本文共 7126 字,大约阅读时间需要 23 分钟。
原文链接: http://zh.5long.me/2015/python-math-1/
摘要(Abstract)
本文介绍使用Python来做数学计算,在学习和工作中,经常会遇到一些数学计算的问题。一般人会使用计算器软件,不得不说,计算器太难用了。专业人士可能会使用更强大的工具,如Matlab,但这种重量级工具有时可能并不适用。本文打算使用一个轻量级的工具Python来做计算。准确来说Python并不是一个数学工具,而是一种编程语言。Python提供了很多数学库,利用Python和这些库可以做很多数学计算。
本文不是编程语言的教程,更像是一个工具的使用教程,阅读本文不需要有程序设计基础,当然,需要一点数学基础(比如加减乘除)。本文适合任何想找一个计算工具的人学习和参考。
本文将以实例讲解各种用法。
安装Python(Installation)
Python官方网站提供下载,完全免费使用。Python目前有Python 2和Python 3两个版本,两个版本有一些语法差别,对于本文来说,几乎没有区别,推荐使用Python 3。在Download界面找到系统对应的版本下载(我的版本是Mac OS X 64-bit/32-bit installer),双击直接安装。安装好后,找到程序IDLE,启动IDLE就可开始写Python程序了。
提示1:Mac OS和大部分版本Linux系统自带Python运行环境,可以不用安装。当然,也可升级成最新版本。Windows需要自行安装。 提示2:也可以安装Sublime Text编辑器,再安装Sublime REPL插件。本人现在使用这种方案,写Python程序非常方便。
提示3:搜狗输入法用户注意,搜狗输入法在IDLE下有点小问题(不能退格),切换到英文输入法即可。
Python 2 和Python 3的注意事项 print的语法。python 3的用法为print("hello world!"),python 2的用法为print "hello world!"或者print("hello world!")。基本运算
加法
>>> 1 + 2 //直接输入,回车直接输出结果
3 >>> sum = 1 + 2 //计算结果保存在sum中 >>> print(sum) //输出sum 3 >>> a = 1 //变量 >>> b = 2 >>> sum = a + b //变量相加 >>> print(sum) 312345678910
减法
>>> a = 1
>>> b = 2 >>> 2 - 1 1 >>> a - b -1 >>> b - a 112345678
乘法
>>> 1 * 2
2 >>> 1.5 * 3 4.5 >>> a * b 2 >>> 1234567
除法
传统的除法。有编程经验的人一定知道,整型除法的结果也是整型(地板除,舍弃小数部分)。如果有一个数是浮点型,则结果是浮点型(真正的除法,保留小数)。
>>> 1 / 3 //整型除法,商为0,舍弃小数部分
0 >>> 5 / 2 2 >>> 1.0 / 3 //浮点数除法,保留小数 0.3333333333333333 >>> 5.0 / 2.0 2.512345678真正的除法。在未来的Python版本中,不管是整型还是浮点型除法,结果总是真实地商(保留小数部分),现阶段可以通过执行from __future__ import division指令做到这一点。
>>> from __future__ import division
>>> 1 / 3 0.3333333333333333 >>> 5 / 2 2.5 >>> 1.0 / 3 0.3333333333333333 >>> 5.0 / 2.0 2.5123456789地板除。Python 2.2新加了一个操作符//,//除法不管操作数为何种数值类型,总是舍弃小数部分。
>>> 1 // 3
0 >>> 5 // 2 2 >>> 1.0 // 3 0.0 >>> 5.0 // 2.0 2.012345678
取余数
>>> 1 % 3
1 >>> 5 % 2 1 >>> 5.0 % 2.0 1.0123456
幂运算
Python有幂运算符**。
>>> 2 ** 3
8 >>> 2.5 ** 5 97.65625 >>> 4 ** -1 0.25123456代码中分别计算23、2.55、4-1。
复数
复数的表示。复数的表示如下:
>>> aComplex = 1 + 2j //申明一个复数
>>> aComplex (1+2j) >>> aComplex.real //复数实部 1.0 >>> aComplex.imag //复数虚部 2.0 >>> aComplex.conjugate() //共轭复数 (1-2j) >>> 12345678910复数的运算。复数的运算与实数一致。
>>> c = 1 + 2j
>>> d = 2 - 1j >>> c + d (3+1j) >>> c - d (-1+3j) >>> c * d (4+3j) >>> c / d 1j >>> c / 2 (0.5+1j) >>> c * 2 (2+4j) >>> c ** 2 (-3+4j)12345678910111213141516
math标准库
Python有一个标准库math专门用来做数学运算的。详细介绍可参考Python的官方文档。要使用math库,先要import这个库。
>>> import math1
一下的例子假设已经执行了import math。
两个常数
>>> math.pi //圆周率pi
3.141592653589793 >>> math.e 2.718281828459045 //自然常数e1234
数值计算
math.ceil(x)。向上取整,返回最小的大于或等于x的整数。>>> math.ceil(2) 2.0 >>> math.ceil(2.2) 3.0 >>> math.ceil(2.9) 3.0 >>> math.ceil(3.0) 3.012345678 math.floor(x)。向下取整,返回最大的小于或等于x的整数。
>>> math.floor(2) 2.0 >>> math.floor(2.2) 2.0 >>> math.floor(2.9) 2.0 >>> math.floor(3.0) 3.012345678 math.fabs(x)。取x得绝对值。
>>> math.fabs(1.0) 1.0 >>> math.fabs(-1.0) 1.01234 math.factorial(x)。求x的阶乘,x必须为整数,否则出现错误。
>>> math.factorial(5) 120 >>> math.factorial(4) 24 >>> math.factorial(2.1) //执行错误 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: factorial() only accepts integral values >>> 123456789
幂和对数函数(Power and logarithmic functions)
math.exp(x)。返回e ** x。>>> math.exp(2) 7.38905609893065 >>> math.e ** 2 7.3890560989306495 //请忽略后面的不一致,计算机浮点数本身的问题1234 math.log(x [,base])。求以base为底的对数。
>>> math.log(math.e) //值传一个参数,默认以math.e为底 1.0 >>> math.log(math.e ** 2) 2.0 >>> math.log(8, 2) //两个参数,2为底 3.0 >>> math.log(100, 10) //两个参数,10为底s 2.012345678 math.pow(x, y)。幂运算,计算xy,相当于x ** y。
>>> math.pow(2, 3) 8.0 >>> 2 ** 3 81234 math.sqrt(x)**。求x的平方根。
>>> math.sqrt(4) 2.0 >>> math.sqrt(9.0) 3.01234 开根号。Python的math库中只有开平方根,没有立方根和n次方根,不过可以利用math.pow或者**,只需把根号变成分数。
>>> math.pow(4, 1.0 / 2) //平方根,相当于math.sqrt(4) 2.0 >>> 4 ** (1.0 / 2) //平方根,相当于math.sqrt(4) 2.0 >>> 8 ** (1.0 / 3) //立方根 2.0 >>> 1024 ** (1.0 / 10) //10次方根 2.012345678
三角函数(Trigonometric functions)
math库中的三角函数使用的弧度(radians)计算,所以用角度(angle)计算前先要转换成弧度。math也提供了角度和弧度的转换函数。
方法名 实现功能
math.degrees(x)
把弧度x转换成角度 math.radians(x) 把角度x转换成弧度
>>> math.degrees(math.pi) 180.0 >>> math.radians(180.0) 3.1415926535897931234 math.cos(x)。不解释。 math.sin(x)。不解释。 math.tan(x)。不解释。 math.acos(x)。反余弦函数。 math.asin(x)。反正弦函数。 math.atan(x)。反正切函数。 math.hypot(x,y)。欧式范数(Euclidean norm)。相当sqrt(x*x + y*y)。
>>> math.cos(math.pi) -1.0 >>> math.sin(math.pi / 2) 1.0 >>> math.tan(math.pi / 4) 0.9999999999999999 //结果为1,计算机浮点数固有缺陷 >>> math.tan(math.pi / 4) 0.9999999999999999 >>> math.acos(-1.0) 3.141592653589793 >>> math.asin(1.0) 1.5707963267948966 >>> math.atan(1) 0.7853981633974483 >>> math.pi / 4 0.7853981633974483 >>> math.hypot(3, 4) 5.0123456789101112131415161718
双曲函数(Hyperbolic functions)
双曲函数和三角函数类似。
math.cosh(x)。求x的双曲余弦函数。 math.sinh(x)。求x的双曲正弦函数。 math.tanh(x)。求x的双曲正切函数。 math.acosh(x)。求x的反双曲余弦。 math.asinh(x)。求x的反双曲正弦。 math.atanh(x)。求x的反双曲正切。>>> math.cosh(1) 1.5430806348152437 >>> math.sinh(1) 1.1752011936438014 >>> math.tanh(1) 0.7615941559557649 >>> math.acosh(1.5430806348152437) 1.0 >>> math.asinh(1.1752011936438014) 1.0 >>> math.atanh(0.7615941559557649) 0.9999999999999999 //结果为1,计算机浮点数固有缺陷123456789101112
一个复杂的例子
举一个复杂的例子,计算下面的公式:
>>> - (4 ** (1.0 / 3)) / 4 * math.log(2 ** (1.0 / 3) - 1) - (math.sqrt(3) * (4 ** (1.0 / 3))) / 6 * math.atan(math.sqrt(3) / (1 + 2 * (2 * (1.0 / 3)))) 0.2420914086273389712
坑
在前面的例子可能已经注意到了,计算机表示浮点数是不准确的,比如1.0成了0.9999999999999999。这是计算机浮点数表示法的固有缺陷。比如会出现如下结果:
>>> 0.05 + 0.01
0.060000000000000005 >>> 1.0 - 0.12 0.88 >>> 1.0 - 0.32 0.6799999999999999 >>> 1.0 - 0.42 0.5800000000000001 >>> 4.015 * 100 401.49999999999994 >>> 123.3 / 100 1.2329999999999999123456789101112浮点数的缺陷不仅仅在Python在存在,在任何语言都存在,它是浮点数表示法本身的缺陷。对于不是非常严格的计算,这种缺陷是可以接受的,而对于过于严格的计算,那么应该用整型数计算(整型计算是精确的)。比如在保留两位小数的计算中,可以把原始数乘以100取整数再计算,约定最后两位为小数即可。
结语
本文介绍了Python标准库的数学计算方法,通过使用Python标准数学库,可以应付一些日常的基本计算(比如我就很少使用计算器了,一般的计算都用Python解决)。当然,数学是如此的丰富,仅有标准库是远远不够的。将来如果有需要的话,我会研究下使用其它的数学库来进行更复杂的计算以及数学图像的绘制。比如NumPy、SciPy、Matplotlib、SymPy等。
在python中函数的定义以及调用如下代码所示:
def test(x): y = x+1 return yresult = test(2)print(result)
如果在函数中return多个值,会将那多个值打包成一个元组传出,如下代码所示
def test(x): y1 = x+1 y2 = x+2 return y1,y2result = test(2)print(result) #打印结果为(3, 4)
使用关键字参数,则传参的位置可以不固定,但是个数还是要相匹配,此外在调用的时候关键字参数一定要在普通参数的右边,如下代码所示
def test(x,y,z): res = x - y - z return resresult = test(y=1,x=5,z=2)print(result) #打印结果为2
使用默认参数,传参的个数可以不匹配,如果默认参数的位置没有传,则使用默认值,这个是在定义的时候定义的,定义默认参数要写在最右边,如下代码所示
def test(name,sex = "man"): print(name) print(sex)test("CodeScrew")#打印结果为CodeScrew mantest("CodeScrew","women")#打印结果为CodeScrew women
参数组中指的是可以传任意参数,一般**对应字典,*对应列表,如下代码所示
def test(name,*args): print(name) print(args)test("CodeScrew",*[1,2,3,4])#打印结果为CodeScrew (1, 2, 3, 4)
def test(name,**kwargs): print(name) print(kwargs)test("CodeScrew",x=1,y=2)#打印结果为CodeScrew {'x': 1, 'y': 2}test("CodeScrew",**{"x":1,"y":2})#打印结果为CodeScrew {'x': 1, 'y': 2}
def test(x,y,z): res = x - y - z return resresult = test(y=1,x=5,z=2)print(result) #打印结果为2
方法一: 使用内置模块
>>> import math >>> math.pow(12, 2) # 求平方144.0 >>> math.sqrt(144) # 求平方根12.0 >>>
方法二: 使用表达式
>>> 12 ** 2 # 求平方144 >>> 144 ** 0.5 # 求平方根12.0 >>>
方法三: 使用内置函数
>>> pow(12, 2) # 求平方144 >>> pow(144, .5) # 求平方根12.0
转载地址:http://ucuii.baihongyu.com/