如何在IF中分配变量,然后返回它.(蟒蛇)

TIM*_*MEX 15 python if-statement variable-assignment

def isBig(x):
   if x > 4: 
       return 'apple'
   else: 
       return 'orange'
Run Code Online (Sandbox Code Playgroud)

这有效:

if isBig(y): return isBig(y)
Run Code Online (Sandbox Code Playgroud)

这不起作用:

if fruit = isBig(y): return fruit
Run Code Online (Sandbox Code Playgroud)

为什么第二个不起作用!?我想要1个班轮.除此之外,第一个将调用函数TWICE.

如何制作1个衬垫,不调用两次功能?

Ale*_*lli 16

我看到其他人已经指出我的旧"分配和设置"Cookbook配方,其最简单的版本归结为:

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()
Run Code Online (Sandbox Code Playgroud)

但是,这主要是为了简化Python和语言之间的音译,在这些语言中,if或者直接支持赋值while.如果你在级联中有"数百个"这样的检查和返回,那么做一些完全不同的事情好得多:

hundreds = isBig, isSmall, isJuicy, isBlah, ...

for predicate in hundreds:
  result = predicate(y)
  if result: return result
Run Code Online (Sandbox Code Playgroud)

甚至是类似的东西

return next(x for x in (f(y) for f in hundreds) if x)
Run Code Online (Sandbox Code Playgroud)

如果没有满足谓词就可以获得StopIteration异常,或者

return next((x for x in (f(y) for f in hundreds) if x)), None)
Run Code Online (Sandbox Code Playgroud)

None当没有满足谓词时,if是否是正确的返回值等.

几乎无一例外地,使用(甚至希望;-) Holder诀窍/非成语是一种"设计气味",暗示寻找一种不同的,更多的Pythonic方法 - 一种Holder合理的案例正是我的特殊情况设计它,即你希望在Python代码和一些非Python之间保持密切对应的情况(你在Python中音译一个参考算法,并希望它在重构为更多Pythonic形式之前先工作,或者你'重新编写Python作为原型,一旦它有效地工作,将被音译成C++,C#,Java等).


Xav*_*hot 14

从开始Python 3.8,并引入赋值表达式(PEP 572):=运算符),现在可以将条件值(isBig(y))捕获为变量(x),以便在条件主体内重新使用它:

if x := isBig(y): return x
Run Code Online (Sandbox Code Playgroud)


Chr*_*utz 9

one liner不起作用,因为在Python中,assignment(fruit = isBig(y))是一个语句,而不是表达式.在C,C++,Perl和无数其他语言中,它是一个表达式,你可以把它放在一个if或一个while或任何你喜欢的东西中,但不能放在Python中,因为Python的创造者认为这很容易被滥用(或被滥用) )编写"聪明"的代码(就像你想要的那样).

而且,你的例子相当愚蠢.isBig()将始终评估为true,因为唯一的字符串是false是空字符串(""),所以if在这种情况下你的语句是无用的.我认为这只是对你要做的事情的简化.这样做:

tmp = isBig(y)
if tmp: return tmp
Run Code Online (Sandbox Code Playgroud)

这真的更糟吗?

  • 当你有这样的100行时,听起来有点像你的解决方案是次优的,但我不会说不知道你在做什么. (5认同)
  • 谢谢.顺便说一句,当你有这样的100,它更糟糕:) (2认同)