2.2 变量
下面在helloworld.py中定义并初始化一个变量,在这个文件开头添加一行代码,并对第2行代码进行修改,代码如下:
msg = 'Hello Python!' print(msg)
运行这段程序,会看到如下的输出结果:
Hello Python!
你会发现,输出结果与前面的相同。在这段代码中,定义了一个名为msg的变量,并为这个变量指定了一个值,这个过程称为变量的初始化,这个值就是与该变量关联的信息。如果以后不再为msg变量赋值,那么msg就代表"Hello Python!"。在处理第2行代码时,print函数会将与msg变量关联的值打印到屏幕上。
下面扩展这个程序,修改helloworld.py,让其再打印一行消息。为此,需要在helloworld.py的最后再添加两行代码,为了让代码更清晰,可以在新添加的两行代码前面加一个空行:
msg = 'Hello Python!' print(msg) msg = '我爱Python,我爱《Python从菜鸟到高手》!' print(msg)
现在运行程序,会看到输出了如下两行消息:
Hello Python! 我爱Python,我爱《Python从菜鸟到高手》!
在新添加的两行代码中的第1行重新设置了msg变量的值,所以最后一行代码会将msg变量最新的值打印到屏幕上。因此可以得出一个结论,在Python中可以随时随地修改变量的值,而每次使用变量时,都会获得变量最新的值。
2.2.1 变量的定义和初始化
微课视频
代码位置:src/basic/var.py
由于Python是动态编程语言(1),所以在定义变量时并不需要事先指定变量的数据类型,变量的定义和初始化是同时进行的。Python解析器会根据初始化值的数据类型动态确定变量的类型。例如,下面有4个变量a、b、c、d,分别为这4个变量设置了不同类型的值,最后的4行代码使用type函数分别输出了这4个变量的类型。
a = 40 b = True c = 30.4 d = "I love python" print("a的数据类型:" ,type(a)) print("b的数据类型:" ,type(b)) print("c的数据类型:" ,type(c)) print("d的数据类型:" ,type(d))
运行这段代码,会输出如下内容:
a的数据类型: <class 'int'> b的数据类型: <class 'bool'> c的数据类型: <class 'float'> d的数据类型: <class 'str'>
从输出结果可以看出,在为4个变量赋值时,其实变量已经创建和初始化了,同时确定了变量的数据类型。
在Python中,变量的数据类型是随时可以改变的,现在扩展这个程序,在var.py最后添加两行代码:
a = 40 b = True c = 30.4 d = "I love python" print("a的数据类型:" ,type(a)) print("b的数据类型:" ,type(b)) print("c的数据类型:" ,type(c)) print("d的数据类型:" ,type(d)) d = 20 print("d的数据类型:" ,type(d))
运行这段代码,会输出如下内容:
a的数据类型: <class 'int'> b的数据类型: <class 'bool'> c的数据类型: <class 'float'> d的数据类型: <class 'str'> d的数据类型: <class 'int'>
从输出结果可以看出,变量的数据类型从str变成了int,所以验证了Python变量的数据类型是随时可以改变的。
2.2.2 变量的命名
Python中的变量名要遵循一定的规则,如果违反,在运行Python程序时就会引发错误(2),而按照这些规则对变量命名,不仅可以避免发生错误,还可以让程序更容易理解。读者可以参照下面的规则命名Python变量。
· 尽管Python支持Unicode(3),理论上可以使用每个国家的语言作为变量名,如中文、日文、韩文等。但强烈建议不要这样做。因为这样做可能会导致乱码,以及非本语种的人无法阅读的窘境。通常的做法是变量名只由英文、数字和下画线组成。如abc、abc_、test_project都是可以被大众接受的变量名。
· 变量名不能以数字开头,只能以英文字母或下画线开头。如4a、20b是错误的变量名,程序会出错。a4、b20、_20是正确的变量名。
· 不能用某些特殊的字符作为变量名,变量名中也不能包含这些字符。如运算符号(+、0、*、/等)、比较符号(>、=、<等)、逻辑符号(&&、||、!等)都不能包含在变量名中。如a=b、a!都是错误的变量名。
· 不能用Python的关键字作为变量名,但变量名中可以包含这些关键字。如if、while、for都是错误的变量名,但ifa、awhile、forxyz是正确的变量名。
· 变量名应该用有意义的名字,除非做简单的验证和测试,否则正式的项目最好不要起像a、b、c、d、name这样的变量名,它们尽管合法,但不容易让人理解。变量名应该与实际表示的数据相关,例如productName、studentSex、phonePrice都是比较好的变量名。
· 统一变量名的命名规范。变量名的命名规范主要有3种:大驼峰、小驼峰、下画线分隔。大驼峰是组成变量名的每个英文单词首字母都大写,如ProductName;小驼峰与大驼峰类似,只是组成变量名的第1个英文单词的首字母小写,其余英文单词的首字母都大写,如productName;下画线分隔是组成变量名的所有英文单词的所有字母都小写,多个英文单词中间用下画线分隔,如product_name。Python用小驼峰和下画线分隔的方式比较多,这些命名规范并没有好坏之分,只要整个项目统一命名规范即可。
· 变量名尽量不要用容易混淆的字符和数字,如1和l, 0和O等,前者是数字1和0,后者是小写字母l和大写字母O。如果不仔细看,是很容易混淆的。尤其是其他人看自己写的程序的情况下更容易弄错,如a1和al,这两个变量在word文档里几乎是一样的,在IDE中有细微的差别,但需要仔细看才可以分辨。
2.2.3 避免弄错变量名
由于Python是动态语言,所以只有在程序运行时才能发现错误,其中一个非常容易发生的错误就是变量名写错了,代码如下:
message='Hello Python!' print(mesage)
很明显,第2行代码将message写成了mesage,中间少了一个字母s。运行这段程序,就会抛出如图2-1所示的异常。
当执行到第2行代码时,Python解析器会尽可能找到mesage变量,但很可惜,没找到,所以Python解析器就会告知有一个错误,并指明错误的具体原因,也就是mesage变量没定义。Python不允许使用一个没定义的变量。
其实读者使用PyCharm开发Python程序,这种变量名写错的情况一般是可以避免的,如果使用了没定义的变量名,PyCharm会在变量名下方显示一个红色的波浪线,就表明该变量未定义,但下面的情况就不会得到任何提示了,除非程序执行到错误行,或自己读代码时发现,否则这个错误将永远隐藏在程序中。例如:
al = 20 a1 = "hello world" print(a1+ 30)
执行这段代码,会抛出如图2-2所示的异常。
图2-1 由于变量名错误抛出的异常
图2-2 不容易发现的变量名错误
本来第3行是想让al与30相加的,其中al变量的值是20,是一个整数类型。al变量的第2个字符是小写的字母l。而第2行的a1变量是字符串类型,a1的第2个字符是数字1。由于l和1非常像,所以将l写成了1,但在这种情况下,PyCharm是不会给出任何提示的,除非程序运行到第3行,否则是不会抛出任何异常的。
这里先普及一个知识点,在Python中,字符串是不能与数字直接相加的,否则会抛出异常。关于字符串的详细内容在后面的章节会讲解。
其实像前面的这段代码还好,至少程序在执行到第3行时会抛出异常,只要在测试时覆盖到这行代码,就会发现错误,但下面的代码压根就不会抛出异常,这属于100%的逻辑错误。
执行这段代码,输出的是60,但按业务逻辑,期望输出的是50,就是由于将字母l写成了数字1,所以导致了逻辑错误,但可惜的是,al和a1都是整数类型,所以程序是不会抛出任何异常的。这样的错误极难被发现,所以再强调一点,起变量名时尽可能不要用容易混淆的字符或数字,否则这样的错误在所难免。
图2-3 变量与小柜子
2.2.4 如何理解变量
尽管大家到现在为止已经学会了如何定义和使用Python变量,但对于初学者来说,对变量的概念可能还是有些模糊。
其实可以将变量想象成超市中存放物品的一个个的小柜子,如图2-3所示。
变量名相当于每个柜子的号码,变量中的值相当于柜子中存放的物品。变量的数据类型相当于柜子中可以存放物品的种类,如手机、鞋子、帽子、食品等。变量可以存储的值的大小就相当于柜子的容量。如太大的物品是无法放进较小的柜子里的(存储的值超出了变量运行的最大存储空间,如最大存储4字节的变量不能保存8字节的数据)。
按照这个比喻,可以很容易理解Python变量到底是怎么回事,读取变量中的值,就相当于根据柜子的编号找到柜子,并取出柜子中的物品(4),对变量重新赋值,就相当于根据柜子的编号找到柜子,然后向柜子中放入相应的物品。变量可以随时改变数据类型就相当于可以向柜子中放入任何种类的物品。如果不可以改变变量的数据类型,那么就相当于第1次放入物品,柜子就会自动识别物品的种类,以后就只能放这类物品了。
当然,如果从底层来阐述,柜子的编号(变量)其实相当于内存地址,而柜子中的存储空间(变量的值)相当于一段内存存储空间,不过读者在刚开始学习Python时,并不需要对这些细节有过多的了解,只需要学会使用Python变量即可。