我需要打印一些东西,只有当布尔变量设置为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。
我错过了什么?
我需要打印一些东西,只有当布尔变量设置为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。
我错过了什么?
内联if-else表达式必须包含else子句,例如:
a = 1 if b else 0
如果你想让你的'a'变量值保持不变-使用旧的'a'值(否则仍然需要语法要求):
a = 1 if b else a
当b变为False时,这段代码保持a不变。
'else'语句是强制的。你可以这样做:
>>> b = True
>>> a = 1 if b else None
>>> a
1
>>> b = False
>>> a = 1 if b else None
>>> a
>>>
编辑:
或者,根据你的需要,你可以尝试:
>>> if b: print(a)
对于你的情况,这是有效的:
a = b or 0
编辑:这是如何工作的?
在问题中
b = True
所以评估
b or 0
结果
True
它被赋值给a。
如果b == False?, b或0将求值为第二个操作数0,该操作数将赋值给a。
Python没有尾随的if语句。
在Python中有两种if:
如果声明: If条件:语句 如果条件: 块 if表达式(在Python 2.5中引入) Expression_if_true if条件else expression_if_false
注意,print a和b = 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语句写在一行上,尽管它可读性较差,而且确实没有理由避免两行变体。
如果你不想从__future__导入print_function,你可以这样做:
a = 100
b = True
print a if b else "", # Note the comma!
print "see no new line"
打印:
100 see no new line
如果你不反对从__future__导入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块”)
我没有像线程中其他人使用的那样使用None或0的原因是,使用None/0会导致程序在b为False的情况下打印None或打印0。
如果你想阅读这个主题,我已经包含了这个功能添加到Python的补丁的发布说明的链接。
上面的“模式”与PEP 308中显示的模式非常相似:
This syntax may seem strange and backwards; why does the condition go in the middle of the expression, and not in the front as in C's c ? x : y? The decision was checked by applying the new syntax to the modules in the standard library and seeing how the resulting code read. In many cases where a conditional expression is used, one value seems to be the 'common case' and one value is an 'exceptional case', used only on rarer occasions when the condition isn't met. The conditional syntax makes this pattern a bit more obvious: contents = ((doc + '\n') if doc else '')
所以我认为总的来说,这是一种合理的方法,但你不能否认它的简单性:
if logging: print data
你可以使用:
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.
因为2.5你可以使用C 's ' ' ?"三元条件运算符,语法为:
[on_true] if [expression] else [on_false]
所以你的例子很好,但你必须简单地添加其他,比如:
print a if b else ''
这可以通过字符串格式化来实现。它可以使用%符号以及.format()和f-strings(3.6新增)
print '%s' % (a if b else "")
or
print '{}'.format(a if b else "")
or
print(f'{a if b else ""}')
嗯,你可以用列表理解来做。如果你有一个真正的范围,这才有意义。但它确实做到了:
print([a for i in range(0,1) if b])
或者只用这两个变量:
print([a for a in range(a,a+1) if b])
你可以这样写一个内联三元运算符:
sure = True
# inline operator
is_true = 'yes' if sure else 'no'
# print the outcome
print(is_true)
print a if b
File "<stdin>", line 1
print a if b
^
SyntaxError: invalid syntax
回答
假设你的print语句在表达式为false时不输出任何东西,正确的语法是:
print(a if b else '')
(在我发布这个答案的时候,打印已经演变成一个函数,现在需要括号。)
原因是条件表达式if有两个强制子句,一个是if后面的b为真,一个是else后面的b为假。两个子句本身都是表达式。在你的代码中,else部分缺失了。条件表达式也被称为三元运算符,这表明它操作三个元素,一个条件和两个表达式。
详细信息:表达式与语句
不要将条件表达式和条件语句混合使用,条件语句可以在没有else部分的情况下使用:
The if statement is a compound statement with further instructions to execute depending on the result of the condition evaluation. It is not required to have an else clause where the appropriate additional instructions are provided. Without it, when the condition is false no further instructions are executed after the test. The conditional expression is an expression. Any expression must be convertible to a final value, regardless of the subsequent use of this value by subsequent statements (here the print statement).
例如,你可以这样使用if语句:
if b: print(a)
注意区别:
当条件为false时,if语句不会执行任何指令,不会打印任何内容。 打印语句print(a if b else ")不是任何条件分支的一部分,它总是被执行。它输出的是if条件表达式。这个表达式总是在执行print语句之前求值。因此,当条件为假时,print输出一个空行。
请注意,您的其他尝试打印(如果b==True,则输出a)与第一个相同。
b==True将首先求值,然后将结果替换。由于b==True的逻辑值等于b,我猜Python只是忽略了这个计算,直接使用b,就像你第一次尝试的那样。