def isBig(x): if x > 4: return 'apple' else: return 'orange'
这有效:
if isBig(y): return isBig(y)
这不起作用:
if fruit = isBig(y): return fruit
为什么第二个不起作用!?我要一线。除此以外,第一个将调用函数TWICE。
如何在不调用函数两次的情况下使其成为1个衬板?
我看到其他人已经指出了我的旧“分配和设置”食谱,该食谱的最简单版本归结为:
class Holder(object): def set(self, value): self.value = value return value def get(self): return self.value h = Holder() ... if h.set(isBig(y)): return h.get()
但是,这主要是为了简化Python和直接在if或中支持赋值的语言之间的音译while。如果你有在级联这种检查和回报“数百名”,这是 多 好做一些完全不同的:
if
while
hundreds = isBig, isSmall, isJuicy, isBlah, ... for predicate in hundreds: result = predicate(y) if result: return result
甚至像
return next(x for x in (f(y) for f in hundreds) if x)
如果不满足谓词就可以获取StopIteration异常,或者
return next((x for x in (f(y) for f in hundreds) if x)), None)
None当不满足谓词时,if是正确的返回值,等等。
None
几乎总是使用(甚至希望;-)Holder技巧/非习惯用法是一种“设计气味”,这表明正在寻找一种不同且更具Python风格的方法-Holder有理由的一种情况正是我所针对的特殊情况设计了它,例如,要在Python代码和某些非Python之间保持紧密对应的情况(您要在Python中音译参考算法,并希望它先工作才能重构为更Pythonic的形式,或者重新将Python编写为原型,一旦其有效运行,它将转化为C ++,C#,Java等)。
Holder