python python中的三元表达式 python三元组 - Python有三元条件运算符吗?




12 Answers

是的,它是在2.5版本中added
语法是:

a if condition else b

评估第一个condition ,然后根据conditionBoolean值返回ab
如果condition计算结果为True a则返回,否则返回b

例如:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

请注意,条件是表达式 ,而不是语句 。 这意味着您不能在条件中使用赋值或pass或其他语句:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

在这种情况下,您必须使用普通的if语句而不是条件语句。

请记住,由于以下几个原因,一些Pythonist对此不满意:

  • 参数的顺序与许多其他语言(例如C,Ruby,Java等)不同,当不熟悉Python的“惊人”行为的人使用它时(可能会颠倒顺序),这可能会导致错误。
  • 有些人觉得它“笨拙”,因为它与正常的思想流程相反(首先考虑条件然后考虑影响)。
  • 文体的原因。

如果您在记住订单时遇到问题,请记住,如果您大声朗读它,您(几乎)会说出您的意思。 例如, x = 4 if b > 8 else 9x = 4 if b > 8 else 9大声朗读x = 4 if b > 8 else 9因为x will be 4 if b is greater than 8 otherwise 9

官方文件:

python三目运算 python四元表达式

如果Python没有三元条件运算符,是否可以使用其他语言结构模拟一个?




对于2.5之前的版本,有诀窍:

[expression] and [on_true] or [on_false]

on_true具有false布尔值时,它可能会给出错误的结果。 1
虽然它确实有从左到右评估表达式的好处,但在我看来这更清晰。

1. 是否有相当于C的“?:”三元运算符?




文档

条件表达式(有时称为“三元运算符”)具有所有Python操作的最低优先级。

表达式x if C else y首先计算条件, C不是x ); 如果C为真,则计算x并返回其值; 否则,将评估y并返回其值。

有关条件表达式的更多详细信息,请参阅PEP 308

自2.5版以来的新版本。




@up:

不幸的是,

(falseValue, trueValue)[test]

解决方案没有短路行为; 因此,无论条件如何,都会评估falseValue和trueValue。 这可能是次优的甚至是错误的(即trueValue和falseValue都可能是方法并且有副作用)。

对此的一个解决方案是

(lambda: falseValue, lambda: trueValue)[test]()

(执行延迟到获胜者已知;)),但它引入了可调用和不可调用对象之间的不一致。 此外,它不能解决使用属性时的情况。

故事就是这样 - 在3个提到的解决方案之间进行选择是在具有短路功能,使用至少python 2.5(恕我直言不再是问题)和不容易出现“trueValue-evaluates-to-false”之间的权衡错误。




三元运算符在不同的编程语言中

在这里,我只是尝试在几种编程语言之间展示ternary operator一些重要区别。

Javascript中的三元运算符

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Ruby中的三元运算符

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Scala中的三元运算符

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

R编程中的三元运算符

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Python中的三元运算符

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

现在你可以看到蟒蛇语言的美丽。 它具有高度可读性和可维护性。




理解,它非常容易理解。

general syntax : first_expression if bool_expression_is_true else second_expression

Example: x= 3 if 3 > 2 else 4 
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false



模拟python三元运算符。

例如

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

输出:

'b greater than a'



三元条件运算符只允许在单行中测试条件替换多行if-else使代码紧凑。

句法 :

[on_true] if [expression] else [on_false]

1-使用三元运算符的简单方法:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2-直接使用元组,字典和lambda的方法:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3-三元运算符可以写为嵌套if-else:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

以上方法可写为:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a



更多的提示而不是答案(不需要在hundreth时间重复显而易见的事情),但我有时会将它用作此类构造中的oneliner快捷方式:

if conditionX:
    print('yes')
else:
    print('nah')

,成为:

print('yes') if conditionX else print('nah')

有些(很多:)可能会皱眉头(甚至是ruby-ish :),但我个人认为它更自然 - 即你如何正常表达它,以及在大块代码中更具视觉吸引力。




是。

>>> b = (True if 5 > 4 else False)
>>> print b
True



是:

假设你想给变量x赋一些值,如果某些bool是真的,同样如此

如果其他x = 10,则X = 5

如果[如果这是真的第一个值评估],则X = [某个值]否则[其他值评估]




语法:Ternary运算符将给出:

[on_true] if [expression] else [on_false]

例如

x, y = 25, 50
big = x if x < y else y
print(big)



Related