生成器
生成器就是一种自定义的迭代器,本质就是迭代器 。即生成器是迭代器中的一种。
next():每次只获取一个数据。
next()的两种用法:
复制代码
1
2
3
4
5
6
7
8
9
10g = (x for x in range(1, 6)) print(next(g)) # 1 print(next(g)) # 2 print(g.__next__()) # 3 print(g.__next__()) # 4 # 结果:1 # 2 # 3 # 4
复制代码
1
2
3
4
5
6
7
8
9r = (x for x in range(1,6)) for i in r: print(i) # 结果:1 # 2 # 3 # 4 # 5
for循环的本质就是调用next()
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 创建生成器方法一: (x for x in range(1,11)) # 创建生成器方法二:yield关键字实现 # yield相当于挂起,存档的意思 def f(): print("hello world") yield 1 g = f() print(next(g)) # 结果:hello world # 1
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14def a(): print("f1") yield 1 print("f2") yield 2 g = a() print(next(g)) # f1 1 print(next(g)) # f2 2 # 结果: f1 # 1 # f2 # 2
复制代码
1
2
3
4
5
6
7
8
9
10
11
12def a(): print("f1") yield 1 print("f2") yield 2 for i in a(): print(i) # 结果: f1 # 1 # f2 # 2
可迭代对象的含义:
- 从现象来看,只要是可以for循环的都是可迭代对象。
- 从本质来看,是内置有iter方法的是可迭代对象(对象拥有iter方法)。
复制代码
1
2
3
4
5
6
7
8
9
10li = [2, 4, 6] print(li.__iter__()) tu = (1, 2, 3) print(tu.__iter__()) di = {'name': 'Jim'} print(di.__iter__()) # 结果:<list_iterator object at 0x000001C13046F610> # <tuple_iterator object at 0x000001C13046F610> # <dict_keyiterator object at 0x000001C13020C810>
迭代器
iterator:迭代器
iterable:可迭代对象
复制代码
1
2
3
4
5li = [2, 4, 6] a = iter(li) print(a) #结果:<list_iterator object at 0x000002609AA69FA0>
迭代器有next()方法;有iter()方法
复制代码
1
2
3
4
5
6
7
8
9li = [2, 4, 6] a = iter(li) print(next(a)) print(next(a)) print(next(a)) # 结果:2 # 4 # 6
for循环的本质:
- 调用可迭代对象的iter方法返回一个迭代器
- 不断地调用迭代器的next()方法
- 处理异常
复制代码
1
2
3
4
5
6
7
8li = [1, 2, 3] for i in li: print(i) li.__iter__() # 结果:1 # 2 # 3
复制代码
1
2
3
4
5
6
7
8
9
10a = iter([1,2,3]) while True: try: print(next(a)) except StopIteration: break # 结果:1 # 2 # 3
迭代器的优点:
为序列类型和非序列类型提供一种统一的迭代取值方式。
可以只在需要的时候才去调用next()来计算出一个值。就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流。而对于其他容器的类型,比如列表,就需要把所有的元素都存放在内存中,受内存大小的限制,可以存放的值得个数是有限的。
最后
以上就是爱听歌冷风最近收集整理的关于Python学习(十二)——生成器和迭代器生成器迭代器的全部内容,更多相关Python学习(十二)——生成器和迭代器生成器迭代器内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复