五. python进阶(迭代器)
一. 迭代器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
dir()查看方法
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
# 表示生成了两个迭代器 而生成器函数可以作用于一个迭代器 ll=[1,2,3,4,5,6] for i in ll: if i==3: break print(i) print("###################################333") for i in ll: print(i)
# a=[1,2,3] # for i in a: # print(i)
# 为什么这些可以循环 # list # dict # str # set # tuple # f=open # range # enumerate
print(dir([])) # 告诉我列表里面有什么方法 print(dir()) # 告诉我元组里面有什么方法 print(dir({})) #告诉我字典里面有什么方法 print(dir('')) #告诉我字符串里面有什么方法 print(dir(range(10))) #告诉我range里面有什么方法 # 双下方法 print([1].__add__([2])) # 同等print([1]+[2]) print([1]+[2])
# 说明一个问题能被for循环的数据类型 就一定拥有__iter__方法 iterator print('__iter__' in dir(int)) # False 不是迭代器 print('__iter__' in dir(bool)) # False 不是迭代器 print('__iter__' in dir(set)) # True print('__iter__' in dir(list)) # True print('__iter__'in dir(dict)) # True 迭代器 print('__iter__'in dir(tuple)) # True 迭代器 print('__iter__'in dir(str)) # True 迭代器 # # 区分可迭代l对象和迭代器 # 可迭代对象是含有iter()方法的对象。iter()方法返回一个迭代器。 # String, tuple, list,dict都是可迭代对象,因为它们都实现了iter()方法; # 但是他们都不是迭代器,因为它们都没有实现iter()方法。 # 执行了__iter__方法之后的返回值是一个迭代器 # 只有含有__iter__方法的都是可以迭代的 就是可迭代协议 # 迭代协议内部含有__next__和__iter__方法就是迭代器
1. 迭代模块
from collections import Iterable from collections import Iterator print(isinstance([],Iterator)) # 判断是不 是迭代器 print(isinstance([],Iterable)) # 判断是不是迭代的对象 print(dir([])) # 判断是不是可以迭代,用Iterable isinstance({}, Iterable) # --> True isinstance((), Iterable) # --> True isinstance(100, Iterable) # --> Fals # 判断是不是迭代器,用Iterator isinstance({}, Iterator) # --> False isinstance((), Iterator) # --> False isinstance( (x for x in range(10)), Iterator) # --> True # 迭代器和可迭代协议 # 可以被for循环都是可以迭代的 # 只要是迭代器 一定可以迭代 # 可迭代的__iter__方法就可以得到一个迭代器 # 迭代器中的__next__方法可以一个一个的获取值 # 迭代器的好处 # 从容器类型中一个一个的取值 会把所有的值取到 # 节省内存 # print(list(range(1000000000))) # 没有真正的生成数据 在内存中 只是通过range 给了个数字 意思就是处理一个数据就生成一个数据 # 通过迭代器模拟for循环 l=[1,2,3,4] aa=l.__iter__() while True: print(aa.__next__()
# Python迭代器(Iterator) """ 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list、tuple、dict、set、str等; 一类是generator,包括生成器和带yield的generator function。 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。 可以使用isinstance()判断一个对象是否是Iterable对象: isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next()。 字符串,列表或元组对象都可用于创建迭代器: """ list=[1,2,3,4] it = iter(list) # 创建迭代器对象 print(it) print (next(it)) # 输出迭代器的下一个元素 # 1 print("11**********************************************************") list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ") # 1 2 3 4 print("22**********************************************************") # 迭代器对象可以使用常规for语句进行遍历: list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ") # 1 2 3 4 print("33**********************************************************") a=[1,2,3] b=a.__iter__() # 使用对象内置的__iter__()方法生成迭代器 print(b) #<list_iterator object at 0x0000014E5A08A2E8> print(b.__next__()) # 1 print(b.__next__()) # 2 print(b.__next__()) # 3 print("44**********************************************************") # f=open("aa.txt","r+") # qq=f.__iter__() # print(qq.__next__())
# 跌带器 案例 a=["爷爷","爸爸","儿子","孙子"] b=a.__iter__() # 创建迭代器对象 print(b.__next__()) # 爷爷 print(b.__next__()) # 爸爸 print(b.__next__()) # 儿子 # 其实next()就是在调用创建的这个迭代 c=["爷爷1","爸爸","儿子","孙子"] b=c.__iter__() # 创建迭代器对象 e=next(b) print(e) # 爷爷1
# 特点: # 只能向前 几乎不站内存 # for 循环 # 惰性机制 # print(dir(list)) # __iter__ iterable # print(dir(str)) # __iter__ # print(dir(int)) # 没有 __iter__ # 所有的带__iter__可以使用for循环 可迭代对象 # 可迭代对象可以使用 __iter__()来获取迭代器 # 迭代器里面有 __next__()方法 # s="abc" # c=s.__iter__() # 迭代器 有 __iter__ () __next__() # # 只能向前 几乎不站内存 # print(c) # <str_iterator object at 0x00000169A4E38400> # print(c.__next__()) # a # print(c.__next__()) # b # print(c.__next__()) # c # print(c.__next__()) # StopIteration 停止迭代 # 迭代器去模拟for 循环 ll=[1,2,3,4,5,6] # for i in ll: # for 循环底层就是用的迭代器 # print(i) print("********************************************************************") aa=ll.__iter__() # 获取迭代器 print(aa) while True: try: print(aa.__next__()) # 获取元素 except StopIteration: # 处理错误 break from collections import Iterable # 可迭代对象 包含 __iter__()函数 from collections import Iterator # 迭代器 __iter__() __next__() # 迭代器 一定可以迭代 print(isinstance([],Iterator)) # False print(isinstance([],Iterable)) #True print(isinstance({},Iterator)) # False print(isinstance({},Iterable)) #True