Python中的迭代器(Iterator)与生成器(Generator)

本文主要是基于廖雪峰网站上的解释加上自己的一些理解写的,顺带做了个小练习
代码基于Python 3.7

生成器(Generator)

生成器基于这样的思想:它保存某种机制,使生成器可以一边循环一遍获取元素。可以理解为,它保留了某种算法,我们可以通过这个算法源源不断地产生我们需要的元素。

创建方法

主要有两种:
1、通过列表生成式产生,区别就在于我们用圆括号而不是方括号包裹列表产生式。

#列表
[x for x in range(10)]
#生成器对象
(x for x in range(10))

2、通过yield关键字
这种方法用于函数之中。这也是很有特色的一个特性,出现yield关键字的函数可以称为一个生成器函数,这样的函数有一个特点,被next()方法调用的时候,每一次调用都会停留在yield的位置,yield后面跟随的值是本次迭代产生的值,而下一次next()的调用又从yield的下个语句开始执行。
当然作为函数,生成器函数同样具有返回值,只不过这个返回值仅在引发StopIteration后才能得到(当然前提是我们的迭代不是一个无限的迭代)。

这个StopIteration异常是我们不停调用next()直到迭代结束才会抛出。
前面提到的函数的返回值藏在StopIteration.value里,下面是一个小例子:

def Generator(n):
    for i in range(n):
        yield 2*i 
    return "迭代完毕"
"""
捕捉异常,获取函数返回值
"""
g = Generator(5)
while True:
    try:
        i = next(g)
        print(i)
    except StopIteration as s:
        print(s.value)
        break
#函数输出
0
2
4
6
8
迭代完毕

迭代器(Iterator)

网站上给出了迭代器的一个定义,能够被next()方法调用的对象就是一个迭代器,所以,每一个生成器都是迭代器。

可迭代对象(Iterable)

可迭代对象有一个粗略的定义,能够使用for循环获取元素的对象就是一个可迭代对象
但是可迭代对象不一定是一个迭代器,像list/dict/tuple都是可迭代对象,但使用next()方法调用是会报错的。但是可迭代对象也可以转换为一个迭代器,方法很简单,只需要iter()方法,就可以将一个可迭代对象转换为迭代器。

小练习

编写一个生成器函数,生成杨辉三角。
杨辉三角形如:
杨辉三角
要求每次迭代以列表形式输出一行

def triangle():
    n = 1
    pre = []
    tmp = [1]
    while True:
        for i in range(n):
            if n==1:
                break
            if i!=n-1 and i-1>=0 :
                tmp.append(pre[i - 1] + pre[i])
            elif i==n-1:
                tmp.append(1)
        yield tmp        
        n += 1
        pre = tmp
        tmp = [1]
    return "Finish"
"""
测试
"""
count = 0
gen = triangle()
for l in gen:
    print (l)
    count+=1
    if count == 10:
        break
"""
运行结果
"""
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

顺带一提,我写的这个杨辉三角就无法看到它的返回值(目前所知)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值