【问题标题】:One line if-condition-assignment一行 if 条件赋值
【发布时间】:2011-12-13 22:38:02
【问题描述】:

我有以下代码

num1 = 10
someBoolValue = True

如果someBoolValueTrue,我需要将num1的值设置为20;否则什么也不做。所以,这是我的代码

num1 = 20 if someBoolValue else num1

有没有什么办法可以避免...else num1 部分让它看起来更干净?等价于

if someBoolValue:
    num1 = 20

我尝试将其替换为 ...else pass,如下所示:num1=20 if someBoolValue else pass。我得到的只是语法错误。我也不能省略...else num1 部分。

【问题讨论】:

  • 只需将其全部更改为num1 = 20 if someBoolValue else 10。然后你也保存num1=10 行?
  • 谢谢。但这不完全是我的代码。我的意思是num1 已经存在...

标签: python if-statement


【解决方案1】:

对于来自 Google 的未来时间旅行者,这里有一种新方法(从 Python 3.8 开始可用):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

【讨论】:

  • 感谢您的回答,我想知道这是什么奇怪的语法以及为什么它不适用于 python3.7 :D
  • 请注意,这只在 Python 中可用>=3.8
  • 对新 if-else 代码风格的最佳说明。谢谢
【解决方案2】:

如果你肯定会遇到一行代码,Python 3.8 引入了 assignment expressions 被亲切地称为“海象运算符”。

:=

someBoolValue and (num := 20)

如果第一个布尔表达式是True,则20 将被分配给num。赋值必须在括号内,否则会出现语法错误。

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

【讨论】:

    【解决方案3】:
    num1 = 10 + 10*(someBoolValue is True)
    

    这是我新的最终答案。 先前的答案如下,对于所述问题来说过于矫枉过正。 Getting_too_clever == not Good。这是先前的答案...如果您想为True cond 添加一件事并为False 添加另一件事,仍然很好:

    num1 = 10 + (0,10)[someBoolValue is True]
    

    您提到num1 已经有一个值,应该不理会它。我假设num1 = 10,因为这是帖子的第一条语句,所以到达20的操作是添加10

    num1 = 10
    someBoolValue = True
    
    num1 = 10 + (0,10)[someBoolValue is True]
    
    print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')
    

    产生了这个输出

    num1 = 20
    someBoolValue = True
    

    【讨论】:

    • 现在我想我应该回答 'num1 = 10 + 10*(someBoolValue == True)' 定义为 'False' 条件的问题基本上是无操作。如果需要选择为“False”添加不同的值,那么之前的答案更合适。我是编辑我的帖子还是在 cmets 中这样做?
    【解决方案4】:

    你可以这样做。

    try:
        a = [i for i in [20] if False][0]
    except IndexError:
        print("Do what ever you want here")
    

    您可以通过这种方式解决您的问题,但是使用“try/except 块”并不是 python 的最佳实践。

    【讨论】:

      【解决方案5】:

      如果您希望在某个布尔值为真时调用方法,您可以输入else None 来终止三元组。

      >>> a=1
      >>> print(a) if a==1 else None
      1
      >>> print(a) if a==2 else None
      >>> a=2
      >>> print(a) if a==2 else None
      2
      >>> print(a) if a==1 else None
      >>>
      

      【讨论】:

        【解决方案6】:

        另一种方式 num1 = (20*boolVar)+(num1*(not boolVar))

        【讨论】:

          【解决方案7】:

          这是我可以建议的。 使用另一个变量来派生 if 子句并将其分配给 num1。

          代码:

          num2 =20 if someBoolValue else num1
          num1=num2
          

          【讨论】:

            【解决方案8】:

            如果你愿意,你绝对可以使用 num1 = (20 if someBoolValue else num1)。

            【讨论】:

            • 以上答案重复?
            【解决方案9】:

            我认为这在 Python 中是不可能的,因为您实际尝试做的事情可能会扩展为如下内容:

            num1 = 20 if someBoolValue else num1
            

            如果您排除 else num1,您将收到语法错误,因为我很确定该赋值实际上必须返回一些内容。

            正如其他人已经提到的,你可以这样做,但这很糟糕,因为你可能会在下次阅读那段代码时弄糊涂:

            if someBoolValue: num1=20
            

            出于完全相同的原因,我不是num1 = someBoolValue and 20 or num1 的忠实粉丝。实际上,我必须三思而后行。

            真正实现你想做的最好的方法是原始版本:

            if someBoolValue:
                num1 = 20
            

            最好的版本是因为它非常明显你想要做什么,而且你不会混淆自己,或者以后会接触到该代码的任何人。

            另外,作为旁注,num1 = 20 if someBoolValue 是有效的 Ruby 代码,因为 Ruby 的工作方式有点不同。

            【讨论】:

            • 根据 PEP-308 (docs.python.org/2.5/whatsnew/pep-308.html),如果放在括号中,条件表达式可以更清晰,如 num1 = (20 if someBoolValue else num1)
            • 注意被零除的语句 -- 如果my_var 为 0,num_cats = math.ceil(num_humans / my_var) if my_var > 1 else 1 生成被零除,即使该代码的条件为假
            【解决方案10】:

            您可以使用以下方法之一:

            (falseVal, trueVal)[TEST]
            
            TEST and trueVal or falseVal
            

            【讨论】:

            • 不错的单行条件赋值
            • 那个“结构”怎么称呼?在学习 Python 约 6 个月的时间里,我从未见过这种情况。
            • 至少这些不是赋值,除非你在它们前面放一个,第二,它们不会按照这里描述的方式工作。第一个创建一个元组,然后按索引选择其中一个元素。它仅适用于返回介于 -1 和 1 之间的整数或 True/False 的测试,因为 boolint 的子类。在所有情况下,如果测试返回的东西只会评估为真,它就会失败并出现异常。第二个只有在 trueVal 本身不评估 false 时才有效,即使测试为 true,也会导致分配 falseVal
            • 它很短,但也很难安全地被用作“推荐模式”,请参阅上面来自 Bachsau 的评论......(所以我否决了它)跨度>
            【解决方案11】:

            没有。我猜你希望像num1 = 20 if someBoolValue 这样的东西会起作用,但事实并非如此。我认为最好的方法是使用您编写的if 声明:

            if someBoolValue:
                num1 = 20
            

            【讨论】:

              【解决方案12】:
              num1 = 20 * someBoolValue or num1
              

              【讨论】:

                【解决方案13】:

                一行:

                if someBoolValue: num1 = 20
                

                但不要那样做。这种风格通常不是预期的。为了清晰和一致,人们更喜欢较长的形式。

                if someBoolValue:
                    num1 = 20
                

                (同样,骆驼帽应该避免。所以宁愿使用some_bool_value。)

                请注意,没有else 部分的内联表达式 some_value if predicate 不存在,因为如果谓词为假,则不会有返回值。但是,表达式在所有情况下都必须具有明确定义的返回值。这与在 Ruby 或 Perl 中的用法不同。

                【讨论】:

                • 因为它很难阅读,而且您最终可能会被自己的代码弄糊涂,这绝不是一个好主意。
                • @bdhar,你为什么要把它放在一行上?它不会跑得更快,只会让其他人更难阅读
                • @gnibbler,实际上没有理由。我一直在寻找一种更短且可读性更好的形式..
                【解决方案14】:

                使用这个:

                num1 = 20 if someBoolValue else num1
                

                【讨论】:

                • 这是我一直在使用的.. 并正在寻找替代品.. 无论如何谢谢!!
                • 如何调用这个块?我的意思是它叫什么名字?
                • 是三元运算符
                • 如果循环遍历大型数据集,则不应使用这种方法,因为它会引入不必要的分配,以防我们最终进入 else 语句。
                猜你喜欢
                • 2012-10-03
                • 2013-07-14
                • 2021-05-05
                • 2018-09-20
                • 1970-01-01
                • 2014-03-11
                • 2013-12-05
                • 1970-01-01
                • 2012-05-09
                相关资源
                最近更新 更多