浅谈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开启多个子进程并行运行的方法
Apr 18 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
python获取外网IP并发邮件的实现方法
Oct 01 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
pandas进行时间数据的转换和计算时间差并提取年月日
Jul 06 Python
django使用admin站点上传图片的实例
Jul 28 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
python实现while循环打印星星的四种形状
Nov 23 Python
Python使用configparser库读取配置文件
Feb 22 Python
Python制作表白爱心合集
Jan 22 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
其他功能
2006/10/09 PHP
php 删除cookie方法详解
2014/12/01 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
网站上面有这种切换效果
2006/06/26 Javascript
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
javascript XML数据显示为HTML一例
2008/12/23 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
详解Angular5 服务端渲染实战
2018/01/04 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
Python中的filter()函数的用法
2015/04/27 Python
Python中的集合类型知识讲解
2015/08/19 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
python查看列的唯一值方法
2018/07/17 Python
python批量获取html内body内容的实例
2019/01/02 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
python 消费 kafka 数据教程
2019/12/21 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
若干个Java基础面试题
2015/05/19 面试题
幼师求职自荐信范文
2014/01/26 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
详解Python常用的魔法方法
2021/06/03 Python
nginx中proxy_pass各种用法详解
2021/11/07 Servers
Python+tkinter实现高清图片保存
2022/03/13 Python
详解Python内置模块Collections
2022/03/22 Python