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个衬里,而不是两次调用该函数?
答案 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与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
是没有满足谓词的正确返回值,等等。
几乎无一例外地,使用(甚至希望;-) Holder
技巧/非成语是一种“设计气味”,它建议寻找一种不同的更多Pythonic方法 - {{1} 1}}被证明是我设计它的特殊情况,即你希望在Python代码和一些非Python之间保持密切对应的情况(你在Python中音译参考算法并希望它工作首先将它重构为更Pythonic的形式,或者你正在编写Python作为原型,一旦它有效地工作就会被音译成C ++,C#,Java等。
答案 1 :(得分:8)
one liner不起作用,因为在Python中,赋值(fruit = isBig(y)
)是一个语句,而不是表达式。在C,C ++,Perl和无数其他语言中,它是一个表达式,您可以将它放在if
或while
或任何您喜欢的内容中,但不能放在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"