浅谈Python里面None True False之间的区别


Posted in Python onJuly 09, 2020

None虽然跟True False一样都是布尔值。

虽然None不表示任何数据,但却具有很重要的作用。

它和False之间的区别还是很大的!

例子:

>>> t = None
>>> if t:
... print("something")
... else:
... print("nothing")
...
nothing

浅谈Python里面None True False之间的区别

区分None和False.使用is来操作!

>>> if t is None:
... print("this is None!")
... else:
... print("this is ELSE!")
...
this is None!
>>>

浅谈Python里面None True False之间的区别

虽然是个小小的区别!但是在Python里面是重要的。你需要将None和不含任何值的空数据结构区分开。

0值的整型/浮点型,空字符串(‘ '),空列表([]),空元组({}),空集合(set())都是等价于False,但是不等于None。

现在,写一个函数:

>>> def oj(t):
... if t is None:
... print("this is None")
... elif t:
... print("this is True")
... else:
... print("this is False")
...

浅谈Python里面None True False之间的区别

进行数据测验:

>>> oj(None)
this is None
>>> oj(True)
this is True
>>> oj(False)
this is False
>>> oj(0)
this is False
>>> oj(0.0)
this is False
>>> oj([])
this is False
>>> oj(())
this is False
>>> oj({})
this is False

浅谈Python里面None True False之间的区别

以上说明,None,False,True还是有很大不同的~

补充知识:python "0.3 == 3 * 0.1" 为False的原因

一.引入

如果你在你的解释器中输入以下第一行代码:

>>> 0.3 == 3 * 0.1

False

你会发现,输出为False。

对于CS小白而言,对此表示费解。

因此我查了相关的资料,进行了一下总结。

二.浮点算法的问题和局限

1.计算机硬件对于浮点数的处理方式

首先,我们必须明白一件事情。浮点数在计算机硬件中表示为基数2(二进制)的分数。

例如:

0.125(10) == 1/10 + 2/100 + 5/1000

0.001(2) == 0/2 + 0/4 + 0/8

这两个分数具有相同的值,唯一的实际区别是,第一个分数以10为基数的分数表示,第二个分数以2为基数。当我们输入0.125时,计算机硬件会以第二种方式表示,而不是第一种。

但是不幸的是,大多数十进制分数不能完全表示为二进制分数。

结果是,通常我们输入的十进制浮点数仅由计算机中实际存储的二进制浮点数

近似。但是在十进制不能完全表示为二进制分数的情况下,无论多么近似,终究不是确切值。

2.例子:对于0.1的处理

例如0.1(10),无论我们愿意使用多少个2位数字,十进制值0.1都不能精确表示为2进制小数,即以2为底的1/10是无限重复的分数。

0.1(10) == 0.0001100110011001100110011001100110011001100110011...(2)

当我们让它停在某个有限的位数,就可以得出一个近似值。

因为Python浮点数可使用 53位精度 ,

因此输入十进制数时计算机内部存储的值0.1是

0.00011001100110011001100110011001100110011001100110011010(2)

这个值接近但是不等于1/10.

这也是造成print(0.3 == 3 * 0.1)输出为False的原因。

如果要强制使用python输出计算机内保存的0.1的真实十进制值,应该为

>>> 0.1

0.1000000000000000055511151231257827021181583404541015625

由于这一串数字实在太长了,所以Python通过显示舍入的值来保持数字的可管理性。所以实际上我们看到是:

>>> 0.1

0.1

但是我们要明白,机器中的值不完全是1/10,这只是舍入了真实机器值的显示。

3.一点有趣的东西

上面我们提到了Python通过显示舍入的值来保持数字的可管理性,我们看到的只是舍入了真实机器值的显示。通过下面的例子,我们就可以更加清楚这一事实。

当我们用python写下下面的代码时,就会发现这个神奇的现象。

这本质上是二进制浮点数:这不是Python中的bug,也不是代码中的bug。在支持硬件浮点算术的所有语言中,都会看到同一种东西(尽管某些语言在默认情况下或在所有输出模式下可能不会显示差异)。

1)0.1+0.2

>>> 0.1 + 0.2

0.30000000000000004

2)round(2.675, 2)

i)round( x [, n] )的用法

作用: 返回浮点数x的四舍五入值。

参数:

x ? 数值/数值表达式。

n ? 要保留的小数位数,可以省略。若省略,n默认为0,即四舍五入到整数。

ii)round( 2.675, 2)

按照我们的逻辑来看,输入round( 2.675, 2 ),输出应该为2.68。但是实际上是:

>>> round(2.675, 2)

2.67

三.表示错误(选读)

在这里我们详细说明“ 0.1”示例,并说明我们如何自己对此类情况进行准确的分析。如果你不想深究其背后的原因,下面的可以忽略。

1.表示错误的概念、影响和原因

(1)概念

表示错误是指某些(在实际中为大多数)小数部分不能完全表示为二进制(基数为2)分数。

(2)影响

使得Python(或Perl,C,C ++,Java,Fortran和其他许多语言)经常不显示我们所期望的确切十进制数字。

(3)原因

如今,几乎所有机器都使用IEEE-754浮点算法,并且几乎所有平台都将Python浮点数映射到IEEE-754“双精度”。754个double包含53位精度,因此在输入时,计算机会努力将浮点数转换为J / 2 ** N形式的最接近分数, 其中J是一个正好包含53位的整数。

2."0.1"的具体分析

转化目标:1 / 10 ~= J / (2 ** N)

所以:J ~= 2 ** N / 10

1)求解N

因为J是一个正好包含53位的整数(但是实际上最后我们用的是J的近似值( >=2 ** 52 and < 2 ** 53)是通过N计算出来的),并且N是一个整数,所以我们可以得到N的最佳值是56

>>> 2**52
4503599627370496
>>> 2**53
9007199254740992
>>> 2**56/10
7205759403792793

2)求解我们要用的J的近似值

我们通过N来求解实际的J,我们实际上用的J其实是(2**N /10)四舍五入之后的值。

i)divmod(a, b)

功能: 接收两个数字类型(非复数)参数,返回一个包含商和余数的元组(a // b, a % b)。

参数:

a ? 被除数

b ? 除数

ii)求解J近似值

>>> q, r = divmod(2**56, 10)
>>> r
6

因为余数为6>5,所以我们用的J的近似值是

>>> q+1

7205759403792794

3)求解"0.1"的近似值

因此,在754倍精度中,最接近1/10的最佳近似值是

7205759403792794 / 72057594037927936

【注】由于我们四舍五入,因此实际上比1/10大一点;如果我们不进行四舍五入,则商将小于1/10。但是在任何情况下都不能完全是 1/10!

4)获取计算机存储值

通过上面的分析,我们可以看到计算机永远不会“看到” 1/10:它看到的是上面给出的精确分数,它可以得到的最佳754倍近似值(即J的近似值)

>>> .1 * 2**56

7205759403792794.0

如果我们将该分数乘以10 ** 30,我们可以看到其30个最高有效十进制数字的(截断)值:

>>> 7205759403792794 * 10**30 // 2**56

100000000000000005551115123125L

在Python 2.7和Python 3.1之前的版本中,Python将该值四舍五入为17个有效数字,即为'0.10000000000000001'。

在最新版本中,Python会基于最短的十进制分数显示一个值,该值会正确舍入为真实的二进制值,并仅得出'0.1'。

以上这篇浅谈Python里面None True False之间的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
介绍Python的@property装饰器的用法
Apr 28 Python
python抓取最新博客内容并生成Rss
May 17 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
python轻松查到删除自己的微信好友
Jan 10 Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
Python pip配置国内源的方法
Feb 14 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
Python多线程的退出控制实现
Aug 10 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 #Python
在CentOS7下安装Python3教程解析
Jul 09 #Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 #Python
Python使用xlrd实现读取合并单元格
Jul 09 #Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 #Python
浅谈优化Django ORM中的性能问题
Jul 09 #Python
Python单元测试及unittest框架用法实例解析
Jul 09 #Python
You might like
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
Python实现求笛卡尔乘积的方法
2017/09/16 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
专科毕业生就业推荐信
2013/11/01 职场文书
李敖北大演讲稿
2014/05/24 职场文书
付款证明模板
2015/06/19 职场文书
处罚决定书范文
2015/06/24 职场文书
春季运动会加油词
2015/07/18 职场文书
德劲DE1108畅想
2021/04/22 无线电
pytorch--之halfTensor的使用详解
2021/05/24 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL