python 短路运算符_Python中三目计算符的正确用法及短路逻辑

news/2025/2/25 19:07:37

今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘.

短路逻辑

Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接看代码

print True and 1

# 1

print True or 1

# True

print False and 1

# False

print False or 1

# 1

可以看到, 虽然1会被当做布尔值计算, 但整个表达式的计算结果却不一定是布尔值, 而是根据表达式的不同而不同. 上面几个表达式不同的结果, 就是短路逻辑. 用大白话讲, 就是一旦Python能判断整个表达式是True还是False, 就不会进行后续的计算了, 就是逻辑被短路了, 后续的表达式被忽略了.

比如True or 1的结果为True就是因为不管or后面是任何值, 整个式子的结果都必定是True, 所以Python看到True, 看到or, 后面的1就不看了, 1被短路了, 返回了True; 同样的False and 1也是一样, 看到False然后是and不管后面是什么, 整个式子的结果必定是False, 所以1被短路了, 返回False.

相应的, 为什么False or 1会返回1, 就是因为False和or判断不了式子的结果, 整个式子是True还是False, 是由or后面的值来决定的, 所以Python要把整个式子看完, 所以返回1.

明白了什么是短路逻辑之后, 我们看一看三目运算符

三目运算符

三目运算符, 又叫三元运算符. 熟悉Java的同学可能会知道, 它的形式是这样的b?x:y, 对于这个表达式来说, 如果条件b为True, 那表达式的结果就是x, 如果b为False, 那表达式的结果就是y. 这是一种很方便的写法, 比if语句简洁很多.

但Python中早期没有类似写法的三目运算符, 所以就出现了一种利用短路逻辑, 用and和or来模拟三目运算符的写法, 下面我们看代码

A = X and 'table' or False

这句代码就是在利用短路逻辑模拟三目运算符, 当X为True的时候, A会被赋值为'table', 当X为Flase的时候, A会被赋值为False;

乍一看好像很不错, 但这种写法却有个坑, 我们看这句代码

True and 0 or 1

如果我们把刚才的写法当三目运算符来使用, 那么条件语句是True, 表达式应该返回0才是我们期望的结果, 但实际上这个表达式会返回1; 因为True and 0的值为True, 整个表达式的值是由or之后的值来决定的, 所以Python会对后面的值做判断, 导致返回了1, 这就是为什么and...or这个写法有坑的原因

正确写法

如果想在Python中使用三目运算符, 可以使用if...else写法, 具体看代码

# if else

0 if True else 1

用if...else的写法, 结果就会跟我们期望的相同, 当条件为True时, 返回前面的值, 条件为False时, 返回后面的值. 不会有坑, 只是写的时候要注意, 条件和返回值的顺序跟Java中的三目运算符不同, 不要搞错即可


http://www.niftyadmin.cn/n/712984.html

相关文章

ZZULIOJ-1093,验证哥德巴赫猜想(函数专题)(Python)

题目描述: 哥德巴赫猜想大家都知道一点吧。我们现在不是想证明这个结论,而是对于任给的一个不小于6的偶数,来寻找和等于该偶数的所有素数对。做好了这件实事,就能说明这个猜想是成立的。 要求程序定义一个prime()函数和一个main()函数&#x…

ios多线程之GCD

介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6 ,iOS 4及以…

pandas 存xlsx多个标签_Pandas读写文件(1)

Pandas读写文件来源:https://realpython.com/pandas-read-write-files/翻译:老齐阅读本文需要10分钟★译者注: Pandas是数据科学中常用的库,用它读写文件也是常规操作,《数据准备和特征工程》一书对此有更详实的阐述。…

python进程线程协程面试_面试必备:进程,线程和协程

本文从操作系统原理出发结合代码实践讲解了以下内容:什么是进程,线程和协程?它们之间的关系是什么?为什么说Python中的多线程是伪多线程?不同的应用场景该如何选择技术方案?...什么是进程进程-操作系统提供…

ZZULIOJ-1094,统计元音(函数专题)(Python)

题目描述: 输入一个字符串,统计其中元音字母的个数。要求使用函数vowel()用来判断是否为元音,其余功能在main()函数中实现。 int vowel(char ch) { //如果ch是元音,返回1,否则返回0 } 本题如果是C/C代码提交&#x…

发现“钓鱼网站”的一些思路

发现“钓鱼网站”的一些思路JackZhai背景:钓鱼网站是那些模仿社交、银行、电商等网站,用于骗取用户账户名与密码的“套牌网站”。人们在访问网站时,其URL显示在地址栏中,但URL相似时(可以显示虚假URL),人们常常忽视&am…

经验总结21--抓取WEB数据,汇率,HtmlAgilityPack

网上找了非常多资料,PHP的比較多,然后找到有csv文件的。处理起来非常麻烦,国外的站点速度非常慢。最后还是去页面上抓取数据,我是从中国银行抓取的,各位可去其它站点抓取。 1、模拟请求URL。 string url "http:/…

python 优先队列_队列只能先进先出?试试使用优先队列自由的控制队列的弹出顺序吧...

相信对于队列的概念大家都不会陌生,这种先入先出的数据结构应用很广泛,像一般的生产消费都会用到队列,关于Queue的用法介绍可以参考我之前的文章 python中的Queue与多进程(multiprocessing)还有栈,栈是一种先入后出的数据结构,优先…