0%

编程,真不难 3 —— 基础语法

上篇文章《编程环境》中,我们了解了如何搭建一个 Python 的编程环境。

有了编程环境之后,理论上就能实现任何想要的程序了。

如《DOOM 启世录》中所说:

如果你想动手开发什么全新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机,和为之献身的决心。

Python 编译器,就是我们的计算机,是我们征战星辰大海的装备。

程序都是由代码编写出来的,代码的编写具有一定的规则,了解这些规则,就能更容易地理解和编写程序逻辑了。

编码规则大体由 语法流程控制 两部分组成。

虽然不同的编程语言,语法流程控制 的形式有所不同,但含义和理念是相通的。

只要了解了一种编程语言的编码规则,学习其他编程语言,就容易多了。

今天,我们先来了解一下 Python 中的 基本语法

语法构成

编程语言的语法一般都由 关键字变量内部方法块结构 四个部分构成。

Python 也一样。

先看一段 Python 的 示例代码 (后面提到的 示例代码,就是这段代码):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

def isInt(num):
try:
v = int(num)
return True
except Exception:
return False

inputValue = input('输入一个数字:')

if isInt(inputValue):
value = int(inputValue)
if value > 10:
print('大于 10')
else:
print('不大于 10')
else:
print('输入的不是数字')

读者可能读不懂这段代码,不过没关系,今天我们只是了解代码的构成,对这段代码有个感官认识就可以了。

这段代码的整体作用是:引导用户输入一个数字,然后判断这个数字是否大于 10,并输出判断结果。

下面我们来看看,语法的四个部分的意义和表达方式。

关键字

关键字,也被称为 保留字,是编程语言为了实现程序逻辑、提高编译效率,预先定义好一些单词。

比如,示例代码中,包含的关键字有:ifelsedeftryTrueFalse 等。

关键字能帮助我们 组织程序逻辑,比如 if 用来表达一个判断,def 用来定义一个方法;

或者 代表某种数据或者含义,比如 True 表示逻辑真,False 表示逻辑假。

如何识别代码中的关键字呢?

除了记住之外,一般,代码编辑器都有语法高亮功能,会将当前编程语言中的 关键字内部方法 等做不同的高亮处理,以便让程序员识别。

Python 中大概有三十多个关键字,而且随着 Python 语言功能的升级,关键字会有所变化。

想知道当前使用的 Python 编译器中,有哪些关键字吗?

很简单,在编译器的交互模式中,执行下面代码即可:

1
2
3
import keyword

print(keyword.kwlist)

将代码保存成代码文件,用执行模式执行也成

这么多关键字,要记到啥时候去呀!?

不用着急,随着我们的学习和实践,理解并应用它们是自然而然的事情,而且常用的关键字,没几个。

变量

一般我们对 变量 的理解是:一件事情或者过程中会发生变化的因素;或者初中数学中,函数的自变量 和 因变量。

感觉好像是:变量用来代表一个携带信息的容器。

如果有这样的认识,就太好了,因为程序中的 变量 就是用来存储各种各样数据的。

当我们需要:

  • 记录数据,比如现在的统计值,或者处理到了第几个等;
  • 操作对象,比如读取文件内容,或者控制播放器等;
  • 传送信息,比如将计算结果返回出来,或者将数据交给其他程序去处理等;

在这些时候,就需要用到变量了。

这些情况和我们日常生活离得很近,比如买菜时计算一下总金额,给朋友发段消息等,过程中,我们会将中间结果记在脑子里或者写在纸上,将信息输入微信里等

而程序中,需要将中间结果、信息等等记录在变量里。

不过程序中的变量很灵活,只要是能被存入计算机里的东西(数据或者信息,存入计算机的过程称作 信息化),都能用变量来记或者表示。

从某种意义上来说,编程就是对变量的处理加工过程

既然变量是用来存储信息的空间(这种说法并不严谨),那么如何开辟或者得到这个空间呢?

这个开辟的过程,叫作 变量定义 或者 变量声明,通过这个过程,才能得到计算机内存中的一块区域,并且对这块区域命名,以便在程序中操作。

如何定义变量呢?

神奇的是,Python 中,不需要这个定义过程,需要使用变量时,起个名字,直接用就可以了,就好像这个变量代表的空间,早已开辟好了似的。

比如示例代码中:inputValue = input('输入一个数字:'),就是将用户的输入内容,存储到 inputValue 这个变量中,而 inputValue 这个变量是拿来就用的,我们看不到事先对它的声明。

这是因为 Python 是一种解释型的动态语言,编译器在理解代码时会做大量的补充工作,替我们做了我们所利用的变量的定义。

类似的动态语言还有 Javascript,也不需刻意声明变量。

更神奇的是,Python 中的变量可以存储任何类型的数据或者信息,怎么回事呢?

我们在了解 对象 等概念时,再深入了解。

现在,我们只需要知道变量是用来存放数据的就行了,当遇到需要 记录、操作、传送数据时,知道应该使用变量即可。

内部方法

除了关键字,还有一些类似关键字,具有一定功能的代码,比如示例代码中的 inputprintint 等,被称为 内部方法,是编译环境,为开发者更方便地实现功能,而提供的方法

比如 input 可以获取用户的输入;print 可以在终端上打印一段字;int 尝试将一个字符串转化为整数。

理解程序中的方法

要理解 内部方法,需要先理解什么是 方法

编程语言中的方法,和我们日常理解中的方法类似,就是处理某个事情的操作步骤。

比如,处理电子邮件的步骤是:

输入身份验证信息、登录邮箱、进入收件箱、从邮件列表中,找到未读邮件……

将处理某件事的步骤整理在一起,就会形成一个方法,给这个方法起个名字,比如:处理电子邮件

那么,程序中,将处理过程的代码,集中在一起,并给它们起个名字,就形成了方法,比如 print,就是将如何在终端屏幕上显示一段文本的方法,打包在其中,并命名以 print

方法处理过程中,可能需要用到一些特定的数据,比如 处理电子邮件 方法中的身份验证信息,会因人而异。但对于方法本身来说,并不会因为这些特殊信息不同而不同。

以此,将方法处理过程中,需要的特定的信息称作 参数,在使用方法时,由使用者提供。

为啥将特殊数据称作参数呢?

是因为程序中的方法,和数学函数很像,实际上,程序中的方法就是源自于数学中的函数。

回想一下计算物体的速度的公式:速度 = 移动的距离 / 移动的时间。

写成函数就是:

d 表示移动的距离,t 表示移动的时间。只要提供特定的距离和时间,就能算出对应的速度。

就是将参数代入函数,就能得到结果,那么这是不是和程序中的方法类似呢?简直就是一模一样。

因此,给程序中的方法提供的特殊数据,就被自然地称为参数了。

也正是因为程序中的方法与数学中的函数意义相同,方法也被称作 函数

那么当提到方法函数时,绝大多数情况下,指的是一会事儿。


严格地说,内部方法不属于编程语言本身的一部分,因为,它们可以通过编程语言提供的能力来实现。

打个比方,如果编程语言是各种形状的积木块的话,内部方法就是已经拼接好的一些积木,理论上,我们完全可以通过积木来拼装任何内部方法。

但,如果任何功能都需要开发者自己去实现,是不现实的,而且开发过程中,大部分功能是类似,可以重复利用的。

因此,将这些常用的、与操作系统相关的功能,就被实现在了编程语言提供的编译环境中,不但可以节省开发时间,而且能保证功能的质量。因为我们不能指望一个连五金件都需要自己加工的装修队,能如期地、物美价廉地完成任务。

因此,需要了解基本的内部方法,以便我们能理解程序代码,并帮助我们实现特定功能。

有哪些内部方法呢?

随着实践的深入,会自然地了解相关内部方法,会像了解关键字一样,也是个自然而然的过程。

块结构

写文章,有段落结构,编写代码也一样,也有段落结构,即 块结构

观察一下我们示例代码,不难发现,代码大体上分为三部分:

  • 第一部分由 def 开始;

  • 第二部分由 inputValue 开始,只有一行;

  • 剩下的是第三部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 第一部分
def isInt(num):
try:
v = int(num)
return True
except Exception:
return False

# 第二部分
inputValue = input('输入一个数字:')

# 第三部分
if isInt(inputValue):
value = int(inputValue)
if value > 10:
print('大于 10')
else:
print('不大于 10')
else:
print('输入的不是数字')

这些个部分,被称为 代码块,而整个代码,就是由多个代码块组合而成的。

代码块的组合方式就构成了编程语言的 块结构

不同编程语言的 块结构 有所不同,不过大体分为两类:

第一类是由 块标识符 来标记,比如 Javascript,是用 {} 来定义块的:

1
2
3
4
5
6
7
8
9
function hello() {
console.log('Hello world')
}

var value = 10

if(value > 5) {
console.log("大于 5")
}

第二类是通过代码的书写结构定义的,比如,Python。

书写结构定义方式,有个巨大的好处,就是编写的代码更规范。不需要刻意去做对齐,缩进等操作,代码自然而然是整齐统一的。

我们在第一篇文章 《编程,真的不难》中,提到过,编码规范是编程中一个重要的问题,而我们用 Python 编程,能一定程度上提高编码的规范性。

Python 中,代码块是由 起始行,加行后的 :,以及起始行后的,比起始行缩进一个缩进单元的内容 构成的。

当要完成 判断方法定义类定义异常检测 等功能时,需要使用块结构。

比如,示例代码中,第一部分是 方法定义,第三部分是 判断

关于每种代码块的具体用法,我们在后面再详述,这里只做一个感性认识就行。

Python 中使用块结构,需要注意以下两点:

  1. 同一份代码文件中,缩进标准必须一致。比如都是 4 个空格,或者都是一个制表符。如果标准不同,编译器将不能正确识别编码逻辑;

  2. 但凡表示块的地方,都是由 : 开始定义块内容的。也就是只有缩进并不一定就是块的内容,比如由于一行内容太长,分割成多行书写,或者再定义特殊的数据结构时。

我们再观察一下上面的代码,还会发现,代码块的内部也是代码块,而且是可以层层嵌套,而形成了一种类似树的 分型结构

分形树结构 局部

这种代码块的组合形式,正是代码的组织方式。

另外我们也能了解到,块结构中,具有相同缩进的代码,是处于同等层次的,即 它们的起始行是对齐的。

比如,示例代码中,三个部分的起始行,都没有缩进,是处于同等层次的;第一部分内部,try 定义的异常检测块缩进了一个空白单位,而 try 内部比 try 多缩进了一个空白单位。

不同的层次会影响代码的执行流程,反之,可以通过控制代码的层次结构,来做代码的 流程控制

总结

今天,我们了解了 Python 中的基本语法,以及构成语法的几个部分:

关键字变量内部方法块结构

为了更好地理解这些概念,留一个小作业,就是对示例代码,进行练习,要求是:

  1. 在自己的编程环境中,运行示例代码
  2. 按照自己的想法改造示例代码

练习中会遇到一些问题,可以先尝试自己寻找答案,比如找人讨论、或者在网上搜索,或者将问题附在留言中。

可能会觉得对 Python 还不懂,不知道如何表达自己的想法,或者从何写起。

其实不用担心,编程本身就是个不断探索的过程,而诸多经验技能都是从探索中得到的。

另外,也不要担心自己的探索会毁掉计算机,或者引发核战争哈哈,尽管尝试,现在的计算机,像是个坚强的、自我保护能力强大的、贴心的玩具,只要不对它进行物理伤害,可以随便玩。

下期,我们将一起了解如何控制程序流程,以表达丰富的程序逻辑。

笔者的水平有限,文章中难免出现各种错误和问题,恳请读者不吝批评、指正。十分感谢!

比心!