【问题标题】:If and Inline if, what are the advantages and disadvantages?if和inline if,各有什么优缺点?
【发布时间】:2013-10-13 00:23:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • else 子句中的“a =”有什么用?这必须是一个表达式,而不是一个赋值。
  • 因此,您所指的“内联 if”是 三元运算符 - 它扮演不同的角色。它只用于分配,不用于一般用途。
  • “哪个更好”是一个愚蠢的问题。如果一个总是比另一个更好,Python 就不会两者兼得。问题是,在什么情况下各自更好?
  • 我明白了。非常感谢!我认为这两个都是陈述。
  • @Lattyware:“仅用于分配”是什么意思?我几乎从不在赋值语句中使用三元表达式。我将它们用于函数参数,偶尔列出推导式或 lambdas,if statement 没有用处。

标签: python if-statement inline-if


【解决方案1】:

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

正确的语法是:

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

至于实用性,这是一个风格问题,也许这对Programmers StackExchange来说是一个很好的问题。

【讨论】:

    【解决方案2】:

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

    result = X if C else Y
    

    你拥有的是:

    result = X if C else result = Y
    

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

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

    result = [x if x % 2 == 0 else 0 for x in li]
    

    【讨论】:

    • 虽然在这种情况下你可以改用result = [max(0, x) for x in list]
    • 优点不在于它更短——事实上,它只是短了几个字符(冒号和换行符)。就是它是一种表达方式。
    • @abarnert。哦!谢谢,我错过了那个确切的词。
    • @GrijeshChauhan。什么??前两个字我没看懂。
    【解决方案3】:

    内联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]
    

    【讨论】:

    • 值得注意的是,三元运算符可以在列表推导中使用,但关键字if也可以在列表组合中用于过滤。它们是不同的东西,因此值得区分 if 语句和三元运算符。例如:["Something" if item > 10 else "SomethingElse" for item in data if item > 5] - 第一次使用if 是三元运算符,第二次是在列表组合中过滤。
    猜你喜欢
    • 2011-07-25
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2011-03-25
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多