Python中的yield break

75 投票
4 回答
66225 浏览
提问于 2025-04-16 19:49

根据对这个问题的回答,C#中的yield break相当于Python中的return。在正常情况下,return确实会停止一个生成器。但是,如果你的函数只做了return,你会得到一个None,而不是一个空的迭代器,这个空迭代器是C#中的yield break返回的。

def generate_nothing():
    return

for i in generate_nothing():
    print i

你会遇到一个TypeError: 'NoneType' object is not iterable的错误,但如果我在return之前加上并且从未运行过的yield,这个函数就会返回我期待的结果。

def generate_nothing():
    if False: yield None
    return

这样做是有效的,但感觉有点奇怪。你有没有更好的想法?

4 个回答

10

当然可以!请看下面的内容:

在编程中,我们经常会遇到一些问题,尤其是当我们在使用某些工具或库的时候。有时候,文档可能写得不够清楚,或者我们对某些概念不太理解,这就需要我们去寻求帮助。

比如说,有人可能在使用某个编程语言时,遇到了错误信息,或者在运行代码时发现程序没有按预期工作。这时候,他们会把问题发到像StackOverflow这样的网站上,寻求其他程序员的建议和解决方案。

在提问时,描述问题的方式非常重要。清晰地说明你遇到的具体情况,比如你使用的是什么工具、遇到的错误信息是什么、你尝试过哪些解决方法等等,这样其他人才能更好地理解你的问题,并给出有效的帮助。

总之,编程过程中遇到问题是很正常的,重要的是要学会如何有效地寻求帮助,并从中学习和成长。

def generate_nothing():
    return iter([])
52

处理这个问题的一个好方法是抛出 StopIteration 异常。这种情况发生在你的迭代器没有更多的内容可以提供时,当你调用 next() 时就会出现这个异常。这样做也能优雅地结束一个循环,而不会执行循环内部的任何代码。

举个例子,假设我有一个元组 (0, 1, 2, 3),我想得到重叠的对 ((0, 1), (1, 2), (2, 3))。我可以这样做:

def pairs(numbers):
    if len(numbers) < 2:
        raise StopIteration

    for i, number in enumerate(numbers[1:]):
        yield numbers[i], number

现在 pairs 可以安全地处理只有一个数字或更少的列表。

67

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当某个变量的值达到一定的标准时,我们就希望程序能做出反应。这种情况下,我们可以使用“条件语句”。

条件语句就像是一个判断的开关,只有当条件满足时,程序才会执行特定的代码。想象一下,你在家里有一个灯开关,只有当你按下开关时,灯才会亮。条件语句的工作原理就类似于这个开关。

在编程中,常见的条件语句有“如果(if)”和“否则(else)”。“如果”后面跟着一个条件,如果这个条件为真,程序就会执行“如果”后面的代码;如果条件不成立,程序就会执行“否则”后面的代码。

通过使用条件语句,我们可以让程序更加灵活,能够根据不同的情况做出不同的反应。这就像是给程序加上了智慧,让它能根据环境变化做出相应的决策。

def generate_nothing():
    return
    yield

撰写回答