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

Python迭代器和生成器

作者头像
王大力测试进阶之路
发布于 2020-07-23 03:44:22
发布于 2020-07-23 03:44:22
37900
代码可运行
举报
文章被收录于专栏:橙子探索测试橙子探索测试
运行总次数:0
代码可运行

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

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

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

创建迭代器对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python中map()函数用法
对可迭代函数*iterables中的每个元素应用func方法,将结果作为迭代器对象返回。
王大力测试进阶之路
2020/07/23
6.3K0
装饰器、生成器,迭代器、Json & pickle 数据序列化
1、 列表生成器:代码例子 1 a=[i*2 for i in range(10)] 2 print(a) 3 4 运行效果如下: 5 D:\python35\python.exe D:/pytho
coders
2018/01/04
6370
装饰器、生成器,迭代器、Json & pickle 数据序列化
Python迭代器与生成器
当执行生成器的__next__的时候,代码会按照顺序去执行,当执行到yield时会返回并提出,yield后面的值就是返回值,然后记录代码执行的位置,并退出
py3study
2020/01/15
4620
python生成器和迭代器
第二,本次迭代的要依赖上一次的结果继续往下做,如果中途有任何停顿,都不能算是迭代。
用户7886150
2020/11/30
4990
迭代器与生成器
这一部分待加强!                 (一)迭代器 一:简介     迭代是Python最强大的功能之一,是访问集合元素的一种方式。     迭代器是一个可以记住遍历的位置的对象。     迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。     迭代器只能往前不会后退。     迭代器有两个基本的方法:iter() 创建迭代器对象和 next()访问迭代器。     字典、字符串、列表或元组对象都可用于创建迭代器 二:迭代器的创建     ①把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__()     ②__iter__() 方法返回一个特殊的迭代器对象,     这个迭代器对象实现了 __next__() 方法     并通过 StopIteration 异常标识迭代的完成。     ③__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象 三:迭代器协议的后台机制     for element in (1, 2, 3):             print(element)     在后台,for 语句在容器对象中调用 iter() 。     该函数返回一个定义了 __next__() 方法的迭代器对象,它在容器中逐一访问元素。     没有后续的元素时, __next__() 抛出一个 StopIteration 异常,     通知 for 语句循环结束。     可以用内建的 next() 函数调用 __next__() 方法;     了解了迭代器协议的后台机制,就可以很容易的给自己的类添加迭代器行为。     定义一个 __iter__() 方法,使其返回一个带有 __next__() 方法的对象。     如果这个类已经定义了 __next__() ,那么 __iter__() 只需要返回 self: 三:迭代器使用的必要性     列表效率高,但是需要将内容一次性读入,可能增加内存的负担,     如果列表太大,内存溢出。     range 返回一个列表     xrange 返回一个对象                 (二)生成器 一:简介     ①在 Python 中,使用了 yield 的函数被称为生成器(generator)     跟普通函数不同的是,生成器是一个返回迭代器的函数,     只能用于迭代操作,更简单点理解生成器就是一个迭代器     ②在调用生成器运行的过程中,每次遇到 yield 时函数会暂停,     并保存当前所有的运行信息,返回 yield 的值,     并在下一次执行 next() 方法时从当前位置继续运行。 二:创建生成器     ①一个简单的生成器:my_generator = (x*x for x in range(4))     和列表解析式只是括号不同,大数据处理时代替列表解析式。     ②和return的区别:一般的函数都是止于return,作为生成器的函数,由于有了yield,     遇到他则会暂时挂起,如果之后还有return,则直接抛出StopIteration异常。 三:本节最后一句:编程中可以不使用生成器。
py3study
2020/01/19
4010
Python基础11-迭代器,生成器
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2860
Python基础11-迭代器,生成器
python 可迭代对象 迭代器 生成器_Python3迭代器获取
初学者在日常提升Python基本功的时候,可能会被Python的迭代器和生成器搞晕,之前在学习和使用时,本来for in 循环体和enumerate函数用的飞起,觉得自己已经彻底了解了Python的迭代特性,但接触了迭代器和生成器后,突然感觉懵逼,大概率会被可迭代、迭代器、生成器等概念搞的不知所向,本文就是结合日常项目应用,对Python的迭代概念进行系统性的全面解析,包括其底层实现原理,还有一些常见的应用,希望能帮助更多人,同时也算作给自己梳理思路。
全栈程序员站长
2022/11/10
1.1K0
Pytest标记预期失败得测试用例@pytest.mark.xfail()
除了测试函数中使用这个方法pytest.xfail()外,xfail还有一种使用方法。就是@pytest.mark.xfail()标记预期会失败的用例,即期望测试用例是失败的,但是不会影响测试用例的的执行。
王大力测试进阶之路
2020/07/23
9590
python 迭代器/iterator与生成器/generator的区别
可以看到,i和g是不同类的实例,拥有的属性也不同,虽然都可以使用next方法取值,但是i可以序列化,g不可以序列化,说明g的值是运行时动态生成,而i值是固定生成
未来sky
2020/09/29
5750
干货推荐:看过介绍 Python 迭代器和生成器最易懂、最全面的文章
迭代器:是访问数据集合内元素的一种方式,一般用来遍历数据,但是他不能像列表一样使用下标来获取数据,也就是说迭代器是不能返回的。
崔庆才
2019/05/06
6110
Python 迭代器和生成器有什么用?
本文将探讨python的迭代器和生成器在实际场景中的一些巧妙用法。掌握迭代器和生成器的使用,能够让开发者在解决实际问题时更加得心应手。
每周聚焦
2024/06/14
1520
Python 迭代器和生成器有什么用?
一文彻底搞懂Python可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)的概念
在Python中可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了。
阳仔
2019/08/01
6.5K0
Python3 迭代器与生成器
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
AlexZhang
2021/12/02
3800
[快学Python3]迭代器和生成器
迭代器 迭代是Python最强大的功能特色,是遍历访问序列元素的一种方式。 迭代器的特性是: 可以记住当前遍历位置 只能往前遍历,不能后退 从序列的第一个元素开始访问,直至所有元素被访问完 有两个基本方法: iter() 和 next() 字符串、列表或元组对象可以用于创建迭代器 下面看以下实例: # -*- coding:utf-8 -*- __author__ = '苦叶子' import sys if __name__ == "__main__": seq_tuple = (1, 2, 3
苦叶子
2018/04/09
1.3K0
Python教程第5章 | Python迭代器和生成器
比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历就是迭代。
仲君Johnny
2024/01/24
2650
Python教程第5章 | Python迭代器和生成器
python基础-迭代器和生成器
我们可以使用__closure__ 来检测函数是否是闭包. 使用函数名.__closure__返回cell就是 闭包. 返回None就不是闭包
以谁为师
2019/05/28
7310
Python3 | 筑基期, 推导式、迭代器、生成器!
描述:前面,我们一起学习了Python3开发中使用最多的函数(Function),相信大家在作者的实践下也已经掌握函数的创建、多参数的传递,以及匿名函数、闭包了吧,这一章我们一起学习Python3编程中的推导式、迭代器以及生成器等相关知识,它也是Python编程中进阶常用的部分,对于程序健壮性以及效率都有所帮助,所以说也是需要我们掌握的。
全栈工程师修炼指南
2024/07/29
1260
Python3 | 筑基期, 推导式、迭代器、生成器!
迭代器和生成器
Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。
全栈程序员站长
2022/07/21
4950
python3.7 迭代器和生成器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项, 要么就引起一个StopIteration异常,已终止迭代,只能往后走,不能往前退. 2、可迭代对象:实现了迭代器协议的对象(对象内部定义一个__iter__()方法),节省内存 3、协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for、sum
py3study
2020/01/19
4610
python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05
迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的)
suwanbin
2019/09/26
1.5K0
python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05
相关推荐
Python中map()函数用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验