【Python 】生成器 & 迭代器

生成器

  • 一边循环一边计算的机制
  • 可以被 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']
# []

生成器 & 迭代器的区别

  1. 生成器本质上是一个函数,用于生成元素
  2. 迭代器是可以执行 next ( ) 操作的对象,用于访问序列中的元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JS.Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值