小编典典

如何在IF条件中分配变量,然后将其返回?

python

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个衬板?


阅读 228

收藏
2020-12-20

共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。如果你有在级联这种检查和回报“数百名”,这是
好做一些完全不同的:

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是正确的返回值,等等。

几乎总是使用(甚至希望;-)Holder技巧/非习惯用法是一种“设计气味”,这表明正在寻找一种不同且更具Python风格的方法-Holder有理由的一种情况正是我所针对的特殊情况设计了它,例如,要在Python代码和某些非Python之间保持紧密对应的情况(您要在Python中音译参考算法,并希望它先工作才能重构为更Pythonic的形式,或者重新将Python编写为原型,一旦其有效运行,它将转化为C
++,C#,Java等)。

2020-12-20