如何编写内联if语句用于打印?

Ric*_*son 342 python if-statement inline

我需要在布尔变量设置为时才打印一些东西True.所以,看后这个,我试图用一个简单的例子:

>>> a = 100
>>> b = True
>>> print a if b
  File "<stdin>", line 1
    print a if b
             ^
SyntaxError: invalid syntax  
Run Code Online (Sandbox Code Playgroud)

如果我写的话也一样print a if b==True.

我在这里错过了什么?

Jan*_*dec 670

Python不不会有拖尾if 声明.

ifPython中有两种:

  1. if 声明:

    if condition: statement
    if condition:
        block
    
    Run Code Online (Sandbox Code Playgroud)
  2. if 表达式(在Python 2.5中引入)

    expression_if_true if condition else expression_if_false
    
    Run Code Online (Sandbox Code Playgroud)

并注意,这两个print ab = a的陈述.只有a部分是表达式.所以,如果你写

print a if b else 0
Run Code Online (Sandbox Code Playgroud)

它的意思是

print (a if b else 0)
Run Code Online (Sandbox Code Playgroud)

而且当你写作时也是如此

x = a if b else 0
Run Code Online (Sandbox Code Playgroud)

它的意思是

x = (a if b else 0)
Run Code Online (Sandbox Code Playgroud)

现在如果没有else条款,它会打印/分配什么?打印/分配仍然存在.

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

  • @ mbomb007,这也不是尾随if*语句*.它只是列表(或生成器)理解的一部分.注意if之前的东西不是一个语句,它们之间是两个带有"for"的表达式. (3认同)
  • @JanHudec 如果 Python 没有尾随 `if`,那么为什么这样做:[`print [i for i in range(10) if i%2]`](https://repl.it/BLMh) ? 我希望他们允许它超出理解范围...... (2认同)
  • @AlexandervonWernherr,是的,这听起来很合理. (2认同)

Ros*_*nko 85

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

a = 1 if b else 0
Run Code Online (Sandbox Code Playgroud)

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

a = 1 if b else a
Run Code Online (Sandbox Code Playgroud)

这段代码留下一个不变当b变成是假的.

  • `if b:print a`在这种情况下只需要一个简单的东西 (13认同)
  • 修正答案,因为如果不是因为"声明"这个词使得它完全不好,这几乎是好的.问题的要点是它不是*声明. (4认同)
  • `否则a`会好于'else 0` (2认同)

小智 19

您可以像这样编写内联三元运算符:

sure = True

# inline operator
is_true = 'yes' if sure else 'no'

# print the outcome
print(is_true)
Run Code Online (Sandbox Code Playgroud)


Ale*_*uet 17

'else'语句是强制性的.你可以做这样的事情:

>>> b = True
>>> a = 1 if b else None
>>> a
1
>>> b = False
>>> a = 1 if b else None
>>> a
>>> 
Run Code Online (Sandbox Code Playgroud)

编辑:

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

>>> if b: print(a)
Run Code Online (Sandbox Code Playgroud)

  • 但*为什么*是强制性的,这就是问题所在. (4认同)

Noe*_*lkd 15

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

a = 100
b = True
print a if b else "",  # Note the comma!
print "see no new line"
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

100 see no new line
Run Code Online (Sandbox Code Playgroud)

如果你没有厌恶from __future__ import print_function或正在使用python 3或更高版本:

from __future__ import print_function
a = False
b = 100
print(b if a else "", end = "")
Run Code Online (Sandbox Code Playgroud)

添加else是您需要做的唯一更改,以使您的代码语法正确,您需要条件表达式的else("in else if else blocks")

我之所以没有使用None0与其他人一样的线程都用过,是因为使用None/0会导致程序print Noneprint 0在案件bFalse.

如果您想阅读有关此主题的信息,我已经添加了一个指向该功能添加到Python的补丁的发行说明的链接.

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

这种语法可能看起来很奇怪而且倒退; 为什么条件在表达式的中间,而不是在C的c中?x:y?通过将新语法应用于标准库中的模块并查看生成的代码如何读取来检查决策.在使用条件表达式的许多情况下,一个值似乎是"常见情况",一个值是"例外情况",仅在不满足条件的情况下使用.条件语法使这种模式更加明显:

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

所以我认为总的来说这是一种合理的方法来解决它但你无法与简单的方法争论:

if logging: print data
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 11

从2.5开始,您可以使用C的"?:" 三元条件运算符,语法为:

[on_true] if [expression] else [on_false]
Run Code Online (Sandbox Code Playgroud)

所以你的例子很好,但你只需添加else,如:

print a if b else ''
Run Code Online (Sandbox Code Playgroud)

  • 请注意,'print'''仍将打印换行符,Noelkd在答案中避免使用. (2认同)

Edu*_*rdo 8

您可以使用:

print (1==2 and "only if condition true" or "in case condition is false")
Run Code Online (Sandbox Code Playgroud)

同样,你可以继续前进:

print 1==2 and "aa" or ((2==3) and "bb" or "cc")
Run Code Online (Sandbox Code Playgroud)

现实世界的例子:

>>> 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.
Run Code Online (Sandbox Code Playgroud)


小智 6

对于您的情况,这有效:

a = b or 0
Run Code Online (Sandbox Code Playgroud)

编辑:这是如何工作的?

在问题中

b = True
Run Code Online (Sandbox Code Playgroud)

所以评价

b or 0
Run Code Online (Sandbox Code Playgroud)

结果是

True
Run Code Online (Sandbox Code Playgroud)

分配给a.

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

  • 这个表达式的丑陋和容易出错是我们首先使用条件表达式的原因。 (3认同)

Eri*_*mar 6

这可以通过字符串格式化来完成。它适用于%表示法以及.format()f字符串(3.6的新功能)

print '%s' % (a if b else "")
Run Code Online (Sandbox Code Playgroud)

要么

print '{}'.format(a if b else "")
Run Code Online (Sandbox Code Playgroud)

要么

print(f'{a if b else ""}')
Run Code Online (Sandbox Code Playgroud)


min*_*ins 6

print a if b
File "<stdin>", line 1
    print a if b
         ^
SyntaxError: invalid syntax  
Run Code Online (Sandbox Code Playgroud)

回答

如果您的print语句在表达式为 false 时必须打印空行,则正确的语法是:

print(a if b else '')
Run Code Online (Sandbox Code Playgroud)

原因是您使用的条件表达式有两个强制子句,一个when bis true before if,一个when bis false after else

这两个子句本身就是表达式。条件表达式也称为三元运算符,明确表示它对三个元素(一个条件和两个表达式)进行操作。在您的代码中else缺少该部分。

不过我猜你的想法是当表达式为假时不打印空行,而是不执行任何操作。在这种情况下,您必须在条件语句print中使用,以便将其执行限制为 的评估结果。b


细节:表达与陈述

条件语句可以在没有该部分的情况下使用else

  • if语句是一个复合语句,具有根据条件评估结果执行的进一步指令。

  • 不需要提供else提供适当附加说明的条款。如果没有它,当条件为假时,测试后不会执行进一步的指令。

  • 条件表达式是一个表达式。任何表达式都必须可转换为最终值,无论后续语句(此处为语句print)随后如何使用该值。

  • 当条件为假时,Python 不会假设表达式的值应该是什么。

您可以if这样使用语句:

if b: print(a)
Run Code Online (Sandbox Code Playgroud)

注意区别:

  • if当条件为假时,该语句不执行任何指令,不会打印任何内容,因为print未调用。

  • print带有条件表达式的语句中print(a if b else '')print总是被执行。它打印的是if条件表达式。该表达式在执行语句之前被评估print。因此,print当条件为 false 时,输出空行。


请注意,您的其他尝试print(a if b==True)与第一次尝试相同。

由于b==True在语法上等价于b,我猜Python解释器只是在执行之前将前者替换为后者。你的第二次尝试很可能会重复第一次。


Ska*_*run 5

试试这个 .它可能对你有帮助

a=100
b=True

if b:
   print a
Run Code Online (Sandbox Code Playgroud)


Nan*_*nde 5

你只是过于复杂了。

if b:
   print a
Run Code Online (Sandbox Code Playgroud)