五. python进阶(迭代器)
Posted sup-to
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五. python进阶(迭代器)相关的知识,希望对你有一定的参考价值。
一. 迭代器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
而生成器不但可以作用于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进阶(迭代器)的主要内容,如果未能解决你的问题,请参考以下文章