博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0403迭代器、生成器
阅读量:4570 次
发布时间:2019-06-08

本文共 1663 字,大约阅读时间需要 5 分钟。

一、迭代器

1,可以用for循环的就是迭代对象

内部含有__iter__方法的对象就叫做可迭代对象

可迭代对象就遵循可迭代协议。

可迭代对象:str,list,tuple,dict,set,range,

迭代器:f1文件句柄

两种方式判断print('__iter__' in dir(s))    #dir(),查看对象的所有方法 from collections import Iterablel = [1, 2, 3, 4]print(isinstance(l, Iterable)) # True
可迭代对象转化成迭代器:可迭代对象.__iter__()  --->迭代器 迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。
li=[1,2,3,4,5,6,]li_obj=li.__iter__()   #迭代器
迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。 判断迭代器: print('__iter__' in  dir(l1_obj)) print('__next__' in dir(l1_obj)) from collections import Iterator print(isinstance(l1_obj, Iterator)) 迭代器的好处: 1,节省内存空间。 2,满足惰性机制。 3,不能反复取值,不可逆。

for循环,能遍历一个可迭代对象,他的内部到底进行了什么?

1,将可迭代对象转化成迭代器 2,内部使用__next__一个一个取值 3,运用了异常处理去处理报错。
用while循环实现for循环 li = [1,2,3,4,5,6,7]li_obj = li.__iter__()while True:   try:      i = li_obj.__next__()      print()i

二、生成器

本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
生成器的产生方式: 1,生成器函数构造。 2,生成器推导式构造。 3,数据类型的转化。
 
第一:函数中只要有yield 那他就不是一个函数,而是一个生成器 第二:g称作生成器对象。
def func1():    print(111)    print(222)    print(333)    yield 666    yield 555    yield 777g = func1()print(g)  # 
print(g.__next__()) #111 222 333 666print(g.__next__()) #111 222 333 666 555print(g.__next__()) #111 222 333 666 555 777
常规函数定义,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间, 挂起函数的状态,以便下次重它离开的地方继续执行
 
def generator():    print(123)    content = yield 1    print('=======',content)    print(456)    yield2g = generator()ret = g.__next__()print('***',ret)ret = g.send('hello')   #send的效果和next一样print('***',ret)#send 获取下一个值的效果和next基本一致#只是在获取下一个值的时候,给上一yield的位置传递一个数据#使用send的注意事项    # 第一次使用生成器的时候 是用next获取下一个值    # 最后一个yield不能接受外部的值

转载于:https://www.cnblogs.com/Mr-Murray/p/8710552.html

你可能感兴趣的文章
C# 中的委托和事件
查看>>
用户控件 RadioButtonList
查看>>
superset开启本地缓存filesystem
查看>>
第一次使用Git上传本地项目到github上
查看>>
discuz 门户栏目URL跳转异常的问题
查看>>
python介绍
查看>>
CSS3--关于z-index不生效问题
查看>>
java中的引用类型
查看>>
jQuery源码浅析
查看>>
Struts 2(四):类型转换
查看>>
Java基础-学习笔记(十一)——类的继承性
查看>>
XHProf性能分析工具
查看>>
[ISE 14.7]Fail to Link the designer导致无法仿真问题
查看>>
用双指针实现PLC堆栈设计
查看>>
ubuntu debain下好用的编辑器
查看>>
.NET Core Community 第四个千星项目诞生:微服务框架 Surging
查看>>
JavaScript高级程序设计55.pdf
查看>>
mysql日期函数_英文简写月的转换
查看>>
列表list
查看>>
[LibreOJ 3124]【CTS2019】氪金手游【容斥原理】【概率】【树形DP】
查看>>