496

只有当布尔变量设置为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

我在这里想念什么?

4

14 回答 14

939

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语句写在一行上,尽管它的可读性较差,并且确实没有理由避免使用两行变体。

于 2012-08-09T09:47:28.010 回答
119

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

a = 1 if b else 0

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

a = 1 if b else a

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

于 2012-08-09T09:32:50.770 回答
26

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

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

编辑:

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

>>> if b: print(a)
于 2012-08-09T09:34:08.207 回答
22

如果您不想这样做,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 (“in line if else blocks”)

我没有使用None0喜欢线程中其他人使用的原因是因为使用None/0会导致程序print None或在isprint 0的情况下。bFalse

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

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

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

内容 = ((doc + '\n') if doc else '')

所以我认为总的来说这是一种合理的方法,但你不能与以下简单性争论:

if logging: print data
于 2013-05-02T11:03:31.780 回答
13

从 2.5 开始,您可以使用等效于 C 的“?:”</a>三元条件运算符,语法为:

[on_true] if [expression] else [on_false]

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

print a if b else ''
于 2015-05-02T16:54:46.073 回答
12

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

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

或者

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

或者

print(f'{a if b else ""}')
于 2017-02-24T15:48:15.177 回答
11

您可以使用:

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.
于 2014-03-19T17:10:35.830 回答
8

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

sure = True

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

# print the outcome
print(is_true)
于 2021-05-05T14:17:05.643 回答
6

你只是过于复杂了。

if b:
   print a
于 2013-06-01T00:35:45.927 回答
6

尝试这个 。它可能会帮助你

a=100
b=True

if b:
   print a
于 2012-08-09T09:57:34.127 回答
6

对于您的情况,这有效:

a = b or 0

编辑:这是如何工作的?

在问题中

b = True

所以评价

b or 0

结果是

True

分配给a.

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

于 2012-08-09T09:34:20.080 回答
2

在以下情况下,您总是需要else内联:

a = 1 if b else 0

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

于 2012-08-09T09:33:41.487 回答
2

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

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

或仅使用这两个变量:

print([a for a in range(a,a+1) if b])
于 2018-09-12T17:02:28.857 回答
-1

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

if b:
    print a
else:
    print 'b is false'
于 2013-02-26T07:26:24.147 回答