文章目录

  • python初步
    • 简介
    • 包管理和调用
    • 函数
    • 开发环境
    • 入口函数

python初步

简介

Python是一门学习曲线平缓而绵长的编程语言,对于初学者非常友好,同时也可以实现高级的设计模式。

python提供了许多数学包和高级的数据结构,我们可以在不知其所以然的情况下放心大胆地使用,然后通过绘图工具迅速验证。对于第一次接触编程的人来说,甚至可以把python当作一个高效计算器,可以计算几乎所有有解的数学表达式。

  • 安装

那么,我们现在就来安装python。百度python第一个链接点进去就到了python官网,然后点Downloads链接即可。下载之后正常安装,记得需要勾选将python添加到环境变量中这个选项。

  • 进入python
  1. 摁下快捷键win+r
  2. 输入cmd,回车,进入命令提示符
  3. 输入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在他的胃里面经历了啥我们就不知道了,甚至不知道thetarad这两个变量是什么鬼。

>>> theta
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'theta' is not defined
>>> rad
Traceback (most recent call last):
  File "<stdin>", 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__

更多推荐

python超快速入门教程