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包依赖安装好。具体格式说明: 点这里

 

posted @ 2018-03-06 11:21  小律爷  阅读(178)  评论(0)    收藏  举报