python 迭代器(iterators)&生成器详解(Generators)

可迭代对象(iterable):

能提供迭代器的任意对象;只要定义了一个迭代器的iter方法或定义了支持下标索引的getitem方法,那就是一个可迭代对象。

迭代器(iterators):

任意对象,只要定义了next或者next方法,那就是一个迭代器

迭代(iteration):

从某个地方(如列表)取出一个元素的过程;使用一个循环来遍历某个东西(如列表),这个过程就是迭代;

生成器(Generators):

也是一种迭代器,但只能对其迭代一次

  • 因为它们并没有把所有值存在内存中,而是运行时生成值;
  • 可通过遍历使用它们,要么使用“for”循环,要么传递给任意可以进行迭代的函数和结构;
  • 大多时候生成器是以函数实现的,但它们并不返回一个值,而是yield(生出)一个值。
def generator_function():
    for i in range(10):
        yield i

for item in generator_function():
    print(item)

# Output: 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
适用场景:

不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环;因为这样做会消耗大量资源
许多Python 2里的标准库函数都会返回列表,而Python 3都修改成了返回生成器,因为生成器占用更少的资源。

斐波那契数列的生成器

# 传统模式
def fibon(n):
    a = b = 1
    result = []
    for i in range(n):
        result.append(a)
        a, b = b, a + b
    return result

# 生成器模式
def fibon(n):
    a = b = 1
    for i in range(n):
        yield a
        a, b = b, a + b

# Now we can use it like this:
for x in fibon(1000000):
    print(x)

Python内置函数:next()

允许我们获取一个序列的下一个元素

特点:

  • yield掉所有的值后,next()会触发一个StopIteration的异常。提示我们所有的值都已经被yield完了;
  • 在使用for循环时没有这个异常,因为for循环会自动捕捉到这个异常并停止调用next()
def generator_function():
    for i in range(3):
        yield i

gen = generator_function()
print(next(gen))
# Output: 0
print(next(gen))
# Output: 1
print(next(gen))
# Output: 2
print(next(gen))
# Output: Traceback (most recent call last):
#         File "<stdin>", line 1, in <module>
#         StopIteration

Python内置函数:iter()

将一个可迭代对象返回一个迭代器对象

my_string = "Bingo"
next(my_string)
# Output: Traceback (most recent call last):
#      File "<stdin>", line 1, in <module>
#    TypeError: str object is not an iterator

这个异常说str对象是一个可迭代对象,而不是一个迭代器;不能直接对其进行迭代操作,所以,使用iter

my_string = "Bingo"
my_iter = iter(my_string)
next(my_iter)
# Output: 'B'
next(my_iter)
# Output: 'i'
next(my_iter)
# Output: 'n'
next(my_iter)
# Output: 'g'
next(my_iter)
# Output: 'o'
next(my_iter)
# Output: Traceback (most recent call last):
#         File "<stdin>", line 12, in <module>
#         StopIteration

作者:Chihwei_hsu
来源:http://chihweihsu.com
Github:https://github.com/HsuChihwei

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值