Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在IF条件下分配变量,然后返回它?_Python_If Statement_Variable Assignment - Fatal编程技术网

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更一致地使它成为一个表达式,因为=/COD>看起来像(并且被解释器和人类解析为)操作符(隐式表达式),而不是函数(隐式语句,虽然这在技术上不是真的)。.坦率地说,你不能总是在项目中使用你想要的语言,这是我见过的最没有帮助的答案之一。如果我能投你十几次反对票,我会的。兔子,如果出于任何原因要求你使用特定的语言,你应该正确地使用它。试图束缚其他语言结构是一个愚蠢的想法。我我在C代码中看到过类似于
#define begin{
,因为Pascal程序员不想适应。这种行为使得代码在两种语言中都没有用处。谢谢。顺便说一句,当你有100个这样的代码时,情况会更糟:)当你有100行这样的代码时,听起来你的解决方案是次优的,但我不能在不知道你在做什么的情况下说话。至少,把你的测试用例输入一个列表中,并在上面迭代,以避免把它们全部写出来。如果是
elif
?@xuhdev,我希望
elif
也有同样的行为ur as
if
(我没有投反对票,但是)缺少布尔返回并不是无法在
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