在Python中是否有特纳利条件操作器?
当前回答
连接多个运营商的方式:
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'
array = [(0,0),(0,1),(1,0),(1,1)]
for a in array:
x, y = a[0], a[1]
print(f(x,y))
# Output is:
# equal,
# less,
# greater,
# equal
其他回答
一个提示比一个答案更多(我不需要重复显而易见的百度),但有时我用它作为一个单线缩短在这样的结构:
if conditionX:
print('yes')
else:
print('nah')
它变成:
print('yes') if conditionX else print('nah')
有些(很多)可能在它上被称为无神论(甚至,Ruby-ish :),但我个人觉得它更自然 - 也就是说,你会如何正常表达它,加上在大块代码中更有视觉吸引力。
一个替代Python的条件表达
"yes" if boolean else "no"
是如下:
{True: "yes", False: "no"}[boolean]
有下列好延伸:
{True: "yes", False: "no", None: "maybe"}[boolean_or_none]
最短的替代品
("no", "yes")[boolean]
因为它是以子类(bool, int)为作用。
注意,但是:替代
yes() if boolean else no()
不是
(no(), yes())[boolean] # bad: BOTH no() and yes() are called
但
(no, yes)[boolean]()
這工作很好,只要沒有,是的,應該用相同的數字呼叫。
yes("ok") if boolean else no() # (1)
或在
yes("ok") if boolean else no("sorry") # (2)
因此,相似的替代品既不存在(一)又几乎不可行(二)。(在罕见的情况下,根据背景,某种类似的
msg = ("sorry", "ok")[boolean]
(no, yes)[boolean](msg)
可以有意义( )
谢谢Radek Rojík的评论
Vinko Vrsalovic的答案是足够好的,只有一件事:
請注意,條件是表達,而不是表達,這意味著您無法在條件表達內使用任命表達或通過或其他表達。
华鲁斯操作员在Python 3.8
在Walrus操作器在Python 3.8中引入后,有些事情发生了变化。
(a := 3) if True else (b := 5)
给 a = 3 和 b 不定义,
(a := 3) if False else (b := 5)
给 a 不定义 和 b = 5 和
c = (a := 3) if False else (b := 5)
给 c = 5, a 不定义, b = 5 。
即使这可能是丑陋的,任务可以在Python 3.8之后的条件表达中进行。
你可以把它分成一个<unk>子:
(falseValue, trueValue)[test]
测试需要返回真实或虚假. 它可能更安全地总是执行它如下:
(falseValue, trueValue)[test == True]
或者您可以使用内置的 bool() 来确保 Boolean 值:
(falseValue, trueValue)[bool(<expression>)]
<表达 1> 如果 <条件> 其他 <表达 2>
a = 1
b = 2
1 if a > b else -1
# Output is -1
1 if a > b else -1 if a < b else 0
# Output is -1
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录