前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python迭代器和生成器

Python迭代器和生成器

作者头像
王大力测试进阶之路
发布2020-07-23 11:44:22
3170
发布2020-07-23 11:44:22
举报
文章被收录于专栏:橙子探索测试橙子探索测试

迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器。__iter__()的作用是可以让for循环遍历。而__next__()方法是让对象可以通过 next(实例对象) 的方式访问下一个元素,通常从序列第一个元素开始访问,直到所有的元素都被访问才结束。

列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但不是迭代器,因为他们都没有next( )方法,但是可用于创建迭代器。

迭代器不需要事先准备好整个迭代过程中的所有元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。

创建迭代器对象

代码语言:javascript
复制
list1 = ['python', 'java', 'c', 'php']
it = iter(list1)
print(it)

C:\Users\admin\AppData\Local\Programs\Python\Python37\python.exe C:/Users/admin/Desktop/AutoTest/Test/test/test_01/test_01.py
<list_iterator object at 0x000001DDB3A6F788>

Process finished with exit code 0

调next()方法,输出迭代器下个值

代码语言:javascript
复制
list1 = ['python', 'java', 'c', 'php']
it = iter(list1)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))

C:\Users\admin\AppData\Local\Programs\Python\Python37\python.exe C:/Users/admin/Desktop/AutoTest/Test/test/test_01/test_01.py
python
java
c
php
Traceback (most recent call last):
  File "C:/Users/admin/Desktop/AutoTest/Test/test/test_01/test_01.py", line 12, in <module>
    print(next(it))
StopIteration


Process finished with exit code 1

迭代器对象可以使用for语句进行遍历

代码语言:javascript
复制
list1 = ['python', 'java', 'c', 'php']
it = iter(list1)
print(it)
for i in it:
    print(i)
    
 "C:\Program Files\Python35\python.exe" C:/Users/wangli/Desktop/AutoTest/Test/test/test_02.py
<list_iterator object at 0x0000017DFA6D4518>
python
java
c
php

Process finished with exit code 0

生成器(generator),可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),

所以生成器就是可迭代对象,Python使用生成器,是指在需要的时候才产生结果,而不是立即产生结果。

a.生成器就是一个迭代器

b.调用一个生成器函数,返回的是一个迭代器对象

c.只有在调用时才产生相应数据,节省内存空间

d.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处

1、生成器函数:常规函数的定义,但是,使用yield语句而不是return语句返回结果。yield语句语句一次返回一个结果,

在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

代码语言:javascript
复制
def test():
    for i in range(0, 100):
        yield i
print(test())
for i in test():
    print(i)
 
"C:\Program Files\Python35\python.exe" C:/Users/wangli/Desktop/AutoTest/Test/test/test_02.py
<generator object test at 0x00000258DD61E258>
0
1
2
3
4
5
……
99
Process finished with exit code 0

2、生成器表达式:类似于列表推导,生成器返回按需产生结果的一个对象,迭代调用,而不是一次构建一个结果列表,浪费内存

代码语言:javascript
复制
it = (i*2 for i in range(0, 20))
print(it)
for i in it:
    print(i)
    
 "C:\Program Files\Python35\python.exe" C:/Users/wangli/Desktop/AutoTest/Test/test/test_02.py
<generator object <genexpr> at 0x000001A03F40E258>
0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38

Process finished with exit code 0
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 橙子探索测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档