详解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 文件与目录操作
Dec 24 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
Python列表推导式与生成器用法分析
Aug 02 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
python实现烟花小程序
Jan 30 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
jenkins+python自动化测试持续集成教程
May 12 Python
python 实现性别识别
Nov 21 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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书写安全的脚本代码
2012/02/05 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
PHP中的类型约束介绍
2015/05/11 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
PHP函数超时处理方法
2016/02/14 PHP
php生成图片验证码的方法
2016/04/15 PHP
JS面向对象编程 for Cookie
2010/09/19 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
Python中List.index()方法的使用教程
2015/05/20 Python
python logging日志模块的详解
2017/10/29 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
python中的插入排序的简单用法
2021/01/19 Python
软件测试面试题
2015/10/21 面试题
教师校本培训方案
2014/02/26 职场文书
房地产促销活动方案
2014/03/01 职场文书
高一学生期末评语
2014/04/25 职场文书
从事会计工作年限证明
2015/06/23 职场文书
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python