1、迭代器
1.1、什么是迭代器
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
1.2、为何要有迭代器
迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型有: 列表、字符串、元组、字典、集合、打开文件
上述迭代取值的方式只适用于有索引的数据类型:列表、字符串、元组
为了解决基于索引迭代器取值的局限性
python必须提供一种能够不依赖于索引的取值方式,这就是迭代器
1.3、如何用迭代器
1.3.1、可迭代对象
但凡内置有__iter__方法的都称之为可迭代的对象
s1= ''
s1. __iter__( )
l= [ ]
l. __iter__( )
t= ( 1 , )
t. __iter__( )
d= { 'a' : 1 }
d. __iter__( )
set1= { 1 , 2 , 3 }
set1. __iter__( )
with open ( 'a.txt' , mode= 'w' ) as f:
f. __iter__( )
pass
1.3.2、调用可迭代对象下的__iter__方法会将其转换成迭代器对象
d= { 'a' : 1 , 'b' : 2 , 'c' : 3 }
d_iterator= d. __iter__( )
print ( d_iterator)
print ( d_iterator. __next__( ) )
print ( d_iterator. __next__( ) )
print ( d_iterator. __next__( ) )
print ( d_iterator. __next__( ) )
while True :
try :
print ( d_iterator. __next__( ) )
except StopIteration:
break
print ( '====>>>>>>' )
d_iterator= d. __iter__( )
while True :
try :
print ( d_iterator. __next__( ) )
except StopIteration:
break
l= [ 1 , 2 , 3 , 4 , 5 ]
l_iterator= l. __iter__( )
while True :
try :
print ( l_iterator. __next__( ) )
except StopIteration:
break
1.3.3、可迭代对象与迭代器对象
可迭代对象("可以转换成迭代器的对象" ): 内置有__iter__方法对象
可迭代对象. __iter__( ) : 得到迭代器对象
迭代器对象: 内置有__next__方法并且内置有__iter__方法的对象
迭代器对象. __next__( ) : 得到迭代器的下一个值
迭代器对象. __iter__( ) : 得到迭代器的本身,和没调是一样的
dic= { 'a' : 1 , 'b' : 2 , 'c' : 3 }
dic_iterator= dic. __iter__( )
print ( dic_iterator is dic_iterator. __iter__( ) . __iter__( ) . __iter__( ) )
可迭代对象: 字符串、列表、元组、字典、集合、文件对象
迭代器对象: 文件对象
with open ( 'a.txt' , mode= 'w' ) as f:
f. __iter__( )
f. __next__( )
1.4、for循环的工作原理
for 循环可以称之为叫迭代器循环
d= { 'a' : 1 , 'b' : 2 , 'c' : 3 }
for k in d:
print ( k)
with open ( 'a.txt' , mode= 'rt' , encoding= 'utf-8' ) as f:
for line in f:
print ( line)
list ( 'hello' )
1.5、迭代器优缺点总结
优点:
( 1 ) 、为序列和非序列类型提供了一种统一的迭代取值方式。
( 2 ) 、惰性计算: 迭代器对象表示的是一个数据流,可以只在需要时才去调用next 来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。
缺点:
( 1 ) 、除非取尽,否则无法获取迭代器的长度
( 2 ) 、只能取下一个值,不能回到开始,更像是'一次性的' ,迭代器产生后的唯一目标就是重复执行next 方法直到值取尽,否则就会停留在某个位置,等待下一次调用next ; 若是要再次迭代同个对象,你只能重新调用iter 方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。
2、生成器
2.1、定义与使用
生成器: 就是一种自定义的迭代器, 是用来返回多次值
自定义迭代器的好处: 节省内存
return 只能返回一次值,函数就立即结束了
yield
1 、可以挂起函数,保存函数的运行状态
2 、可以用来返回多次值
def func ( ) :
print ( '111' )
yield 1 , 2
print ( '222' )
yield
print ( '333' )
yield 3
print ( '44444444444' )
如何得到生成器(自定义的迭代器):
函数内但凡存在yield 关键字,调用函数不会执行函数体代码, 会得到一个返回值,该返回值就是我们自定义的生成器
g = func( )
print ( g)
g. __iter__( )
g. __next__( )
res1 = next ( g)
print ( res1)
res2 = next ( g)
print ( res2)
res3 = next ( g)
print ( res3)
next ( g)
2.2、生成器的案例
def my_range ( start, stop, step= 1 ) :
while start < stop:
yield start
start += step
g= my_range( 1 , 5 )
print ( next ( g) )
print ( next ( g) )
print ( next ( g) )
print ( next ( g) )
print ( next ( g) )
for i in my_range( 1 , 5000 ) :
print ( i)