广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中怎么支持任意的真值判断
  • 483
分享到

Python中怎么支持任意的真值判断

2023-06-16 08:06:41 483人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

python中怎么支持任意的真值判断,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python 在涉及真值判断(Truth Value Testing)时,语法

python中怎么支持任意的真值判断,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Python 在涉及真值判断(Truth Value Testing)时,语法很简便。

比如,在判断某个对象是否不为 None 时,或者判断容器对象是否不为空时,并不需要显示地写出判断条件,只需要在 if 或 while 关键字后面直接写上该对象即可。

下图以列表为例,if my_list 这个简短的写法可以表达出两层意思:

Python中怎么支持任意的真值判断

如果需要作出相反的判断,即“如果为 None 或为空”,只需要写成if not my_list 即可。

与众不同的真值判断方式

通常而言,当一个值本身是布尔类型时,写成"if xxx"(如果真),在语义上就很好理解。如果 xxx 本身不是布尔类型时,写成“if xxx”(如果某东西),则在语义上并不好理解。

C/C++/Java 之类的静态语言中,通常要先基于 xxx 作一个比较操作,比如“if (xxx == null)”,以此得到一个布尔类型的值的结果,然后再进行真值判断。否则的话,若“if xxx”中有非布尔类型的值,则会报类型错误。

Python 这门动态语言在这种场景中表现出了一种灵活性,那么,我们的问题来了:为什么 Python 不需要先做一次比较操作,直接就能对任意对象作真值判断呢?

先来看看文档 中对真值判断的描述:

Python中怎么支持任意的真值判断

简单而言,Python 的任何对象都可以用在 if 或 while 或布尔操作(and、or、not)中,默认情况下认为它是 true,除非它有__bool__() 方法返回False 或者有__len__() 方法返回0 。

对于前面的例子,my_list 没有__bool__() 方法,但是它有__len__() 方法,所以它是否为 true,取决于这个方法的返回值。

真值判断的字节码

接着,我们继续刨根问底:Python 为什么可以支持如此宽泛的真值判断呢?在执行if xxx 这样的语句时,它到底在做些什么?

对于第一个问题,Python 有个内置的 bool() 类型,可以将任意对象转化成布尔值。那么,这是否意味着 Python 在进行真值判断时,会隐式地 调用 bool() 呢(即转化成if bool(xxx))?(答案为否,下文有分析)

对于第二个问题,可以先用dis 模块来查看下:

Python中怎么支持任意的真值判断

POP_JUMP_IF_FALSE指令对应的是 if 语句那行,它的含义是:

If TOS is false, sets the bytecode counter to target. TOS is popped.

如果栈顶元素为 false,则跳转到目标位置。

这里只有跳转动作的描述,仍看不到一个普通对象是如何变成布尔对象的。

Python 在解释器中到底是如何实现真值判断的呢?

真值判断的源码实现

微信群友 Jo 的帮助下,我找到了 CPython 的源码(文件:ceval.c、object.c):

Python中怎么支持任意的真值判断

Python中怎么支持任意的真值判断

可以看出,对于布尔类型的对象(即 Py_True 和 Py_False),代码会进入到快速处理的分支;而对于其它对象,则会用 PyObject_IsTrue() 计算出一个 int 类型的值。

PyObject_IsTrue() 函数在计算过程中,依次会获取 nb_bool、mp_length 和 sq_length 的值,对应的应该就是 __bool__() 和 __len__() 这两个魔术方法的返回值。

这个过程就是前文中所引用的官方文档的描述,正是我们想要找的答案!

另外,对于内置的 bool(),它的核心实现逻辑正是上面的 PyObject_IsTrue() 函数,源码如下(boolobject.c):

Python中怎么支持任意的真值判断

所以,Python 在对普通对象作真值判断时,并没有隐式地调用 bool(),相反它调用了一个独立的函数(PyObject_IsTrue()),而这个函数又被 bool() 所使用。

也就是说,bool() 与 if/while 语句对普通对象的真值判断,事实上是基本相同的处理逻辑。 知道了原理,就会明白if bool(xxx) 这种写法是多此一举的了(我曾见到过)。

至此,我们已经回答了前文中提出的问题。

验证真值判断的过程

接下来,有 3 个测试例子,可以作进一步的验证:

Python中怎么支持任意的真值判断

你可以暂停而思考下:bool(Test1) 与 bool(Test1()) 各是什么结果?然后依次判断剩下的两个类,结果又会是什么?

揭晓答案:

bool(Test1)    # True bool(Test2)    # True bool(Test3)    # True  bool(Test1())  # True bool(Test2())  # False bool(Test3())  # True

原因如下:

  • 类对象没被实例化时,bool() 不会调用它的 __bool__() 或 __len__() 这两个魔术方法

  • 类对象被实例化后,若同时存在 __bool__() 或 __len__() 魔术方法,则 bool() 会先调用 __bool__() 方法(PS:这个方法要求返回值必须为 bool 类型,因此只要有它,就必然不需要再用__len__() 方法来判断真假)

数字类型如何作真值判断?

除了这 3 个例子,还有一种情况值得验证,那就是对于数字类型,它们是怎么做真值判断的呢?

我们可以验证一下数字类型是否拥有那两个魔术方法:

hasattr(2020, "__bool__") hasattr(2020, "__len__")

不难验证出,数字拥有的是 __bool__() 魔术方法,并没有__len__() 魔术方法,而且所有类型的数字其实被分成了两类:

  • __bool__() 返回 False:所有表示 0 的数字,例如0, 0.0, 0j, Decimal(0), Fraction(0, 1)

  • __bool__() 返回 True:所有其它非 0 的数字

文章小结

Python 中if xxx 这种简便的写法,虽然是正规的真值判断语法,并它但并不符合常规的语义。在 C/c++/Java 之类的语言中,要么 xxx 本身是布尔类型的值,要么是一种可返回布尔类型值的操作,但是在 Python 中,这个“xxx”竟然还可以是任意的 Python 对象!

本文通过对文档、字节码和 CPython 解释器的源码逐步分析,发现了 Python 的真值判断过程并不简单,可以提炼出以下的几个要点:

  • if/while 是隐性的布尔操作符: 它们除了有“判断”真假的作用,还具有隐式地将普通对象计算出布尔结果的功能。实际的操作是解释器根据“POP_JUMP_IF_FALSE”指令来完成的,其核心逻辑跟内置的 bool() 是共用了一个底层方法

  • 真值判断过程依赖两个魔术方法: 除非被判断对象有__bool__() 方法返回False 或者有__len__() 方法返回0 ,否则布尔操作的结果都是 True。两个魔术方法总是会先计算__bool__()

  • 数字类型也可做真值判断: 数字有__bool__() 魔术方法,但没有__len__() 魔术方法,除了表示 0 的数字为 False,其它数字都为 True

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网Python频道,感谢您对编程网的支持。

--结束END--

本文标题: Python中怎么支持任意的真值判断

本文链接: https://www.lsjlt.com/news/282810.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中怎么支持任意的真值判断
    Python中怎么支持任意的真值判断,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python 在涉及真值判断(Truth Value Testing)时,语法...
    99+
    2023-06-16
  • html5中怎么判断浏览器是否支持canvas
    html5中怎么判断浏览器是否支持canvas,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码如下:<!DOCTYPE ...
    99+
    2022-10-19
  • 怎么在判断使用的浏览器是否支持css3
    怎么在判断使用的浏览器是否支持css3?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CSS @supports规则:语法:@supports (rul...
    99+
    2023-06-14
  • 怎么在python中判断全局变量的赋值
    这篇文章将为大家详细讲解有关怎么在python中判断全局变量的赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,...
    99+
    2023-06-14
  • 在python中怎么 判断一个值是否为Nan
    在 Python 中,可以使用 math.isnan() 或者 numpy.isnan() 来判断一个值是否为 NaN。 示例代码如下: import mathimport numpy as np# ...
    99+
    2023-09-02
    python numpy 开发语言
  • Python中的Nonetype类型怎么判断
    今天写了个爬虫,在抓取数据的时候遇到一个问题,我觉得如果不注意,这个问题很容易被忽略,所以特意在博客记录下: 问题描述: 比如,我在提取信息时,这样判断类型: type(answers[0].find_all("...
    99+
    2022-06-02
    Python Nonetype类型判断 判断Nonetype
  • 怎么用代码判断当前系统是否支持某个版本的feature
    怎么用代码判断当前系统是否支持某个版本的feature,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JDK9已经出来有一段时间了,因此很多流行的Java应用纷纷增添了对JDK9...
    99+
    2023-06-02
  • python中的数据类型怎么判断
    在Python中,可以使用type()函数来判断一个对象的数据类型。例如: x = 5 print(type(x)) # 输出: ...
    99+
    2023-10-25
    python
  • php怎么判断数组中有几个重复的值
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php判断数组中有几个重复的值在php中,可利用array_count_values()函数来判断数组中有几个重复的值array_count_values() 函数用于...
    99+
    2016-09-15
    php 数组 重复值
  • python怎么判断一年中的第几天
    可以使用datetime库中的date类来判断一年中的第几天。下面是一个示例代码:pythonfrom datetime impor...
    99+
    2023-10-20
    python
  •  python中的条件判断语句怎么用
    这篇文章主要为大家展示了“ python中的条件判断语句怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ python中的条件判断语句怎么用”这篇文章吧。1. 避免多层分...
    99+
    2023-06-29
  • mybatis中的if test判断入参值问题怎么解决
    本文小编为大家详细介绍“mybatis中的if test判断入参值问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis中的if test判断入参值问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-30
  • Python中怎么判断统计每个月的天数
    今天就跟大家聊聊有关Python中怎么判断统计每个月的天数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。断统计每个月天数源码示例:如下#!/usr/bin/python# ...
    99+
    2023-06-02
  • 怎么在python中使用sqlite3判断cursor的结果是否为空
    这期内容当中小编将会给大家带来有关怎么在python中使用sqlite3判断cursor的结果是否为空,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python可以做什么Python是一种编程语言,内置了...
    99+
    2023-06-14
  • 怎么在​python中使用id函数判断分片产生的列表
    这篇文章将为大家详细讲解有关怎么在python中使用id函数判断分片产生的列表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStac...
    99+
    2023-06-14
  • Python中不使用If-Elif 语句怎么判断某个数字所属的等级
    这篇文章主要介绍“Python中不使用If-Elif 语句怎么判断某个数字所属的等级”,在日常操作中,相信很多人在Python中不使用If-Elif 语句怎么判断某个数字所属的等级问题上存在疑惑,小编查阅了...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作