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

短路逻辑

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, 就是因为Falseor判断不了式子的结果, 整个式子是True还是False, 是由or后面的值来决定的, 所以Python要把整个式子看完, 所以返回1.

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

三目运算符

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

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

A = X and 'table' or False

这句代码就是在利用短路逻辑模拟三目运算符, 当XTrue的时候, A会被赋值为'table', 当XFlase的时候, 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中三目计算符的正确用法及短路逻辑的更多相关文章

  1. python中index、slice与slice assignment用法

    python中index.slice与slice assignment用法 一.index与slice的定义: index用于枚举list中的元素(Indexes enumerate the elem ...

  2. python中星号变量的几种特殊用法

    python中星号变量的几种特殊用法 不知道大家知不知道在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊的用法"在变量前添加单个星号或两个星号",实现多参数的传入 ...

  3. Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...

  4. python中thread的setDaemon、join的用法的代码

    下面内容是关于python中thread的setDaemon.join的用法的内容. #! /usr/bin/env python import threading import time class ...

  5. Python——day14 三目运算、推导式、递归、匿名、内置函数

    一.三目(元)运算符 定义:就是 if...else...语法糖前提:简化if...else...结构,且两个分支有且只有一条语句注:三元运算符的结果不一定要与条件直接性关系​ cmd = input ...

  6. Python中三种基本结构的语句

    选择语句 if 条件判断 : # 条件可以加括号也可以不加括号 -- else: -- Python中没有switch语句这是可以使用if exp:.... elif exp:来代替 if 判断条件1 ...

  7. python自动化测试之函数(匿名函数lambda和三目运算等(高级用法))

    ''' 匿名函数: lambda ''' def Add(a,b): print(a+b) Add(2,3) per = lambda a,b:a+b print(per(2,3)) ''' 三目运算 ...

  8. 详解Python中内置的NotImplemented类型的用法

    它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...

  9. Python中time和datetime模块的简单用法

    python中与时间相关的一个模块是time模块,datetime模块可以看为是time模块的高级封装. time模块中经常用到的有一下几个方法: time()用来获取时间戳,表示的结果为从1970年 ...

随机推荐

  1. 安装 mysql-5.7.5-m15-winx64

    win7 64位下如何安装配置mysql-5.7.5-m15-winx64 距离上次安装MySQL已经过去好久了.步骤这些,有可能会忘记.简单记录一下吧.(参考了一些网络上的博客.) 1.mysql- ...

  2. Azure PowerShell (10) 使用PowerShell导出订阅下所有的Azure VM和Cloud Service的高可用情况

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China服务. 该脚本下载地址在http://files.cnblogs.co ...

  3. 一个上好的C# http/https类

    直接Copy拿去用吧: 新的 tls 协议需要新的.net版本, tls 至少更新到.net4吧,尽量用最新的.net! 不然出错了就折腾... using System; using System. ...

  4. android studio sdk 不能更新

    网上看到好多sdk不能更新的,解决办法基本上一下,试了下大都没用,,有人说改hosts ,我试了 貌似没用 下面是我亲测可以更新的一种方法:使用镜像地址更新 步骤: 1. 打开 SDK Manager ...

  5. Javascript学习记录——原生JS实现旋转木马特效

    昨天学习到了JS特效部分,然后老师讲了旋转木马特效的实现,如上图.不过只是讲了通过点击箭头实现图片的切换,对于点击图片本身以及二者联动却是没有讲解. 本着一颗追求完美的心,今天花费了一个中午终于将整个 ...

  6. Javascript刷题 》 查找数组元素位置

    找出元素 item 在给定数组 arr 中的位置 输出描述: function indexOf(arr, item) { ..... } 如果数组中存在 item,则返回元素在数组中的位置,否则返回 ...

  7. 每天多一点(2016.12.04)》Javascript隐式转换

    乱想 javascript为什么需要隐式转换?如果没有会出现什么情况? 找了一圈没有看到关于这个的讨论,只好自己研究了,可能不一定正确,自行辨知. 郁闷就是郁闷在好好的,为什么要搞个隐式转换,一般来讲 ...

  8. 【开源】OSharp框架解说系列(5.2):EntityFramework数据层实现

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  9. xUnit安装及注意事项

    前言 对于单元测试,想必大家都已再熟悉不过了,同时单元测试的重要性也越发突出,在招聘中也特别强调单元测试,但是对于微软内置的单元测试还是太过于繁琐,于是都在寻找一种简洁并且更加轻量的测试工具.用的最多 ...

  10. Openfire/XMPP学习之——Openfire的安装、配置

    一.Openfire下载: 官方下载:http://www.igniterealtime.org/downloads/index.jsp 在官方下载站点,可以获取Windows.Linux.Mac三种 ...