Python 教程中的收益:生成器和收益与返回示例
什么是 Python 产量?
python中的yield关键字的作用就像一个返回唯一
不同之处在于它不是返回一个值,而是将一个生成器对象返回给调用者。
当一个函数被调用并且执行线程在函数中找到一个yield关键字时,函数执行会在该行本身停止,并将一个生成器对象返回给调用者。
在本 Python 教程中,您将学习:
- 什么是 Python 产量?
- 语法
- 什么是 Python 中的生成器?
- 普通函数与生成器函数之间的区别。
- 如何从生成器中读取值?
- 生成器是一次性使用的
- 示例:斐波那契数列的生成器和收益
- 示例:使用 Yield 调用函数
- 在 Python 中何时使用 Yield 而不是 Return
- 收益率与回报率
语法
yield expression
说明
Python yield 返回一个生成器对象。生成器是特殊函数,必须迭代才能获取值。
yield 关键字将给出的表达式转换为一个生成器函数,该函数返回一个生成器对象。要获取对象的值,必须对其进行迭代以读取赋予产量的值。
示例:收益方法
这是一个简单的产量示例。函数 testyield() 有一个带有字符串“Welcome to Guru99 Python Tutorials”的 yield 关键字。当函数被调用时,输出被打印出来并给出一个生成器对象而不是实际值。
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
输出:
<generator object testyield at 0x00000028265EB9A8>
给出的输出是一个生成器对象,它具有我们给yield的值。
但是我们没有得到我们必须在输出中给出的消息!
要打印给 yield 的消息,必须迭代生成器对象,如下例所示:
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() for i in output: print(i)
输出
Welcome to Guru99 Python Tutorials
什么是 Python 中的生成器?
生成器是返回可迭代生成器对象的函数。生成器对象的值一次获取一个,而不是一起获取完整列表,因此要获取实际值,您可以使用 for 循环,使用 next() 或 list() 方法。
使用生成器函数
您可以使用生成器函数和生成器表达式创建生成器。
生成器函数就像一个普通函数,它没有返回值,而是有一个 yield 关键字。
要创建生成器函数,您必须添加一个 yield 关键字。以下示例显示了如何创建生成器函数。
def generator(): yield "H" yield "E" yield "L" yield "L" yield "O" test = generator() for i in test: print(i)
输出:
H E L L O
Normal 函数与 Generator 函数之间的区别。
让我们了解生成器函数与普通函数的不同之处。
有两个函数 normal_test() 和 generator_test()。
假设这两个函数都返回字符串“Hello World”。 normal_test() 使用return,generator_test() 使用yield。
# Normal function def normal_test(): return "Hello World" #Generator function def generator_test(): yield "Hello World" print(normal_test()) #call to normal function print(generator_test()) # call to generator function
输出:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
输出显示,当您调用普通函数 normal_test() 时,它会返回 Hello World 字符串。对于带有 yield 关键字的生成器函数,它返回
这是生成器函数和普通函数之间的主要区别。现在要从生成器对象中获取值,我们需要使用 for 循环中的对象或使用 next() 方法或使用 list()。
print(next(generator_test())) # will output Hello World
添加到普通函数与生成器函数的另一个区别是,当您调用普通函数时,执行将在它到达 return 时开始和停止 并将值返回给调用者。因此,当执行开始时,您不能在两者之间停止正常功能,它只会在遇到 return 关键字时停止。
但是在生成器函数的情况下,一旦执行开始,当它获得第一个收益时,它就会停止执行并返回生成器对象。您可以使用生成器对象来获取值,还可以根据您的要求暂停和恢复。
如何从生成器中读取值?
您可以使用 list()、for 循环和使用 next() 方法从生成器对象中读取值。
使用:列表()
列表是一个可迭代对象,其元素包含在括号内。在生成器对象上使用 list() 将给出生成器保存的所有值。
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(list(num))
输出:
[0, 2, 4, 6, 8]
使用:for-in
在示例中,定义了一个函数 even_numbers() 将为您提供定义的 n 的所有偶数。对函数 even_numbers() 的调用将返回一个生成器对象,用于 for 循环。
示例:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i)
输出:
0 2 4 6 8
使用 next()
next() 方法将为您提供列表、数组或对象中的下一项。一旦列表为空,并且如果调用 next(),它将返回一个带有 stopIteration 信号的错误。这个错误,来自 next() 表明列表中没有更多的项目了。
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num))
输出:
0 2 4 6 8 Traceback (most recent call last): File "main.py", line 11, in <module> print(next(num)) StopIteration
发电机是一次性使用
如果是发电机,它们只能使用一次。如果您再次尝试使用它们,它将是空的。
例如:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i) print("\n") print("Calling the generator again: ", list(num))
输出:
0 2 4 6 8 Calling the generator again: []
如果您希望再次使用输出,则必须再次调用函数。
示例:斐波那契数列的生成器和收益率
以下示例展示了如何在 Python 中使用生成器和 yield。该示例将生成斐波那契数列。
def getFibonnaciSeries(num): c1, c2 = 0, 1 count = 0 while count < num: yield c1 c3 = c1 + c2 c1 = c2 c2 = c3 count += 1 fin = getFibonnaciSeries(7) print(fin) for i in fin: print(i)
输出:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
示例:使用 Yield 调用函数
在这个例子中会看到如何使用yield调用一个函数。
下面的示例有一个名为 test() 的函数,它返回给定数字的平方。还有另一个名为 getSquare() 的函数使用 test() 和 yield 关键字。输出给出给定数字范围的平方值。
def test(n): return n*n def getSquare(n): for i in range(n): yield test(i) sq = getSquare(10) for i in sq: print(i)
输出:
0 1 4 9 16 25 36 49 64 81
在 Python 中何时使用 Yield 而不是 Return
Python3 产量 关键字返回一个生成器给调用者,代码的执行只有在生成器被迭代时才开始。
返回 在函数中是函数执行的结束,返回给调用者一个单一的值。
在这里,是应该使用 Yield 而不是 Return 的情况
- 数据量大时使用yield代替return
- 当您需要在大型数据集上更快地执行时,Yield 是最佳选择
- 当您想向调用函数返回大量值时,请使用 yield
- 产量是产生大量或无限数据的有效方式。
收益与回报
这里,是收益和回报之间的区别
产量 | 返回 |
---|---|
yield返回一个生成器对象给调用者,代码的执行只有在生成器被迭代时才开始。 | 函数中的return是函数执行的结束,返回一个单一的值给调用者。 |
当函数被调用并且遇到yield关键字时,函数执行停止。它将生成器对象返回给调用者。只有在执行生成器对象时才会开始执行函数。 | 当函数被调用时,如果有return关键字,则开始执行并将值返回给调用者。函数内部的 return 标志着函数执行的结束。 |
屈服表达式 | 返回表达式 |
使用yield关键字时不占用内存。 | 为返回的值分配内存。 |
如果由于不使用内存而不得不处理巨大的数据量时非常有用。 | 非常适合非常小的数据量。 |
如果yield关键字用于大数据量,性能会更好。 | 如果数据量很大会影响性能,则会使用大量内存。 |
在大数据量的情况下执行时间更快。 | 使用的执行时间更多,因为如果您的数据量很大,它会进行额外的处理,对于小数据量也可以正常工作。 |
总结:
- python 中的 yield 关键字的作用类似于 return,唯一的区别是它不是返回一个值,而是将生成器函数返回给调用者。
- 生成器是一种特殊类型的迭代器,一旦使用,将不再可用。这些值不存储在内存中,仅在调用时可用。
- 可以使用 for-in、list() 和 next() 方法读取来自生成器的值。
- yield 和 return 的主要区别在于,yield 返回一个生成器函数给调用者,而 return 给调用者一个单一的值。
- Yield 不会将任何值存储在内存中,其优点是在数据量很大时很有用,因为没有任何值存储在内存中。
- 与 return 大数据量相比,如果使用 yield 关键字,性能会更好。
Python