迭代器
简单点说,可以使用 for 来进行遍历的对象,都是迭代器,比如我们常用的 列表、元组、字典、字符串等
首先迭代器一定是可迭代的,是可迭代对象,可迭代对象内部一般是实现了 iter 和 next 方法,我们可以用 isinstance() 去判断一个对象是否是迭代器
而 isinstance() 是根据一个对象内部是不是实现了 next 方法来判读其是不是迭代器,因此具有一定的局限性。因为python内部的解释器会使用 getitem() 来逐个
遍历对象内的元素,如果可以遍历,那么遍历的对象也是迭代器,所以:迭代器一定是可迭代的,可迭代对象不一定是迭代器
例:
定义列表
list_a = [1,2,3,4,5]
是否是迭代器# False(因为列表内部是没有实现 next 方法的)
print(isinstance(list_a, Iterator))
是否是可迭代的# True(因为可以通过 for 循环进行遍历)
print(isinstance(list_a, Iterable))
在没有经过处理前,list_a 不是迭代器,接下来可经过处理后变成迭代器(本质就是实现 next 方法)
class my_iterator():
def __init__(self,list_a):
self.list_a = list_a
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.list_a):
res = self.list_a[self.index]
self.index += 2
return res
raise StopIteration
my_ite = my_iterator(list_a)
# 经过迭代器内部的 next 处理后,列表成为迭代器,因为 isinstance 是判断是否有 next,有就是可迭代的
print(isinstance(my_ite, Iterator)) # True
for i in my_ite:
print(i)
输出结果:因为我们对默认值做了修改,原先的默认值是 +1 ,在这里调整为+2;self.index += 2
1
3
5
生成器
是一个可以像迭代器那样使用for循环来获取元素的函数。实现了延时计算,从而缓解了在大量数据下内存消耗过猛的问题。
生成器里的关键词:yield
它相当于我们函数里的 return,但与 return 又有所不同。
1、当一个函数运行到 yield 后,函数的运行会暂停,并且会把 yield 后的值返回出去。
2、若 yield 没有接任何值,则返回 None
3、yield 虽然返回了,但是函数并没有结束
def my_yeild(top):
index = 0
while index < top:
print(f'index的值为:{index}')
index += 0.5
yield index
ye = my_yeild(top=1)
# 生成器构造完毕之后,需要对生成的可迭代对象进行遍历才可以拿到元素,是没有办法在构造的时候拿到生成的元素的
print(ye) # <generator object my_yeild at 0x00000253509E6420>
这个时候并没有输出我们想要的数值,需要进行一个遍历才可以。
for i in ye:
print(i)
输出结果:因为我们对默认值做了修改,原先的默认值是 +1 ,在方法里我们对默认值做了 +0.5 的修改
index的值为:0
0.5
index的值为:0.5
1.0