将简单的 if-then-else 语句放在一行上 [duplicate]

Putting a simple if-then-else statement on one line [duplicate]

提问人:Abizern 提问时间:5/10/2010 最后编辑:Mateen UlhaqAbizern 更新时间:7/25/2023 访问量:2399065

问:

这个问题在这里已经有答案了:
3年前关闭。

社区在 2 年前审查了是否重新打开这个问题,并将其关闭:

原始关闭原因未解决

如何在 Python 中编写 -- 语句以使其适合一行?ifthenelse

例如,我想要一个单行版本:

if count == N:
    count = 0
else:
    count = N + 1

在 Objective-C 中,我会这样写:

count = count == N ? 0 : count + 1;
python if-statement 语法 条件运算符

评论


答:

2499赞 cmsjr 5/10/2010 #1

这更具体地说是一个三元运算符表达式,而不是 if-then,这是 python 语法

value_when_true if condition else value_when_false

更好的例子:(感谢伯恩斯先生)

'Yes' if fruit == 'Apple' else 'No'

现在有赋值并与 if 语法对比

fruit = 'Apple'
isApple = True if fruit == 'Apple' else False

fruit = 'Apple'
isApple = False
if fruit == 'Apple' : isApple = True

评论

3赞 uchuugaka 5/20/2016
这很像理解。你可以这样做:(假设你导入了 re)print('matched!' if re.match(r'\d{4,}', '0aa9') else "nopes")
11赞 Torben 10/28/2016
请注意,速记语法仅对实际值有效。您可以将它与常量和函数 () 一起使用,但不能与关键字 (Yes' if fruit == 'Apple' else print('No Apple')'Yes' if fruit == 'Apple' else raise Exception('No Apple'))
7赞 Miro 2/14/2017
我不清楚我是否可以省略其他内容,如果水果==“苹果”,我可以只说“是”吗?
16赞 cmsjr 2/15/2017
使用三元形式时不能省略 else,这会导致语法错误,但您可以在一行中执行正常操作,我更新了示例以进行说明。
4赞 Brōtsyorfuzthrāx 8/22/2017
通过使用多行 if 语句将此方法与同一事物进行对比,可以使此答案受益。
169赞 Tim Pietzcker 5/10/2010 #2
count = 0 if count == N else N+1

- 三元运算符。虽然我会说你的解决方案比这更可读。

评论

0赞 korchix 11/11/2021
我更喜欢你的回答,它简单而简短
146赞 mshsayem 5/10/2010 #3

一般三元语法:

value_true if <test> else value_false

另一种方式可以是:

[value_false, value_true][<test>]

例如:

count = [0,N+1][count==N]

这将在选择一个分支之前评估两个分支。要仅评估所选分支,请执行以下操作:

[lambda: value_false, lambda: value_true][<test>]()

例如:

count = [lambda:0, lambda:N+1][count==N]()

评论

5赞 msw 5/10/2010
这依赖于一个我不知道是保证(但没有检查)的实现细节。虽然简洁,但它不会赢得任何可读性奖项。你也可以用C语言做,但这并不意味着你应该这样做。(False, True) == (0, 1)"abcdefg"[i]
10赞 Mark Dickinson 5/11/2010
@msw:这是有保证的,并且:这里没有实现细节。:)请参阅 docs.python.org/reference/ 下的“布尔值”标题...False == 0True == 1
14赞 tstenner 5/11/2010
但是,无论 [<test>] 是什么,这两个值都不是计算出来的吗?
1赞 mshsayem 5/11/2010
@msw:嗯,说到三元运算,我总是更喜欢第一种。我只是展示了另一种可能的方法......
1赞 Jonas Kölker 11/12/2013
另一种方式:.第三种方式,如果是一些昂贵的函数:.这要求您知道字典值的真实性,并且它们都需要具有相同的真实性。如果值都为真值,则反转布尔运算符,例如{N: 0}.get(count, N+1)N+1{N: 0}.get(count, "anything truthy") and f(N){0: 7}.get(weekday, False) or f(weekday)
29赞 phoenix24 5/10/2010 #4
<execute-test-successful-condition> if <test> else <execute-test-fail-condition>

使用您的代码片段,它将变成,

count = 0 if count == N else N + 1
295赞 Johannes Braunias 7/7/2012 #5

此外,您仍然可以使用“普通”语法并将其与冒号混为一行。if

if i > 3: print("We are done.")

field_plural = None
if field_plural is not None: print("insert into testtable(plural) '{0}'".format(field_plural)) 

评论

13赞 keithhackbarth 12/21/2013
有人可以解释为什么这不是最好的答案吗?恕我直言,它绝对是最容易阅读的。
68赞 adam.r 5/30/2014
该问题包括一个“其他”条件
15赞 Ricky Wilson 7/12/2014
@johannes-braunias 您的方法违反了 PEP8 标准。
16赞 anregen 7/14/2017
这很奇怪。这是来自 PEP8 的特定“是”示例。 我猜,你知道,地精什么的。Yes: if x == 4: print x, y; x, y = y, x
32赞 PProteus 8/30/2018
PEP8 不是神圣的。如果你的程序使用这种语法会更好,那很好。