Python函数中的yield的作用和用法详解
在Python中,yield关键字用于定义生成器函数。生成器是一种特殊的迭代器,它在调用next()函数时挂起(暂停执行)函数并返回一个值,然后再在下一次调用next()函数时从当前位置继续执行,直到函数执行完毕或者碰到一个return语句。
下面是一个简单的使用yield的例子:
def my_generator():
yield 1
yield 2
yield 3
for value in my_generator():
print(value)
输出结果:
1
2
3
可以看到,在my_generator()函数中,我们使用yield关键字来返回值。每次调用next()函数时,函数会暂停执行并返回一个值。在这个例子中,我们可以使用for循环来迭代生成器对象,并依次打印每个返回的值。
yield的作用是使函数具有生成器的特性,即可以通过多次迭代产生一系列的值,而不是一次性返回所有的值。此外,使用yield可以让生成器函数在迭代时暂停并恢复执行,从而避免了一次性返回大量的数据造成的性能问题。
除了使用yield返回值之外,yield语句还可以接收调用者传入的值。例如:
def my_generator():
i = 0
while True:
i += 1
value = yield i
if value is not None:
i = value
gen = my_generator()
print(next(gen)) # 输出 1
print(gen.send(10)) # 输出 11
print(next(gen)) # 输出 12
print(gen.send(5)) # 输出 6
print(next(gen)) # 输出 7
在这个例子中,我们定义了一个无限循环的生成器函数my_generator(),每次循环都会产生一个数字。此外,该函数还可以接收一个值,并将其赋值给i。在第一次调用next()函数时,生成器函数会从yield i语句挂起,并返回i的当前值1。在第二次调用gen.send(10)时,生成器函数会从yield i语句继续执行,并将10赋值给value,然后返回i的新值11。在第三次调用next()函数时,生成器函数会继续执行,并返回i的新值12。同样,在第四次调用gen.send(5)时,生成器函数会从yield i语句继续执行,并将5赋值给value,然后返回i的新值6。
总之,使用yield可以让函数具有生成器的特性,从而产生一系列的值,而不是一次性返回所有的值。此外,使用yield还可以接收调用者传入的值,并将其赋值给函数内部的变量,从而实现更加灵活的生成器。
