Python 如何在IF条件下分配变量,然后返回它?
这项工作:Python 如何在IF条件下分配变量,然后返回它?,python,if-statement,variable-assignment,Python,If Statement,Variable Assignment,这项工作: def isBig(x): if x > 4: return 'apple' else: return 'orange' 这不起作用: if isBig(y): return isBig(y) 为什么第二个不行!?我想要一条一轮的。除此之外,第一个函数将调用该函数两次 如何在不调用函数两次的情况下使其成为一个线性函数?问题在于赋值操作不能被计算为具有布尔值。if语句依赖于能够计算布尔值。比如说, if fruit = isBig(
def isBig(x):
if x > 4:
return 'apple'
else:
return 'orange'
这不起作用:
if isBig(y): return isBig(y)
为什么第二个不行!?我想要一条一轮的。除此之外,第一个函数将调用该函数两次
如何在不调用函数两次的情况下使其成为一个线性函数?问题在于赋值操作不能被计算为具有布尔值。
if
语句依赖于能够计算布尔值。比如说,
if fruit = isBig(y): return fruit
水果=‘苹果’
>>>布尔(水果=苹果)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
/用户/jem/in()
TypeError:“fruit”是此函数的无效关键字参数
>>>布尔('a')
真的
如果你想用PHP(或C)编码,就用它编码。不要试图把它的方法强加给另一种语言 Python背后的一个基本原则(在我看来)是可读性。您应该使用:
>>> 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
我还应该提到,您使用的
isXXX()
非常奇怪;它通常用于返回布尔值。尤其是在这种情况下,如果在IF
语句中使用它,那么单行程序就不起作用了,因为在Python中,赋值(fruit=isBig(y)
)是一个语句,而不是一个表达式。在C、C++、perl和无数其他语言中,它是一个表达式,如果或<代码>,<>代码>或任何你喜欢的,但不在Python中,你可以把它放在<代码>中,因为Python的创作者认为这太容易被滥用(或滥用)来编写“聪明”代码(就像你正在尝试)。
而且,你的例子相当愚蠢isBig()
将始终计算为true
,因为唯一为false的字符串是空字符串(“”
),因此在这种情况下,if
语句是无用的。我想这只是你想做的事情的简化。只要这样做:
fruit = isBig(y)
if fruit: return fruit
真的有那么糟糕吗?我看到其他人已经指出了我以前的“分配和设置”食谱,它的最简单版本归结为:
tmp = isBig(y)
if tmp: return tmp
然而,这主要是为了简化Python和语言之间的音译,而在if
或while
中直接支持赋值。如果您有“数百”个这样的检查并以级联方式返回,那么最好做一些完全不同的事情:
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()
甚至是类似的
hundreds = isBig, isSmall, isJuicy, isBlah, ...
for predicate in hundreds:
result = predicate(y)
if result: return result
如果没有满足谓词,则可以获取StopIteration异常,或者
return next(x for x in (f(y) for f in hundreds) if x)
如果None
是不满足谓词时的正确返回值,等等
几乎无一例外地,使用(甚至希望;-)Holder技巧/非惯用语是一种“设计味道”,意味着寻找一种不同的、更具python风格的方法--Holder被证明是正当的一种情况正是我设计它的特殊情况,即。,在这种情况下,您希望在Python代码和一些非Python代码之间保持密切的对应关系(你正在Python中对一个引用算法进行音译,并希望它在将其重构成更为python的形式之前工作,或者你将Python写入原型,一旦它有效工作,它将被翻译成C++、C、java等。”< /P> < P>可以使用生成器:< /P>
print "apple" if x > 4 else "orange"
从Python 3.8开始,引入(
:=
操作符),现在可以将条件值(isBig(y)
)捕获为变量(x
),以便在条件体中重复使用:
def ensure(x):
if x: yield x
for fruit in ensure(isBig(y)):
return fruit
我不认为这两个版本或多或少是可读的,但也许这是从经验中得到的。而且,IMHO更一致地使它成为一个表达式,因为
#define begin{
,因为Pascal程序员不想适应。这种行为使得代码在两种语言中都没有用处。谢谢。顺便说一句,当你有100个这样的代码时,情况会更糟:)当你有100行这样的代码时,听起来你的解决方案是次优的,但我不能在不知道你在做什么的情况下说话。至少,把你的测试用例输入一个列表中,并在上面迭代,以避免把它们全部写出来。如果是elif
?@xuhdev,我希望elif
也有同样的行为ur asif
(我没有投反对票,但是)缺少布尔返回并不是无法在if()中使用它的原因
statement。这两个限制都是将赋值定义为语句而不是表达式的语言的副作用。为什么要使用一行程序?程序不会变得更好,因为它们的行数更少。与您有100行程序相同?您不会碰巧在编写解析器,对吗?请参见此列表()来自Ned Batcheld的网站。这与问题无关。我花了很长时间才找到这个。你的答案应该有更多的投票:(
def ensure(x):
if x: yield x
for fruit in ensure(isBig(y)):
return fruit
if x := isBig(y): return x