一、容器
容器就是一个用来存储多个元素的数据结构,常见的容器包括【列表】、【元组】、【字典】、【集合】、【字符串】。
容器有两个特点:1、容器中的元素可通过迭代获取 2、所有容器中的元素被存储在内存中
二、可迭代对象
可迭代对象,简单的说就是可以被迭代获取的对象,iterable定义了可返回迭代器的__iter__方法
通过iter()方法,我们能将可迭代对象返回成迭代器。
from collections.abc import Iterable
#定义一个列表,其本身是可迭代对象
lsit = ['a','b','c']
isinstance(lsit,Iterable)
a = iter(lsit)
#对迭代器调用next()方法
print(next(a))
print(next(a))
print(next(a))
print(next(a)) #抛出StopIteration异常
三、迭代器
迭代器是一个带状态的对象,迭代器内部持有一个状态,应该用于记录 当前迭代所在位置,以便于下次迭代的时候获取正确的元素。迭代器可以通过next()方法来迭代获取下一值
迭代器实现了__iter__() 和 next()方法。而且,迭代器不会一次性把所有元素都加载到内存。而是需要的时候才返回结果。
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的for
循环本质上就是通过不断调用next()
函数实现的
创建一个返回数字的迭代器,初始值为1 ,逐步递增:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
#输出结果
1
2
3
4
5
四、生成器
在python中,使用了yield的函数被称为生成器
和普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作更简单点理解生成器就是一个迭代器。在生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代对象。
使用yield实现斐波那契数列:
def fib(n):
a = 1
b = 1
while n:
yield a
a,b = b,a+b
n = n-1
for ii in fib(10):
print(ii)
总览:可迭代对象、迭代器、生成器之间的关系
= b,a+b
n = n-1
for ii in fib(10):
print(ii)