容器(container)
容器是用来储存元素的一种数据结构,容器将所有数据保存在内存中,Python中典型的容器有:list,set,dict,str
等等。
class test():
def __init__(self,data=1):
self.data = data
def __iter__(self):
return self
def __next__(self):
if self.data > 5:
raise StopIteration
else:
self.data+=1
return self.data
for item in test(3):
print(item)
for … in…
这个语句其实做了两件事。第一件事是获得一个可迭代器,即调用了__iter__()
函数。
第二件事是循环的过程,循环调用__next__()
函数。
对于test
这个类来说,它定义了__iter__
和__next__
函数,所以是一个可迭代的类,也可以说是一个可迭代的对象(Python中一切皆对象)。
迭代器
含有__next__()
函数的对象都是一个迭代器,所以test
也可以说是一个迭代器。如果去掉__itet__()
函数,test
这个类也不会报错。如下代码所示:
class test():
def __init__(self,data=1):
self.data = data
def __next__(self):
if self.data > 5:
raise StopIteration
else:
self.data+=1
return self.data
t = test(3)
for i in range(3):
print(t.__next__())
生成器
生成器是一种特殊的迭代器。当调用fib()
函数时,生成器实例化并返回,这时并不会执行任何代码,生成器处于空闲状态,注意这里prev, curr = 0, 1
并未执行。然后这个生成器被包含在list()
中,list
会根据传进来的参数生成一个列表,所以它对fib()
对象(一切皆对象,函数也是对象)调用__next()__
方法,
def fib(end = 1000):
prev,curr=0,1
while curr < end:
yield curr
prev,curr=curr,curr+prev
print(list(fib()))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
简单理解Python
迭代器
迭代器
在使用列表时,直接将数据存入列表将会占据大量空间,且复用率较低,为解决这个问题,这里了解一下迭代器,从而创建一种数据产生的方式,以此来节省空间。
迭代对象
注意,这里需要使用到内建函数__iter__
,简单理解为,使用了__iter__
才会是一个可迭代对象,关于这部分,我们可以对一些对象做一些判断,从而清楚是不是可迭代对象,比如L1
列表:
from collections.abc import Iterable
# 判断L1是否为可迭代对象
L1 = [i for i in range(4)]
print(isinstance(L1, Iterable)) # 结果为True,确定为迭代对象
这里我们使用__iter__()
方法和__next__()
方法来将元素取出。
L2 = L1.__iter__()
# L2 = iter(L1) # 和上面一句等价
print(next(L2))
print(L2.__next__()) # 和上面一句等价
print(next(L2))
在这里我们实现了使用for
循环来取出元素的方法,在了解这里之后,我们开始做一个自己的迭代器
# 构造迭代器
class NewIter():
# 用于生成斐波那契数列
def __init__(self, num):
self.num = num
self.a = 0
self.b = 1
def __iter__(self):
# 创建可迭代对象
return self
def __next__(self):
while self.num > 0:
result = self.a
self.a, self.b = self.b, self.a + self.b
self.num -= 1
return result
# 循环结束后跳出
raise StopIteration
new_iter = NewIter(5)
print(next(new_iter))
print(next(new_iter))
生成器
这里引入生成器个概念,生成器能做到迭代器能做的所有事,由于自动创建了iter()
和next()
方法,生成器显得特别简洁。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出 StopIteration
异常。简单理解他就是迭代器的一种!!使用yield
即可实现。
# 生成器实现
def new_create(num):
# 用于生成斐波那契数列
a, b = 0, 1
while num > 0:
yield a
a, b = b, a+b
num -= 1
new_iter = new_create(5)
print(next(new_iter))
print(next(new_iter))
结语
目的就是节省空间,提高复用率