python--迭代器
迭代器
可迭代对象有很--str,list,dic,tuple,set,open,range,enumrate等
通过调用dic()方法查看对像的属性和方法
dir('A') dir([]) dir((,)) dir({}) dir()返回值为列表,可先把列表转为set取交集可得到共有方法
得到{'__setstate__', '__next__', '__length_hint__'}这样方法称为下划线方法
li1 = [1,2,3] iterator = li1.__iter__() print(iterator.__next()__) print(iterator.__next()__) print(iterator.__next()__) $1 $2 $3
集合调用__iter__()方法返回迭代器,调用__next__(或next())方法取值
结论:只要含有__iter__()方法的都是可迭代的,即迭代协议
当下标越界时会报错StopIteration
为了进一步证实,可用以下方法测试
from collections import Iterable #可迭代的 from collections import Iterator #迭代器 class A: def __iter__(self):pass def __next__(self):pass a = A() print(isinstance(a,Iterable) print(isinstance(a,Iterator)
1可迭代对象才能用for方法,遇到新对象时查看是否可循环时,查看是否有两个迭代方法
2判断:调用其它方法时,有可能
a.返回值可能是一个可迭代对象或迭代对像
b.返回多个值时,但是只有一个对象(eg:range(10))
c.返回内存值
for 循环内部实现 for i in li1:pass iterator = li1.__iter__() iterator.__next__() $for内部先判断对象是否为可迭代对像,调用next()方法
迭代器的好处:
1.从窗口类型中一个一个的取值,会把所有值都取到
2.节省内存,迭代器并不会在内存中再占用一大块内存,而是随着循环,每次生成一个
# 迭代器只是一次取一个 print(range(10000)) # 而list则是把所有数据都填入到内存中,会报错 print(list[range(100000)])
生成器
生成器generator,生成器本质是迭代器,是自己写的函数,关键字为yield
def generator(): print(1) return 'a' ret = generator() print(ret) #生成器关键字-yield, #生成器函数:执行之后会得到一个生成器作为返回值 def generator(): print(1) yield 'a' ret = generator() print(ret) print(ret.__next__()) $<generator object generator at 0x00000000024A06D0> $1 $a
注意:
1.yield只能写在函数里
2.不能与return共用
3.与return不同的地方在于,return会直接结束函数执行,yield不会结束
def generator(): print(1) yield 'a' print(2) yield 'b' g = generator() ret = g.__next__() print(ret) ret = g.__next__() print(ret) 与for循环相同 for i in g:print(i)