python中内部含有__iter__方法的对象,都是可迭代对象,使用dir可以看该对象的的以字符串的形式所有方法名。
l1=[1,2,3,4]
s1=100
print('__iter__' in dir(l1)) #True
print('__iter__' in dir(s1))#False
可迭代对象占用内存,不能迭代取值(除去索引、key以为)不理解为啥可迭代对象不能迭代取值的意思,说for循环取值是先转迭代器再取值的不懂呀?
迭代器迭代器内部含有__iter__和 next__方法的对象就是迭代器,迭代对象不一定就是迭代器,迭代器返回的是一个内存地址。
可迭代对象能否转化为迭代器:可以的,加上__iter()就行
l1=[1,2,3,4] obj = l1.__iter__() print(obj) #
迭代器取值的两种方式:
每__next__一次,取一个值,取完了还next的话,就会报stopIteration的错误
l1 = [1,2,3,4] obj = iter(l1) ret = obj.__next__() print(ret)#1 ret = next(obj) print(ret)#2 ret = next(obj) print(ret)#3 ret = next(obj) print(ret)#4 ret=next(obj) print(ret)# stopIteration
还有就是可以直接用for循环去取
s1='我是一个字符串'
obj=iter(s1)
for i in range(2):
print(next(obj))
迭代器就是节省内存,可以通过循环+next方法取值。迭代器去每次取的放到内存空间中,你下次再取时上次取的就释放了,把新的数据放进去。
生成器生成器本质是迭代器,但是也有不同
创建生成器的三种方式
1、通过生成器函数
生成器函数是普通函数用return返回一个值,还有一种函数用yield返回值,这种函数叫生成器函数,函数调用时返回一个生成器对象。生成器其实是一种特殊的迭代器,生成器一定是迭代器。
def fib(max):
prev,curr=0,1
while max>0:
max-=1
yield curr
prev,curr=curr,prev+curr
if __name__=='__main__':
ret=fib(6)
for n in ret:
print(n)
yield vs return
yield 生成器函数可以设置多个,并不会终止函数,return只能有一个,终止函数
2、通过生成器推导式
生成器推导式和列表推导式规则一样只不过需要把[]换成()返回的是生成器对象
x=(x*x for x in range(10)) print(x) #at 0x00000166F8640580>
yield from
在下面的例子中 yield 调用for循环返回的是[1,2,3,4];yield from 返回的是 1,2,3,4这种;这有什么区别?yield from 返回的是列表中的每个元素。将每个可迭代对象中的每一个数据作为生成器结果返回,下面例子中列表是可迭代对象,不是将列表整个作为生成器返回,而是每一个元素作为一个生成器返回。
def func():
lst=[1,2,3,4]
yield lst
ret=func()
for i in ret:
print(i) #[1, 2, 3, 4]
def fuc1():
lst=[1,2,3,4]
yield from lst
ret1=fuc1()
for i in ret1:
print(i)
# 1
# 2
# 3
# 4
python中的迭代器与生成器说一下?
迭代器是python中含有双下划线__next__和__iter__方法的可迭代对象,取值可以使用next方法 后者 for i in 迭代器取值,next 每次只能取一个值,如果取完了还next的话,会报错,优点只有用到取进来的时候才占用内存
生成器就是一种特殊的迭代器,有两种生成方式第一种就是生成器函数,使用yield作为返回值返回,返回的是一个生成器,可以用for 循环取值
另一种可以用生成器推导式生成一个生成器。



