生成器
- 一边循环一边计算的机制
- 可以被 next ( ) / __ next __ ( ) 函数调用,并返回当前值;下一次调用返回下一个值。
方法一:使用列表推导式
- 语法:生成器 = ( expression for value in array )
① expression :返回的表达式;② value :序列里面的元素;③ array :被遍历的序列
list1 = [1, 2, 3, 4, 5, 6]
generator1 = (value * 3 for value in list1)
print(type(generator1))
print(generator1.__next__(), end=' ') # __next__() 函数
print(generator1.__next__(), end=' ')
print(next(generator1), end=' ') # next() 函数
print(next(generator1), end=' ')
# ---------- 输出 ----------
# <class 'generator'>
# 3 6 9 12
配合循环使用
list1 = [1, 2, 3, 4, 5, 6]
generator1 = (value * 3 for value in list1)
for value in range(4):
print(next(generator1), end=' ')
# ---------- 输出 ----------
# 3 6 9 12
方法二:使用函数,配合 yield
- 当一个函数中使用了 yield,这个函数就是一个生成器
- yield 返回结果后,将函数阻塞在当前位置,直到再次被调用,再执行下一次。
def fun():
for i in range(10):
yield i * 3
f = fun()
print(type(f))
for value in range(4):
print(next(f), end=' ')
# ---------- 输出 ----------
# <class 'generator'>
# 0 3 6 9
- 生成器只能执行一遍,取完元素后,生成器里面就没有元素了
def fun():
for i in range(10):
yield i * 3
f = fun()
list1 = [value for value in f]
list2 = [value for value in f]
print(list1)
print(list2)
# ---------- 输出 ----------
# [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
# []
迭代器
- 可迭代对象:能用 for 遍历的对象(eg:字符串、列表、元组、集合 都 iterable
- 可迭代对象可以用 iter ( ) / __ iter __ ( ) 使自身变成迭代器
list1 = [value for value in range(10)]
Iterator = iter(list1)
# Iterator = list1.__iter__()
print(Iterator)
print(type(Iterator))
# ---------- 输出 ----------
# <list_iterator object at 0x0000017C39B19160>
# <class 'list_iterator'>
- 迭代器也可以被 next ( ) 函数调用,并返回当前值;下一次调用返回下一个值
list1 = [value for value in range(10)]
Iterator = iter(list1)
for i in range(5):
print(next(Iterator) * 3, end=' ')
# ---------- 输出 ----------
# 0 3 6 9 12
- 迭代器也只能执行一遍,取完元素后,里面就没有元素了
list1 = [value for value in range(10)]
Iterator = iter(list1)
result1 = [i for i in Iterator]
print(result1)
result2 = [i for i in Iterator]
print(result2)
# ---------- 输出 ----------
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# []
reversed ( array )
序列使用 reversed ( ) 函数后,会返回一个反转的迭代器
list1 = ['Sun WuKong', 'Zhu Bajie', 'Monk Sha', 'Tang Monk']
iterator1 = reversed(list1)
print(type(iterator1))
list2 = [value for value in iterator1]
print(list2)
list3 = [value for value in iterator1]
print(list3)
# ---------- 输出 ----------
# <class 'list_reverseiterator'>
# ['Tang Monk', 'Monk Sha', 'Zhu Bajie', 'Sun WuKong']
# []
生成器 & 迭代器的区别
- 生成器本质上是一个函数,用于生成元素
- 迭代器是可以执行 next ( ) 操作的对象,用于访问序列中的元素