如何编写内联if语句以进行打印?


376

我仅在将布尔变量设置为时才需要打印一些内容True。因此,看完这个之后,我尝试了一个简单的示例:

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

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

我在这里想念什么?



2
好问题,复杂的答案...一个直接的问题就是“其他部分是强制性的”。
分钟

Answers:


737

Python不不会有拖尾if 声明

ifPython 有两种:

  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在多行语句的情况下不起作用。
2013年

是的,但是您不需要使用if,只需使用布尔逻辑即可,如我在下面的示例中所示。
爱德华多

1
@JanHudec如果Python没有尾随if,那么为什么这样做print [i for i in range(10) if i%2]呢?我希望他们会在理解之外……
mbomb007

3
@ mbomb007,也不是结尾的if 语句。它只是列表(或生成器)理解的一部分。请注意,if之前的内容不是语句,它们for之间是两个表达式。
Jan Hudec

2
@AlexandervonWernherr,是的,听起来很合理。
Jan Hudec

93

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

a = 1 if b else 0

如果您想保持'a'变量值不变-修改旧的'a'值(语法要求中还需要其他):

a = 1 if b else a

这段代码留下一个不变当b转弯是假的。


1
哦。但是,如果我不希望在else分支中发生任何事情该怎么办?我需要类似的东西:print a if b
里奇·罗宾逊

2
else a那就更好了else 0
厌食症2012年

13
if b: print a仅在这种情况下需要一个简单的选择
jamylak

4
修正答案,因为如果不是因为“陈述”一词而使它变得完全不好,那几乎是一件好事。问题的要点在于这不是一个声明。
Jan Hudec 2012年

1
+ 1-1:可以很好地指出else表达式是强制性的,但不能为未提供有关情况的答案:打印“ nothing”(类似于""or的内容None,请参见其他答案的详细信息)。
sancho.s ReinstateMonicaCellio 2014年

18

'else'语句是强制性的。您可以执行以下操作:

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

编辑:

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

>>> if b: print(a)

15

如果您不想这样做,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(“如果else阻塞,则行内”)

我没有使用None0与线程中的其他线程一样使用过的None/0原因是,使用会导致程序进入print Noneprint 0处于bis 的情况False

如果您想阅读有关此主题的内容,我提供了指向该功能已添加到Python的补丁程序的发行说明的链接

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

这种语法可能看起来很奇怪而且倒退。为什么条件出现在表达式的中间,而不是C的c的前面?x:y?通过将新语法应用于标准库中的模块并查看结果代码的读取方式来检查该决定。在许多使用条件表达式的情况下,一个值似乎是“常见情况”,而一个值是“例外情况”,仅在不满足条件的极少数情况下使用。条件语法使此模式更为明显:

内容=((doc +'\ n')如果文档为其他'')

因此,我认为总体而言,这是一种合理的处理方式,但是您不能凭借以下简单性来争论:

if logging: print data

谢谢。这里的事情print ""仍然会打印出一些内容:空行。
Ricky Robinson

谢谢。将end在argumnt print只出现在Python 3.x中,对不对?
Ricky Robinson

1
是的,我更像是2.7个人,因此 from __future__ import print_function
Noelkd

11

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

[on_true] if [expression] else [on_false]

所以您的示例很好,但是您只需添加else,例如:

print a if b else ''

2
请注意,print ''仍然会打印换行符,Noelkd的答案避免了这种情况。
yoniLavi

8

您可以使用:

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.

7

这可以通过字符串格式化来完成。它适用于%表示法以及.format()f字符串(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

@melpomene,但打印“”则换行,这print "",对于Python2和(Python3)使用(冒号)print("", end="")可以避免。
m3nda

5

对于您的情况,这可行:

a = b or 0

编辑:这是如何工作的?

在问题中

b = True

所以评估

b or 0

结果是

True

分配给a

如果b == False?b or 0将求值到0将分配给的第二个操作数a


3
该表达式的丑陋和错误倾向是我们首先具有条件表达式的原因。
Jan Hudec 2012年



2

在以下情况下,您始终需要else内联:

a = 1 if b else 0

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


3
-1:比较容易。而且完全不可读。而且,无论如何,问询者都不想要。
Jan Hudec 2012年

ITYM a = int(bool(b))
glglgl


1

嗯,您可以通过列表理解来做到这一点。这只有在您拥有真实范围的情况下才有意义..但是它确实可以做到:

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

或仅使用这两个变量:

print([a for a in range(a,a+1) if b])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.