产量 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的话,性能会更好。