python基础(八)-迭代器与生成器
一、迭代器
li=[1,2,3]
f=li.__iter__()
print(f)
print(f.__next__())
print(f.__next__())
print(f.__next__()) #运行结果
<list_iterator object at 0x0000000000D770B8>
1
2
3
迭代器:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
之前所说字符串、列表、元组、字典可迭代对象,其实是调用了__iter__方法,生成一个迭代器。
迭代器只能往前不会后退,且遍历取值时只能取一次。
for循环机制:
使用for循环对序列和字典进行迭代,其实就是调用数据对象的__iter__方法,生成迭代器,然后再调用__next__方法取值,直到捕捉StopIteration异常,以终止迭代。
二、生成器
1、定义:
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象
2、Python中生成器两种表现形式:
生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
3、生成器优点:
延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。
节省内存
生成器的唯一注意事项就是:生成器只能遍历一次
4、生成器函数:
def lay_eggs(num):
for egg in range(num):
res='蛋%s' %egg
yield res
print('下完一个蛋') laomuji=lay_eggs()#我们拿到的是一只母鸡
print(laomuji)
laomuji.__next__() #蛋下完 母鸡就死了
def fun():
print('第一次')
res=yield
print('第二次',res)
yield
print('第三次') f=fun()
f.__next__()
f.send('fuck you') #一个效果跟next方法,另一个效果就是传递参数给上次yield
两个小例子:注意取值的地方
def test():
for i in range(4):
yield i g=test() g1=(i for i in g) #g1应该是一个新的生成器
g2=(i for i in g1) print(g)
print(g1)
print(g2)
print(list(g1)) #[0, 1, 2, 3]
print(list(g2)) #[] g2中的g1已经被上一步list取完,此处执行list没有值可取
有点绕的例子一
def add(n,i):
return n+i def test():
for i in range(4):
yield i g=test() #[0,1,2,3]
for n in [1,10]: # n=1 g=[1,2,3,4] ; n=10 g=[11,12,13,14]
g=(add(n,i) for i in g)
print('for',n,g) print(g)
print(list(g)) # [20, 21, 22, 23] 为什么是这个呢? # 过程:1、生成器g 2、for循环列表[1,10] 又是个生成器g-->覆盖之前的g 3、最终生成一个g=(add(10,))
# g=[0,1,2,3] => for循环 n=1 g=[1,2,3,4] ; n=10 g=[11,12,13,14]
比较绕的例子二
def add(n,i):
return n+i def test():
for i in range(4):
yield i g=test() #[0,1,2,3]
for n in [1,10]: # n=1 g=[1,2,3,4] ; n=10 g=[11,12,13,14]
g=(add(n,i) for i in g)
print('for',n,g) print(g)
print(list(g)) # [20, 21, 22, 23] 为什么是这个呢? # 过程:1、生成器g 2、for循环列表[1,10] 又是个生成器g-->覆盖之前的g 3、最终生成一个g=(add(10,))
# g=[0,1,2,3] => for循环 n=1 g=[1,2,3,4] ; n=10 g=[11,12,13,14]
例二的错误解析
def add(n,i):
return n+i def test():
for i in range(4):
yield i g=test() #代码执行,生成一个生成器 [0,1,2,3]
for n in [1,10]: #代码也执行 n= 1
g=(add(n,i) for i in g) # 第一次循环:全局变量n=1,生成新的生成器 g=((add(n,i) for i in test()))
#第二次循环:n=10,生成新的生成器 g=(add(n,i) for i in ((add(n,i) for i in test()))) # 代码执行到这里:全局变量 n = 10 # 如果对生成器 g 取值:执行 __next__() 方法 --> n =10,g=(add(n,i) for i in ((add(n,i) for i in test())))
# 类似于 递归
# print(list(g))
例二的正确解析姿势
python基础(八)-迭代器与生成器的更多相关文章
- Python基础之迭代器和生成器
阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...
- python基础8 -----迭代器和生成器
迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...
- 【Python基础】迭代器、生成器
迭代器和生成器 迭代器 一 .迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单 ...
- 1.17 Python基础知识 - 迭代器和生成器初识
可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象. 列表解析表达式:可以简单高效处理一个可迭代对象,并生成结果列表 示例代码: [ i ** 2 for i in range(10) ] ...
- Python高手之路【九】python基础之迭代器与生成器
迭代器与生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...
- python 基础(五) 迭代器与生成器
迭代器和生成器 迭代器 iterator (1) 迭代对象: 可以直接作用于for循环的 称为可迭代对象(iterable)可以通过 isinstance 判断是否属于可迭代对象 可以直接作用于for ...
- Python基础之迭代器、生成器
一.迭代器: 1.迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值.例如:循环获取容器中的元素. 2.可迭代对象(iterable): 1)定义:具有__ite ...
- python基础之迭代器、生成器、装饰器
一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...
- python基础之迭代器与生成器
一.什么是迭代器: 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器是一个可以记住遍历的位置的对象. 迭代器的 ...
- 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范
1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...
随机推荐
- MACOSX 命令行设置无效网关ip
sudo需要管理员权限 sudo networksetup -setmanual Ethernet 192.168.10.100 255.255.255.0 0.0.0.0 网络设置界面会报错: Ba ...
- hdu 1698 Just a Hook(线段树基础)
成段更新的线段树,加入了延时标记............ 线段树这种东西细节上的理解因人而异,还是要自己深入理解......慢慢来 #include <iostream> #include ...
- TaintDroid:智能手机监控实时隐私信息流跟踪系统(三)
4.3 原生代码标记传播 Native 代码是不受TaintDroid监控的.理想情况下,我们获得了相同的传播语义当使用相同的解释副本时.因此,为了精确的在Java层进行污点监控,我们定义了两个必 ...
- Linux设备驱动开发详解-Note(11)--- Linux 文件系统与设备文件系统(3)
Linux 文件系统与设备文件系统(3) 成于坚持,败于止步 sysfs 文件系统与 Linux 设备模型 1.sysfs 文件系统 Linux 2.6 内核引入了 sysfs 文件系统,sysfs ...
- 【C语言】指针模块
本文目录 直接引用 一.什么是指针? 二.指针的定义 三.指针的初始化 四.指针运算符 五.指针的用途举例 六.关于指针的疑问 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得 ...
- 使用gulp构建自动化工作流
简单易用 高效构建 高质量的生态圈 可能很多人会说现在提gulp也太落后了吧,但我想说写点东西并不是为了讨论它是否过时,而是来帮助我们自己来记忆.整理和学习.任何工具,我需要,我才去使用它,正如此时我 ...
- 【Java每日一题】20170111
20170110问题解析请点击今日问题下方的"[Java每日一题]20170111"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- linux基础命令大全
编辑器 ed vi/vim (交互式) sed (非交互) vi/vim 的使用 1.命令模式 移动光标 方向键 hjkl H L M G 1G nG 复制行 yy nyy 粘贴 p 删除行 dd n ...
- 【游记】NOIP2015造纸记
题目来自HZWER学长的名言:“虽然已经做好了学OI就是打铁的准备.” 然后我发现我已经不是打铁,只能造纸了啊_(:3LZ_) [DAY0] 中午吃了饭才1:00,说好2:30才出发于是各种闲逛.2: ...
- CFRound#379(div2)
题目链接:http://codeforces.com/contest/734 A:SB题. #include<cstdio> #include<cstring> #includ ...