python 的逻辑值及其运算(python中逻辑量有哪些)

liftword5个月前 (01-22)技术文章41

概述

bool 是 python 内建数据类型,其取值只有 TrueFalse;python 的逻辑运算符有 notandor

看上去很简单,所以当我第一次看到下面的代码时我是懵逼的

id = item.get('id') or ''

作为一个主要使用 Java 的程序员来说,只有逻辑类型的变量才可以使用逻辑运算符,已经成了思维定式,对于 python,这些思维定式反而成了障碍

python 逻辑判断

python 的所有变量都可以进行逻辑比较,其中,如下变量的 bool 值总是 False

0, 0.0, [], {}, (), "", '', None, False

如何理解这个结论呢?

  • None:总是 False,这是 python 语言特性
  • 数值:对于数值 n,如果 n==0,那么 n 的 bool 值就是 False,反之为 True
  • 对于集合/字符串/或其他类型 x,如果 len(x)==0,那么 x 的 bool 值就是 False,反之为 True
  • 对于方法,其 bool 值总是 True,所以一定要注意,在逻辑表达式里不要忽略了方法的括号
  • 自定义的类,其实例对象的 bool 值总是 True,如果想要改变,可以实现如下方法
    • __bool__()
    • __len__()
    • 如果同时存在 __bool__()__len__(),则 __bool()__ 优先

python 的 or 和 and 运算符

回到本文的开头,来看下 or 运算符

首先要明确一点:python 的 or 并不保证只返回 bool 值,即 TrueFalse

or 运算有个短路特性,即遇到第一个 True 时就可以返回,不需要计算后续的表达式,而且它返回的是第一个为 True 的变量,并不一定是 True,比如说 1 也是 True,那么返回的就是 1,示例如下

>>> 0 or 1 or None or True
1

如果 or 没有发生短路,即计算到最后一个值还是没有遇到 True,那么会返回这最后的一个值,所以本文最初的代码,其含义如下

# 如果 item.id 是 None,则 id 值为 ''
id = item.get('id') or ''

这相当于给 id 一个默认值 '' 来避免其值为 None,因为对应的数据库字段可能不允许为 null

同样的,and 也有短路特性,它遇到第一个 False 就可以返回对应的变量,或者返回最后一个变量,示例如下

>>> 1 and {'x':1} and [] and True
[]

>>> 1 and True and [1,2] and [3,4]
[3, 4]

python 的 not

not 就比较特殊了,它返回的是 bool 值,即 TrueFalse,示例如下

>>> not None
True
>>> not 100
False
>>> not [1]
False
>>> not {}
True

python 方法参与逻辑运算

python 的方法本身也是对象,可以赋值给变量

前面已经说了,方法的 bool 值总是 True,所以要小心,忘记给方法写上括号是会导致奇怪的问题的,排查起来很痛苦,示例如下

# 定义一个方法,总是返回 False
>>> def always_false():
...   return False

# 预期打印出 bad
>>> x = always_false()
>>> if x:
...   print('ok')
... else:
...   print('bad')
...
bad

# 不慎没有写方法后的括号,导致运行错误
>>> x = always_false
>>> if x:
...   print('ok')
... else:
...   print('bad')
...
ok

相关文章

简单学Python——关键字2——True和False

True和False是Python中的两个关键字,是布尔类型,分别用于表示真和假。1、True和False表示真和假的例子:#将1==2的结果赋值给了x x=1==2 #将1==2的结果赋值给了y y...

Python的条件判断(python三个条件判断)

计算机之所以能够执行众多自动化任务,关键在于它具备自行进行条件判断的能力。例如,当输入用户年龄后,依据不同的年龄来打印相应内容,在 Python 程序里,这可以通过 if 语句来实现,示例如下:age...

通达信公式02-攻击&力量Python化代码

1.公式```pythonTYP:=(HIGH+LOW+CLOSE)/3;攻击:(TYP-MA(TYP,10))/(0.015*AVEDEV(TYP,10)),LINETHICK1;力量:(TYP-M...

Python range():表示某个范围内的数值

range函数作用Python 中的range是表示整数区间的对象,通常用for循环访问。range函数t转的对象可以转换为列表for i in range(5)是一个循环,它遍历从 0 到 4(包括...

春节停车难?用Python找空车位(python停车场代码)

【导语】今天这篇文章的选题非常贴近生活。营长生活在北京,深知开车出门最怕的就是堵车和找不到停车位。记得冬至那个周末,几个小伙伴滑雪回来找了一家饺子馆吃饺子,结果七拐八拐,好不容易才找到一个停车位。看到...

PYTHON数据分析必备知识(2)(python数据分析常用技能)

1.二分钟快速给项目添加日志信息""" 给项目添加日志信息 """ # 导Python内置包 import logging import time...