python布尔测试_Python布尔函数:用真值优化代码

Python布尔类型是Python的内置数据类型之一。它用来表示表达式的真实值。例如,表达式1<=2为True,而表达式0==1为False。了解Python布尔值的行为对于在Python中良好编程是非常重要的。

Python布尔类型

Python布尔类型只有两个可能的值:

True

False

没有其他值的类型为bool。可以使用内置方法type()检查True和False的类型:

>>> type(False)

>>> type(True)

用type()测试False和True的都是bool。

bool是内置类型,在Python中使用不需要导入。然而名字本身并不是语言中的关键字,虽然以下被认为是错误的写法,但可以将其指定给bool名称:

>>> bool

>>> bool = "this is not a type"

>>> bool

'this is not a type'

虽然技术上可行,但为了避免混淆,强烈建议不要为bool指定不同的值。

Python布尔值作为关键字

内置名称不是关键字。就Python语言而言,它们是常规变量。如果指定给它们,则将覆盖内置值。

相比之下,True和False两个名字并不是内置,它们是关键词。与许多其他Python关键字不同,True和False是Python表达式。因为它们是表达式,所以可以在任何可以使用其他表达式(如1+1)的地方使用它们。

可以为变量分配布尔值,但不能将值赋给True:

>>> a_true_alias

True

>>> True = 5

File "", line 1

SyntaxError: cannot assign to True

因为True是一个关键字,所以不能给它赋值。同样的规则适用于False:

>>> False = 5

File "", line 1

SyntaxError: cannot assign to False

不能指定为False,因为它是Python中的关键字。这样,True和False的行为与其他数值常量类似。例如,可以将1.5传递给函数或将其分配给变量。但是不可能将值赋给1.5。语句1.5=5不是有效的Python代码。1.5=5和False=5都是无效的Python代码,解析时将引发语法错误。

Python布尔值作为数字

在Python中布尔值被认为是一种数值类型。这就表面它们是数字,您可以将算术运算应用于布尔值,还可以将其与数字进行比较:

>>> True == 1

True

>>> False == 0

True

>>> True + (False / True)

1.0

布尔值的数值特性没有很多用途,但是有一种技术可能会对您有所帮助。因为True等于1,False等于0,所以将布尔值相加是一种快速计算真值数量的方法。当您需要计算满足某个条件的项数时,这会很方便。

例如,如果你想分析一首经典儿童诗中的一句话,看看哪一行包含了“the”这个词,那么“真”等于1,“假”等于0这一事实很有用:

>>> lines="""\

... He took his vorpal sword in hand;

... Long time the manxome foe he sought—

... So rested he by the Tumtum tree

... And stood awhile in thought.

... """.splitlines()

>>> sum("the" in line.lower() for line in lines) / len(lines)

0.5

将生成器表达式中的所有值相加可以知道True在生成器中出现的次数。生成器中True的次数等于包含单词“The”的行数,不区分大小写。用这个数除以行总数,就得到了匹配行数与总行数的比率。

要了解这一点的原因,可以将上面的代码拆分成更小的部分:

>>> lines = """\

... He took his vorpal sword in hand;

... Long time the manxome foe he sought—

... So rested he by the Tumtum tree

... And stood awhile in thought.

... """

>>> line_list = lines.splitlines()

>>> "the" in line_list[0]

False

>>> "the" in line_list[1]

True

>>> 0 + False + True # Equivalent to 0 + 0 + 1

1

>>> ["the" in line for line in line_list]

[False, True, True, False]

>>> False + True + True + False

2

>>> len(line_list)

4

>>> 2/4

0.5

ine_list变量保存一个行列表。第一行中没有单词“The”,所以“The”在第line_list[0]中为False。在第二行中,“the”出现了,因此第[1]行中的“the”为真。因为布尔值是数字,你可以把它们加到数字中,0+False+True得到1。

因为[“the”in line for line in line_list]是由四个布尔值组成的列表,所以可以将它们相加。加上False+True+True+False,得到2。现在,如果将结果除以4,即列表的长度,得到0.5。单词“The”出现在所选内容的一半行中。这是一种利用布尔值是数字这一事实的有用方法。

布尔算子

布尔运算符是那些接受布尔输入并返回布尔结果的运算符。

因为Python布尔值只有两个可能的选项,True或False,所以可以根据操作符分配给每个可能的输入组合的结果来完全指定操作符。这些规范称为真值表,因为它们显示在表中。

正如您稍后将看到的,在某些情况下,知道运算符的一个输入就足以确定其值。在这些情况下,不评估其他输入。这称为短路评估。

短路评估的重要性取决于具体案例。在某些情况下,它可能对您的程序几乎没有影响。在其他情况下,例如当计算不影响结果的表达式时,它提供了显著的性能优势。在最极端的情况下,代码的正确性取决于短路评估。

无输入的运算符

您可以将True和False视为不接受输入的布尔运算符。其中一个运算符始终返回True,另一个运算符始终返回False。

将Python布尔值看作运算符有时很有用。例如,这种方法有助于提醒您它们不是变量。由于同样的原因,你不能分配给+,这是不可能分配给真或假。

只存在两个Python布尔值。没有输入的布尔运算符总是返回相同的值。因此,True和False是唯一两个不接受输入的布尔运算符。

非布尔运算符

唯一有一个参数的布尔运算符不是。它接受一个参数并返回相反的结果:False表示True,True表示False。这是真相表:

A

not A

True

False

False

True

此表说明not返回参数的相反真值。因为not只需要一个参数,所以它不会短路。它在返回结果之前对其参数求值:

>>> not True

False

>>> not False

True

>>> def print_and_true():

... print("I got called")

... return True

...

>>> not print_and_true()

I got called

False

最后一行显示not在返回False之前对其输入求值。

您可能想知道为什么没有其他布尔运算符接受单个参数。为了理解原因,您可以查看一个表,其中显示了所有理论上可能采用一个参数的布尔运算符:

A

not A

Identity

Yes

No

True

False

True

True

False

False

True

False

True

False

只有四个可能的运算符具有一个参数。除此之外,其余三个运算符都有一些异想天开的名称,因为它们实际上并不存在:

Identity:由于此运算符只返回其输入,所以您可以将其从代码中删除而不会产生任何效果。

Yes:这是一个短路运算符,因为它不依赖于它的参数。你可以用True替换它,得到同样的结果。

No:这是另一个短路运算符,因为它不依赖于它的参数。你可以用False替换它,得到同样的结果。

另一个运算符可能没有任何用处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构体中vector自动为0_面试题:你是如何选择顺序存储数据结构的?

作者&#xff1a;Tarun Telang 来源&#xff1a;https://dzone.com/articles/arraylist-or-linkedlist本文为Java开发人员选择适当的顺序数据结构提供指导。ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口…

python 公开课_python公开课视频(11~20)

Python基础教程视频教程 各集内容简介 通俗易懂&#xff0c;语言简练&#xff0c;保证入门。 11. Python基础教程视频教程 第 11 集 Python的分支语句if基础 本集主要讲述Python条件分支语句if的基本使用和语法结构&#xff0c;if嵌套和多分支if语句程序设计等问题。 12. Pytho…

oracle 随机排列,oracle的随机排序

oracle的随机排序项目里一个功能要用到随机排序&#xff0c;但是后来又因为数据量大的原因&#xff0c;要分页去查询数据&#xff0c;结果导致查询出来的数据出现重复。原sql如下select * from ( select row_.*, rownum rownum_ from(select * from tble order by dbms_random.…

c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...

我想到了。 我走在正确的轨道上。使用以下连接后&#xff1a;var dev await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);您需要执行自定义配对&#xff1a;var prslt await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds…

python字典求平均值_Python - 字典中各个键的每个值的均值

我在跨整个字典进行迭代时遇到问题&#xff0c;无法对键的值中的每个元素进行简单的汇总统计&#xff08;平均值&#xff09;。Python - 字典中各个键的每个值的均值 我的字典由那些号码清单键和值&#xff1a; test_dict{NJ:[20,50,70,90,100],NY:[10,3,0,99,57],CT:[90,1000,…

数字填图问题matlab上机实验报告,数学建模实验报告数字填图问题

数字填图问题一、实验目的及意义本实验旨在通过生活中几个常见的数字填图问题的探究&#xff0c;探究这类问题的逻辑推理解法和计算机解法&#xff0e;二、实验内容1. 数字填图的逻辑推理&#xff1b;2. 数字填图的计算机解法。三、实验步骤1.开启软件平台——MA TLAB&#xff…

c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...

↑↑↑ 点击上方公众号名称关注&#xff0c;不放过任何转变的机会。✎ 编 者 悟 语借口再小也会瓦解人的意志。文 章 导 读今天带大家用下函数指针&#xff0c;然后将函数指针和函数参数封装到结构体中&#xff0c;接着将数据用动态分配和静态分配的方式赋值给相应的函数&#…

domino流程图_OA实施工程师一线解读Java与Domino优劣

南宁OA软件泛微运营中心云腾为您分享&#xff1a;作为企业的CIO&#xff0c;不仅要面对企业内部的各类需求&#xff0c;还需要管理理念以及对市面上的信息化系统和技术了如指掌&#xff0c;否则很有可能在自己的职业生涯中划上遗憾的一笔。固然是吃一堑长一智&#xff0c;但谁不…

oracle中packages使用,oracle中packages的使用

最近&#xff0c;由于开发的功能较多&#xff0c;对于编写的很多过程&#xff0c;看着英文名字觉得挺熟悉&#xff0c;但要看功能&#xff0c;则需要每个点开去开备注或者代码&#xff0c;觉得很是郁闷。突见packages&#xff0c;想将所有写的过程放到一起&#xff0c;这样下次…

python怎么做软件界面_python – 如何自定义桌面应用程序的标题栏和窗口

我如何自定义标题栏(包括&#xff1a;关闭,最大化,最小化按钮,标题)和用PyQt编写的桌面应用程序框架,使其看起来像下面的图像&#xff1f;我需要一种方法来指定我想用于标题栏元素的颜色(按钮,文本标题和条形和按钮的背景颜色).我需要更改其窗口的代码&#xff1a; import sys …

树莓派存储方案_如何增加树莓派的存储量

大多数人仅使用8GB SD卡来运行Raspberry Pi。但这真的够了吗&#xff1f;如果您需要更多空间怎么办&#xff1f;这是通过删除不需要的软件包或简单地添加存储来在Raspbian上腾出更多空间的方法。使用更大的microSD卡您应该考虑在Raspberry Pi上增加空间的第一个选择是更大的SD卡…

linux中进程优先级,linux下调整进程优先级

linux下调整进程优先级进程的优先级决定了进程是否优先被cpu分配资源进行处理。在cpu资源十分充足时&#xff0c;每个正在运行的进程都能分配到足够的资源进行处理&#xff0c;此时调整进程的优先级是没有什么意义的&#xff1b;如果cpu资源紧张时&#xff0c;top查看cpu使用达…

华为交换机 查ip冲突_交换机如何解决IP地址冲突?

如何防止IP地址冲突故障&#xff1f;这个在实际项目中经常会遇到&#xff0c;网络用户如果没有按照规定设置IP地址的话&#xff0c;IP地址冲突现象就不可避免&#xff0c;一旦这种现象频繁发生&#xff0c;不但会影响上网效率&#xff0c;而且也不利于局域网网络的稳定运行。为…

python绘制社会关系网络图_Python networkx 网络图绘制

简单演示import networkx as nx import matplotlib.pyplot as plt # 定义空图 g nx.Graph() # 增加节点 g.add_node(1) g.add_node(A) g.add_nodes_from([2, 3]) g.add_edge(2, 3) g.add_edges_from([(1, 2), (1, 3)]) nx.draw(g, with_labelsTrue) plt.show() 一次增加多个点…

查看LINUX放开端口,linux如何查看端口是否开放?

在linux中我们可以通过在命令行中使用lsof命令、netstat命令来检查端口是否开放。方法一&#xff1a;使用lsof命令我们可以使用lsof命令来检查某一端口是否开放&#xff0c;基本语法如下&#xff1a;lsof -i:端口号如果没有任何输出则说明没有开启该端口号下图以80端口和53端口…

vue如何把数组转为json数组_vue.js,_vuejs Ajax取得一个数据json数组,vue.js - phpStudy...

vuejs Ajax取得一个数据json数组vuejs Ajax取得一个数据json数组后&#xff0c;要通取回的数据再做判断一定只能通这种方式或者 套template标签{{item.displayWords}}{{item.displayWords}}或者{{item.displayWords}}{{item.displayWords}}这样才行吗&#xff1f;&#xff1f;&…

python数据处理框架_python 最快 web 框架 Sanci 快速入门

简介 Sanic 是一个和类Flask 的基于Python3.5的web框架&#xff0c;它编写的代码速度特别快。 除了像Flask 以外&#xff0c;Sanic 还支持以异步请求的方式处理请求。这意味着你可以使用新的 async/await 语法&#xff0c;编写非阻塞的快速的代码。 关于 asyncio 包的介绍&…

linux tcp ip c,Linux下TCP/IP编程--TCP实战(select)

本文参考自徐晓鑫《后台开发》&#xff0c;记录之。一、为什么要使用非阻塞I/O之select初学socket的人可能不爱用select写程序&#xff0c;而习惯诸如connect、accept、recv/recvfrom这样的阻塞程序。当让服务器同时为多个客户端提供一问一答服务时&#xff0c;很多程序员采用多…

mybatis 取查询值_Mybatis --- 映射文件、参数处理、参数值的获取、select元素

这样就可以在insert函数中获取新添加的用户的 id主键&#xff0c;否则获取不到select * from student where id #{id}insert into student(name,password,email) values(#{name},#{password},#{email})编写测试单元&#xff1a;private EmployeeMapper mapper null;private S…

单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏

为了让大家更深入地了解底层的原理&#xff0c;在讲解时特意选择了51单片机(而非STM系列)&#xff0c;另外16*16点阵由译码器和移位缓存器直接驱动(而非MAX系列芯片)&#xff0c;摇杆也利用ADC功能判断方向。那如何让单片机驱动这256个点呢&#xff1f;直接用IO口驱动显然不够且…