我非常想要有以下行为:
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 value和yield在同一个函数中,在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在他的" 编程大师 "一书中的采访中说道:
我有一些个人的烦恼:首先,这是特定于动态语言,不要使方法的返回类型取决于其中一个参数的值; 否则,如果您不知道关系,可能很难理解返回的内容 - 也许类型确定参数是从一个变量中传入的,该变量的内容在读取代码时无法轻易猜出.