ChatGPT解决这个技术问题 Extra ChatGPT

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

这个问题在这里已经有了答案:Python 有三元条件运算符吗? (32 个回答) 2 年前关闭。社区在 8 个月前审查了是否重新打开此问题并将其关闭:原始关闭原因未解决

我刚接触 Python,我真的很喜欢简洁的语法。但是,是否有更简单的方法来编写 if-then-else 语句以使其适合一行?

例如:

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

有没有更简单的写法?我的意思是,在 Objective-C 中,我会这样写:

count = count == N ? 0 : count + 1;

Python有类似的东西吗?

更新

我知道在这种情况下我可以使用 count == (count + 1) % N

我在问一般语法。

那不应该是 count = count == N ? 0 : N + 1; 而不是 count = count == N ? 0 : count + 1; 吗?
对于这种特定情况: count = (count+1) % (N+1) 会起作用。
您可以在一行上执行 if-then。 '''如果 1==1: print('hi')'''
if 1==1: print('hi') 可以这样使用。 '''if 1==1: print('hi')''' 不会打印任何内容!
我想知道count == (count + 1) % N过去做什么。目前它只计算 count == (count + 1)(自然而然,总是会产生 False)。我检查了 Python 3.6.1 和 Python 2.7.10。

p
princelySid

这比 if-then 更具体地说是一个 ternary operator 表达式,这是 python 语法

value_when_true if condition else value_when_false

更好的例子:(感谢 Mr. Burns

'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

这很像理解。您可以这样做:print('matched!' if re.match(r'\d{4,}', '0aa9') else "nopes")(假设您重新导入)
请注意,速记语法仅对实际值有效。您可以将它与常量和函数 (Yes' if fruit == 'Apple' else print('No Apple')) 一起使用,但不能与关键字 ('Yes' if fruit == 'Apple' else raise Exception('No Apple')) 一起使用
我不清楚是否可以省略其他内容,如果水果 == 'Apple',我可以只使用“是”吗?
使用三元形式时不能省略else,这会导致语法错误,但你可以在一行中做一个正常的if,我更新了示例来说明。
通过将此方法与使用多行 if 语句的相同方法进行对比,可以使这个答案受益。
k
kale

此外,您仍然可以使用“普通”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)) 

有人可以解释为什么这不是最佳答案吗?它绝对是最容易阅读恕我直言。
问题包括“其他”条件
@johannes-braunias 您的方法违反了 PEP8 标准。
这很奇怪。这是来自 PEP8 的特定“是”示例。 Yes: if x == 4: print x, y; x, y = y, x 我猜,你知道的,大地精之类的。
PEP8 不是圣旨。如果您的程序使用这种语法会更好,那很好。
T
Tim Pietzcker
count = 0 if count == N else N+1

- 三元运算符。尽管我会说您的解决方案比这更具可读性。


我更喜欢你的回答,它简单而简短
j
jameshfisher

一般三元语法:

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]()

这取决于我不知道的 (False, True) == (0, 1) 保证(但未检查)的实现细节。虽然简洁,但它不会赢得任何可读性奖项。您也可以在 C 中执行 "abcdefg"[i],但这并不意味着您应该这样做。
@msw:保证 False == 0True == 1:这里没有实现细节。 :) 请参阅 docs.python.org/reference/… 下的“布尔值”标题
但是,无论 [] 是什么,这两个值都不是计算出来的吗?
@msw:嗯,说到三元运算,我总是更喜欢第一个。我只是展示了另一种可能的方式......
另一种方式:{N: 0}.get(count, N+1)。第三种方式,如果 N+1 是一些昂贵的功能:{N: 0}.get(count, "anything truthy") and f(N)。这需要你知道dict的值的真实性,并且它们都需要具有相同的真实性。如果这些值都是真实的,则反转布尔运算符,例如 {0: 7}.get(weekday, False) or f(weekday)
p
phoenix24
<execute-test-successful-condition> if <test> else <execute-test-fail-condition>

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

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