欢迎访问宙启技术站
智能推送

Python函数:如何使用生成器函数来创建可迭代对象?

发布时间:2023-05-31 22:03:44

生成器函数是一种能够产生中间结果流的 Python 函数,它能够逐步地结算出 List、Set、Dict 等集合类型。生成器是一个可迭代对象,数据只有在迭代时才实时计算,适合处理大量数据。

生成器函数用关键字 yield 来返回一个值,并暂停函数执行,将程序控制权返回给调用者。当调用者请求下一个值时,函数将恢复执行,计算下一个结果,并返回给调用者。生成器函数可以通过列表解析和特定函数,以包含大量数据,减少了计算时间和计算空间。这里介绍如何使用生成器函数创建可迭代对象。

一、生成器函数的定义

在生成器函数中使用 yield 关键字来返回结果,并保存状态以便从上次离开的地方继续执行。看下面这个简单的示例,实现打印数字列表的功能:

def num_list(n):
    i = 0
    while i < n:
        yield i
        i += 1

for num in num_list(5):
    print(num)

使用 yield 关键字返回值,函数会生成一组中间结果,这些结果在需要时才会被生成。此处的 num_list(5)是一个生成器对象,可以调用 next 函数,也可以经过迭代输出。

二、使用生成器函数创建可迭代对象

生成器函数可以创建可以使用 for 循环迭代的可迭代对象,以及 iter() 和 next() 函数。通过生成器函数定义一个新的可迭代对象,并在调用元素时循环计算结果,实现了对大数据集的高效处理。

class my_gen:

    def __init__(self, n):
        self.n = n
        self.current = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.n:
            self.current += 1
            return self.current - 1
        else:
            raise StopIteration


if __name__ == '__main__':
    obj = my_gen(10)
    i = iter(obj)

    for item in obj:
        print(item)

这个实现是上面那个示例的类版本。我们先定义好一个生成器函数,然后调用 iter() 函数创建一个迭代器,使用 next() 函数来获取值,并在不断递增地循环中停止。

三、python 标准库中的生成器函数

Python 标准库中也提供了一些常用的生成器函数,比如:

1. range(start, stop, step):在 start 和 stop 之间创建包含 step 步长的数字序列,这个函数与列表解析非常相似。

list(range(0, 5, 1)) # [0, 1, 2, 3, 4]

2. zip(iterables):迭代器在并行循环时最常用的工具,将数个可迭代对象作为输入,构建成一个元素为元组的迭代器。

a = [1, 2, 3]
b = [4, 5, 6]
for i in zip(a, b):
    print(i) # (1, 4), (2, 5), (3, 6)

3. map(function, iterable, ...):对一个序列中的每个元素进行操作,可以是一元(单个参数)或多元(含有两个以上参数)的函数。

a = [1, 2, 3]
b = [4, 5, 6]

def fun(x, y):
    return x * y

result = map(fun, a, b)
for i in result:
    print(i)

生成器函数的使用提高了代码的可读性和可维护性,提高了 Python 编程中的效率。生成器函数返回基于 yield 的中间结果,通过迭代访问,最终计算生成结果,这使得处理大型数据集变得更加高效。以上就是如何使用生成器函数来创建可迭代对象。