沈阳市城乡建设局网站网站建设行业如何
沈阳市城乡建设局网站,网站建设行业如何,深圳找做兼职女上班的网站,荥阳网站建设多少钱Python 中的迭代器#xff08;Iterator#xff09;是一个可以记住遍历位置的对象#xff0c;用于迭代列表、元组、字典、集合和字符串等可迭代#xff08;Iterable#xff09;对象#xff0c;迭代器从集合的第一个元素开始访问#xff0c;直到所有的元素被访问完结束Iterator是一个可以记住遍历位置的对象用于迭代列表、元组、字典、集合和字符串等可迭代Iterable对象迭代器从集合的第一个元素开始访问直到所有的元素被访问完结束并且只能往前不会后退。使用 collections.abc 库中的 Iterable 和 Iterator 可以判断对象是否可迭代和是否为迭代器。 from collections.abc import Iterableisinstance([], Iterable)
Trueisinstance({}, Iterable)
Trueisinstance(abc, Iterable)
Trueisinstance(100, Iterable)
Falsefrom collections.abc import Iteratorisinstance([], Iterator)
Falseisinstance({}, Iterator)
Falseisinstance(abc, Iterator)
Falseisinstance(iter([]), Iterator)
Trueisinstance(iter(abc), Iterator)
True正如上面代码所示列表、字典和字符串都是可迭代的而数字就不是可迭代的。但列表、字典和字符串都不是迭代器因为可迭代的对象如列表、元组、字典、集合和字符串得先使用 iter() 方法把它们初始化为迭代器对象之后才能使用 next() 方法对其进行迭代。所以 iter([]) 和iter(abc) 都是迭代器。
有了迭代器之后就可以用 next() 方法对其进行迭代如果迭代器的内容已经全部迭代完了就会返回一个 StopIteration 的错误 list[1, 2, 3, 4]it iter(list) # 创建迭代器对象print (next(it)) # 输出迭代器的下一个元素
1print (next(it))
2print (next(it))
3print (next(it))
4print (next(it))
Traceback (most recent call last):File stdin, line 1, in module
StopIteration不断地调用 next() 方法显然太麻烦了最简洁的方法是使用 for 循环 for i in [1, 2, 3, 4]:
... print(i)
...
1
2
3
4注意 for 循环接收的只是可迭代对象而不是迭代器所以实际上 for 循环帮我们同时完成了 iter() 和 next() 方法并且在遇到 StopIteration 就会自动退出循环。以下代码和上面是等价的
it iter([1, 2, 3, 4, 5]) # 创建迭代器对象
# 循环:
while True:try:i next(it) # 输出迭代器的下一个元素print(i)except StopIteration: # 遇到StopIteration就退出循环break说完迭代器就轮到生成器了。所谓生成器generator 就是一个返回迭代器的函数只能用于迭代操作更简单点理解生成器就是一个迭代器。
生成器函数有两种写法第一种是类似于列表生成式推导式 的写法只不过把列表的中括号换成小括号而已 f (x * x for x in range(10))f
generator object genexpr at 0x1022ef630f 就是一个迭代器其函数为求平方所以能使用 next() 方法进行迭代 next(f)
0next(f)
1next(f)
4next(f)
9next(f)
16next(f)
25next(f)
36next(f)
49next(f)
64next(f)
81next(g)
Traceback (most recent call last):File stdin, line 1, in module
StopIteration同样地用 for 循环既然能处理可迭代对象当然也可以处理迭代器如下 f (x * x for x in range(10))for i in f:
... print(i)
...
0
1
4
9
16
25
36
49
64
81第二种生成器的写法就是在创建函数时使用 yield 关键字假设我们想输出指定长度的斐波拉契数列有如下函数
def fib(max):n, a, b 0, 0, 1while n max:print(b)a, b b, a bn n 1return done调用函数如下 fib(6)
1
1
2
3
5
8
done只需要把函数中的 print 改为 yield该函数就变成了生成器函数
def fib(max):n, a, b 0, 0, 1while n max:yield ba, b b, a bn n 1return done调用生成器函数就会得到一个生成器实际上也就是迭代器 f fib(6)f
generator object fib at 0x104feaaa0所以用 for 循环进行迭代可以得到如下结果 for i in f:
... print(i)
...
1
1
2
3
5
8生成器函数和普通函数的执行流程不一样。普通函数是顺序执行遇到 return 语句或者最后一行函数语句就返回。而变成生成器的函数在每次调用 next() 的时候执行遇到 yield 语句返回再次执行时从上次返回的 yield 语句处继续执行。
最后作个总结
迭代器一定是可迭代的但集合数据类型如列表、字典、字符串等是可迭代的但不是迭代器可以通过 iter() 函数获得一个迭代器对象凡是可作用于 for 循环的对象都是可迭代的凡是可作用于 next() 函数的对象都是迭代器它们表示一个惰性计算的序列Python 的 for 循环如果接收到还不是迭代器的可迭代的对象就会调用 iter() 将其变成迭代器然后不断调用 next() 函数实现迭代过程生成器就是可以让我们通过编写函数自定义得到的迭代器。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88073.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!