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

Python生成器函数:一次生成一个值

发布时间:2023-06-18 09:45:45

Python生成器函数是一个特殊的函数,当被调用时返回一个生成器对象,该对象可以逐个生成值。相比于一次生成所有值,生成器函数可以节省大量内存。这是因为生成器在生成下一个值时,并不会生成所有值,而是在需要时逐个生成。

Python生成器函数的定义:

生成器函数以关键字yield定义,返回一个生成器对象。

def my_generator():
    yield 1
    yield 2
    yield 3

以上代码定义了一个生成器函数,它可以生成数字1、2和3。当调用my_generator()函数时,函数并不会立即返回值,而是返回一个生成器对象,可以通过next()函数逐个获取值。例如:

gen = my_generator()
print(next(gen))  # 输出1
print(next(gen))  # 输出2
print(next(gen))  # 输出3

在生成器函数中可以使用yield来返回一个值,并记住程序的状态。当再次调用next()函数时,生成器会继续从下一个yield语句继续执行。例如:

def countdown(num):
    print('Starting')
    while num > 0:
        yield num
        num -= 1

gen = countdown(5)
print(next(gen))  # 输出5
print(next(gen))  # 输出4
print(next(gen))  # 输出3

以上代码定义了一个生成器函数countdown(num),它可以倒数数字num。当调用该函数时,程序会在while循环中断,返回yield语句的值,即num的当前值。随后生成器对象会被挂起,等待下一次调用next()函数。当再次调用next()函数时,程序会继续执行while循环中的代码,直到下一个yield语句。这样就达到了一个状态的记忆,节省了内存和计算资源。

需要注意的是,当生成器函数没有可生成的值时,会抛出StopIteration异常。例如:

def my_gen():
    yield 1
    yield 2
    yield 3

gen = my_gen()
print(next(gen))  # 输出1
print(next(gen))  # 输出2
print(next(gen))  # 输出3
print(next(gen))  # 抛出StopIteration异常

以上代码尝试获取4个值,但生成器中只有3个值,因此第4次调用next()函数时会抛出StopIteration异常。

生成器函数是Python中一个非常方便的工具,它可以在需要时逐个生成值,省去了一次性生成所有值的开销和资源浪费。理解生成器函数的使用方法,可以在程序设计中带来很多便利。