概述
本文主要是基于廖雪峰网站上的解释加上自己的一些理解写的,顺带做了个小练习
代码基于Python 3.7
主要内容
- 生成器(Generator)
- 创建方法
- 迭代器(Iterator)
- 可迭代对象(Iterable)
- 小练习
生成器(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]
顺带一提,我写的这个杨辉三角就无法看到它的返回值(目前所知)
最后
以上就是精明摩托为你收集整理的Python中的迭代器(Iterator)与生成器(Generator)生成器(Generator)迭代器(Iterator)小练习的全部内容,希望文章能够帮你解决Python中的迭代器(Iterator)与生成器(Generator)生成器(Generator)迭代器(Iterator)小练习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复