可迭代对象:
可以
直接作用于for循环的对象
统称为
可迭代对象(返回迭代器的对象)
,即Iterable。
# 一是集合数据类型,如list、tuple、dict、set、str等;
# 一是集合数据类型,如list、tuple、dict、set、str等;
# 二是generator,包括生成器和带yield的generator function。
容器:简单来说容器是一系列元素的集合
容器是一种把多个可以逐个地迭代获取的元素组织在一起并存储在内存中的数据结构;可以用in
, not in
关键字判断元素是否包含在容器中。(并不是所有的元素都放在内存,比如迭代器和生成器对象)
在Python中,常见的容器对象有:list.dict.tupe.set.str
迭代器:任何实现了__iter__
和__next__()
方法的对象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,
la=[1,2,3,4] # for i in la: for循环 # print(i)结果:1 2 3 4 print(next(la)) print(next(la)) print(next(la)) 结果TypeError: 'list' object is not an iterator#可迭代对象不一定是迭代器
la=[1,2,3] print(type(la)) 结果<class 'list'> la=iter(la) #通过iter()函数可以把可迭代对象转换成迭代器 print(type(la)) 结果<class 'list_iterator'> print(next(la)) print(next(la)) print(next(la)) print(next(la)) 结果StopIteration
生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写__iter__()
和__next__()
方法,只需要一个yiled
关键字。因此任何生成器也是以一种懒加载的模式生成值。
#iter(可迭代对象) ===> 迭代器-->Iterator。 #迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置, #以方便下次迭代的时候获取正确的元素 #斐波那契(Fibonacci)演示 迭代器 和 生成器 def fab(max): n,a,b=0,0,1 while n<max: yield b #yeild将b转换为生成器对象, a,b=b,a+b n=n+1; #没有return #生成器一定是迭代器,反之不成立 l= fab(10) #l表示生成器 for i in l: print(i) #可迭代类 class Fab(object): def __init__(self,max): self.max=max; self.n,self.a,self.b=0,0,1; def __iter__(self):#迭代器生成方式:1、iter()将可迭代对象转化成迭代器 return self; # 2、实现iter()和next()两个函数 def __next__(self): if self.n<self.max: r= self.b; self.a,self.b=self.b,self.a+self.b; self.n+=1 return r; raise StopIteration(); # f=Fab(10);#f表示迭代器 # for i in f: # print(i) # print( next(f))#nest可以直接操作迭代器(可迭代对象不可以除非用iter()转换一下) # print( next(f)) # print( next(f)) # print( next(f)) # print( next(f)) # print( next(f))
-
- 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了
__next__
和__iter__
方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。 - 生成器是一种特殊的迭代器,它的返回值不是通过
return
而是用yield
。
- 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了