Possible Duplicate:
Python Ternary Operator
我刚刚开始学习Python,我非常喜欢它简洁的语法。然而,是否有一种更简单的方法来编写if-then-else语句,使其适合一行呢?
例如:
1 2 3 4
| if count == N:
count = 0
else:
count = N + 1 |
有更简单的写法吗?我的意思是,在Objective-C中,我可以这样写
1
| 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:打印("嗨")"
- if 1==1: print('hi')可以这样使用。而且'''if 1==1: print('hi')'''什么也不会打印!
- 我想知道亚南以前做什么。目前,它只是计算count == (count + 1)(很自然,结果总是False)。我已经检入了Python 3.6.1和Python 2.7.10。
这是一个更具体的三元运算符表达式,而不是if-then,这是python语法
1
| value_when_true if condition else value_when_false |
更好的例子:(谢谢伯恩斯先生)
'Yes' if fruit == 'Apple' else 'No'
现在来看赋值和if语法的对比
1 2
| fruit = 'Apple'
isApple = True if fruit == 'Apple' else False |
vs
1 2 3
| fruit = 'Apple'
isApple = False
if fruit == 'Apple' : isApple = True |
- 这很像理解。您可以这样做:print('matched!' if re.match(r'\d{4,}', '0aa9') else"nopes")(假设您导入了re)
- 注意,简写语法只对实际值有效。可以将其用于常量和函数(Yes' if fruit == 'Apple' else print('No Apple')),但不能用于关键字('Yes' if fruit == 'Apple' else raise Exception('No Apple'))
- 我不清楚是否可以省略else,如果fruit == 'Apple',是否可以只使用'Yes' ?
- 在使用三元形式时不能忽略else,它会导致语法错误,但是您可以在一行中执行常规if操作,我更新了示例来演示。
- 在这些语句中可以使用圆括号吗?
- 通过使用多行if语句将此方法与相同的方法进行比较,可以得到这个答案。
- 这并没有回答原来的问题"if/else在同一条线上"。-即使它确实回答了特定的例子(三元运算符)。
- 这行不通。print("" .join(my_list)) if my_list else print("") SyntaxError: invalid syntax返回
- 但是,看起来您可以使用这种格式:print("" .join(my_list) if my_list else"" )
- 当您没有其他语句时:when_condition_true if condition else None
- 为什么不改为:isApple = fruit == 'Apple'
- 对于值want为布尔值且可以通过比较确定的情况,这没有问题。但是考虑OP场景。count = count == N ?0:计数+ 1;如果count == N,则需要count = 0,否则count + 1。
此外,您仍然可以使用"普通"if语法,并将其合并为一行,并使用冒号。
1
| if i > 3: print("We are done.") |
或
1 2
| field_plural = None
if field_plural is not None: print("insert into testtable(plural) '{0}'".format(field_plural)) |
- 有人能解释一下为什么这不是最好的答案吗?它绝对是最容易读的。
- 这个问题包括一个"else"条件
- @johannes-braunias你的方法违反了PEP8标准。
- PEP8:复合语句(同一行上的多个语句)通常不鼓励使用。
- 复合语句在shell中不能没有后面的行。用多余的线,你还不如把它们分开。
- 这是奇怪的。这里有一个来自PEP8的特定的"是"例子。Yes: if x == 4: print x, y; x, y = y, x我想,你知道,妖怪之类的。
- PEP8不是圣旨。如果您的程序能更好地使用这种语法,那就很好。
1
| count = 0 if count == N else N+1 |
-三元运算符。尽管我想说你的解决方案比这个更容易读。
一般三元语法:
1
| value_true if <test> else value_false |
另一种方法是:
1
| [value_false, value_true][<test>] |
例句:
1
| count = [0,N+1][count==N] |
这将在选择一个分支之前评估两个分支。只评估所选的分行:
1
| [lambda: value_false, lambda: value_true][<test>]() |
例如:
1
| count = [lambda:0, lambda:N+1][count==N]() |
- 这取决于(False, True) == (0, 1)的实现细节,我不知道该实现细节是否得到了保证(但没有检查)。虽然简洁,但它不会赢得任何可读性奖项。您也可以在C语言中执行"abcdefg"[i],但这并不意味着您应该这样做。
- @msw:保证False == 0和True == 1:这里没有实现细节。:)参见docs.python.org/reference/&hellip下的"布尔人"标题;
- 但是,不管[]是什么,这两个值都不是计算出来的吗?
- 嗯,说到三元运算,我总是喜欢第一个。我刚刚展示了另一种可能的方法…
- 另一种方法:{N: 0}.get(count, N+1)。第三种方法,如果N+1是某个昂贵的函数:{N: 0}.get(count,"anything truthy") and f(N)。这要求您了解dict值的真实性,并且它们都需要具有相同的真实性。如果所有值都为true,则反转布尔运算符,例如{0: 7}.get(weekday, False) or f(weekday)
- count= [0,N+1][count==N]给定解的集合在python 2.7中不起作用
- 如果测试在[value_false, value_true][]中计算结果为false,而不是相反(例如value_true if else value_false),那么我正在试图理解将第一个值赋值后的概念。这种看似不直观的语法背后有什么逻辑吗?
- 因为False计算为0,而True计算为1。虽然有效,但要避免。通常这是一个坏的方法。
- 像这样的语句失败有什么特殊的原因吗?x+=1 if else y+=1
- 因为if语法只允许放置表达式;但是x+=1是一种说法。
1
| <execute-test-successful-condition> if <test> else <execute-test-fail-condition> |
你的代码片段会变成,
1
| count = 0 if count == N else N + 1 |