亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

Python 教程中的收益:生成器和收益与返回示例

什么是 Python 产量?

python中的yield关键字的作用就像一个返回唯一

不同之处在于它不是返回一个值,而是将一个生成器对象返回给调用者。

当一个函数被调用并且执行线程在函数中找到一个yield关键字时,函数执行会在该行本身停止,并将一个生成器对象返回给调用者。

在本 Python 教程中,您将学习:

语法

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关键字时,函数执行停止。它将生成器对象返回给调用者。只有在执行生成器对象时才会开始执行函数。 当函数被调用时,如果有return关键字,则开始执行并将值返回给调用者。函数内部的 return 标志着函数执行的结束。
屈服表达式 返回表达式
使用yield关键字时不占用内存。 为返回的值分配内存。
如果由于不使用内存而不得不处理巨大的数据量时非常有用。 非常适合非常小的数据量。
如果yield关键字用于大数据量,性能会更好。 如果数据量很大会影响性能,则会使用大量内存。
在大数据量的情况下执行时间更快。 使用的执行时间更多,因为如果您的数据量很大,它会进行额外的处理,对于小数据量也可以正常工作。

总结:


Python

  1. Python 匿名/Lambda 函数
  2. Python 生成器
  3. Python 闭包
  4. Python 装饰器
  5. Python String strip() 函数与示例
  6. Python 字符串长度 | len() 方法示例
  7. 带有示例的 Python Lambda 函数
  8. 带有示例的 Python round() 函数
  9. 带有示例的 Python map() 函数
  10. 集合中的 Python 计数器示例
  11. Python 中的 Enumerate() 函数:循环、元组、字符串(示例)
  12. Python time.sleep():为您的代码添加延迟(示例)