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

Python中的生成器函数:如何使用yield生成序列?

发布时间:2023-06-12 07:37:02

Python中的生成器函数是一种特殊的函数,与普通函数不同,它可以生成序列。生成器函数可以使用yield语句定义,在运行时返回一个生成器对象。生成器对象可以像序列一样迭代,但它并不会将所有的元素一次性存储在内存中,而是在需要时动态生成,并逐个返回。这大大降低了序列的存储和计算成本,特别适用于处理海量数据的情况。

在Python中,生成器函数具有很多优势,例如:优化内存使用、提高程序效率、简化代码等。下面我们将通过几个实例,来演示如何使用yield生成序列。

1. 生成斐波那契数列

斐波那契数列指的是:1,1,2,3,5,8,13,……,数列中第一个数和第二个数都是1,从第三个数开始,每个数都是它前面两个数的和。我们可以使用生成器函数生成这个数列:

def fib(max):
    a, b = 0, 1
    while a<max:
        yield a
        a, b = b, a+b

print(list(fib(10)))

输出结果为:[0, 1, 1, 2, 3, 5, 8],说明在10以内生成了一个斐波那契数列序列。这段代码比使用循环自动生成这个数列要简单得多。

2. 生成自然数序列

有时候,我们需要生成一个自然数序列,这个序列可以是从1开始的递增的整数序列。这里介绍两种方法:

方法一:

def naturals(number=0):
    while True:
        yield number
        number += 1

n = naturals()
for i in range(10):
    print(next(n))

输出结果为:0,1,2,3,4,5,6,7,8,9。这里使用了while循环,不断产生新的自然数。

方法二:

def naturals():
    n = 1
    while True:
        yield n
        n += 1

n = naturals()
for i in range(10):
    print(next(n))

输出结果同样为:1,2,3,4,5,6,7,8,9,10。这段代码和上面的代码作者区别在于,这里没有指定初始值,而是默认从1开始生成自然数。

3. 生成偶数序列

我们可以使用生成器函数生成一个偶数序列,这个序列的元素都是偶数。这里介绍两种方法:

方法一:

def evens(number=0):
    while True:
        if number % 2 == 0:
            yield number
        number += 1

e = evens()
for i in range(10):
    print(next(e))

输出结果为:0,2,4,6,8,10,12,14,16,18。这里使用了if语句判断一个数是否是偶数,如果是偶数就生成。

方法二:

def evens():
    n = 0
    while True:
        yield n
        n += 2

e = evens()
for i in range(10):
    print(next(e))

输出结果同样为:0,2,4,6,8,10,12,14,16,18。这段代码和上面的代码作者区别在于,这里默认从0开始生成偶数,每次生成的数都加2,确保元素都是偶数。

4. 生成一个由任意字母组成的随机字符串

我们可以使用生成器函数生成一个随机字符串,这个字符串由任意字母组成。这里介绍两种方法:

方法一:

import string
import random

def rand_str(length):
    all_chars = string.ascii_letters
    for i in range(length):
        yield random.choice(all_chars)

rs = rand_str(10)
print(''.join(list(rs)))

输出结果为:随机生成的由10个字母组成的字符串。这里使用了random.choice函数,从all_chars中随机挑选一个字母,生成一个随机字符串。

方法二:

import string
import random

def rand_str(length):
    all_chars = string.ascii_letters
    result = ''
    for i in range(length):
        result += random.choice(all_chars)
    yield result

rs = rand_str(10)
print(list(rs))

输出结果同样为:随机生成的由10个字母组成的字符串。这段代码和上面的代码作者区别在于,这里使用了result存储随机字符串,并且使用了yield一次性生成整个字符串。

上面几个例子展示了如何使用yield生成序列。使用生成器函数具有很多优势,例如节省内存使用、提高程序效率、代码紧凑简单易读等。在处理大规模数据的时候,使用生成器函数能够使程序更为高效。