今日主要内容:
1.可迭代对象
2.迭代器
3.生成器
1.可迭代对象
什么是可迭代对象:内部含有__iter__方法的对象,就是可迭代对象.
查看__iter__方法:dir(对象)
可迭代对象就遵循可迭代协议。
接触过的可迭代对象有:str,list,tuple,dict,set,range
迭代器:f1文件句柄
如何判断
法一:
例:s = 'laonanhai'
print('__iter__' in dir(s))
法二:
例:l = [1, 2, 3, 4]
from collections import Iter
print(isinstance(l, Iterable))
返回结果:# True
2.迭代器
什么是迭代器
可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器
不仅含有__iter__方法,还要含有__next__方法
例:l1 = [1,2,3]
l1_obj = l1.__iter__()
print('__iter__' in dir(l1_obj)) #True
print('__next__' in dir(l1_obj)) #True
判断迭代器:
法一:
print('__iter__' in dir(l1_obj)) #判断是否是可迭代对象
print('__next__' in dir(l1_obj)) #判断是否为迭代器
法二:
from collections import Iterator
print(isinstance(l1_obj, Iterator))
迭代器的好处:
1.节省内存空间,只有执行__next__函数,才会进行下一步,并加载到内存中.
2.满足惰性机器
3.不能反复取值,不可逆.
例:用while循环模拟for循环内部机制
思路:
'''
1.将可迭代对象转化成迭代器
2.内部使用__next__方法,取值
3.运用了异常处理去处理报错
'''
li = [1,2,3,4,5,6,7]
li_obj = li.__iter__()
while True:
try:
i = li_obj.__next__()
printe(i)
except Exception:
break
# Exception 表示一切非代码错误
3.生成器
(1)
什么是生成器:生成器本质是迭代器,是特殊的迭代器.所以迭代器的有点它都具有.
(2)
生成器的产生方式:
1.生成器函数构造
2.生成器推导式构造
3.数据类型的转换
1.生成器函数构造
方法:
正常函数下面将return 变成yield,就可以将函数转变成生成器.
例:
def funcl():
print(666)
print(555)
return 777
print(funcl())
def funcl1():
print(666)
print(555)
yield 444
yleld 777
g = funcl()
print(g)
结论:# <generator object func1 at 0x0000000001197888>
解析:
第一:函数中只要有yield 那他就不是一个函数,而是一个生成器
第二:g称作生成器对象
执行:
print(g.__next__())
print(g.__next__())
print(g.__next__()) #超出yield数量,报错
sent的作用
next 和send 功能一样,都是执行一次
send可以给上一个yield赋值
例:
def generator():
print(123)
content = yield 1
print(content)
print(456)
yield 2
g = generator()
g.__next__()
g.send('hello')