zoukankan      html  css  js  c++  java
  • 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包依赖安装好。具体格式说明: 点这里

  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/cirr-zhou/p/8509209.html
Copyright © 2011-2022 走看看