Python中三目计算符的正确用法及短路逻辑
今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘.
短路逻辑
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中的三目运算符不同, 不要搞错即可
Python中三目计算符的正确用法及短路逻辑的更多相关文章
- python中index、slice与slice assignment用法
python中index.slice与slice assignment用法 一.index与slice的定义: index用于枚举list中的元素(Indexes enumerate the elem ...
- python中星号变量的几种特殊用法
python中星号变量的几种特殊用法 不知道大家知不知道在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入 ...
- Python中第三方库Requests库的高级用法详解
Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...
- python中thread的setDaemon、join的用法的代码
下面内容是关于python中thread的setDaemon.join的用法的内容. #! /usr/bin/env python import threading import time class ...
- Python——day14 三目运算、推导式、递归、匿名、内置函数
一.三目(元)运算符 定义:就是 if...else...语法糖前提:简化if...else...结构,且两个分支有且只有一条语句注:三元运算符的结果不一定要与条件直接性关系 cmd = input ...
- Python中三种基本结构的语句
选择语句 if 条件判断 : # 条件可以加括号也可以不加括号 -- else: -- Python中没有switch语句这是可以使用if exp:.... elif exp:来代替 if 判断条件1 ...
- python自动化测试之函数(匿名函数lambda和三目运算等(高级用法))
''' 匿名函数: lambda ''' def Add(a,b): print(a+b) Add(2,3) per = lambda a,b:a+b print(per(2,3)) ''' 三目运算 ...
- 详解Python中内置的NotImplemented类型的用法
它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...
- Python中time和datetime模块的简单用法
python中与时间相关的一个模块是time模块,datetime模块可以看为是time模块的高级封装. time模块中经常用到的有一下几个方法: time()用来获取时间戳,表示的结果为从1970年 ...
随机推荐
- 一个新人如何学习在大型系统中添加新功能和Debug
文章背景: 今年七月份正式入职,公司主营ERP软件,楼主所在的组主要负责二次开发,使用的语言是Java. 什么叫二次开发呢?ERP软件的客户都是企业.而这些企业之间的情况都有所不同,一套标准版本的企业 ...
- Go语言的堆栈分析
本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快 ...
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3)
Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3) 到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了.那么来看下一个问题:一个场景里可能会有多个VBO,此时每个 ...
- C#设计模式-模板方法模式
提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下 ...
- PHP扩展-扩展的生成和编译
首先说明一下,PHP扩展有两种编译方式:方式一:在编译PHP时直接将扩展编译进去方式二:扩展被编译成.so文件,在php.ini里配置加载路径: 以下开始说明创建PHP扩展并编译的步骤:下载PHP源码 ...
- TortoiseSVN Clean up 失败的处理方法
当使用 TortoiseSVN 下载项目失败之后,重新下载之前需要 Clean up,在 TortoiseSVN 中 Clean up 总是失败. 在命令行行中执行 svn cleanup 就成功 ...
- Minor【 PHP框架】4.服务容器与服务提供者
框架Github地址:github.com/Orlion/Minor (如果觉得还不错给个star哦(^-^)V) 框架作者: Orlion 知乎:https://www.zhihu.com/peop ...
- 部署 instance 到 VXLAN - 每天5分钟玩转 OpenStack(112)
上一节我们创建了 vxlan 100_net,今天将部署 instance 并分析网络的连通性. launch 新的 instance "cirros-vm1",网络选择 vxla ...
- 理解brk和sbrk
brk和sbrk的定义 在man手册中定义了这两个函数: #include <unistd.h> int brk(void *addr); void *sbrk(intptr_t incr ...
- 确保 PHP 应用程序的安全
开始之前在本教程中,您将学习如何在自己的 PHP Web 应用程序中添加安全性.本教程假设您至少有一年编写 PHP Web 应用程序的经验,所以这里不涉及 PHP 语言的基本知识(约定或语法).目标是 ...