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)

浙公网安备 33010602011771号