7

我对 Python 中的 if 和 inline if 之间的区别有点好奇。哪一个更好?

除了它更短之外,还有什么理由使用inline if ?

另外,这个说法有什么问题吗?我收到语法错误:SyntaxError: can't assign to conditional expression

a = a*2 if b == 2 else a = a/w
4

3 回答 3

9

内联if表达式的优点是它是一个表达式,这意味着您可以在其他表达式中使用它——列表推导式、lambda 函数等。

内联if表达式的缺点在于它是一个表达式,这意味着您不能在其中使用任何语句。


缺点的一个完美示例正是导致您的错误的原因:a = a/w是一个语句,因此您不能在表达式中使用它。你必须这样写:

if b == 2:
    a = a*2
else:
    a = a/w

除了在这种特殊情况下,您只想a在任何一种情况下分配一些东西,所以您可以这样写:

a = a*2 if b==2 else a/w

至于优势,考虑一下:

odd_numbers = [number if number%2 else number+1 for number in numbers]

如果没有if表达式,您必须将条件包装在命名函数中——这对于不平凡的情况是件好事,但在这里过于冗长:

def oddify(number):
    if number%2:
        return number
    else:
        return number+1
odd_numbers = [oddify(number) for number in numbers]

另请注意,以下示例使用if(三元条件)表达式,而是使用if(条件过滤器)子句:

odd_numbers = [number for number in numbers if number % 2]
于 2013-10-06T10:20:48.897 回答
7

使用条件表达式的正确方法是:

result = X if C else Y

你所拥有的是:

result = X if C else result = Y

所以,你应该result =从那里删除部分。条件表达式的主要优点是,它是一个表达式。您可以在使用普通表达式的任何地方使用它们,作为赋值表达式的 RHS,作为方法/函数参数,在 lambdas 中,在列表理解中,等等。但是,您不能只在其中放入任何任意语句,例如 sayprint语句。

例如,假设您想要列表中的所有偶数,但对于所有奇数,您想要的值为0. 您可以像这样在列表理解中使用它:

result = [x if x % 2 == 0 else 0 for x in li]
于 2013-10-06T10:20:17.753 回答
3

内联 if 是一个表达式,所以你不能把赋值放在里面。

正确的语法是:

a = a*2 if b == 2 else a/w

至于有用性,这是一个风格问题,对于程序员 StackExchange来说,这可能是一个很好的问题。

于 2013-10-06T10:20:03.510 回答