迭代器、生成器

首先来看一下迭代的含义:
集合(set),字典(dict)、列表(list)、元组(tuple)、字符串(str)可以通过for...in...语句从其中依次拿到数据并使用,我们称这样的过程叫做遍历,也叫 迭代
迭代是访问集合类元素的一种方式
但是并不是所有的数据都可以通过这种形式进行使用,我们把可以通过这种for...in....语句进行依次读取数据的对象类型称为 可迭代对象(Iterable)
整数类型不能被迭代

如何判断一个对象是否可以迭代:
from collections import Iterable:
isinstance(被判断的对象,Iterable)
返回值为True或False

-----------------------------------------
迭代器(iterator)
迭代器的作用是帮我们记录每次迭代时所访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会给我们返回一个它所记录的位置的下一个位置的数据,这时实际上是调用的迭代器对象的__next__方法,
一个实现了__iter__方法和__next__方法的对象就是迭代器
是迭代器帮助我们实现了这种迭代的过程
list和tuple都是可迭代对象,我们可以通过 iter()函数来获取这些对象的迭代器,
例如:
list=[1,2,3] #list 是迭代对象
li = iter(list) #li就是迭代器,它是由iter函数直接生成的
next(li)------>1 迭代执行一次
next(li)------>2 迭代执行两次
next(li)------>3 迭代执行三次

----------------------------------------------------
如何判断一个可迭代对象是否是迭代器:
from collections import Iterator
isinstance(可迭代对象,Iterator)
返回值为True或False

-----------------------------------------------------
a = [1,2,3,4 ]
for i in a :
print(i)
这个循环本质上是如何执行的:
1.可迭代对象调用__iter__()方法,返回一个迭代器
iterator = a.__iter__()
2.迭代器调用__next__()方法,
如果解释器未抛出StopIteration,说明循环未结束,返回一个数
num = iterator.__next__()
如果解释器抛出StopIteration,说明循环结束
3.执行循环体语句
print(i)
-------------------------------------------------------------------
生成器(generator)是一种特殊的迭代器(iterator)
创建生成器的方法1
将列表推导式外面的方括号改为圆括号,那么它就变成了生成器
L = [for x in range (10)]
G = (for x in range (10))
L是一个列表,而G是一个生成器
我们可以直接打印出列表的每一个元素
而对于生成器我们可以按照对待迭代器的方法进行使用
直接调用next方法、for循环、list()等
G.__next__()

创建生成器的方法2
以斐波那契数列为例
def fib(n):
num1=0
num2=1
current=0
while current<n:
num1,num2 = num2,num1+num2
current +=1
yield num1
当一个函数中含有yield关键字的时候,这就不再是个函数,而是生成器
yield关键字有2点作用
1.保存当前运行状态,然后将程序暂停,即将生成器(函数)挂起
2.将yield关键字后面的表达式的值作为返回值返回,因此可以理解为起到了return得作用
可以使用next()函数让生成器从断点处继续执行,即唤醒生成器
注意:
Python3中可以使用return返回最终的返回值,而Python2中不允许使用return返回值(即可以使用return从生成器中退出,但return后面不能跟任何表达式)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值