⽤python计算1乘到10_从零开始学习PYTHON3讲义(⼗⼀)
计算器升级啦
(内容需要,本讲中再次使⽤了⼤量在线公式,如果因为转帖⽹站不⽀持公式⽆法显⽰的情况,欢迎访问原始博客。)
《从零开始PYTHON3》第⼗⼀讲
第⼆讲的时候,我们通过Python的交互模式来⼊门Python基本知识。当时把Python当成了⼀个计算器使⽤。随后从第三讲开始,⼀直到第⼗讲,我们进⼊了编程的⽅式,并且不断的深⼊,到第九讲,我们已经完成了Python基本语⾔、语法部分的学习。
每⼀讲都有⼤量的编程练习,估计⼤家也累了,这⼀讲休息⼀下,我们回到把Python当做计算器的状态。当然内容还是要更深⼊⼀些,介绍⼀些常⽤的⾼级数学运算功能。
Python的标准数学库
标准库、内置库、官⽅库这些词其实说的都是⼀个意思,就是这个库来⾃Python官⽅开发团队,随开发语⾔⼀同安装⽆需另外下载的库。
第⼆讲的时候我们已经发现了,Python本⾝似乎只能做⼀些简单的数学运算,加、减、乘、除、乘⽅。随后整数运算还额外有取余数、整除等⼏个特别的运算。实际上Python更复杂的数学运算都在标准数学库math之中。⼀直到第九讲我们介绍了“库”的概念,我们才能更多的介绍Python更⾼级的计算能⼒。
如同上⼀讲说到sys库的那样,我们也可以使⽤Python的内部帮助来查看math库的详细情况:
>>> import math
>>> dir(math)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil',
'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd',
'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians',
'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
>>> help(math)
... #将有⼤量详细的帮助信息,这⾥略去
下⾯我们介绍⼀些常⽤的math内置数学函数:
函数
功能
math.pi
数学常数π= 3.141592……
math.e
数学常数e = 2.718281….
math.tau
数学常数τ= 6.283185……
返回x的上限,返回最⼩的整数A (A>=x)。如il(3.14)返回的整数为4官⽹math库
math.fabs(x)
返回绝对值x。
math.factorial(x)
返回 x!。如果x不是积分或者是负的,就会产⽣ValueError。
math.floor(x)
返回x的下限,返回⼀个值最⼤整数A (A<=x)。如math.floor(3.14)返回的整数为p(x)
返回 ex也就是 math.e ** x
math.pow(x,y)
返回x的y次⽅,即返回 x ** y
linspace numpy
math.sqrt(x)
返回 $$ \sqrt x $$
math.degrees(x)
将⾓x从弧度转换成⾓度。
math.radians(x)
把⾓x从度转换成弧度。
math.acos(x)
返回 x 的反余弦
math.asin(x)
返回 x 的反正弦。
math.atan(x)
返回 x 的反正切。
返回 x 的余弦。
math.sin(x)
返回 x 的正弦。
math.tan(x)
返回 x 的正切。
math.log(x,a)
返回 $$ log;a^x $$,若不提供a参数,默认使⽤e
有了这些函数的帮助,我们⼀下从⼩学⽔平上升到了⾼中:),来看⼏个使⽤的例⼦:>>> import math#所有math的函数,使⽤之前必须引⼊库,引⼊⼀次即可
>>> math.sin(1) #1的正弦
0.8414709848078965
>>> math.pi #π常量
3.141592653589793
>>> math.sqrt(3) #计算3的平⽅根
1.7320508075688772
>>>
扩展库和各种函数的学习,通常不需要你⼀次都记住,⽽是⽤的时候查资料会⽤即可。常⽤的函数,⽤的多的⾃然就记住了。
第三⽅数学库numpy
“第三⽅”是在计算机⾏业中很常⽤的概念,指的既不是开发者官⽅提供的,也不是⽤户⾃⼰开发的。是由其它组织开发并提供服务的内容。可以把两者做⼀个⽐较:
标准库
第三⽅扩展库
同为软件库,相同的使⽤⽅法
同为软件库,相同的使⽤⽅法
由PYTHON官⽅或认可的开发团队开发维护
通常由世界范围内许多不同公司或组织开发维护
通常只有⼀个最稳定的版本
同⼀个功能,可能有很多个团队的不同产品,质量参差不齐
主要完成常⽤、基本、必备功能
解决各种各样问题
随PYTHON安装,直接就可以使⽤,称为标准库
需要额外安装,跟不同操作系统可能还有兼容性问题,称为第三⽅扩展库
开发规范、命名习惯基本统⼀
各⾃有各⾃的标准、规范,互相之间有可能习惯差别很⼤
通常能⽣存并传播很⼴泛的第三⽅扩展库都有惊⼈强⼤的功能。在享受这些“超级”功能的同时,每个第三⽅扩展库都需要安装之后才能被Python程序“引⽤”和“使⽤”,是第三⽅扩展库最⼤的障碍。
为此Python发展出了很多扩展库的管理⼯具来帮助开发⼈员安装、管理、删除扩展库。我们第⼀讲介绍了使⽤最多的pip管理⼯具。
使⽤pip管理⼯具安装numpy数学库的⽅法如下:
#在Windows中,⾸先退出当前的Python软件
#使⽤管理员模式执⾏cmd命令⾏,然后执⾏如下命令:
pip install numpy
#某些windows系统需要使⽤pip3
pip3 install numpy
#linux和mac在命令⾏执⾏:
sudo pip3 install numpy
使⽤习惯之后,这样⼀⾏的安装命令根本不会对你使⽤扩展库有什么影响,⽽且只需要安装⼀次,不换电脑就可以⼀直使⽤。
numpy的使⽤跟math的使⽤⼏乎是相同的,但是相较于只有50多个预置数学函数的math,numpy包含了600多个。只要跟数学相关的,⼏乎所有需要⽤到的函数和常量都已经有了。我们举⼏个例⼦:
#⾸先使⽤之前⼀样是必须先引⽤
import numpy as np
#as np表⽰引⼊后使⽤np的名字来调⽤,这样每次都可以少敲⼏个字母
np.sin(1) #正弦函数
=> 0.8414709848078965
np.pi #π常量
=> 3.141592653589793
np.sqrt(3) #平⽅根
=> 1.7320508075688772
np.arccos(0) #反余弦函数
=> 1.5707963267948966
#查看帮助
help(np) #第⼀次帮助会从⽹上获取,速度⽐较慢
第九讲我们曾经讲过了使⽤列表类型保存矩阵的⽅式,可惜就基本Python的功能来讲,也只是能保存⽽已,想要计算,需要⾃⼰使⽤复杂的循环嵌套来完成。但矩阵运算在numpy是直接内置的,⽐如:
\[A = \left\{
\begin{matrix}
2 &
3 &
4 \\
5 &
6 &
7 \\
8 & 9 & 10
\end{matrix}
\right\} \times 3\tag{1}
\]
我们直接看numpy的计算⽅式:
>>> np.array([[2,3,4],[5,6,7],[8,9,10]])*3
array([[ 6, 9, 12],
[15, 18, 21],
[24, 27, 30]])
np.array函数,实际是numpy中的列表类型。列表的定义跟标准Python很像,是⽤嵌套的“[]”完成的。随后numpy的类型直接就⽀持矩阵乘法,所以最后“*3”。执⾏后输出了矩阵的计算结果。对⽐的如果使⽤标准的Python,肯定要使⽤两个循环嵌套,然后逐项的进⾏乘法计算。速度会慢很多,编程也复杂很多。
再⽐较⼀个例⼦。第六讲中我们讲了range函数,是跟for循环⼀起介绍的,⼤家应当不陌⽣。当时重点说明了range返回的是⼀个整数的序列类型,那碰到需要使⽤⼩数的序列类型的时候怎么办呢?通常的办法只能在循环体中增加⼀次整数同浮点⼩数的乘法运算来⽣成每次循环使⽤的⼩数。⽐如:
step=0.11
r=[]
for i in range(10):
r.append(i * step)
#结果为:
[0.0, 0.11, 0.22, 0.33, 0.44, 0.55, 0.66, 0.77, 0.88, 0.99]
⽽numpy中,直接有⽀持⼩数序列的类型:
#Python内置的range函数
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#numpy中⽀持⼩数序列的linspace
>>> np.linspace(1,2,10)
array([1. , 1.11111111, 1.22222222, 1.33333333, 1.44444444,
1.55555556, 1.66666667, 1.77777778, 1.88888889,
2. ])
linspace函数的三个参数跟range函数区别⽐较⼤,需要注意:第⼀个参数是指起始数值;第⼆个参数是指结束数值,注意这⾥会包含结束数值,⽽range中是不包含结束数值;第三个参数是指从开始到结束,分为多少份,也就是最后序列的长度。
我们⾄今所看到的Python数学计算,都属于数值计算的范畴。所谓“数值计算”就是指不管计算过程多么复杂,最终以数值的形式得出计算结果。
数值计算在实际应⽤中使⽤的最多,但缺陷也⽐较明显。⽐如从上⾯linspace的例⼦就能看出来,看起来所⽣成的浮点⼩数序列,并不是很整齐,⼏乎可以确定有被省略的部分。计算机内部的存储是2进制数,我们平常习惯的计算⽅式是10进制数,两者之间的转换会有误差,⽆理数的多次截取也会造成误差。我们可以再举⼀个更明显的例⼦:
import math
math.sqrt(8)
结果:2.8284271247461903
math.sqrt(8)*math.sqrt(8)
结果:8.000000000000002
上例中,因为对8开平⽅的时候数据做了截取,相乘计算回平⽅值之后,⽆法做到精确的得出8,只是⼀个很近似的值。这在存在⼤量计算⽽精度⼜要求⽐较⾼的情况下,仔细的考虑化简的时机和计算的⽅法将会耗费⼤量的精⼒。
这种情况在第三⽅的numpy数学库中同样是存在的:
import numpy as np
np.sqrt(8)
结果:2.8284271247461903
np.sqrt(8)*np.sqrt(8)
结果:8.000000000000002
实际上只要是使⽤数值计算就会出现这种情况,尚⽆法避免。
为了应对这种⽅式,在数学中⼤量采⽤了符号计算。我们⽬前数学课上学到的⽅程式、多项式基本都
属于这个范畴。往往并不需要求出最终的计算结果。化简到⼀些包含简单符号和算式的结果就可以满⾜应⽤。因此符号计算在科研、⼯程领域都有⼴泛应⽤。
Python有⼀个第三⽅的符号计算扩展库,名为sympy。安装⽅式为(以后的安装介绍均以windows为例,不再介绍linux及mac,相信参考windows的⽅法,在linux和mac安装都不应当有问题):
#⾸先使⽤管理员模式打开cmd命令⾏,然后执⾏:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论