python 之 看yield的返回值

本文解释了Python中生成器的概念及其与迭代器的区别。通过示例代码展示了如何使用yield关键字创建生成器,并讨论了如何观察yield的返回值。此外,还介绍了在循环中使用生成器的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

含有yield的函数就是生成器,不是普通的函数。生成器包含有迭代器,“雨果”不明白什么是生成器和迭代器参见

http://blog.youkuaiyun.com/xiaofeng_yan/archive/2010/09/27/5910215.aspx

下面重点说一下,怎么看 yield 的返回值。

大家要记住,看yield的值必须在循环里,因为只有在循环里才能使yield返回值或者具有可迭代的函数里如列表。

比如:

def test(lst):
        try:
                for sublist in lst:
                        print "sublist"
                for element in test(sublist):
                        print 'element=', element
        except TypeError:
                print 'TypeError'
                yield lst

for i in test(1):
        print i
这里test(1) 使得for sublist in lst 引发了一个异常。然后调用yield lst语句。它返回了什么呢?  我们就用for i in test(1)来看它的值。

或者:

def test(lst):
        try:
                for sublist in lst:
                        print "sublist"
                for element in test(sublist):
                        print 'element=', element
        except TypeError:
                print 'TypeError'
                yield lst

print list(test(1))

执行的结果是[1],没错list将数字“1”转换成了列表。因为列表是可用于迭代的。

Python 中的语法结构多种多样,每种结构在执行后可能会产生不同的返回值。以下是几种常见语法结构及其返回值的详解。 ### 条件语句 `if-elif-else` `if-elif-else` 结构本身没有直接的返回值,但可以用于控制程序流程,从而影响函数或表达式的返回结果。例如,在一个函数中根据条件返回不同值: ```python def check_number(num): if num > 0: return "Positive" elif num < 0: return "Negative" else: return "Zero" ``` 在这个例子中,函数 `check_number` 根据输入数字的正负性返回不同的字符串[^1]。 ### 循环语句 `for` 和 `while` 循环语句通常也不直接返回值,它们主要用于重复执行一段代码块。然而,通过结合 `return` 或 `yield` 关键字,可以在特定情况下从循环内部返回数据。比如使用 `for` 循环遍历列表并查找元素: ```python def find_element(lst, target): for element in lst: if element == target: return f"Found {target}" return "Not found" ``` 此函数会在找到目标元素时立即返回消息,否则继续搜索直至结束再返回未找到的信息[^1]。 ### 异常处理 `try-except-else-finally` 异常处理结构允许程序优雅地处理运行时错误。虽然这个结构不直接给出返回值,但它可以通过 `except` 块捕获异常,并决定是否重新引发、忽略或者采取其他措施来改变程序的行为路径。此外,`else` 块内的代码仅当没有异常发生时才会被执行,这也可以用来提供额外的逻辑分支。 ```python def divide(a, b): try: result = a / b except ZeroDivisionError: return "Cannot divide by zero." else: return result ``` 这里,如果除法操作成功完成,则返回计算结果;若出现除以零的情况,则捕捉到异常后返回相应的错误信息[^1]。 ### 函数定义 `def` 定义函数时,使用 `return` 指令指定函数应该输出什么值。如果没有显式调用 `return`,那么默认情况下该函数将返回 `None`。对于生成器函数(包含 `yield` 表达式的函数),其行为有所不同——每次迭代都会暂停并在下一次迭代时恢复执行。 ```python def simple_generator(): yield 1 yield 2 yield 3 gen = simple_generator() print(next(gen)) # 输出 1 print(next(gen)) # 输出 2 ``` 生成器函数利用 `yield` 提供了一种简便的方式来创建迭代器对象,这些对象能够记住上次被中断的位置以便后续继续执行[^2]。 ### 类与对象 类是面向对象编程的核心概念之一。当你创建了一个类实例后,可以通过方法调用来获取有关该对象的状态信息或者其他相关计算结果。例如: ```python class Rectangle: def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height rect = Rectangle(5, 10) print(rect.area()) # 输出 50 ``` 此处,`area()` 方法负责计算矩形面积并将其作为浮点数返回[^1]。 ### 列表推导式 & 字典推导式 这类简洁的构造方式使得快速生成新序列成为可能。它们总是会生成一个新的可迭代对象作为最终产物。 ```python squares = [x**2 for x in range(5)] # 等价于 squares = [] for x in range(5): squares.append(x**2) even_squares = {x: x**2 for x in range(10) if x % 2 == 0} ``` 以上两个示例分别展示了如何用列表推导式和字典推导式高效地构建集合型数据结构[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值