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)
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)
这真的更糟吗?