Python是一门学习曲线平缓而绵长的编程语言,对于初学者非常友好,同时也可以实现高级的设计模式。
python提供了许多数学包和高级的数据结构,我们可以在不知其所以然的情况下放心大胆地使用,然后通过绘图工具迅速验证。对于第一次接触编程的人来说,甚至可以把python当作一个高效计算器,可以计算几乎所有有解的数学表达式。
那么,我们现在就来安装python。百度python第一个链接点进去就到了python官网,然后点Downloads链接即可。下载之后正常安装,记得需要勾选将python添加到环境变量中这个选项。
然后我们就进入了python,看到我用的python是3.7.4版本。试着输入1+1,看看结果。
(c) 2019 Microsoft Corporation。保留所有权利。
C:\Users\Laser>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2
>>>
现在,恭喜你,有了一个非常方便的计算器,至少支持四则混合运算。+、-、*、\,这四个运算符是毫不意外的,现代人都应该有这样的数学直觉。除了这四个运算符之外,还有三个常用的运算符。
>>> 10%3 #求余数
1
>>> 2**3 #乘方
8
>>> 10//3 #整数除法
3
>>>
现在,我们已经可以去糊弄小学生了,但是我们还不会算三角函数。这个时候我们就需要使用python中的一些库了。就目前而言,我们可以选择math库。
>>> import math #python中,用import来调用某个已经安装的包
>>> math.cos(0) #使用包中的函数,格式为 包.函数
1.0
>>> math.sin(1.5) #这里用的是弧度制
0.9974949866040544
>>> math.log(10) #自然对数
2.302585092994046
>>> math.log10(10)
1.0
好了,到了这里,我们不仅可以糊弄小学生,初中生也不在话下。
我们注意到这里用到了一条命令import math
,这个math是python的一个包,里面封装了一些数学函数。我们可以将python理解为一个人,包就是工具包。人的潜能是无限的,工具包自然也是无限的,只要有人去开发。所以,除了自带的一些包之外,还有更多的包需要我们另行下载。
说到这里有人要问了,那么哪里能下载呢?
至于哪里能下载,就先不要管了,我们刚刚装python的时候,顺便安装了一个包管理工具,pip,可以通过命令行的方式轻松实现python包的安装,安装命令为pip install 包名
。
现在回到命令行
>>> exit() #这个命令用于退出python
C:\Users\Laser>pip install numpy
C:\Users\Laser>pip install matploblib
numpy是一个装机必备的科学计算包,提供了数组这种对象,我们因之可以方便地做一些线性代数和差分运算。
matplotlib则是一个科学绘图包,至于效果,直接上代码。
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> x = np.arange(0,5,0.1) #生成区间[0,5)范围内间隔为0.1的等差数列
>>> x #在命令提示符中,直接输入变量会显示变量内容
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2,
1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2, 2.3, 2.4, 2.5,
2.6, 2.7, 2.8, 2.9, 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8,
3.9, 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9])
>>> y = np.sin(x)
>>> plt.plot(x,y) #画图
[<matplotlib.lines.Line2D object at 0x000002F1750337C8>]
>>> plt.show() #显示画出的图
在上面的代码中,import ... as ...
可以理解为对某个包进行重新命名,这样在调用的时候更加方便。像numpy、matplotlib这种名包,被调用后的名称几乎是通用的,一般看到np
自然就会想到numpy
,看到plt
自然就想到了画图。
函数arange
的作用是创建一个等差数组,输入参数的格式为arange(start, stop, step)
。需要注意的是,前两个参数是一个左闭右开的区间,step表示步长。
有了包的概念之后,我们就会意识到,原来世界这么大,能人这么多,我等菜鸟的需求早有前辈们想过并解决了。于是就会有意识地去搜索一些优秀的包,希望统统收入囊中,为我所用,沉浸其中不能自拔。但时间长了就会感到烦躁厌倦,Anaconda帮我们解决了这个问题,这里面内置了诸多攒劲的科学计算包,只要下这一个,可以省下许多次pip
。
大多数从零开始的编程语言教程往往有着类似的讲解顺序,始于数据类型,运算符后之,而后则是判断与循环语句,至此,方才涉及函数的概念。
然而,实际情况却是,无论是新手还是老手,在一个小的项目中,几乎难以用尽某一编程语言的所有数据类型与运算符。所以先行讲解、先行忘记,从初学者到具备一年编程经验,并不能改变面向CSDN的编程习惯。
所谓函数,从编程语言的角度理解,便是可以被重复调用并实现一定功能的代码段。从数学的角度理解,则是一群自变量与因变量之间的映射关系。在python中,我们定义这个映射关系的语句为:
def 函数名(输入参数):
函数内容 #这部分要缩进一个tab建#########
return 输出参数
考虑到我们以光学仿真为主题,所以在此定义一个可能会经常用到的角度与弧度转换的函数:
>>> def degToRad(theta): #在python中,用#进行注释,编译器不会编译#后面的内容
... rad = theta*np.pi/180 #np.pi即圆周率
... return rad #返回rad
...
>>> degToRad(180) #函数调用
3.141592653589793
>>> np.sin(degToRad(30)) #可以理解为复合函数
0.49999999999999994 #sin(30°)=0.5
如果没得到结果的话,请检查一下缩进。在python中,通过缩进来表示层级关系,函数缩进去的部分就表示这部分属于我了,以后你在调用我的时候,其实就是在调用我缩进去的部分。
如果还是报错,检查一下括号和冒号是否用了中文字符,或者习惯性地敲了个分号。
如果还是报错,检查一下是否忘了import numpy as np
。
如果仍然报错,请检查一下是不是进入了一个假的python。
对于一个函数来说,其内部就是一个独立的空间,内外分明,只有传入和传出的参数与外界相关。用一个会让你记忆深刻的比喻,对于上面那个degToRad
函数来说,就像是一个人,吃下theta
之后然后产出rad
。对于另一个人来说,我们只能看到他吃下了180
然后产出了3.1415...
,180
在他的胃里面经历了啥我们就不知道了,甚至不知道theta
和rad
这两个变量是什么鬼。
>>> theta
Traceback (most recent call last):
File "" , line 1, in <module>
NameError: name 'theta' is not defined
>>> rad
Traceback (most recent call last):
File "" , line 1, in <module>
NameError: name 'rad' is not defined
所以函数内部的变量只被限制在函数内部这个小的作用域
里。
如果我们只是想拥有一个可以替代calc的快捷计算器,cmd
已经足够了。但cmd
连个保存功能都没有,岂不是意味着每天敲代码都要重头开始?尤其是今天写了个degToRad
函数,命令行一关就没了,明天想要用,还得重新写。
所以,我们需要把我们的函数保存在一个文件里,于是我们需要一个文本编辑器。
当然,windows有自带的,据说长期使用可以养成良好的编程习惯,而且最新版的win10自带的文本编辑器已经能够方便地显示行数,但也仅限于此了。
在这方面,个人比较推荐VSCode,相对于VIM和Emacs来说,学习曲线比较平缓,可以无痛使用,而且很多操作符合windows用户的操作直觉。安装过程乏善可陈,注意将安装路径添加到环境变量中,这样就能在命令行启动了。
python的文件后缀为.py
,我们现在就可以尝试着创建一个python文件,在命令行中输入
E:\Code\光学仿真>code test.py #code 即vscode
然后就打开了VS Code,VS Code会自动检测到.py
的文件名,右下角会提示是否安装python插件,如果没提示的话,可以自己到扩展栏搜索然后安装。这样会有自动的代码补全和高亮显示。
将之前定义的弧度角度转换函数输入到test.py
中,然后保存,并回到命令行。
import numpy as np
def degToRad(theta): #在python中,用#进行注释,编译器不会编译#后面的内容
rad = theta*np.pi/180
return rad
回到命令行之后,进入python,并调用我们的test.py
,原来我们不知不觉就写了一个包。
E:\Code\光学仿真>python
>>> import test
>>> test.degToRad(180)
3.141592653589793
VS Code虽然功能强大,但毕竟不是专门为python打造的,所以颇有血统不纯正之感。相比之下,PyCharm名字中就带有Py
这两个字,可见二者之间必有什么py交易,所以也推荐使用。
命令行工具当然可以方便地调用.py
文件中的函数,但这并非我们通常所习惯的操作模式。我们习惯的操作模式是软件即文件,通过双击来运行。
当然,在VS Code中,运行的快捷键是F5
,但我们发现摁下F5
之后什么也没有发生。
这并不诡异,因为我们只定义了一个函数,并没有声明说要执行这个函数。就像我们造了个人出来,但并没有喂这个人东西,所以他是不会有产出的。
而且就算喂,也不能乱喂,无论拿着什么东西往这个人的耳朵里乱怼,他也不可能吸收的进去,第一步是找到嘴,这个嘴就是入口函数main。
至此,test.py
就变成了下面的样子,其中if __name__ == "__main__":
import numpy as np
def degToRad(theta):
rad = theta*np.pi/180
return rad
if __name__ == "__main__":
x = degToRad(180)
print(x)
摁下F5
然后选择Python File
摁回车,VS Code自带的命令行工具会输出3.141592653589793
。如果报错的话,检查一下是不是把main
错写成了mian
,日后见多识广了,千万不要回忆起被面函数支配的恐惧。如果继续报错,检查一下是不是把双等号写成了等号。初学者背下来就行
在上式中,if
是一个判断语句,双等号==
表示同或。这个语句的意思就是,如果双等号两边相等,那么就执行下面的操作,这个语句非常符合人类直觉。__name__
是一个系统变量,如果我们像之前那样用import
调用test.py
,那么__name__
的值就是模块的名字,如果去执行这个文件,那么__name__
的值就是__main__
。