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
简要解释一下:
bin/
: 存放项目的一些可执行文件,当然你可以起名script/
之类的也行foo/
: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/
存放单元测试代码; (3) 程序的入口最好命名为main.py
docs/
: 存放一些文档config/
: 配置文件setup.py
: 安装、部署、打包的脚本requirements.txt
: 存放软件依赖的外部Python包列表README
: 项目说明文件
6.2 关于README
需要说明以下几个事项:
- 软件定位,软件的基本功能
- 运行代码的方法: 安装环境、启动命令等
- 简要的使用说明
- 代码目录结构说明,更详细点可以说明软件的基本原理
- 常见问题说明
6.3 setup.py
用setup.py
来管理代码的打包、安装、部署问题。使用Python流行的打包工具setuptools来管理。可以参考Python的一个Web框架,flask是如何写的: setup.py。
6.4 requirements.txt
- 方便开发者维护软件的包依赖。将开发过程中新增的包添加进这个列表中,避免在
setup.py
安装依赖时漏掉软件包。 - 方便读者明确项目使用了哪些Python包。
这个文件的格式是每一行包含一个包依赖的说明,通常是flask>=0.10
这种格式,要求是这个格式能被pip
识别,可以通过 pip install -r requirements.txt
把所有Python包依赖安装好。具体格式说明: 点这里。