如何写内联if语句打印?

我需要打印一些东西,只有当布尔变量设置为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

我错过了什么?

1134175 次浏览

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

a = 1 if b else 0

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

a = 1 if b else a

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

你总是需要一个else在内联如果:

a = 1 if b else 0

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

'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 or 0将计算为第二个操作数0,该操作数将分配给a

Python中后面有if 声明

Python中有两种类型的if:

  1. < p > # EYZ0声明:

    if condition: statement
    if condition:
    block
    
  2. if expression (introduced in Python 2.5)

    expression_if_true if condition else expression_if_false
    

And note, that both print a and b = a are statements. Only the a part is an expression. So if you write

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

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

a=100
b=True


if b:
print a

你为什么不简单地写:

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

如果你不想使用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或使用python3或更高版本:

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

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

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

如果你想了解这个主题,我已经在这个功能添加到Python的补丁的发布说明中包含了链接

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

这个语法可能看起来很奇怪和落后;为什么会出现这种情况 在表达式的中间,而不是像C的C ?x y: ?方法应用新语法来检查该决策 模块的标准库,并查看如何产生的代码 阅读。在使用条件表达式的许多情况下,一个值 似乎是“常见情况”,一个值是“例外情况”, 仅在不符合条件的罕见情况下使用。的 条件语法使这个模式更加明显:

Contents = ((doc + '\n') if doc else ")

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

if logging: print data

你只是把事情复杂化了。

if b:
print a

你可以使用:

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的“?”:“ 三元条件运算符,语法是:

[on_true] if [expression] else [on_false]

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

print a if b else ''

这可以使用字符串格式化完成。它适用于%符号以及.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 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 '')

(在我发布这个答案的时候,print已经演变成一个函数,现在需要括号。)

原因是if条件<强> < / >强表达,有两个强制子句,一个是在if之后b为真,一个是在else之后b为假。两个子句本身都是表达式。在你的代码中,else部分缺失了。条件表达式也被称为三元运算符,这表明它操作三个元素,一个条件和两个表达式。


详细信息:表达式与语句

不要将条件表达式与条件语句混合使用,它可以在没有else部分的情况下使用:

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

    它不需要有else子句,其中提供了适当的附加指令。如果没有它,当条件为false时,测试后不再执行进一步的指令。

  • 条件表达式为表达式。任何表达式都必须转换为最终值,无论后续语句(这里是print语句)是否使用该值。

例如,你可以这样使用if语句:

if b: print(a)

注意区别:

  • 当条件为false时,if语句不会执行任何指令,不会打印任何内容。

  • print语句print(a if b else '')不属于任何条件分支,它总是被执行。它输出的是if条件表达式。这个表达式总是在执行print语句之前求值。因此,当条件为false时,print输出一个空行。


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

b==True将首先计算并替换结果。由于b==True的逻辑值等于b,我猜Python只是忽略了这个计算,直接使用b,就像你第一次尝试的那样。