• Week4-python(装饰器)


    Week4

    1 嵌套函数

    在某一函数内定义子函数,子函数只能在函数内调用。不调用则保存函数内容,不执行。

    2 匿名函数

    匿名函数就是不需要显式的指定函数。

    1 #这段代码
    2 def calc(n):
    3     return n**n
    4 print(calc(10))
    5  
    6 #换成匿名函数
    7 calc = lambda n:n**n
    8 print(calc(10))

    3 高阶函数

    #高阶函数应用1:把函数当做参数传给高阶函数
    import time
    def timer(func):
        start_time=time.time()
        func()
        stop_time=time.time()
        print('%f'% float(stop_time-start_time))
    
    def foo():
        time.sleep(3)
        print('the program run')
    
    timer(foo)
    #为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timer(foo),改变了函数的调用方式
    #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
    import time
    def timer(func):
        start_time=time.time()
        return func
        stop_time=time.time()
        print('%f'% float(stop_time-start_time))
    
    def foo():
        time.sleep(3)
        print('the program run')
    
    foo=timer(foo)
    foo()
    #没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

    4 装饰器

    定义:器即函数,装饰即修饰,意指为其他函数添加新功能。

    原则:1、不修改被装饰对象的源代码 2、不修改被装饰对象的调用方式。

    目标:在遵循1和2的前提下,为被装饰对象添加上新功能。

    import time
    def timer(func): # func= foo
        def deco():
            start_time = time.time()
            func()    # func=foo
            stop_time=time.time()
            print('%f'% float(stop_time-start_time))
        return deco # 返回deco内存地址
    
    def foo():
        time.sleep(3)
        print('the program run')
    
    foo=timer(foo) # 相等于@timer,写在使用装饰器功能函数的头部
    foo() # 执行deco
    import time
    def timer(func): # func= foo
        def deco(*args,**kwargs): #加上参数
            start_time = time.time()
            func(*args,**kwargs)    # func=foo
            stop_time=time.time()
            print('%f'% float(stop_time-start_time))
        return deco # 返回deco内存地址
    @timer
    def foo():
        time.sleep(3)
        print('the program run')
    @timer
    def bar(name):
        print(name)
    foo() # 执行deco
    bar('zhouxy')
    username='zhouxy'
    password='111111'
    def login(type):
        def outter(func):
            def wrapper(*args,**kwargs):
                user=input('请输入用户名:')
                pswd=input('请输入密码:')
                if type == 'local':
                    print('使用本地认证')
                    if user==username and pswd==password:
                        print('登录成功')
                        res=func(*args,**kwargs)    #func=home/bbs
                        return res           #加上返回值
                    else:
                        print('登录失败')
                else:
                    print('使用其它认证')
                    if user == username and pswd == password:
                        print('登录成功')
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print('登录失败')
            return wrapper
        return outter
    @login #语法糖 index调用的是outter
    def index(type):
        print('欢迎进入首页'.center(10,'-'))
        return 1
    @login(type='local') #home=wrapper
    def home():
        print('欢迎进入登陆界面'.center(10,'-'))
    @login(type='API')
    def bbs():
        print('欢迎进入论坛界面'.center(10,'-'))
    
    index('local')
    home()
    bbs()

    5 json&pickle序列化

    #序列化
    import json
    
    info ={
        'name':'zhouxy',
        'age' : 18
    }
    f = open('json.txt','w')
    f.write(json.dumps(info))
    f.close()
    #反序列化
    import json
    
    f = open('json.txt','r')
    data = json.loads(f.read())
    print(data['age'])
    #序列化
    import pickle
    
    def other():
        print('end')
    info ={
        'name':'zhouxy',
        'age' : 18,
        'other' : other
    }
    f = open('json.txt','wb')
    f.write(pickle.dumps(info))   # pickle.dump(info,f)
    f.close()
    #反序列化
    import pickle
    
    def other(): #与原来函数体内容无关
        print('start')
    f = open('json.txt','rb')
    data = pickle.loads(f.read()) # data = pickle.loan(f)
    print(data['age'])
    print(data['other']())

    只dump一次load一次。

    6 软件目录结构规范

    跨目录调用:

    import os
    import sys
    
    print(__file__) # 打印相对路径
    print(os.path.abspath(__file__)) # 打印绝对路径
    print(os.path.dirname(os.path.abspath(__file__))) # 父目录路径
    print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 父父目录路径
    PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    sys.path.append(PATH) # 加入环境变量
    from core import main
    main.atm()

    6.1 目录组织结构

    Foo/
    |-- bin/
    |   |-- foo
    |
    |-- foo/
    |   |-- tests/
    |   |   |-- __init__.py
    |   |   |-- test_main.py
    |   |
    |   |-- __init__.py
    |   |-- main.py
    |
    |-- docs/
    |   |-- conf.py
    |   |-- abc.rst
    |-- config/ |-- setup.py |-- requirements.txt |-- README

    简要解释一下:

    1. bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行
    2. foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py
    3. docs/: 存放一些文档
    4. config/: 配置文件
    5. setup.py: 安装、部署、打包的脚本
    6. requirements.txt: 存放软件依赖的外部Python包列表
    7. README: 项目说明文件

    6.2 关于README

    需要说明以下几个事项:

    1. 软件定位,软件的基本功能
    2. 运行代码的方法: 安装环境、启动命令等
    3. 简要的使用说明
    4. 代码目录结构说明,更详细点可以说明软件的基本原理
    5. 常见问题说明

    6.3 setup.py

    setup.py来管理代码的打包、安装、部署问题。使用Python流行的打包工具setuptools来管理。可以参考Python的一个Web框架,flask是如何写的: setup.py

    6.4 requirements.txt

    1. 方便开发者维护软件的包依赖。将开发过程中新增的包添加进这个列表中,避免在setup.py安装依赖时漏掉软件包。
    2. 方便读者明确项目使用了哪些Python包。

    这个文件的格式是每一行包含一个包依赖的说明,通常是flask>=0.10这种格式,要求是这个格式能被pip识别,可以通过 pip install -r requirements.txt把所有Python包依赖安装好。具体格式说明: 点这里

  • 相关阅读:
    BZOJ 3236 AHOI 2013 作业 莫队算法
    使用再哈希算法查找元素
    冰雪奇缘--用爱酿就一部经典
    Scrapy系列教程(2)------Item(结构化数据存储结构)
    html学习笔记二
    知方可补不足~sqlserver中触发器的使用
    我心中的核心组件(可插拔的AOP)~调度组件quartz.net
    EF架构~为BulkInsert引入SET IDENTITY_INSERT ON功能
    知方可补不足~sqlserver中使用sp_who查看sql的进程
    知方可补不足~为千万级数据表加索引
  • 原文地址:https://www.cnblogs.com/cirr-zhou/p/8509209.html
Copyright © 2020-2023  润新知