编程语言入门(以python为例)

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。其中省略号为多个子函数。

图1 面向过程编程的代码结构

11 面向对象思想

面向对象编程,在某种程度上,可以理解为模块化编程。面向过程编程,是将所有函数放在同一层下,不加区分,需要用到哪个函数,就调用哪个函数。而此时,会导致结构不清晰,如图2

图2 面向过程编程举例

随着系统的发展,函数越来越多,同一层将有大量的函数,难以查找。

此时需要模块化开发,如图3所示。

图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 结尾

仅针对初学者,并且该文章包含大量个人对语言的理解,因此极有可能有错误的地方,希望看的时候可以自己思考,既可以明辨对错,也可以加深理解。

如果觉得有写的不恰当的地方,欢迎指正,共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容