Python进阶教程,生成器、迭代器一文掌握

迭代的概念上一次输出的结果为下一次输入的初始值 , 重复的过程称为迭代,每次重复即一次迭代 , 并且每次迭代的结果是下一次迭代的初始值
什么是迭代

  1. 访问集合元素的一种方式
  2. 可通过 for 循环遍历的对象 叫可迭代对象
  3. 数字类型 不可迭代
  4. 私信小编01即可获取大量Python学习资料
判断对象是否可迭代: isinstance( ) 判断是否为 Iterable(可迭代对象)
from collections.abc import Iterable#print(isinstance(要判断的对象 , 数据类型))print(isinstance([1,2,3,4],Iterable))是可迭代对象返回 True不是可迭代对象返回 False可迭代的对象
内置iter方法的 , 都是可迭代的对象 。list是可迭代对象 , dict是可迭代对象 , set也是可迭代对象 。
迭代器 Iterator1.为什么要有迭代器?对于没有索引的数据类型 , 必须提供一种不依赖索引的迭代方式 。
2.迭代器定义:迭代器:可迭代对象执行iter方法 , 得到的结果就是迭代器 , 迭代器对象有next方法
它是一个带状态的对象 , 他能在你调用next()方法的时候返回容器中的下一个值 , 任何实现了iter和next()方法的对象都是迭代器 , iter返回迭代器自身 , next返回容器中的下一个值 ,如果容器中没有更多元素了 , 则抛出StopIteration异常
迭代器的遍历循环:
class MyIterator(object):def __init__(self,list):self.list=listself.xiabiao=0def __iter__(self):#获取迭代器 , 自身就为迭代器 , 所以返回自身return selfdef __next__(self):#获取迭代器中的下一个数据if self.xiabiao < len(slef.list):item=self.list[self.xiabiao]self.xiabiao += 1return itemelse:raise StopIteration#抛出 停止迭代异常a=[11,22,33,44,55]my=MyIterator(a) for i in my:print(i) for…in… 循环的本质:先通过iter( )获取可迭代对象的迭代器 , 然后对获取到的迭代器 不断使用next( )方法来获取下一个值 , 并赋值给一个变量 , 当遇到 StopIteration 循环结束
while True:try:print(next( ))except StopIteration:break 迭代器的应用场景: 斐波那契数列
class Fei(object):def __init__(self,n):self.n=nself.weizhi=0记录位置self.num1=0定义初始变量self.num2=1def __iter__(self):获取迭代器 , 此类本身就是迭代器 , 返回自身return selfdef __next__(self):获取迭代器中的下一个数据if self.weizhi < self.n:num=self.num1self.num1,self.num2=self.num2,self.num1+self.num2self.weizhi += 1return numelse:raise StopIterationfei=Fei(10) for i in fei:print(i) 查看迭代器数据的三种方法: for 、list、tuple
#forfor i in fei:print(fei)#listprint(list(fei))#tupleprint(tuple(fei))生成器 generator1.定义
  1. 生成器(generator)是一个特殊的迭代器 , 它的实现更简单优雅 , yield是生成器实现next()方法的关键 。 它作为生成器执行的暂停恢复点 , 可以对yield表达式进行赋值 , 也可以将yield表达式的值返回 。
  2. 也就是说 , yield是一个语法糖 , 内部实现支持了迭代器协议 , 同时yield内部是一个状态机 , 维护着挂起和继续的状态 。
  3. 生成器可以理解为一种数据类型 , 这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己的内置iter方法)
  4. 在Python中 , 一边循环 , 一边计算的机制 , 称为生成器 。
yield的功能:
  1. 相当于为函数封装好iter和next
  2. return只能返回一次值 , 函数就终止了 , 而yield能返回多次值 , 每次返回都会将函数暂停 , 下一次next会从上一次暂停的位置继续执行