Python| 理解yield关键字及示例分享

在本文中,我们将介绍Python中的yield关键字。在开始之前,让我们了解一下yield关键字的定义。
Python中yield关键字的语法:

def gen_func(x):
    for i in range(x):
        yield i

yield关键字有什么作用?

yield关键字用于创建生成器函数。一种高效利用内存的函数类型,可以像迭代器对象一样使用。
通俗地说,yield关键字将把任何与它一起给出的表达式转换为生成器对象,并将其返回给调用者。因此,如果希望获得存储在生成器对象中的值,则必须迭代生成器对象。

Python中return和yield的区别

Python中的yield关键字类似于用于返回值的return语句,它将生成器对象返回给调用包含yield的函数的人,而不是简单地返回一个值。它们之间的主要区别是,return语句终止函数的执行。而yield语句只暂停函数的执行。另一个区别是return语句永远不会执行。而当函数恢复其执行时执行yield语句。
yield优点:

使用yield关键字是非常高效的,因为只有当调用者遍历对象时才会执行。
当变量状态被保存时,我们可以从同一点暂停和恢复,从而节省时间。

yield缺点:

有时,由于函数生成器多次返回值,因此很难理解代码流。
必须正确处理生成器函数的调用,否则可能会导致程序错误。

示例1-Python中的Generator函数和yield关键字

生成器函数的行为与普通函数一样,但具有一个定义特征。Python生成器函数使用yield关键字,而不是返回数据。生成器的主要好处是它们自动创建函数__iter__()和next()。生成器提供了一种非常整洁的技术来生成巨大或无限的数据。

def fun_generator():
    yield "Hello world!!"
    yield "Geeksforgeeks"
 
 
obj = fun_generator()
 
print(type(obj))
 
print(next(obj))
print(next(obj))

​输出:

<class 'generator'>
Hello world!!
Geeksforgeeks

示例2-生成无限序列

在这里,我们使用yield生成一个无限序列,yield返回数字并将num递增+ 1。
注意:这里我们可以观察到num+=1在yield之后执行,但是在return的情况下,在return关键字之后没有执行。

def inf_sequence():
    num = 0
    while True:
        yield num
        num += 1
for i in inf_sequence():
    print(i, end=" ")

输出:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96.......

示例3-在列表中使用yield

在这里,我们从列表中提取偶数。

# generator to print even numbers
def print_even(test_list):
    for i in test_list:
        if i % 2 == 0:
            yield i
 
# initializing list
test_list = [1, 4, 5, 6, 7]
 
# printing initial list
print("The original list is : " + str(test_list))
 
# printing even numbers
print("The even numbers in list are : ", end=" ")
for j in print_even(test_list):
    print(j, end=" ")

​输出:

The original list is : [1, 4, 5, 6, 7]
The even numbers in list are :  4 6 

示例4-使用yield关键字作为布尔值

可能的实际应用是,当处理最后一个数据量并从中搜索细节时,可以使用yield,因为我们不需要从头开始重新查找,从而保存时间。根据使用情况,可能存在许多yield应用。 ​

# func to count number of given word
def print_even(test_string):
    for i in test_string:
        if i == "geeks":
            yield i
 
 
# initializing string
test_string = " There are many geeks around you, \
              geeks are known for teaching other geeks"
 
# count numbers of geeks used in string
count = 0
print("The number of geeks in string is : ", end="")
test_string = test_string.split()
 
for j in print_even(test_string):
    count = count + 1
 
print(count)

​输出:

The number of geeks in string is: 3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值