1 前言
该文章以Python语言为例,讲解编程语言的框架。偏重于编程语言的框架,因此主要讲编程语言必须的通用的内容。对于Python语言的特性,不过多讲解,适合入门级选手。想要进一步深入,可以学习Python的中文文档(https://www.runoob.com/python/)。同时,还浅显的讲解了面向对象思想和电脑如何理解并运行由编程语言组成的程序。
2 程序的概览
程序本质上是一套流程,通过这套流程,一步步处理数据,得到最终的结果。因此,程序上本质就是如何创建数据,如何计算数据得到结果(结果本身也是数据),如何控制先后步骤。
3 数据类型
3.1 数据类型的概念
程序的操作对象是数据,因此,我们需要先了解数据。大部分数据在编程语言中叫做变量。
变量有着不同的类型,如整型数int(来源于英文integer)代表了整数(0、1、2、3等);字符型变量String代表了字母、汉字、特殊字符等;浮点数float代表了具有小数点数字;布尔型bool(来源于英文boolean),代编了是true和否false,仅有这两种取值,表示逻辑上的是否。
不同的数据类型在电脑中存储的空间不同,有的占两个字节,有的占四个字节。不同的数据类型的编码方式不同,如int不需要存储小数点的位置,而float需要存储小数点的位置。因此,需要定义不同的数据类型。
3.2 常用数据类型
3.2.1 List(列表)
List(列表)是Python中使用最频繁的数据类型之一。List是一种复合数据类型,表示多个数据按照顺序组成的集合。其中多个数据可以是不同的数据类型,它支持字符,数字,字符串甚至可以包含列表(即嵌套)。
List用[ ]标识,其中的元素用逗号隔开,形式如下:
a = [ 'runoob', 786 , 2.23, 'john', 70.2 ]
可以用数字通过位置索引List中的元素,如上List,要取得元素786,可以用a[1],索引从0开始。也可以同时截取相邻的多个元素组成新的列表,如同时取得786和2.23,可是用a[1:3],其中冒号表示区间,数字表示截取的列表区间范围,该区间是左闭右开。
4 变量声明
首先,我们学习如何创建数据。数据创建,也叫数据的声明,也就是告诉电脑,这里有一个数据,并且该数据的名字是什么,给数据起个名,后面才可以使用它。数据叫做变量,创建叫做声明,因此,创建数据专业来讲叫做声明变量。
Python中,第一次使用一个变量,视为声明该变量,比如我需要计算变量a增加1,就可以直接输入语句: a = a + 1。这个过程就包含了声明变量。
你是不是觉得这样理所应当吗?当然不是。如果其他语言想实现计算变量a增加1,需要两条语句:int a; a = a + 1。其中int a就是声明a变量,让电脑创建变量a,再对a进行操作。声明一般要指定该变量的数据类型。
Python帮我们完成了这个步骤,同时使用Python过程中,也不需要指定变量的数据类型。后续要深入了解,可以阅读Python的动态数据类型相关资料。
5 运算符
声明变量后,要对变量进行运算。Python中的运算符有算数运算符、关系运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符等。关于不同种运算符及其功能,以及不同运算符之间的优先级关系可以在该页面进行查询:https://www.runoob.com/python/python-operators.html
6 流程控制
变量的运算只是程序中的单个步骤,一个完整的程序,需要进行多个步骤。每一步之间的关系不仅有顺序关系,还有判断、循环等关系。构成这三种关系的语句分别叫做顺序语句、判断语句和循环语句,这三种语句称为流程控制。同时,也有其他语句可以实现流程控制。
6.1 顺序语句
即按照代码先后位置顺序执行。
6.2 判断语句
即判断某个条件是否正确,决定是否运行接下来的一段代码。Python中判断语句的形式如下:
if条件表达式:
语句块1
else:
语句块2
表达式的结果为bool类型,若为true,则执行语句块1;若为false,则执行语句块2。
6.3 循环语句
即通过判断某个条件或限定范围,多次执行某段代码。循环语句有两种形式:
6.3.1 While循环语句
while条件表达式:
语句块
表达式的结果为bool类型,若为true,则执行语句块;若为false,则跳过语句块并执行接下来的代码。
6.3.2 for循环语句
for 循环变量 in 循环范围:
语句块
循环范围是一系列值,用List数据类型表示。循环变量为List中的某个值。按顺序每次从List中取一个值给循环变量,再执行语句块,直到循环范围中的全部值都被循环过。
6.4 其他流程控制语句
6.4.1 break
break语句用在while和for循环中。
break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。
6.4.2 continue
continue语句用在while和for循环中。
continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。
continue语句跳出本次循环,而break跳出整个循环。
6.4.3 return
return语句用在函数中,在函数中再进行讲解。
7 函数
7.1 函数的定义
理解了流程控制,就可以写一段代码,实现某个数据处理的流程。而函数的作用,就是将流程封装为特定的功能,并命名。在我们需要使用该功能时,就可以根据该函数名,调用功能。
Python中定义函数的格式为:
def 函数名(参数1,参数2):
代码块
return 返回值
函数名为该功能的名称。
参数为该函数的输入。函数本质上为处理数据,因此有些情况下,需要输入数据,输入的数据即为参数,输入多个参数以逗号隔开。如果无参数,则保留括号但不输入任何内容即可。
代码块为该函数执行的多条有特定流程的语句。
返回值为该功能实现的数据处理的输出。有些函数不存在输出,则省去这条语句即可。
7.2 常用函数
7.2.1 print()
print()函数可以将括号中的内容打印到屏幕上。形式如下:
print(“你好”)
执行该语句,即可在屏幕上输出你好。
7.2.2 input()
input()函数可以接受输入的值。形式如下:
input(“输入姓名”)
其参数为提示语,在运行input函数时,会先在屏幕上显示提示语,提示需要输入什么量,然后输入数据,按回车结束输入并将值传入程序。
8 函数库
8.1 函数库的概念及导入
函数库相当于一个仓库,有大量现成的函数。在写程序过程中,经常用到别人的程序,这时候,就需要导入函数库。
我们使用import导入函数库。如import numpy即是导入numpy库。
有些库的名称很长,我们可以为库取新的名字,这样调用的时候就可以使用新名字。如import numpy as np,这样我们就可以直接使用np来调用其中的函数。
8.2 常用函数库
8.2.1 numpy
该库是矩阵操作库。我们可以使用numpy.array创建矩阵,如下:
numpy.array([[1, 0, 1, 0],
[0, 1, 0, 1],
[0, 0, 1, 0],
[0, 0, 0, 1]])
array函数的输入参数为一个List,该List的第一个元素仍为List,实现了二维矩阵,同理,可以进行进一步嵌套,实现三维矩阵。
9 计算机如何执行代码
计算机只能理解0或者1,反映在电路中,就是高电压和低电压。而我们写的代码,不仅包含0和1,还包括英文字母和成百上千的数字。那计算机时如何理解我们写的代码呢?
首先,代码要执行,需要经过编译,编译就是将我们写的代码转化成机器可以理解的形式。在机器中,存在一些最基本的指令,如相加、相减、赋值、转跳至某个指令。指令的形式为0101011之类,通过控制译码器,可以产生不同的波形,电脑看到不同的波形即执行相应的动作。通过最基本的指令,可以组合出乘法、除法、顺序语句、判断语句、循环语句等。因此,编译也就是将我们的代码翻译成最基本的指令,一行代码可能会被翻译为多个指令的组合。
编译之后,将多行指令存储在计算机中,当开始执行后,从硬盘中取出指令到内存,再将内存中的指令从第一条开始,输入CPU中,进行处理计算。
10 面向过程编程
上面所学的内容即为面向过程编程。面向过程编程的结构如图1。其中省略号为多个子函数。
11 面向对象思想
面向对象编程,在某种程度上,可以理解为模块化编程。面向过程编程,是将所有函数放在同一层下,不加区分,需要用到哪个函数,就调用哪个函数。而此时,会导致结构不清晰,如图2
随着系统的发展,函数越来越多,同一层将有大量的函数,难以查找。
此时需要模块化开发,如图3所示。
通过模块化开发,我们将不同的函数分类放在了某些模块中,这些模块就叫做类,代表了某一类事物。这样,我们在需要数学相关的函数时,就会在数学类中查找,需要控制量的相关函数时,就会在控制器中查找,需要导弹的相关函数时,就会在导弹的函数中查找。
现实生活中,每个物体的本质都是完成某项或多项功能,如水杯可以装水,也可以倒水。通过功能的组合,可是使类与生活中的具体事物进行对应,如将计算控制量和保存控制量组合,就得到了控制器。通过对真实物体的对应,这样即使存在再多的类,也不会出现混淆,因为这是基于现实。而如果仅使用函数,无法在生活中找到对照,且功能越来越多,程序就会越来越难理解。
使用面向对象编程,就将系统的框图和程序直接对应起来,而不是将系统的框图对应成流程图,再将流程图对应成程序。通过面向对象编程使系统更加清晰,使系统结构体现在代码中。
12 类——封装、继承
12.1 类的概念
根据面向对象的思想,需要使用类来进行编程。
类本质上是由变量和函数组合起来的一个整体,如水杯,可以存水,可以倒水,这就是函数;同时,水杯还包含当前是否有水的状态,这不是水杯的功能,而是状态,这就需要一个bool变量来表示,是否有水,该变量叫做类的属性。通过属性和函数,就可以完全的表示生活中存在的任何一个个体,这就是封装的思想。
12.2 类的定义
在python中,定义类的形式如下:
class ControlSignal:
system = ""
def set_system(self, system):
self.system = system
其中class关键字声明这是一个类,后面接着是类名ControlSignal。system是该类的变量,表示该类的属性,即该控制器控制的系统是什么。set_system为该类的函数,表示给该类设定需要控制的系统是什么,相当于把水倒进去。
12.3 类的实例化
类是虚拟的物体的概念,表示这个物体的总和,比如男人类表示的是男人这个类别,并不专指哪个具体的男人,相当于不存在实体,此时不能使用其中的函数。想要使用类的函数,需要提前声明并取名,声明的过程叫做实例化,才能真正出现一个叫申岩的男人,相当于根据模型,捏出了泥人。这个时候,才可以使用申岩所包含的函数。实例化的类叫做对象。
Python实例化的形式如下:
target = Target1.Target2(f, gama, am_w, std_w, station_t_0)
其中Target1是文件名,表示使用Target1.py中的类。Target2是类名,此时表示实例化类。
括号中为该类实例化的初始参数,就像捏泥人时的身高体重。在实例化类时,会执行类的初始化函数,在Python中的形式如下:
def __init__(self, f, gama):
self.f = f
self.gama = gama
类中函数名为__init__表示为初始化函数,可以根据其输入参数,设定类的初始的属性值。
实例化后,将其赋值给target变量,target相当于该对象的名称。
12.4 类的属性和函数的调用
通过对象名target可以调用该对象中的属性和函数。形式如下:
target.属性名
target.函数名
12.5 类的继承
有些类之间存在着丛从属关系。如定义一个类——人,人可以走路,再定义一个类——男人,男人可以找女朋友。这时候,可以说,男人属于人,男人既有自己的功能,也有属于人的功能,这种关系在编程语言中叫做继承。
Python中,继承的形式如下:
class Man(Person):
此时,类Man继承了类Person,可以使Person中的变量和函数。
通过继承,使Man中不需要定义Person中已经定义的函数,提高了复用性。
13 其他(多态、泛型、多线程)
关于编程语言,还有其他特性,因为这里仅对初学者,因此不展开讨论,继续深入可以查看其它资料。
14 不同编程语言之间的区别
每个语言都有不同的特性,有的特性之间是具有绝对的优势的,有的特性之间是模糊的,所以就会出现两种不同的语言。
比如,单继承不会出现菱形继承但复用性低,多继承复用性高但会出现菱形继承,所以,即使python是新的语言,也使用了多继承。
比如,动态数据类型和静态数据类型,静态数据类型代码执行速度快但需要声明变量,动态数据类型不需要声明数据类型但是执行速度慢。
比如,垃圾回收机制和无垃圾回收机制,垃圾回收机制需要虚拟机,就会占用资源,无垃圾回收机制则不需要虚拟机,运行速度快。
总之,一个不同的特性,会产生两种语言,两个就会产生四种,因此,根据需要,就产生了不同的特性的组合,产生了很多编程语言,因此目前来说没有最好的编程语言。
15 结尾
仅针对初学者,并且该文章包含大量个人对语言的理解,因此极有可能有错误的地方,希望看的时候可以自己思考,既可以明辨对错,也可以加深理解。
如果觉得有写的不恰当的地方,欢迎指正,共同进步。