本来一直纠结是不是要写这篇教程,这些基本知识本应该穿插在后面的教程中的,如果穿插在教程中会显得一些教程比较乱,所以把一些很基本的知识单独拿出来,在这里做理论的讲解,在后面的教程中都会用到的,由于都是理论的知识可能会有些枯燥,只要有个认识,理解即可。

标识符

标识符(Identifier)是指用来标识某个实体的一个符号,在不同的应用环境下有不同的含义。在计算机编程语言中,标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。标识符通常由字母和数字以及其它字符构成。

每个编程语言都有自己的标识符规则,Python也一样,规则如下:

  1. 标识符由字母、数字和下划线组成。
  2. 标识符只能由字母或者下划线开头,不能以数字开头。
  3. 标识符以下划线开头有特殊的意义。

下面是一些例子:

_abc

aBc

1abc (标识符不能数字开头)

ab@qq (标识符由字母、数字和下划线组成,@符号不是字母、数字和下划线)

Abc

_s#2 (标识符由字母、数字和下划线组成,#符号不是字母、数字和下划线)

关键字与保留字

在很多教程中都没有把关键字和保留字区别说清楚,甚至大部分教程还将两者混为一谈,首先关键字是编程语言本身已经定义好具有特殊功能的标识符,而保留字则是尚未定义具有特殊功能的标识符,但是在将来保留字是可能变成关键字的,所以保留字一般视为和关键字一样,也同样不能用作标识符,这也是很多教程都没有区分关键字和保留字的原因。

简单点来说就是,关键字一定是保留字,保留字在版本迭代中很可能成为关键字,两者都不能用作标识符,都是具有特殊含义的。

Python3 目前总共有35个关键字,如下表:

False None True and as
assert async await break class
continue def del elif else
except finally for from global
if import in is lambda
nonlocal not or pass raise
return try while with yield

Python是标识符是区分大小写,比如falseFalse是不同的,False是关键字,不能用作普通标识符,而false则不是关键字,可以用作普通标识符,但是不推荐这么做,因为很容易让人误解,错以为falseFalse关键字。

变量与常量

变量和常量可以说是用的最多,也是最普遍的东西,无论写什么代码,都会用上。

什么是变量?

我们从字面上理解就是会变的量,变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。这么说很多人有不理解了。举个生活的例子,假如现在要搬家,家里有一堆的衣服,和一堆的游戏机,还有一些搬家用的纸箱子,统统打包带走,大家都会把衣服都折叠的整整齐齐,然后放到一个箱子里,把游戏机也整理好放到另一个箱子里,但是想了下,游戏机很贵的啊,有ps4,nds,xbox呢,如果给其他东西压坏了心会很痛,所以为了告诉搬家工人,这东西很珍贵,就在装游戏机的箱子上标明游戏机,在衣服的箱子上标明衣服。

从例子中,游戏机和衣服就是不同的数据类型,箱子就是个容器,它既可以存储衣服,也可以存储游戏机,而我们给箱子上表名的一些字,相当于给箱子取个名字,方便知道箱子里存储的是什么东西。箱子就相当于变量,箱子上的字就相当于标识符,也就是相当于变量名。

变量命名规则

前面简单的说了,变量名是为了方便我们知道存储的是什么,对于机器来说就是给某块内存空间取了个名字,但本质还是内存的一个地址。既然要取名字,总不能随便乱取吧,要一眼就能看出这个变量存储的是什么,所以就有了命名的规则和规范,规则是强制的,规范是自由的,但大家都这么做,所以为了能给别人阅读代码带来方便,我们也应该这么做。

Python变量名的规则如下:

  1. 可以由字母、数字、下画线(_)组成,其中数字不能打头。
  2. 不能是 Python 关键字或者保留字

其中第一条就是标识符的规则,由于它是内存空间的别名且用来存储变量,所以这里不再叫标识符,而是叫变量名。第二条就是不能是关键字或者保留字,这点在关键字与保留字章节里说过了,这里就不再阐述。

什么是常量?

前面讲了变量,那么就有对立的常量,常量就是固定不变的量,比如圆周率,PI,这是不会变的,常量也同样会用常量名来存储,但是它存储的数据是个常量,但是在python里并没有常量的说法。所以我们都会用一种大家都习惯的方式去定义,即使没有常量,大家一看到这种定义就是立马知道,这是个常量,不会随意去更改。

常量命名规则

常量名的命名和变量名一样,没什么不同的,常量既然在python里没有为什么还要说常量呢,因为有时候有些数据存储后不希望被修改,虽然python没有常量的说法,但是有很多种方法可以实现,因为很多都还没学,所以这里只介绍最常用的方法,就是名字全部大写,这样做主要就是告诉别人,这是个常量,不要随意修改,但是要修改还是可以的,只是提醒。

命名规范

规范不是强制的,你可以这么做,也可以不这么做,但是大家习惯性都这么做。这不仅仅是变量名,常量名,甚至以后讲的方法名,类名都会有规范,只要涉及到命名的,都会有规范,大家也不用死记,看多了自然就有这种意识了。因为这涉及到个人代码风格或者企业\公司的代码风格,没办法规定出一个全球统一的规范,这主要看你所在的环境是如何而定,但是一些比较流行的规范还是要了解,哪怕以后到公司给你命名规范手册,一看就知道如何命名。

  1. 名副其实:名字要有意义,也就是不要取什么a啊,b啊这种没一点意义的名字,取a你知道是存什么吗?你知道,别人不知道啊,还要取找a的赋值,会浪费大量的时间,取一些有意义的,比如存储名字,可以用name,年龄可以用age,大家一看就知道是用来存储什么数据的。

  2. 驼峰命名法:驼峰命名法分为大驼峰小驼峰,大驼峰就是每个单词首字母大写,比如MyName。小驼峰就是第二个单词开始每个单词首字母大写,比如myName。

  3. 下划线命名法:如果有多个单词组成,每个单词之间用下划线连接,比如my_name,MY_NAME。

  4. 匈牙利命名法:就是讲类型和描述组合一起来命名,比如名字是字符串类型(可以先理解为就是字符)strName。

  5. 其他的:当然还有其他的一些规范,比如变量用名词,类用动词之类的,这里就不去说明,最主要的还是名副其实。

注释

注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。注释只是为了提高可读性,不会被执行,写注释是种好习惯,当代码量大的时候,注释是最好的解释者,可以快速了解到某句或者某块代码的作用以及含义,python注释有3种方式。

单行注释
单行注释使用#,当前行#后面的所有语句都是注释,都不会被执行。

1
2
3
age = 18        # 年龄是18
height = 175 # 身高是175
weight = 125 # 体重是125

多行注释
python实际上并不存在所谓的多行注释,在每一行注释前加上#就是多行注释了。

1
2
3
4
5
6
# 没有多行注释
# 假装我是多行注释
# 就这样
age = 18
height = 175
weight = 125

注释文档
在某些特定的位置,用三引号包括起来的部分,也被当做注释。但是,这种注释有专门的作用,用于提供文档内容。现在看不懂代码没关系,文档注释会单独一章进行讲解,知道有这么一种注释就可以了。

1
2
3
4
5
6
7
8
9
10
11
def func(num1:int, num2:int) -> int:
"""这是个两数相加的函数

:param num1: 数字1
:type num1: int
:param num2: 数字2
:type num2: int
:return: 两数之和
:rtype: int
"""
return num1+num2

代码结构

这小节比较重要,主要讲讲python的代码结构,这是很多初学者都会范的错误。

:Python和其他编程语言不同,没有结尾符号,默认就是一行就是一句代码,如果一句代码分成两行写就会报错,但是由于考虑到特殊情况,比如这句代码特别长,为了方便阅读可以使用行连接符号进行换行写,下面例子讲示范正确的、错误的和换行的写法。

1
2
3
4
5
6
7
8
9
10
# 正确的写法
age = 24

# 错误的写法
age =
24

# 换行写法
age = \
24

第二个是明显的错误写法,切记不要犯这种低级错误,换行可以用\符号进行换行,一般不推荐一行写特别长或者换行,除非实在没办法。

缩进:这是初学者出错率最高的,80%的初学者都会出错。Python没有结构代码块的符号(所谓代码块就是多条代码组成一小块,这一小块是独立的)。所以Python采用缩进来表示代码块。部分编辑器有所不同,一个缩进等于8个空格,大部分一个缩进等于4个空格,必须保证所有代码保持同一种缩进,一个Tab键(键盘Q键左边那个)就是一个缩进,推荐使用Tab键缩进,避免使用空格缩进。

1
2
3
4
5
6
7
8
# 最外层代码块
while 1:
# 第一层代码块
while 2:
# 第二层代码块
while 3:
# 第三层代码块
pass

很多初学者可能看不懂,不用担心,这都是有固定写法的,等学了控制语句后就会明白为什么这么写,现在只要知道缩进的作用就行了。

进制

最后要讲的就是进制,进制是编程中非常重要的一部分。我们生活中常说“锋十进一”就是十进制。十进制是我们生活用的最多的,但是在编程里不仅有十进制,还有二进制、八进制和十六进制。其中二进制和十六进制是用的比较多的。

二进制

二进制是计算机的常用进制,“逢二进一”,也就是只有0和1两个数字,1+1不再等于2,而是要进一位为10,主要是了解,如何将十进制的数转换为二进制,最简单的方法就是不断除2取余数。做个简单的例子,比如97转换成二进制

97÷2=48,余数为148÷2=24,余数为024÷2=12,余数为012÷2=6,余数为06÷2=3,余数为03÷2=1,余数为11\begin{aligned} 97 \div 2 &= 48,余数为1\\ 48 \div 2 &= 24,余数为0\\ 24 \div 2 &= 12,余数为0\\ 12 \div 2 &= 6,余数为0\\ 6 \div 2 &= 3,余数为0\\ 3 \div 2 &= 1,余数为1\\ 1 \end{aligned}

可以看到将数不断对2求余,整数部分做为下一次的被除数,余数就是二进制的其中一位,最后因为1无法除于2,所以不再计算了,最后从下往上排列余数,1100001,这就是97的二进制。

大家只要知道如何得到的即可,因为很少会自己去算,都有计算器,何必要自己去算,浪费时间。

还有就是二进制转换成十进制,最简单的方法就是把每一位的权相加,我们把1100001变回二进制

从右往左计算,最右边是记作第0位然后是第1位,以此类推,我们只要计算二进制有1的位即可,只要将所有的2的第几位次幂加起来即可,比如第0位有1,那么就是202^0,接着4个0,不需要计算,然后又是1,252^5,最后一个也是1,262^6,最后将所有加起来。

26+25+20=64+32+1=97\begin{aligned} 2^6 + 2^5 + 2^0 = 64 + 32 + 1 = 97 \end{aligned}

看,已经还原会十进制了,只要记住把每一位的权相加即可

在python里二进制的表示很简单,只要在数字前加个0b或者0B,注意第一个是数字0,很多初学者都会写出字母o,第二个是字母

八进制

学会二进制后,八进制就再简单不过了,只不过是把2变成8,数字从0到8,十进制转八进制就不断除于8。

十进制97转八进制为141

97÷8=12,余数为112÷8=1,余数为41\begin{aligned} 97 \div 8 &= 12,余数为1\\ 12 \div 8 &= 1,余数为4\\ 1 \end{aligned}

八进制转十进制就8作为底数,然后还要乘与当前的位数的数字,然后加起来。
141八进制转十进制为97

182+481+180=64+32+1=97\begin{aligned} 1*8^2 + 4*8^1 + 1*8^0 = 64 + 32 + 1 = 97 \end{aligned}

十六进制

十六进制和八进制一样,当数字超过9的时候则用A到F表示,A代表10,F代表16,转换就和八进制一样。

十进制445转十六进制为1BD

445÷16=27,余数为13D445÷16=1,余数为11B1\begin{aligned} 445 \div 16 &= 27,余数为13(D)\\ 445 \div 16 &= 1,余数为11(B)\\ 1 \end{aligned}

1BD十六进制转十进制为445

1162+B161+D160=256+176+13=445\begin{aligned} 1*16^2 + B*16^1 + D*16^0 = 256 + 176 + 13 = 445 \end{aligned}