Python-迭代器、生成器、修饰器
迭代器
在python中几乎所有的容器都会有一个__iter__
的内置方法,用来返回一个迭代器。迭代器其实可以理解成for循环的一个下层组成部分,for就是利用不断的迭代直到报错退出for循环实现list或者其他容器中元素遍历的。
迭代器的使用主要包含两部分,首先利用iter()
函数构建容器的迭代器,在利用next()
函数使用迭代器进行迭代,当迭代器已经完成了所有元素的迭代之后就会报错StopIteration
。在理解上迭代器可以看成是一个指针,初始状态下指向容器的第0个元素,每next一次就向后移动一个元素。
list1 = [1,2]
for each in list1:
print(each)
# 作用和1-3行相同
list1_iter = iter(list1)
print(next(list1_iter)) # 1
print(next(list1_iter)) # 2
print(next(list1_iter)) # ERROR:StopIteration
生成器
生成器是一种特殊的迭代器,只能够使用一个,通过def
函数实现生成器,每一次yield
都是一次阶段性的return
,等到下一次实例对象进行next()
的时候才会执行到下一个yield
。
def test():
yield 1
yield 2
yield 3
if __name__ == '__main__':
t = test() # 构建一个函数的实例对象
print(next(t)) # 1
print(next(t)) # 2
print(next(t)) # 3
print(next(t)) # ERROR:StopIteration
print(list(test())) # [1,2,3]
yield from
是生成器的另一种用法,其作用相当于一个循环迭代生成。
def test(*iterable):
for each in iterable:
yield from each
# 效果相当
def test_demo(*iterable):
for each in iterable:
for i in each:
yield i
if __name__ == '__main__':
t = test('123', 'asd')
print(next(t)) # 1
print(next(t)) # 2
Tips:当生成器被强制转换为list(),tuple()
等容器中时,就会遍历完所有数据
def test(*iterable):
for each in iterable:
yield from each
if __name__ == '__main__':
t = test('123', 'asd')
print(tuple(t)) # ('1', '2', '3', 'a', 's', 'd')
修饰器
修饰器以函数作为输入参数,将输入的函数作为其中的一部分,返回包含了输入函数的一个新的函数(被修饰过的函数),可以理解成在原来函数的技术上增加了一部分处理(重载)。包含两种不同的类型
不带参数的修饰器
def test(func):
def wrapper():
func()
print('wrapper')
return wrapper
@test
def be_test():
print('be test')
if __name__ == '__main__':
be_test()
# 等价于
test(be_test)
带有参数的修饰器
def level_1(var=0):
def level_2(func):
def level_3(a, b):
func(a, b)
print(var, a, b)
return level_3
return level_2
@level_1(111) # 这个参数传给var
def test(b, c): # test传给level_2; 里面的参数传给level_3
pass
if __name__ == '__main__':
test(2, 3)