详解Python编程中基本的数学计算使用


Posted in Python onFebruary 04, 2016


在 Python 中,对数的规定比较简单,基本在小学数学水平即可理解。

那么,做为零基础学习这,也就从计算小学数学题目开始吧。因为从这里开始,数学的基础知识列位肯定过关了。

>>> 3
3
>>> 3333333333333333333333333333333333333333
3333333333333333333333333333333333333333L
>>> 3.222222
3.222222

上面显示的是在交互模式下,如果输入 3,就显示了 3,这样的数称为整数,这个称呼和小学数学一样。

如果输入一个比较大的数,第二个,那么多个 3 组成的一个整数,在 Python 中称之为长整数。为了表示某个数是长整数,Python 会在其末尾显示一个L。其实,现在的 Python 已经能够自动将输入的很大的整数视为长整数了。你不必在这方面进行区别。

第三个,在数学里面称为小数,这里你依然可以这么称呼,不过就像很多编程语言一样,习惯称之为“浮点数”。至于这个名称的由来,也是有点说道的,有兴趣可以 google.

上述举例中,可以说都是无符号(或者说是非负数),如果要表示负数,跟数学中的表示方法一样,前面填上负号即可。

值得注意的是,我们这里说的都是十进制的数。

除了十进制,还有二进制、八进制、十六进制都是在编程中可能用到的,当然用六十进制的时候就比较少了(其实时间记录方式就是典型的六十进制)。

具体每个数字,在 Python 中都是一个对象,比如前面输入的 3,就是一个对象。每个对象,在内存中都有自己的一个地址,这个就是它的身份。

>>> id(3)
140574872
>>> id(3.222222)
140612356
>>> id(3.0)
140612356
>>>

用内建函数 id()可以查看每个对象的内存地址,即身份。

内建函数,英文为 built-in Function,读者根据名字也能猜个八九不离十了。不错,就是 Python 中已经定义好的内部函数。
以上三个不同的数字,是三个不同的对象,具有三个不同的内存地址。特别要注意,在数学上,3 和 3.0 是相等的,但是在这里,它们是不同的对象。

用 id()得到的内存地址,是只读的,不能修改。

了解了“身份”,再来看“类型”,也有一个内建函数供使用type()。

>>> type(3)
<type 'int'>
>>> type(3.0)
<type 'float'>
>>> type(3.222222)
<type 'float'>

用内建函数能够查看对象的类型。<type ‘int'>,说明 3 是整数类型(Interger);<type ‘float'>则告诉我们那个对象是浮点型(Floating point real number)。与 id()的结果类似,type()得到的结果也是只读的。

至于对象的值,在这里就是对象本身了。

看来对象也不难理解。请保持自信,继续。

变量
仅仅写出 3、4、5 是远远不够的,在编程语言中,经常要用到“变量”和“数”(在 Python 中严格来讲是对象)建立一个对应关系。例如:

>>> x = 5
>>> x
5
>>> x = 6
>>> x
6

在这个例子中,x = 5就是在变量(x)和数(5)之间建立了对应关系,接着又建立了 x 与 6 之间的对应关系。我们可以看到,x 先“是”5,后来“是”6。

在 Python 中,有这样一句话是非常重要的:对象有类型,变量无类型。怎么理解呢?

首先,5、6 都是整数,Python 中为它们取了一个名字,叫做“整数”类型的数据,或者说数据类型是整数,用 int 表示。

当我们在 Python 中写入了 5、6,computer 姑娘就自动在她的内存中某个地方给我们建立这两个对象(对象的定义后面会讲,这里你先用着,逐渐就明晰含义了),就好比建造了两个雕塑,一个是形状似 5,一个形状似 6,这就两个对象,这两个对象的类型就是 int.

那个 x 呢?就好比是一个标签,当x = 5时,就是将 x 这个标签拴在了 5 上了,通过这个 x,就顺延看到了 5,于是在交互模式中,>>> x输出的结果就是 5,给人的感觉似乎是 x 就是 5,事实是 x 这个标签贴在 5上面。同样的道理,当x = 6时,标签就换位置了,贴到 6 上面。

所以,这个标签 x 没有类型之说,它不仅可以贴在整数类型的对象上,还能贴在其它类型的对象上,比如后面会介绍到的 str(字符串)类型的对象等等。

这是 Python 区别于一些语言非常重要的地方。

四则运算
按照下面要求,在交互模式中运行,看看得到的结果和用小学数学知识运算之后得到的结果是否一致

>>> 2+5
7
>>> 5-2
3
>>> 10/2
5
>>> 5*2
10
>>> 10/5+1
3
>>> 2*3-4
2

上面的运算中,分别涉及到了四个运算符号:加(+)、减(-)、乘(*)、除(/)

另外,我相信看官已经发现了一个重要的公理:

在计算机中,四则运算和小学数学中学习过的四则运算规则是一样的

要不说人是高等动物呢,自己发明的东西,一定要继承自己已经掌握的知识,别跟自己的历史过不去。伟大的科学家们,在当初设计计算机的时候就想到列位现在学习的需要了,一定不能让后世子孙再学新的运算规则,就用小学数学里面的好了。感谢那些科学家先驱者,泽被后世。

下面计算三个算术题,看看结果是什么

4 + 2
4.0 + 2
4.0 + 2.0

看官可能愤怒了,这么简单的题目,就不要劳驾计算机了,太浪费了。

别着急,还是要运算一下,然后看看结果,有没有不一样?要仔细观察哦。

>>> 4+2
6
>>> 4.0+2
6.0
>>> 4.0+2.0
6.0

不一样的地方是:第一个式子结果是 6,这是一个整数;后面两个是 6.0,这是浮点数。

定义 1:类似 4、-2、129486655、-988654、0 这样形式的数,称之为整数
定义 2:类似 4.0、-2.0、2344.123、3.1415926 这样形式的数,称之为浮点数
对这两个的定义,不用死记硬背,google 一下。记住爱因斯坦说的那句话:书上有的我都不记忆(是这么的说?好像是,大概意思,反正我也不记忆)。后半句他没说,我补充一下:忘了就 google。

似乎计算机做一些四则运算是不在话下的,但是,有一个问题请你务必注意:在数学中,整数是可以无限大的,但是在计算机中,整数不能无限大。为什么呢?(我推荐你去 google,其实计算机的基本知识中肯定学习过了。)因此,就会有某种情况出现,就是参与运算的数或者运算结果超过了计算机中最大的数了,这种问题称之为“整数溢出问题”。

整数溢出问题
这里有一篇专门讨论这个问题的文章,推荐阅读:整数溢出

对于其它语言,整数溢出是必须正视的,但是,在 Python 里面,看官就无忧愁了,原因就是 Python 为我们解决了这个问题,请阅读下面的拙文:大整数相乘

ok!看官可以在 IDE 中实验一下大整数相乘。

>>> 123456789870987654321122343445567678890098876*1233455667789990099876543332387665443345566
152278477193527562870044352587576277277562328362032444339019158937017801601677976183816L

看官是幸运的,Python 解忧愁,所以,选择学习 Python 就是珍惜光阴了。

上面计算结果的数字最后有一个 L,就表示这个数是一个长整数,不过,看官不用管这点,反正是 Python 为我们搞定了。

在结束本节之前,有两个符号需要看官牢记(不记住也没关系,可以随时 google,只不过记住后使用更方便)

整数,用 int 表示,来自单词:integer
浮点数,用 float 表示,就是单词:float
可以用一个命令:type(object)来检测一个数是什么类型。

>>> type(4)
<type 'int'>  #4 是 int,整数
>>> type(5.0)
<type 'float'> #5.0 是 float,浮点数
type(988776544222112233445566778899887766554433221133344455566677788998776543222344556678)
<type 'long'>  # 是长整数,也是一个整数

除法
除法??拢?唤鍪 Python。

整数除以整数
进入 Python 交互模式之后(以后在本教程中,可能不再重复这类的叙述,只要看到>>>,就说明是在交互模式下),练习下面的运算:

>>> 2 / 5
0
>>> 2.0 / 5
0.4
>>> 2 / 5.0
0.4
>>> 2.0 / 5.0
0.4

看到没有?麻烦出来了(这是在 Python2.x 中),按照数学运算,以上四个运算结果都应该是 0.4。但我们看到的后三个符合,第一个居然结果是 0。why?

因为,在 Python(严格说是 Python2.x 中,Python3 会有所变化)里面有一个规定,像 2/5 中的除法这样,是要取整(就是去掉小数,但不是四舍五入)。2 除以 5,商是 0(整数),余数是 2(整数)。那么如果用这种形式:2/5,计算结果就是商那个整数。或者可以理解为:整数除以整数,结果是整数(商)。

比如:

>>> 5 / 2
2
>>> 7 / 2
3
>>> 8 / 2
4

注意:得到是商(整数),而不是得到含有小数位的结果再通过“四舍五入”取整。例如:5/2,得到的是商 2,余数 1,最终5 / 2 = 2。并不是对 2.5 进行四舍五入。

浮点数与整数相除
这个标题和上面的标题格式不一样,上面的标题是“整数除以整数”,如果按照风格一贯制的要求,本节标题应该是“浮点数除以整数”,但没有,现在是“浮点数与整数相除”,其含义是:

假设:x 除以 y。其中 x 可能是整数,也可能是浮点数;y 可能是整数,也可能是浮点数。
出结论之前,还是先做实验:

>>> 9.0 / 2
4.5
>>> 9 / 2.0
4.5
>>> 9.0 / 2.0
4.5

>>> 8.0 / 2
4.0
>>> 8 / 2.0
4.0
>>> 8.0 / 2.0
4.0

归纳,得到规律:不管是被除数还是除数,只要有一个数是浮点数,结果就是浮点数。所以,如果相除的结果有余数,也不会像前面一样了,而是要返回一个浮点数,这就跟在数学上学习的结果一样了。

>>> 10.0 / 3
3.3333333333333335

这个是不是就有点搞怪了,按照数学知识,应该是 3.33333...,后面是 3 的循环了。那么你的计算机就停不下来了,满屏都是 3。为了避免这个,Python 武断终结了循环,但是,可悲的是没有按照“四舍五入”的原则终止。当然,还会有更奇葩的出现:

>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.1 - 0.2
0.0
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17
>>> 0.1 + 0.1 + 0.1 - 0.2
0.10000000000000003

越来越糊涂了,为什么 computer 姑娘在计算这么简单的问题上,如此糊涂了呢?不是 computer 姑娘糊涂,她依然冰雪聪明。原因在于十进制和二进制的转换上,computer 姑娘用的是二进制进行计算,上面的例子中,我们输入的是十进制,她就要把十进制的数转化为二进制,然后再计算。但是,在转化中,浮点数转化为二进制,就出问题了。

例如十进制的 0.1,转化为二进制是:0.0001100110011001100110011001100110011001100110011...

也就是说,转化为二进制后,不会精确等于十进制的 0.1。同时,计算机存储的位数是有限制的,所以,就出现上述现象了。

这种问题不仅仅是 Python 中有,所有支持浮点数运算的编程语言都会遇到,它不是 Python 的 bug。

明白了问题原因,怎么解决呢?就 Python 的浮点数运算而言,大多数机器上每次计算误差不超过 2**53 分之一。对于大多数任务这已经足够了,但是要在心中记住这不是十进制算法,每个浮点数计算可能会带来一个新的舍入错误。

一般情况下,只要简单地将最终显示的结果用“四舍五入”到所期望的十进制位数,就会得到期望的最终结果。

对于需要非常精确的情况,可以使用 decimal 模块,它实现的十进制运算适合会计方面的应用和高精度要求的应用。另外 fractions 模块支持另外一种形式的运算,它实现的运算基于有理数(因此像 1/3 这样的数字可以精确地表示)。最高要求则可是使用由 SciPy 提供的 Numerical Python 包和其它用于数学和统计学的包。列出这些东西,仅仅是让看官能明白,解决问题的方式很多,后面会用这些中的某些方式解决上述问题。

关于无限循环小数问题,我有一个链接推荐给诸位,它不是想象的那么简单呀。请阅读:维基百科的词条:0.999...,会不会有深入体会呢?

补充一个资料,供有兴趣的朋友阅读:浮点数算法:争议和限制
Python 总会要提供多种解决问题的方案的,这是她的风格。

引用模块解决除法--启用轮子
Python 之所以受人欢迎,一个很重重要的原因,就是轮子多。这是比喻啦。就好比你要跑的快,怎么办?光天天练习跑步是不行滴,要用轮子。找辆自行车,就快了很多。还嫌不够快,再换电瓶车,再换汽车,再换高铁...反正你可以选择的很多。但是,这些让你跑的快的东西,多数不是你自己造的,是别人造好了,你来用。甚至两条腿也是感谢父母恩赐。正是因为轮子多,可以选择的多,就可以以各种不同速度享受了。

轮子是人类伟大的发明。

Python 就是这样,有各种轮子,我们只需要用。只不过那些轮子在 Python 里面的名字不叫自行车、汽车,叫做“模块”,有人承接别的语言的名称,叫做“类库”、“类”。不管叫什么名字吧。就是别人造好的东西我们拿过来使用。

怎么用?可以通过两种形式用:

形式 1:import module-name。import 后面跟空格,然后是模块名称,例如:import os
形式 2:from module1 import module11。module1 是一个大模块,里面还有子模块 module11,只想用 module11,就这么写了。
不??铝耍?笛橐桓觯?/p>

>>> from __future__ import division
>>> 5 / 2
2.5
>>> 9 / 2
4.5
>>> 9.0 / 2
4.5
>>> 9 / 2.0
4.5

注意了,引用了一个模块之后,再做除法,就不管什么情况,都是得到浮点数的结果了。

这就是轮子的力量。

余数
前面计算 5/2 的时候,商是 2,余数是 1

余数怎么得到?在 Python 中(其实大多数语言也都是),用%符号来取得两个数相除的余数.

实验下面的操作:

>>> 5 % 2
1
>>> 6%4
2
>>> 5.0%2
1.0

符号:%,就是要得到两个数(可以是整数,也可以是浮点数)相除的余数。

前面说 Python 有很多人见人爱的轮子(模块),她还有丰富的内建函数,也会帮我们做不少事情。例如函数 divmod()

>>> divmod(5,2) # 表示 5 除以 2,返回了商和余数
(2, 1)
>>> divmod(9,2)
(4, 1)
>>> divmod(5.0,2)
(2.0, 1.0)

四舍五入
最后一个了,一定要坚持,今天的确有点??铝恕R?迪炙纳嵛迦耄?芗虻ィ?褪悄诮ê???ound()

动手试试:

>>> round(1.234567,2)
1.23
>>> round(1.234567,3)
1.235
>>> round(10.0/3,4)
3.3333
Python 相关文章推荐
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
python django 实现验证码的功能实例代码
May 18 Python
python WindowsError的错误代码详解
Jul 23 Python
python中logging包的使用总结
Feb 28 Python
Python变量赋值的秘密分享
Apr 03 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
Python 日期与时间转换的方法
Aug 01 Python
Django基础CBV装饰器和中间件
Mar 22 Python
Python连接mysql数据库的正确姿势
Feb 03 #Python
Python内建数据结构详解
Feb 03 #Python
Python解析树及树的遍历
Feb 03 #Python
Python实现二叉堆
Feb 03 #Python
Python实现二叉搜索树
Feb 03 #Python
Python的组合模式与责任链模式编程示例
Feb 02 #Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 #Python
You might like
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
逐步提升php框架的性能
2008/01/10 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
Nike瑞士官网:Nike CH
2021/01/18 全球购物
英语专业毕业生自荐信
2013/10/28 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang