一、装饰器
1.1装饰器的使用
- 我们可以直接通过修改函数中的代码来完成需求,但是会产生以下一些问题
• 如果修改的函数多,修改起来会比较麻烦
• 不方便后期的维护
• 这样做会违反开闭原则(ocp,o open开放对代码的拓展,c close关闭对代码的修改) - 程序的设计,要求开发对程序的扩展,要关闭对程序的修改
- 装饰器是一个特殊的闭包函数 即闭包函数加上参数为装饰的对象
- 装饰器,涉及到高阶函数的两种形式
1.2装饰器的使用
- 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数的功能的
- 通用装饰器:
def addFunc():
print('新增功能')
def funcOut(func):
def funcIn(*args,**kwargs):
addFunc()
func(*args,**kwargs)
return funcIn
def fun():
print('我是fun函数')
# return '我是fun函数'
调用装饰器funcOut的种类:
1
r=funcOut(fun)
r()
2(装饰器的语法糖写法)
#紧贴被装饰对象之前加@funcOut,就可直接用fun()
二、可迭代对象
- 我们已经知道可以对list、tuple、dict、set、str等类型的数据使用for…in…的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代。
- 把可以通过for…in…这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。
三、推导式
- 推导式分为 列表推导式、字典推导式、集合推导式等。在这里我们主要说其中一种也是用的最多列表推导式
- 列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表简单理解就是由一个旧的列表来构建出一个新的列表
- 语法:
[表达式 for 变量 in 旧列表]
[表达式 for 变量 in 旧列表 if 条件]
四、生成器
4.1 生成器的引入
通过列表推导式我们可以直接创建出一个列表,但是受到内存的限制,我们不可能创造出一个无限大的列表。而且创建一个有200万个元素的列表,会占用很大的内存空间,而这个时候我们仅仅需要访问列表中几个元素,那么后面的元素就占用着空间就是一种浪费的行为。那么我们可不可以用几个元素就创建出几个元素。这样在一定程度上就优化了内存。那么在Python中有一种一边循环一边计算的机制就是生成器
4.2生成器的创建方式
1、方法一:使用类似列表推导式的方式得到生成器
把[]改为()
得到一个生成器
s=(1*2 for i in range(5) if i %2==0)
print(s)
#结果:
<generator object <genexpr> at 0x000002A262A1EEB8>
生成器的使用方法:
gen.next()
next(gen) #按顺序从第一个开始一次拿一个
2、方法二:利用函数和yield生成生成器
def fun():
i = 0
while True:
i += 1
yield i
r = fun()
print(r)
print(next(r))
print(next(r))
print(next(r))
#结果:
<generator object fun at 0x000001EF0893EF68>
1
2
3
注:只要在函数中出现yield关键字它就是一个生成器函数
五、迭代器
迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束。
可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator
生成器是可迭代的,也是迭代器
列表是可迭代的,但不是迭代器
通过iter()函数可以将可迭代的变成一个迭代器
迭代器与生成器的区别,转自liangjisheng的博客
六、PEP8规范编写代码
七、附:第十一讲作业
请使用装饰器实现已存在的函数的执行所花费的时间
import time
def fun2(fun1):
def fun3(a):
t1=time.time()
print(t1)
fun1(a)
t2=time.time()
print(t2)
print(t2-t1)
return fun3
@fun2
def fun1(a):
for i in range(a):
print(i)
s=int(input('请输入:'))
fun1(s)
总结:(递归函数、高阶函数、闭包、装饰器、推导式、生成器,迭代器)为高级编程内容