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

Python基础入门(迭代器和生成器)

作者头像
py3study
发布于 2020-01-19 03:14:35
发布于 2020-01-19 03:14:35
37200
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

Python迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next(),且字符串、列表或元组对象都可用于创建迭代器,迭代器对象可以使用常规 for 语句进行遍历,也可以使用 next() 函数来遍历。

具体的实例:

字符创创建迭代器对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str1 = 'jaybo'

iter1 = iter ( str1 )

list对象创建迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list1 = [1,2,3,4]

iter2 = iter ( list1 )

3、tuple(元祖) 对象创建迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tuple1 = ( 1,2,3,4 )

iter3 = iter ( tuple1 )

for 循环遍历迭代器对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for x in iter1 :

print ( x , end = ' ' )
print('\n------------------------')

next() 函数遍历迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while True :

try :

    print ( next ( iter3 ) )

except StopIteration :

    break

最后输出的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
j a y b o

1

2

3

4

list(列表)生成式:

语法为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[expr for iter_var in iterable]

[expr for iter_var in iterable if cond_expr]

第一种语法:首先迭代 iterable 里所有内容,每一次迭代,都把 iterable 里相应内容放到iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

第二种语法:加入了判断语句,只有满足条件的内容才把 iterable 里相应内容放到 iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

实例,用一句代码打印九九乘法表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('\n'.join([' '.join ('%dx%d=%2d' % (x,y,x*y) for x in range(1,y+1)) for y in range(1,10)]))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1x1= 1

1x2= 2 2x2= 4

1x3= 3 2x3= 6 3x3= 9

1x4= 4 2x4= 8 3x4=12 4x4=16

1x5= 5 2x5=10 3x5=15 4x5=20 5x5=25

1x6= 6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36

1x7= 7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49

1x8= 8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64

1x9= 9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

2 生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值。并在下一次执行 next() 方法时从当前位置继续运行。

①创建:

生成器的创建:最简单最简单的方法就是把一个列表生成式的 [] 改成 ()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gen= (x * x for x in range(10))

print(gen)

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
generator object at 0x0000000002734A40

创建 List 和 generator 的区别仅在于最外层的 [] 和 () 。但是生成器并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生” ( yield ) 出来。 生成器表达式使用了“惰性计算” ( lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用 call by need 的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated ),所以在列表比较长的情况下使用内存上更有效。

②以函数形式实现生成器:

其实生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个“for”循环,要么将它们传递给任意可以进行迭代的函数和结构。而且实际运用中,大多数的生成器都是通过函数来实现的。

生成器和函数的不同:

函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next() 的时候执行,遇到 yield语句返回,再次执行时从上次返回的 yield 语句处继续执行。

举个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def odd():

print ( 'step 1' )

yield ( 1 )

print ( 'step 2' )

yield ( 3 )

print ( 'step 3' )

yield ( 5 )
o = odd()

print( next( o ) )

print( next( o ) )

print( next( o ) )

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
step 1

1

step 2

3

step 3

5

可以看到,odd 不是普通函数,而是 generator,在执行过程中,遇到 yield 就中断,下次又继续执行。执行 3 次 yield 后,已经没有 yield 可以执行了,如果你继续打印 print( next( o ) ) ,就会报错的。所以通常在 generator 函数中都要对错误进行捕获。

打印杨辉三角:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def triangles( n ): # 杨辉三角形

L = [1]

while True:

    yield L

    L.append(0)

    L = [ L [ i -1 ] + L [ i ] for i in range (len(L))]
n= 0

for t in triangles( 10 ): # 直接修改函数名即可运行

print(t)

n = n + 1

if n == 10:

    break

输出结果:

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

 3 延伸

①反向迭代

使用 Python 中有内置的函数 reversed()。

要注意一点就是:反向迭代仅仅当对象的大小可预先确定或者对象实现了 reversed() 的特殊方法时才能生效。 如果两者都不符合,那你必须先将对象转换为一个列表才行。

②同时迭代多个序列

为了同时迭代多个序列,使用 zip() 函数,具体示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names = ['jaychou', 'zjl', '周杰伦']

ages = [18, 19, 20]

for name, age in zip(names, ages):

 print(name,age)

输出的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jaychou 18

zjl 19

周杰伦 20

其实 zip(a, b) 会生成一个可返回元组 (x, y) 的迭代器,其中 x 来自 a,y 来自 b。 一旦其中某个序列到底结尾,迭代宣告结束。 因此迭代长度跟参数中最短序列长度一致。注意理解这句话,也就是说如果 a , b 的长度不一致的话,以最短的为标准,遍历完后就结束。加V:mmp9972 小编准备了一份2018年最新Python入门教程资料,都会发给大家的~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
理解Python 生成器与迭代器
前一段时间和同事聊到Python技术知识,发现自己对生成器,迭代器傻傻分不清楚,于是乎查文档,找资料,有了此文。
用户1278550
2018/08/09
5440
python3--迭代器,生成器
现在是从结果分析原因,能被for循环的就是"可迭代的",但是如果按常规想,for怎么知道谁是可迭代的呢?
py3study
2018/08/02
4550
Python 迭代器、生成器和列表解析
迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口。 Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象。即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等。迭代器有以下特性:
py3study
2020/01/03
6720
Python教程第5章 | Python迭代器和生成器
比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历就是迭代。
仲君Johnny
2024/01/24
2340
Python教程第5章 | Python迭代器和生成器
Python 迭代器和生成器
本文介绍了Python迭代器和生成器的概念、用法和示例,以及itertools模块提供的一系列迭代器。生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法。生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。在Python 2.5中,yield语句变成了yield表达式,可以有一个值。在生成器中,每次调用next()方法,就会返回下一个值。生成器还支持send()方法,用于主动推送一个值。在Python 3.x中,send()方法被移除,可以使用next()方法代替。生成器还支持close()方法,用于关闭生成器,关闭后无法使用send()和next()方法,但可以继续使用__iter__()和__next__()方法。生成器是一种强大的编程工具,可以有效地节省内存和提高代码性能,特别是在处理大量数据时。itertools模块提供了一系列迭代器,包括旋转、组合、笛卡尔积等,可以用于简化复杂的循环和算法。总之,迭代器和生成器是Python中非常重要的概念,可以简化很多繁琐的编程任务,提高代码性能和可读性。
企鹅号小编
2018/01/05
6830
Python 迭代器和生成器
3.0 Python 迭代器与生成器
当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出。此时,我们可以采用迭代器Iterator和生成器Generator的方法,逐个地处理数据,从而避免内存溢出的问题。
王瑞MVP
2023/08/12
2690
Python中神奇的迭代器和生成器
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
快学Python
2021/08/09
5410
Python 基础(十六):迭代器与生成器
我们知道 Python 中有一些对象可以通过 for 来循环遍历,比如:列表、元组、字符等,以字符串为例,如下所示:
Python小二
2020/08/18
3080
Python教程(26)——Python迭代器和生成器详解
Python中的迭代器是一种对象,它可以迭代(遍历)一个可迭代对象(比如列表、元组或字符串)的元素。迭代器用于实现迭代器协议,即包含 __iter__() 方法和 __next__() 方法。
一点sir
2024/02/18
2940
Python教程(26)——Python迭代器和生成器详解
Python3 | 筑基期, 推导式、迭代器、生成器!
描述:前面,我们一起学习了Python3开发中使用最多的函数(Function),相信大家在作者的实践下也已经掌握函数的创建、多参数的传递,以及匿名函数、闭包了吧,这一章我们一起学习Python3编程中的推导式、迭代器以及生成器等相关知识,它也是Python编程中进阶常用的部分,对于程序健壮性以及效率都有所帮助,所以说也是需要我们掌握的。
全栈工程师修炼指南
2024/07/29
960
Python3 | 筑基期, 推导式、迭代器、生成器!
一文搞懂Python迭代器和生成器
在Python中,迭代器是遵循迭代协议的对象。使用iter()从任何序列对象中得到迭代器(如list, tuple, dictionary, set等)。另一种形式的输入迭代器是generator(生成器)。
朱卫军 AI Python
2022/04/02
1.1K0
一文搞懂Python迭代器和生成器
【Python】10“生成器和迭代器“
生成器:generator,是一种一边循环一边计算的机制,在传统的函数中,我们可能要从一个函数得到数组列表,而内存容量是有限的,计算出的值到达一定数量时,这样执行效率就会大打折扣。
肓己
2021/08/12
2800
python3.7 迭代器和生成器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项, 要么就引起一个StopIteration异常,已终止迭代,只能往后走,不能往前退. 2、可迭代对象:实现了迭代器协议的对象(对象内部定义一个__iter__()方法),节省内存 3、协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for、sum
py3study
2020/01/19
4520
python迭代器、生成器、装饰器
可以直接作用于for循环的对象统称为可迭代对象,即Iterable。   # 一是集合数据类型,如list、tuple、dict、set、str等;   # 二是generator,包括生成器和带yield的generator function。
用户1432189
2018/09/05
8890
python迭代器、生成器、装饰器
生成器&迭代器
一.生成器 在介绍生成器表达式之前,先看下列表表达式: 1 >>> l = [i for i in range(50) if i % 2] #生成数字50内所有奇数列表 2 >>> l 3 [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49] 生成器表达式和列表表达式一样,不过是()起来而不是[],成器表达式产生的生成器,它自身是一个可迭代对象,同时也是迭代
用户1679793
2018/04/28
5830
python 生成器&迭代器
1、列表生成器:列表生成式就像是一个厨师,他只会做这n(n为任意整数)道菜,想吃甚麽做甚麽,不吃不做,不浪费空间;而列表表达式就相当于已经做好的n盘菜,占用空间。 2、生成器的创建方法:
py3study
2020/01/21
4790
Python中的 生成器、迭代器
上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值
用户7886150
2020/11/30
1.2K0
迭代器和生成器
Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。
全栈程序员站长
2022/07/21
4440
python生成器和迭代器
第二,本次迭代的要依赖上一次的结果继续往下做,如果中途有任何停顿,都不能算是迭代。
用户7886150
2020/11/30
4660
python迭代器与生成器小结
这个东西输出可以脑补一下, 结果是[20,21,22,23], 而不是[10, 11, 12, 13]。 当时纠结了半天,一直没搞懂,后来齐老师稍微指点了一下, 突然想明白了--真够笨的,唉。。好了--正好趁机会稍微小结一下python里面的生成器。
py3study
2020/01/03
3920
相关推荐
理解Python 生成器与迭代器
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验