【问题标题】:How to write inline if statement for print?如何编写用于打印的内联 if 语句?
【发布时间】:2012-08-09 09:31:48
【问题描述】:

只有当布尔变量设置为True 时,我才需要打印一些内容。所以,看了this之后,我尝试了一个简单的例子:

>>> a = 100
>>> b = True
>>> print a if b
  File "<stdin>", line 1
    print a if b
             ^
SyntaxError: invalid syntax  

如果我写print a if b==True也是一样。

我在这里错过了什么?

【问题讨论】:

标签: python if-statement inline


【解决方案1】:

Python没有有尾随if 语句

Python中有两种if

  1. if声明:

    if condition: statement
    if condition:
        block
    
  2. if 表达式(在 Python 2.5 中引入)

    expression_if_true if condition else expression_if_false
    

请注意,print ab = a 都是语句。只有a 部分是表达式。所以如果你写

print a if b else 0

意思是

print (a if b else 0)

在你写作时也是如此

x = a if b else 0

意思是

x = (a if b else 0)

现在如果没有else 子句,它会打印/分配什么?打印/作业还在

请注意,如果您不希望它出现在那里,您始终可以在一行中编写常规的 if 语句,尽管它的可读性较差,并且确实没有理由避免使用两行变体.

【讨论】:

  • 我认为if condition: statement 在多行语句的情况下不起作用。
  • 是的,但你不需要使用 if,只需使用我在示例中显示的布尔逻辑即可。
  • @JanHudec 如果 Python 没有尾随 if,那么为什么会这样:print [i for i in range(10) if i%2]?我希望他们允许它超出理解范围......
  • @mbomb007,这也不是一个尾随的 if statement。它只是列表(或生成器)理解的一部分。注意if前面的不是语句,是两个表达式,中间有for
  • @AlexandervonWernherr,是的,这听起来很合理。
【解决方案2】:

内联 if-else EXPRESSION 必须始终包含 else 子句,例如:

a = 1 if b else 0

如果您想保持 'a' 变量值不变 - 赋值旧的 'a' 值(语法要求仍然需要 else):

a = 1 if b else a

当 b 变为 False 时,这段代码使 a 保持不变。

【讨论】:

  • 哦。但是如果我不想在 else 分支中发生任何事情怎么办?我需要类似的东西:print a if b
  • else a 会比 else 0 更好
  • if b: print a 在这种情况下只需要一个简单的 if
  • 修复答案,因为如果不是因为“声明”这个词,它几乎是好的,这使得它变得非常糟糕。问题的要点是它不是陈述。
  • +1-1:很好地指出 else 表达式是强制性的,但不提供有关案例的答案是不行的:打印“无”(类似于@987654327 @ 或None,详见其他答案)。
【解决方案3】:

“else”语句是强制性的。你可以这样做:

>>> b = True
>>> a = 1 if b else None
>>> a
1
>>> b = False
>>> a = 1 if b else None
>>> a
>>> 

编辑:

或者,根据您的需要,您可以尝试:

>>> if b: print(a)

【讨论】:

    【解决方案4】:

    如果您不想from __future__ import print_function,您可以执行以下操作:

    a = 100
    b = True
    print a if b else "",  # Note the comma!
    print "see no new line"
    

    哪些打印:

    100 see no new line
    

    如果您不习惯 from __future__ import print_function 或使用 python 3 或更高版本:

    from __future__ import print_function
    a = False
    b = 100
    print(b if a else "", end = "")
    

    添加 else 是使代码语法正确所需的唯一更改,条件表达式需要 else (“inline if else 块”)

    我没有像线程中的其他人那样使用None0 的原因是因为在b 的情况下使用None/0 会导致程序print Noneprint 0False

    如果您想阅读有关此主题的信息,我已将 link 添加到 Python 中添加此功能的补丁的发行说明中。

    上面的“模式”与 PEP 308 中显示的模式非常相似:

    这种语法可能看起来很奇怪和倒退;为什么会出现这种情况 在表达式的中间,而不是像 C 的 c 中那样在前面? X : 是吗?通过将新语法应用于 标准库中的模块并查看生成的代码 读。在许多使用条件表达式的情况下,一个值 似乎是“常见情况”,一个值是“例外情况”, 仅在不满足条件的极少数情况下使用。这 条件语法使这种模式更加明显:

    contents = ((doc + '\n') if doc else '')

    所以我认为总体而言这是一种合理的处理方式,但您不能与以下内容的简单性争论:

    if logging: print data
    

    【讨论】:

    • 谢谢。这里的问题是print "" 仍然会打印一些东西:一个空行。
    • 谢谢。 print 中的 end 参数只出现在 Python 3.x 中,对吧?
    • 是的,我更像是一个 2.7 岁的男人,因此from __future__ import print_function
    【解决方案5】:

    从2.5开始你可以使用equivalent of C’s ”?:”ternary conditional operator,语法是:

    [on_true] if [expression] else [on_false]
    

    所以你的例子很好,但你必须简单地添加else,比如:

    print a if b else ''
    

    【讨论】:

    • 请注意,print '' 仍将打印换行符,Noelkd 的回答中避免了这一点。
    【解决方案6】:

    这可以通过string formatting 完成。它适用于 % 符号以及 .format()f-strings(3.6 的新功能)

    print '%s' % (a if b else "")
    

    print '{}'.format(a if b else "")
    

    print(f'{a if b else ""}')
    

    【讨论】:

    • 这与格式化无关;你可以做print a if b else ""。这正是 Noelkd 的回答所做的。
    • @melpomene 但打印 "" 广告是一个新行,对于 Python2 使用 print "",(冒号)和对于 Python3 使用 print("", end="") 可以避免这种情况。
    【解决方案7】:

    你可以使用:

    print (1==2 and "only if condition true" or "in case condition is false")
    

    你也可以继续这样:

    print 1==2 and "aa" or ((2==3) and "bb" or "cc")
    

    现实世界的例子:

    >>> print "%d item%s found." % (count, (count>1 and 's' or ''))
    1 item found.
    >>> count = 2
    >>> print "%d item%s found." % (count, (count>1 and 's' or ''))
    2 items found.
    

    【讨论】:

      【解决方案8】:

      你可以像这样写一个内联三元运算符:

      sure = True
      
      # inline operator
      is_true = 'yes' if sure else 'no'
      
      # print the outcome
      print(is_true)
      

      【讨论】:

        【解决方案9】:

        对于您的情况,这是可行的:

        a = b or 0
        

        编辑:这是如何工作的?

        在问题中

        b = True
        

        所以评价

        b or 0
        

        结果

        True
        

        分配给a

        如果b == False?b or 0 将计算为第二个操作数0,该操作数将分配给a

        【讨论】:

        • 这个表达式的丑陋和容易出错是我们首先使用条件表达式的原因。
        【解决方案10】:

        试试这个。可能对你有帮助

        a=100
        b=True
        
        if b:
           print a
        

        【讨论】:

          【解决方案11】:

          你只是过于复杂了。

          if b:
             print a
          

          【讨论】:

          • 当然这是最简单的选择。我认为当时(2012 年 8 月)我想做类似的事情:if DEBUG: print something
          • 重复的答案?请参阅 SkariaArun,以及评论。
          【解决方案12】:

          如果:

          a = 1 if b else 0
          

          但更简单的方法是a = int(b)

          【讨论】:

          • -1:更容易。而且完全不可读。反正也不是提问者想要的。
          • ITYM a = int(bool(b)).
          【解决方案13】:

          嗯,您可以通过 列表理解 来做到这一点。这只有在你有一个真实的范围时才有意义..但它确实可以完成这项工作:

          print([a for i in range(0,1) if b])
          

          或仅使用这两个变量:

          print([a for a in range(a,a+1) if b])
          

          【讨论】:

            【解决方案14】:

            那么你为什么不简单地写:

            if b:
                print a
            else:
                print 'b is false'
            

            【讨论】:

              猜你喜欢
              • 2012-05-03
              • 2020-01-08
              • 2022-11-25
              • 2013-11-05
              • 1970-01-01
              • 1970-01-01
              • 2016-06-28
              • 2021-06-23
              • 1970-01-01
              相关资源
              最近更新 更多