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

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

概述

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的条件判断(python三个条件判断)

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

用python编写判断输入是否为整数的程序

最近在自学python,写了两个小程序,大家帮个看看有没有更好的方式来编写,没学过编程,学起来有点懵。想实现一个功能,就是判断外部输入是否为整数,就是判断是不是数字,要是输入的其他的返回“您输入的信息...

python编程实践:如何将变量正确设置为空?

在Python中,变量是非常重要的一部分。它们用于储存数据,来支持程序的运行。当我们在编程时,将来可能会遇到一个问题:如何将变量正确设置为空?什么是变量?在Python中,变量是程序员用来储存数据的一...

python 标志法-优化版(数值判断[正负])、非空判断、退出判断)

在这个程序中,我们使用了一个标志来指出程序是否处于活动状态,这样如果要添加测试(如elif 语句)以检查是否发生了其他导致quit_msg2变为False 的事件,将很容易。在复杂的程序中,如很多事件...

django rest框架之Django-ninja(django框架mvt)

django web框架,它是一个入门有门槛,学会了做项目非常方便的Web框架。《2020 Python 开发者调查结果》https://www.jetbrains.com/zh-cn/lp/pyth...

印度“光辉”战机前途不光辉(印度光辉战机作战半径)

来源:科技日报“光辉”战机采用了切根三角翼设计,利用涡升力增大了升力系数。由于利用了涡升力,切根三角翼不但大大提高了升力系数,其升力斜率也比传统三角翼要大一些,保留了无尾三角翼本身跨超音速阻力小的同时...