如何在IF中分配变量,然后返回它?

时间:2009-10-11 07:57:30

标签: python if-statement variable-assignment

def isBig(x):
   if x > 4: 
       return 'apple'
   else: 
       return 'orange'

这有效:

if isBig(y): return isBig(y)

这不起作用:

if fruit = isBig(y): return fruit

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

如何使它成为1个衬里,而不是两次调用该函数?

8 个答案:

答案 0 :(得分:16)

我看到其他人已经指出了我原来的“分配和设置”食谱,其最简单的版本归结为:

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与ifwhile中直接支持分配的语言之间的音译。如果你在级联中有“数百个”这样的检查和返回,那么做很多更好地做一些完全不同的事情:

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是没有满足谓词的正确返回值,等等。

几乎无一例外地,使用(甚至希望;-) Holder技巧/非成语是一种“设计气味”,它建议寻找一种不同的更多Pythonic方法 - {{1} 1}}被证明是我设计它的特殊情况,即你希望在Python代码和一些非Python之间保持密切对应的情况(你在Python中音译参考算法并希望它工作首先将它重构为更Pythonic的形式,或者你正在编写Python作为原型,一旦它有效地工作就会被音译成C ++,C#,Java等。

答案 1 :(得分:8)

one liner不起作用,因为在Python中,赋值(fruit = isBig(y))是一个语句,而不是表达式。在C,C ++,Perl和无数其他语言中,它是一个表达式,您可以将它放在ifwhile或任何您喜欢的内容中,但不能放在Python中,因为Python的创建者认为这很容易被滥用(或被滥用)来编写“聪明”的代码(就像你想要的那样)。

另外,你的例子很傻。 isBig()将始终评估为true,因为唯一的字符串false是空字符串(""),因此在这种情况下,您的if语句无效。我认为这只是对你要做的事情的简化。就这样做:

tmp = isBig(y)
if tmp: return tmp

真的更糟吗?

答案 2 :(得分:2)

如果你想用PHP(或C)编码,请在其中编码。不要试图强迫其方法使用其他语言。

Python背后的基本原则之一(在我看来)是它的可读性。你应该使用:

fruit = isBig(y)
if fruit: return fruit

我还应该提到你使用isXXX()非常奇怪;它通常用于返回布尔值。特别是在这种情况下,您在IF语句中使用它。

答案 3 :(得分:0)

由于有意识的语言设计,这不起作用,但您可以使用this trick来解决此决定

答案 4 :(得分:0)

问题是赋值操作不能被评估为具有布尔值。 if语句依赖于能够评估布尔值。例如,

>>> fruit = 'apple'
>>> bool(fruit = 'apple')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/Users/jem/<ipython console> in <module>()

TypeError: 'fruit' is an invalid keyword argument for this function
>>> bool('a')
True

答案 5 :(得分:0)

您可以使用生成器:

def ensure(x):
    if x: yield x

for fruit in ensure(isBig(y)):
    return fruit

答案 6 :(得分:0)

<td data-toggle="collapse" data-target="#collapseOne" aria-expanded="true"[attr.aria-controls]=client.cnk> 开始并引入assignment expressions (PEP 572)Python 3.8运算符),现在可以将条件值(:=)捕获为变量({{1 }}),以便在条件体内重新使用它:

isBig(y)

答案 7 :(得分:-3)

print "apple" if x > 4 else "orange"