可迭代协议
iterable:可迭代的,重复的。
迭代:将某个数据集内的数据一个挨一个的取出来,叫迭代
from collections import Iterable l = [1,2,3,4] t = (1,2,3,4) d = {1:2,3:4} s = {1,2,3,4} print(isinstance(l,Iterable)) print(isinstance(t,Iterable)) print(isinstance(d,Iterable)) print(isinstance(s,Iterable))
可迭代协议:可以被迭代满足要求的协议就叫做可迭代协议,就是内部实现了_iter_方法
print(dir([1,2])) print(dir((2,3))) print(dir({1:2})) print(dir({1,2}))
iterator 迭代器,迭代程序
迭代器协议:必须拥有_iter_和_next_方法
''' dir([1,2].__iter__())是列表迭代器中实现的所有方法,dir([1,2])是列表中实现的所有方法,都是以列表的形式返回给我们的,为了看的更清楚,我们分别把他们转换成集合, 然后取差集。 ''' #print(dir([1,2].__iter__())) #print(dir([1,2])) print(set(dir([1,2].__iter__()))-set(dir([1,2])))
谁能取值
我们用迭代器next来写一个不依赖for的遍历
l = [1,2,3,4] l_iter = l.__iter__() item =l_iter.__next__() print(item) item =l_iter.__next__() print(item) item =l_iter.__next__() print(item) item =l_iter.__next__() print(item)
使用while循环实现
l =[1,2,3,4] l_iter = l.__iter__() while True: try: item = l_iter.__next__() print(item) except StopIteration: break
还账:next和iter
print('_next_' in dir(range(12))) print('_iter_' in dir(range(99))) from collections import Iterable print(isinstance(range(10000000),Iterable))
为什么要用for循环,年轻人,for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法
l = [1,2,3] index = 0 while index < len(l): print(l[index]) index +=1
生成器:自己写的这个能实现迭代器功能的东西就叫生成器
Python中提供的生成器:
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
生成器Generator:
本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
特点:惰性运算,开发者自定义
生成器函数
初识生成器函数
复制代码 import time def genrator_fun1(): a = 1 print('现在定义了a变量') yield a b = 2 print('现在又定义了b变量') yield b g1 = genrator_fun1() print('g1 : ',g1) #打印g1可以发现g1就是一个生成器 print('-'*20) #我是华丽的分割线 print(next(g1)) time.sleep(1) #sleep一秒看清执行过程 print(next(g1))
#初识生成器二 def produce(): """生产衣服""" for i in range(2000000): yield "生产了第%s件衣服"%i product_g = produce() print(product_g.__next__()) #要一件衣服 print(product_g.__next__()) #再要一件衣服 print(product_g.__next__()) #再要一件衣服 num = 0 for i in product_g: #要一批衣服,比如5件 print(i) num +=1 if num == 5: break