Python 迭代函数

问题 链接

Python里面的迭代对象遵从迭代器协议,这意味着它们都会提供两个方法:iter()next()iter()将返回迭代对象,且在循环开始时被隐式调用。next()方法返回下一个值,且在每次循环推进时被隐式调用。当迭代器对象中没有可返回值时,next()方法会抛出StopIteration异常,这个异常会被循环捕捉以终止循环。

下面是一个计数器的例子:

class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def next(self):  # Python 3: def __next__(self)
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1

for c in Counter(3, 8):
    print c

这段代码将会输出:

3
4
5
6
7
8

下面是一个更简单的方法:

def counter(low, high):
    current = low
    while current <= high:
        yield current
        current += 1

for c in counter(3, 8):
    print c

更新时间:2022-05-16 12:23:03 标签:python 迭代

Python 迭代函数
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。

Python 对于容器类型数据支持逐个进行迭代处理,迭代会对所有元素按照一个逻辑进行计算操作。因此在 Python 所有数据范围内就存在类型是否是可迭代的话题。为了高效完成迭代操作,Python 专门设计了迭代器类型,这类数据专门用来迭代操作。最后,为了高效快捷创建一个迭代器类型,Python 又有一个生成器类型成生成一个可迭代对象。

主要内容

迭代

迭代(iteration)是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果可能会被用来作为下一次迭代的初始值。

比如将购买的散装鸡蛋放心冰箱时,我们打开冰箱门后,一个一个地将其从篮子里拿出摆放到冰箱,每次 捡拾->搁放 就是一次迭代,这个过程不断重复,走到篮子里的鸡蛋全部放心冰箱。

在计算机科学中,迭代是程序中对一组指令(或一定步骤)的重复,是按照某种顺序逐个访问列表中的每一项。

在编程中,还有一个类似的概念叫 递归(Recursion),我们可以放在一起进行理解。

在函数内部,调用函数自身的编程技巧称为递归( recursion)。递归函数结构清晰,很直观的理解计算过程,但也有严重缺点:相对于普通循环而言,递归运行效率较低,经过很多冗余的计算,递归会消耗大量的调用堆栈。

迭代和递归都是一个事情多次重复下去,解决问题,不过思路不一样。

例子:

  • 递归:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!...
  • 迭代:愚公移山,子子孙孙无穷无尽,干同一件事情。

迭代操作

在 Python 中,我们可以用多种方式来进行迭代操作。最常见的是使用 for 循环来遍历这个 list 或 tuple 等数据。

for

for 语句 是最简便的迭代方法:

for i in ['a', 'b', 'c']:
    print(i)
'''
a
b
c
'''

如果要让元素在迭代时有下标,可以使用内置函数 enumerate(),它会将索引与每个元素形成一个元组对。

next

Python 的内置函数 next() 从迭代器返回下一项。如果给定了默认值,并且迭代器已耗尽,则返回它,而不是引发 StopIteration 错误。我们在使用 next() 前一定要确保操作的对象是一个 迭代器,如果不是可以用内置函数 iter() 转为一个迭代器。

lst = ['a', 'b', 'c']
iter(lst)
# <list_iterator at 0x7f8482698250>

it = iter(lst)

next(it) # 'a'
next(it) # 'b'
next(it) # 'c'
next(it)
# StopIteration:

推导式

列表推导式、字典推导式,都可以完成类似迭代的操作,我们可以将数据转为一个列表和字典:

foo = 'abc'
[i for i in foo]
# ['a', 'b', 'c']

{i:0 for i in foo}
# {'a': 0, 'b': 0, 'c': 0}

当然,上边的过程可以附带操作或者调用函数。

[print(f'哎呀!迭代{i}了') for i in foo]
'''
哎呀!迭代a了
哎呀!迭代b了
哎呀!迭代c了

[None, None, None]
'''

不过不建议这么操作。

while

可以使用 while 对可迭代对象转成的迭代器进行 next() 下一个项的操作,直到迭代完所有项,、抛出 StopIteration 错误。

iterable = ['a', 'b', 'c']
iter_obj = iter(iterable)

# infinite loop
while True:
    try:
        # get the next item
        element = next(iter_obj)
        print(element)
    except StopIteration:
        # if StopIteration is raised, break from loop
        break

'''
a
b
c
'''

参考

  • https://docs.python.org/zh-cn/3/library/stdtypes.html#iterator-types
  • https://docs.python.org/zh-cn/3/reference/expressions.html#yield-expressions
  • https://juejin.cn/post/6844903834381189127
  • https://www.jianshu.com/p/774f9fc03a63
  • https://www.programiz.com/python-programming/iterator
  • https://www.programiz.com/python-programming/generator