迭代器
字符串和整数的区别:
dir(str)
dir(int)
字符串有__iter__
整数没有__iter__
迭代对象与迭代器
什么是迭代对象
只要能被循环遍历的对象,就被称为迭代对象
一个对象或者类包含了__iter__()魔术方法,这个 类/对象,就是可迭代对象
__iter__()魔术方法:
通过这个得到的是当前对象的迭代器
iter(可迭代对象) 返回的是迭代器
通过__next__()方法可以遍历当前对象的数据
next(迭代器)
__next__ 获取元素
__length_hint__ 获取迭代器中剩余元素个数
__setstate__ 决定取值的位置
什么是迭代器
是一个可以记住遍历位置的对象
一个包含__next__()魔术方法的对象
迭代器特点
可迭代对象是可以使用循环遍历的一种特殊数据
比如字符串,该对象包含了一个__iter__魔术方法
通过魔术方法的执行可以得到该对象的迭代器
自定义一个迭代器:
class Persion:
def __init__(self, fa = ['小王', '小李','小孙']):
self.fa = fa
self.index = 0
def __iter__(self):
# 返回当前对象
return self
def __next__(self):
d = self.fa[self.index]
self.index += 1
return d
p = Persion()
print(p.__next__())
print(p.__next__())
print(p.__next__())
生成器
生成器就是一边循环,一边计算的机制,称为生成器
为什么要使用生成器
通过生成器生成,进行优化 ,记录生成数据的方法,需要一个数据就生成一个数据,而不是一次性将所有数据生成出来,避免了内存开销过大,耗时过长的问题
生成器创建的两种方式
1、生成器表达式
格式:将列表推导式的[]改为()
访问数据:next()函数 这种方式超出范围时会报错
生成器的本质就是迭代器,所以可以使用循环遍历,但是同一个数据不能生成两次
2、生成器函数
一个包含yield关键字的函数就是生成器函数
例
一个函数中可以写多个yield
yield和return类似都是用于返回数据的,但是yield不会结束函数,会记录函数当前执行的位置
下次再使用生成器时,从当前记录的位置开始执行
send() 获取下一个值的结果,和next()方法基本一样,但是在获取下一个值的时候给上一个yield位置传递一个数据
使用时需要注意
第一次使用生成器的时候使用next(),
如果使用send必须传参数None
最后一个yield不能接受外部的值