杭州余杭区Python培训多久能学会
Python课程内容
Python基础
Python概述环境搭建、入门程序数据类型、变量基本运算符if选择结构while循环列表、for循环元组、集合字典操作字符串操作日期模块(datetime)使用函数系统模块os操作模块sys数学模块math文件IO面向对象:概述、封装面向对象:继承、多态异常处理自定义模块及使用数据库
Linux概述Python环境搭建微信飞机大战ubuntu开发MySQL数据库概述MySQL安装MySQL单表增删改查外键约束多表查询Python操作MySQLmongoDB入门mongoDB进阶Redis概述Redis安装Redis常见命令
Python核心
Python内存分析列表*操作函数*操作正则表达式案例操作网络编程多进程-多线程
前端开发
HTML概述入门程序、文档结构常见行级标签常见块级标签样式概述常见文本修饰样式尺寸修饰样式定位样式盒子模型网页项目开发JavaScript概述基础语法事件操作DOM操作常见**开发Ajax操作JQuery概述插件使用、Ajax操作Bootstrap常见全局样式常见插件的使用
Django Web框架
Web基础Django入门数据模型Model视图操作Views\路由操作模板操作Template后台管理系统表单处理、数据安全常见问题:ajax、分页等项目协同开发项目部署、分布式处理项目开发Tornado入门Tornado请求处理流程静态文件及模板的操作Tornado数据库操作Tornado安全应用Tornado异步操作WebSocketNginx下载、配置新闻发布平台项目开发
数据爬虫
爬虫原理与数据爬取urllib2爬虫*操作数据提取requests模块BeautifulSoup4Scrapy框架概述深度爬虫Scrapy分布式爬虫入门Scpary-Redis分布式爬虫Scrapy-Redis实战案例
人工智能
数据结构与算法人工智能核心概念机器学习常见算法深度学习常见算法数据分析数据可视化
Python 浮点数的冷知识
请读者们先思考下面的两个问题:
若两个元组相等,即 a==b 且 a is b,那么相同索引的元素(如a[0] 、b[0])是否必然相等?
若两个对象的 hash 结果相等,即 hash(a) == hash(b),那么它们是否必然相等呢?
答案当然都为否(不然就不叫冷知识了),大家可以先尝试自己回答一下,然后再往下看。
好了,先来看看一个问题。两个相同的元组 a、b,它们有如下的关系:
>>> a = (float('nan'),) >>> b = a >>> a # (nan,) >>> b # (nan,) >>> type(a), type(b)(<type 'tuple'>, <type 'tuple'>) >>> a == bTrue >>> a is b # 即 id(a) == id(b)True >>> a[0] == b[0] False
以上代码表明:a 等于 b(类型、值与 id 都相等),但是它们的对位元素却不相等。
两个元组都只有一个元素(逗号后面没有别的元素,这是单元素的元组的表示方法,即 len(a)==1 )。float() 是个内置函数,可以将入参构造成一个浮点数。
为什么会这样呢?先查阅一下文档,这个内置函数的解析规则是:
sign ::= "+" | "-" infinity ::= "Infinity" | "inf" an ::= "nan"numeric_value ::= floatnumber | infinity | nan umeric_string ::= [sign] numeric_value
它在解析时,可以解析前后的空格、前缀的加减号(+/-)、浮点数,除此之外,还可以解析两类字符串(不区分大小写):"Infinity"或"inf",表示无穷大数;“nan”,表示不是数(not-a-number),确切地说,指的是除了数以外的所有东西。
前面分享的一个冷知识就跟“nan”有关,作为整体,两个元组相等,但是它们的元素却不相等。之所以会这样,因为“nan”表示除了数以外的东西,它是一个范围,所以不可比较。
作为对比,我们来看看两个“无穷大的浮点数”是什么结果:
>>> a = (float('inf'),) >>> b = a >>> a # (inf,) >>> b # (inf,) >>> a == b # True >>> a is b # True >>> a[0] == b[0] # True
注意后一次比较,它跟前面的两个元组恰好相反,由此,我们可以得出结论:两个无穷大的浮点数,数值相等,而两个“不是数的东西”,数值不相等。
化简一下,可以这样看:
>>> a = float('inf') >>> b = float('inf') >>> c = float('nan') >>> d = float('nan') >>> a == b # True >>> c == d # False
以上就是一个冷知识的揭秘。接着看第二个:
>>> hash(float('nan')) == hash(float('nan'))True
前面刚说了两个“不是数的东西”不相等,这里却显示它们的哈希结果相等,这挺违背常理的。
我们可以推理出一条简单的结论:不相等的两个对象,其哈希结果可能相等。
原因在于,hash(float('nan')) 的结果等于 0,它是个固定值,作比较时当然就相等了。
其实,关于 hash() 函数,还埋了一个彩蛋:
>>> hash(float('inf')) # 314159 >>> hash(float('-inf')) # -314159
有没有觉得这个数值很熟悉啊?它正是圆周率的前五位 3.14159,去除小数点后的结果。在早期的 Python 版本中,负无穷大数的哈希结果其实是 -271828,正是取自于自然对数 e。这两个数都是硬编码在 Python 解释器中的,算是某种致敬吧。
由于 float('nan') 的哈希值相等,这通常意味着它们不可以作为字典的不同键值,但是事实却出人意料:
>>> a = {float('nan'): 1, float('nan'): 2} >>> a{nan: 1, nan: 2}# 作为对比: >>> b = {float('inf'): 1, float('inf'): 2} >>> b{inf: 2}
如上所示,两个 nan 键值在表示上一模一样(注意,它们没有用引号括起来),它们可以共存,而 inf 却只能归并成一个,再次展示出了 nan 的神奇。
好了,两个很冷的小知识分享完毕,背后的原因都在于 float() 取浮点数时,Python 允许了 an(不是数)的存在,它表示不确切的存在,所以导致了这些奇怪的结果。
后,我们作下小结:
包含 float('nan') 的两个元组,当做整体作比较时,结果相等;两个相等的元组,其对位的元素可能不相等
float('nan') 表示一个“不是数”的东西,它本身不是确定值,两个对象作比较时不相等,但是其哈希结果是固定值,作比较时相等;可用作字典的键值,而且是不冲突的键值
float('inf') 表示无穷大的浮点数,可看作确定的值,两个对象做比较时相等,其哈希结果也相等;可用作字典的键值,但是会产生冲突
float('nan') 的哈希结果为 0,float('inf') 的哈希结果为 314159
更多培训课程,学习资讯,课程优惠等学校信息,请进入 杭州萧山区Web培训杭州余杭区Python培训杭州富阳区Linux云计算培训 网站详细了解,免费咨询电话:400-998-6158