python中的迭代

2018/01/23 posted in  Python
Tags: 

python中,迭代是一个很重要的概念,当我们使用各种循环的时候,我们就会用到这个概念,比如:for循环

for是如何工作的?自己如何在类中实现迭代?下面我们就来了解一下:

首先,我们要了解几个概念:迭代可迭代对象迭代器

迭代是一种惰性获取数据的方式,每次返回一个值。

可迭代对象,按照字面意思就是可迭代的对象,在Python中,一个可迭代对象都可以通过内置函数iter()返回一个迭代器。而iter()函数则会检查对象中有没有实现__iter__()函数,如果有则调用__iter__()返回一个可迭代对象,如果没有,则检查是否实现了__getitem__()函数,如果有则根据__getitem__()函数生成一个迭代器,按顺序获取元素,如果都没有,则抛出异常,表明对象不可迭代。

迭代器实现了__next__()函数,可以返回下一个元素,如果没有下一个元素则返回StopIteration的异常。

而我们在提起迭代器的时候,通常还会提起另一个概念生成器

生成器是一种特殊的迭代器,它能够更优雅的实现迭代器的功能。生成器的特征是使用yield关键字,而不使用__iter__()__next__()内置函数。

# 返回从0开始整数的累加值,大于100结束
# 迭代器
class myIter():
    def __init__(self):
        self.count = 0
        self.sum = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.sum += self.count
        self.count += 1
        return self.sum


if __name__ == "__main__":
    a = myIter()
    for i in a:
        print(i)
        if i > 100:
            break
# 返回从0开始整数的累加值,大于100结束
# 生成器
def myGen():
    count, sum = 0, 0
    while True:
        yield sum
        count += 1
        sum += count


if __name__ == "__main__":
    a = myGen()
    for i in a:
        print(i)
        if i > 100:
            break

我们可以看到使用生成器实现的代码看起来更简介,更pythonic。

使用迭代器时我们需要先创建一个类,然后在类里实现__iter__()__next__()两个内置函数。

而使用生成器时,我们只需要定义一个函数,在函数中使用yield做返回,也不需要return

同样的还有生成器表达式,它看起来像一个列表表达式,但是它使用的是()而不是[],并且它返回的是一个生成器对象,而不是列表

# 列表表达式
[x+1 for x in range(10)]
# 生成器表达式
(x+1 for x in range(10))