在python中混合yield和return语句是一种好习惯吗?

Dav*_*ton 6 python

我非常想要有以下行为:

def foo(bar=None):
    if bar:
        return other_function(other_thing[bar])
    else:
        for i in other_thing:
            yield other_function(i)
Run Code Online (Sandbox Code Playgroud)

这个想法是该函数可以用作生成器来构建所有实例,或者它可以用于返回特定实例.这是在Python中执行此操作的好方法吗?如果没有,是否有更好的方法.

ber*_*eal 11

只有在Python 3中,在语法上可以拥有return valueyield在同一个函数中,在Python 2中它将导致:

SyntaxError: 'return' with argument inside generator
Run Code Online (Sandbox Code Playgroud)

在Python 3中return value,生成器内部实际上是一个语法糖raise StopIteration(value),该yield from子句也支持它:

def f():
    yield from iter('123')
    return 'ok'

def g():
    message = yield from f()
    print('Message:', message)

In [1]: list(g)
Message: ok
Out[1]: ['1', '2', '3']
Run Code Online (Sandbox Code Playgroud)

所以,这个结构不符合你的预期.此外,基于参数值改变函数的返回类型(或者更确切地说,界面)似乎不是一个非常好("pythonic")的想法.这可能是一个品味问题,但是,Guido van Rossum在他的" 编程大师 "一书中的采访中说道:

我有一些个人的烦恼:首先,这是特定于动态语言,不要使方法的返回类型取决于其中一个参数的值; 否则,如果您不知道关系,可能很难理解返回的内容 - 也许类型确定参数是从一个变量中传入的,该变量的内容在读取代码时无法轻易猜出.

  • 这也是 [明确记录](https://docs.python.org/3/reference/expressions.html#yield-expressions):*在函数体中使用 yield 表达式会导致该函数成为生成器*。超出这一点就无所谓了。你使用`yield`,它是一个生成器函数,结束。可达性在这里没有发挥作用。 (4认同)