产量 Python 教程: Generator & 收益率与回报率示例
什么是 Python 屈服?
Python 中的 Yield 关键字的作用类似于 return,但
不同之处在于它不返回值,而是向调用者返回一个生成器对象。
当调用一个函数并且执行线程在函数中找到一个yield关键字时,函数执行将在该行本身停止,并将生成器对象返回给调用者。
句法
yield expression
描述
Python Yield 返回一个生成器对象。 Generators 是特殊函数,必须进行迭代才能获取值。
Yield 关键字将给定的表达式转换为生成器函数,该函数返回一个生成器对象。要获取该对象的值,必须对其进行迭代以读取传递给 Yield 的值。
例如:Yield 方法
以下是一个简单的yield示例。函数testyield()有一个yield关键字,其中包含字符串“Welcome to Guru99 Python 教程“。当调用该函数时,将打印输出并给出生成器对象而不是实际值。
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
是什么 Generator Python?
Generators 是返回可迭代生成器对象的函数。生成器对象的值每次只获取一个,而不是整个列表一起获取,因此要获取实际值,您可以使用 for 循环、next() 或 list() 方法。
运用 Generator function
您可以使用生成器函数和生成器表达式创建生成器。
生成器函数就像普通函数一样,但它没有返回值,而是有一个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
正常函数与s函数之间的区别 Generator 功能。
让我们了解生成器函数与普通函数有何不同。
有 2 个函数 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 关键字时它才会停止。
但是对于生成器函数,一旦执行开始,当它获得第一个收益时,它就会停止执行并返回生成器对象。您可以使用生成器对象来获取值,也可以根据您的要求暂停和恢复。
如何从生成器读取值?
您可以使用 list()、for 循环和 next() 方法从生成器对象读取值。
使用:list()
列表是一个可迭代对象,其元素位于括号内。在生成器对象上使用 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
Generator一次性使用
对于发电机来说,它们只能使用一次。如果你尝试再次使用它们,它将是空的。
例如:
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: []
如果您想再次使用输出,则必须再次调用该函数。
计费示例: Generator斐波那契数列的收益
以下示例展示了如何在 Python。该示例将生成斐波那契数列。
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() 的函数,它使用带有yield关键字的 test()。输出给出给定数字范围的平方值。
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
何时使用 Yii 代替 Return Python
Python3产量 关键字向调用者返回一个生成器,并且只有当生成器被迭代时才开始代码的执行。
A 回报 在函数中是函数执行的结束,并且向调用者返回一个值。
以下是您应该使用 Yield 而不是 Return 的情况
- 当数据量很大时,使用yield代替return
- 当你需要在大型数据集上更快地执行时,Yield 是最佳选择
- 当你想向调用函数返回一大组值时使用yield
- 产量是产生大量或无限数据的有效方法。
收益率与回报率
收益率和回报率的区别如下
产量 | 回程 |
---|---|
Yield 返回一个生成器对象给调用者,只有当生成器被迭代时,代码才开始执行。 | 函数中的返回是函数执行的结束,并将单个值返回给调用者。 |
当函数被调用时,如果遇到yield关键字,函数执行就会停止。它会将生成器对象返回给调用者。只有当生成器对象被执行时,函数才会开始执行。 | 当函数被调用时,开始执行,如果有 return 关键字,则将值返回给调用者。函数内部的 return 标志着函数执行的结束。 |
产量表达 | 返回表达式 |
使用yield关键字时不使用内存。 | 为返回的值分配内存。 |
如果您必须处理大量数据,因为不使用内存,这非常有用。 | 对于非常小的数据量来说很方便。 |
对于较大的数据量,如果使用yield关键字,性能会更好。 | 如果数据量很大,则会占用大量内存,从而影响性能。 |
如果数据量较大,则执行时间会更快。 | 由于需要进行额外处理,所以如果您的数据量很大,因此使用的执行时间会更长,但对于小数据量,它将能正常工作。 |
结语
- Python 中的 Yield 关键字的作用类似于返回,唯一的区别是它不返回一个值,而是将一个生成器函数返回给调用者。
- 生成器是一种特殊类型的迭代器,一旦使用,将无法再次使用。其值不存储在内存中,仅在调用时可用。
- 可以使用 for-in、list() 和 next() 方法读取生成器的值。
- Yield 和 return 之间的主要区别在于,yield 向调用者返回一个生成器函数,而 return 向调用者提供单个值。
- Yield 不会将任何值存储在内存中,其优点是当数据量很大时它很有用,因为没有任何值存储在内存中。
- 对于较大的数据量,如果使用yield关键字而不是return的话,性能会更好。