![]() |
2.1 变量命名与赋值 |
在程序中,程序语句或指令就是告诉计算机要存取哪些数据(Data),按照程序语句中的指令一步步来执行,这些数据可能是文字,也可能是数字。我们所说的变量(variable)是程序设计语言中最基本的角色,也就是在程序设计中由编译程序分配的一块具有名称的内存单元,用来存储可变动的数据内容,如图2-1所示。计算机会将它存储在“内存”中,需要时再取出使用,为了方便识别,必须给它一个名字,我们把这样的对象称为“变量”,例如:
>>>a = 3 >>>b = 5 >>>c = a + b
在上面的程序语句中,a、b、c就是变量,数字3是a的变量值。由于内存的容量是有限的,为了避免浪费内存空间,每个变量都会按照需求分配不同大小的内存空间,因此有了“数据类型”(Data Type)来加以规范。
图2-1 变量就是程序中用来存放数据的地方
Python是面向对象的语言,所有的数据都看成是对象,在变量的处理上也是用对象引用(Object reference)的方法,变量的类型是在赋予初始值时决定的,所以不需要事先声明数据类型。变量的值是使用“=”来赋值的,初学者很容易将赋值运算符(=)的作用和数学上的“等于”的功能互相混淆,在程序设计语言中,“=”号主要用于赋值。
声明变量的语法如下:
变量名称 = 变量值
例如:
number = 10
上式表示把数值10赋给变量number。
简单来说,在Python语言中,使用变量时不需要事先声明数据类型,这点与在C语言中使用变量前一定要事先声明才能使用不同,Python解释和运行系统会根据所赋予或设置的变量值来自动决定该变量的数据类型。例如,上述变量number的数据类型为整数,如果变量内容为字符串,该变量的数据类型就是字符串。
对于一名优秀的程序设计师而言,程序代码的可读性非常重要。虽然变量名称只要符合Python的规定都可以自行定义,但是当变量越来越多时,如果只是简单取abc等字母名称的变量,就会让人晕头转向,大幅降低可读性。考虑到程序的可读性,最好根据变量所赋予的功能与意义来命名。例如,存储身高的变量取名为“height”,存储体重的变量取名为“weight”等。尤其是当程序规模越大时,有意义的变量名称就会显得越重要。例如在声明变量时,为了程序的可读性,一般习惯以小写字母开头表示,如score、salary等。
在Python中,变量名称也需要符合一定的规则,如果使用不恰当的名称,可能会在程序执行时发生错误。Python属于区分字母大小写的语言,也就是说,number与Number是两个不同的变量,变量名称的长度不限,变量名称有以下几点限制:
·变量名称的第一个字符必须是英文字母、下画线“_”或中文,不能是数字。
·后续字符可以搭配其他的大小写英文字母、数字、下画线“_”或中文,不能使用空格符。
·不能使用Python内建的保留字(或称为关键字)。
尽管Python 3.x版本的变量名称支持中文,不过建议大家尽量不要使用中文来命名变量,一方面,输入程序代码时要切换输入法较为麻烦;另一方面,在程序代码的阅读上也会显得不顺畅。所谓保留字,通常具有特殊的意义与功能,所以它会被预先保留,而无法作为变量名称或任何其他标识符名称。
以下是有效变量名称的范例:
pagecount fileName01 length number_item
以下是无效变量名称的范例:
2_result for $result user name
help()函数是Python的内建函数,如果不太清楚特定对象的方法、属性的用法,可以使用help()函数来查询。
前面提到的Python保留字就可以使用help()函数来查看,只要执行“help()”就会进入help交互模式,在此模式下输入要查询的指令就会显示相关的说明,操作步骤如图2-2所示。
图2-2
我们可以在help模式下继续输入想要查询的指令,想要退出help交互模式时,输入q或quit即可。也可以在输入help()指令时带上参数,例如help("keywords"),Python就会直接显示帮助或说明信息,而不会进入help交互模式。
虽然Python采用动态数据类型,但是对于数据的处理却很严谨,它的数据类型属于“强类型”。举例来说:
>>> a = 5 >>> b = "45" >>> print( a+b ) #显示TypeError
变量a是数值类型,变量b是字符串类型。有些程序设计语言会在不知不觉中转换类型,自动将数值a转换为字符串类型,因此a+b会得到545,Python语言禁止不同数据类型进行操作,所以执行上面的语句会显示类型错误的信息。
程序设计语言的数据类型有“强类型”(strongly typed)和“弱类型”(weakly typed或loosely typed)的区别,权衡条件之一是对于数据类型转换的安全性。强类型对于数据类型转换有较严格的检查,不同类型进行运算时必须明确转换类型,程序不会自动转换,比如Python、Ruby就偏向强类型;而弱类型的程序设计语言大部分采取隐式转换(Implicit Conversion),如果不注意,就会发生非预期的类型转换而导致错误的执行结果,JavaScript就是偏向弱类型的程序设计语言。
Python执行时才决定数据类型的方式属于“动态类型”,什么是动态类型呢?程序设计语言的数据类型按照类型检查方式可分为“静态类型”(Statically-Typed)与“动态类型”(Dynamically-Typed)。
编译时会先检查类型,因此变量使用前必须先进行明确的类型声明,执行时不能任意变更变量的类型,像Java、C就属于这类程序设计语言。例如,下面的C语言程序语句声明变量number是int整数类型,变量的初值设置为10,当我们再把"apple"赋值给number时,就会出错,因为"apple"是字符串,在编译阶段会因类型不符而导致编译失败。
int number = 10 number = "apple" #Error:类型不符
编译时不会事先进行类型检查,在执行时才会按照变量值来决定数据类型,因此变量使用前不需要声明类型,同一个变量还可以赋予不同类型的值,Python就属于动态类型。例如,下面的程序语句声明变量number,同时设置初值为整数10,当我们把字符串apple赋值给number时,就会自动转换类型。
number = 10 number = "apple" print( number ) #输出字符串apple
Python有垃圾回收(Garbage Collection)机制,当对象不再使用时,解释器会自动回收,释放内存空间。在上面的例子中,当整数对象number重新赋值成另一个字符串对象时,原本的整数对象会被解释器删除掉。如果对象确定不需要使用了,我们也可以使用“del”指令来删除,语法如下:
del 对象名称
例如:
>>>number = "apple" >>>print( number ) #输出apple >>>del number #删除字符串对象number >>>print(number) #Error: number未定义
执行结果如图2-3所示。由于变量number已经删除,如果再使用number变量,就会出现变量未定义的错误信息。
图2-3