迭代器
1、在定义一个类时添加一个__ iter__函数来使它成为一个迭代器,作为一个迭代器,它就可以使用next()方法来逐步输出类中包含的数据
2、通过iter()函数来使一个可迭代数据类型变成一个迭代器,例如:
li = [11, 22, 33, 44, 55]
# 通过iter() 取得可迭代对象的迭代器
iterator = iter(li)
# 通过next()函数取得iterator迭代器指向的下一个值
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))
#output:
11
22
33
44
55
生成器
要创建一个生成器,有很多种方法。第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( )
G=(x*2 for x in range(6))
generator非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现。 函数中含有yield就是一个生成器,yield所在位置就是函数中断的位置,用send或者next方法来激活生成器函数,即从中断处继续执行。
# 创建一个简单生成器,通过 for来遍历
G=(x*2 for x in range(6))
print("通过for 迭代的结果:")
for num in G:
print(num)
#output:
0
2
4
6
8
10
闭包:
由于考虑到编程的封闭性和模块化,采用闭包对函数进行处理,即可以隐藏函数源代码,又可以将不必要的变量从全局转入局部。
所谓闭包,就是指在一个函数中定义了一个另外一个函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。
def function():
lunch = 'lunch'
def eat():
print('eat{}'.format(lunch))
return eat
gen = function()
gen()
简单来说就是将function()的return结果 eat赋值给gen然后gen就获得了内部函数eat()的内存地址,就能通过运行gen()来运行eat()而且在function()环境下运行
装饰器:
在我看来就是闭包的一种运用,为了在不修改原有函数功能和数据的前提下为函数添加新的功能,在函数外嵌套一个新的函数,将原函数需要的参数传进去,就形成了一个装饰器
# 装饰器固定格式
def wrapper(func):
def inner(*args, **kwargs):
# 在被装饰函数前执行的
ret = func(*args, **kwargs)
# 在被装饰函数后执行的
return ret
return inner
# 被装饰函数
@wrapper # 语法糖
def function(*args, **kwargs):
# 函数主体
return