
2.1 常量和变量
常量和变量是程序设计语言的最基本元素,它们是构成表达式和编写程序的基础。本节将介绍Python语言的常量和变量。
2.1.1 常量
常量是内存中用于保存固定值的单元,在程序中常量的值不能发生改变。Python并没有命名常量,也就是说不能像C语言那样给常量起一个名字。Python常量包括数字、字符串、布尔值和空值等。
1. 数字
Python包括整数、长整数、浮点数和复数4种类型的数字。
(1)整数:表示不包含小数点的实数,在32位计算机上,标准整数类型的取值范围是-231~231-1,即-2147483648~2147483647。
(2)长整数:顾名思义,就是取值范围很大的整数。Python的长整数的取值范围仅与计算机支持的虚拟内存大小有关,也就是说,Python能表达非常大的整数。
(3)浮点数:包含小数点的浮点型数字。
(4)复数:可以用a+bi表示的数字。a和b是实数,i是虚数单位。虚数单位是二次方程式x2+1=0的一个解,所以虚数单位同样可以表示为。
在复数a+bi中,a称为复数的实部,b称为复数的虚部。
一个复数可以表示为一对数字(a,b)。使用矢量图描述复数如图2-1所示。Re是实轴,Im是虚轴。

图2-1 使用矢量图描述复数
2. 字符串
字符串是一个由字符组成的序列。字符串常量使用单引号(')或双引号(")括起来。例如:
'我是一个字符串' "我是另一个字符串"
(1)转义符号。
当需要在字符串中使用特殊字符时,Python使用反斜杠(\)作为转义字符。例如,如果需要在单引号括起来的字符串中使用单引号('),代码如下:
'字符串常量使用单引号(')括起来'
Python就会分不清字符串里面的单引号(')是否表示字符串的结束。此时就需要使用转义符号,将单引号表示为(\'),代码如下:
'字符串常量使用单引号(\')括起来'
当然,也可以使用双引号(")括起来包含单引号的字符串,代码如下:
"字符串常量使用单引号(\')括起来"
Python常用转义字符的使用情况如表2-1所示。
表2-1 Python的常用转义字符

例如,如果字符串中出现单引号(')或双引号("),则需要使用转义符号(\):
'I\'m a string'
(2)使用三引号(''' 或者 """)。
可以使用三引号指定多行字符串,例如:
'''多行字符串的例子。 第一行 第二行 可以在多行字符串里面使用'单引号'或"双引号" '''
在使用单引号(')或双引号(")括起来的字符串中,也可以在行尾使用转义字符(\)实现多行字符串,例如:
'多行字符串的例子。\ 第一行。\ 第二行。'
注意,在行尾使用转义字符(\)并不等同于换行符\n,上面的例子相当于
'多行字符串的例子。第一行。第二行。'
(3)Unicode字符串。
前面介绍的字符串都是处理ASCII码字符的,ASCII是American Standard Code for Information Interchange的缩写,是基于拉丁字母的一套电脑编码系统。它使用一个字节存储一个字符,主要用于显示现代英语和其他西欧语言。
但是ASCII码不能表示世界上所有的语言。例如,中文、日文、韩文等都无法使用ASCII码表示。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。如果要在程序中处理中文字符串,则需要使用Unicode字符串。
Python表示Unicode字符串的方法很简单,只要在字符串前面加上u或U前缀即可,例如:
u"我是Unicode字符串。"
3. 布尔值
布尔值通常用来判断条件是否成立。Python包含两个布尔值,包含True(逻辑真)和False(逻辑假)。布尔值区分大小写,也就是说true和TRUE不能等同于True。
4. 空值
Python有一个特殊的空值常量None。与0和空字符串("")不同,None表示什么都没有。None与任何其他的数据类型比较都永远返回False。
2.1.2 变量
变量是内存中命名的存储位置,与常量不同的是变量的值可以动态变化。Python的标识符命名规则如下:
·标识符名字的第1个字符必须是字母或下画线(_);
·标识符名字的第1个字符后面可以由字母、下画线(_)或数字(0~9)组成;
·标识符名字是区分大小写的。也就是说Score和score是不同的。
例如,_score、Number、_score和number123是有效的变量名;而123number(以数字开头)、my score(变量名包含空格)和my-score(变量名包含减号(-))不是有效的变量名。
Python的变量不需要声明,可以直接使用赋值运算符对其进行赋值操作,根据所赋的值来决定其数据类型。
【例2-1】 在下面的代码中,定义了一个字符串变量a、数值变量b和布尔类型变量c。
a = "这是一个常量"; b = 2; c = True
例2-1的代码中都是将常量赋值到一个变量中。也可以将变量赋值给另外一个变量,例如:
a = "这是一个常量"; b = a; \
此代码将变量a的值赋予变量b,但以后对变量a的操作将不会影响到变量b。每个变量都对应着一块内存空间,因此每个变量都有一个内存地址。变量赋值实际就是将该变量的地址指向赋值给它的常量或变量的地址。
也说是说,变量a只是将它的值传递给了变量b。
【例2-2】 变量值传递的例子。
a = "这是一个变量"; b = a; print(b);#此时变量b的值应等于变量a的值 print ("\n"); a = "这是另一个变量"; print(b); #对变量$a的操作将不会影响到变量b
运行结果如下:\
这是一个变量 这是一个变量
可以看到,变量赋值后修改变量a的值并没有影响到变量b。图2-2所示为变量赋值过程的示意图。

图2-2 变量赋值过程的示意图
可以使用id()函数输出变量的地址,语法如下:
id(变量名)
【例2-3】 用id()函数输出变量地址的示例程序:
str1 = "这是一个变量"; print("变量str1的值是:"+str1); print("变量str1的地址是:%d" %(id(str1))); str2 = str1; print("变量str2的值是:"+str2); print("变量str2的地址是:%d" %(id(str2))); str1 = "这是另一个变量"; print("变量str1的值是:"+str1); print("变量str1的地址是:%d" %(id(str1))); print("变量str2的值是:"+str2); print("变量str2的地址是:%d" %(id(str2)));
程序首先定义了一个变量str1,将它赋值为"这是一个变量";将变量str1的地址传递给变量str2;再修改变量str1的值为"这是另一个变量",在每次赋值后分别打印变量str1和str2的值。运行结果如下:
变量str1的值是:这是一个变量 变量str1的地址是:58752208 变量str2的值是:这是一个变量 变量str2的地址是:58752208 变量str1的值是:这是另一个变量 变量str1的地址是:58752264 变量str2的值是:这是一个变量 变量str2的地址是:58752208
可以看到,执行str2 = str1;语句后,变量str2的地址与变量str1的地址相同(58752208)。对变量str1赋值后,变量str1的地址变成58752264,此时变量str2的地址依然是58752208。
2.1.3 常量与变量的数据类型转换
Python在定义变量时,不需要指定其数据类型,而是根据每次给变量所赋的值决定其数据类型。但也可以使用一组函数对常量和变量进行类型转换,以便对它们进行相应的操作。
1. 转换为数字
可以将字符串常量或变量转换为数字,包括如下的情形。
(1)使用int()函数将字符串转换为整数,语法如下:
int(x [,base ])
参数x是待转换的字符串,参数base为可选参数,指定转换后整数的进制,默认为十进制。
(2)使用long()函数将字符串转换为长整数,语法如下:
long(x [,base ])
参数的含义与int()函数相同。
(3)使用float()函数将字符串或数字转换为浮点数,语法如下:
float (x)
参数x是待转换的字符串或数字。
(4)使用eval ()函数计算字符串中的有效Python表达式,并返回结果,语法如下:
eval(str)
参数str是待计算的Python表达式字符串。
【例2-4】 下面是一个类型转换的例子。
a = "1"; b = int(a)+1; print(b);
变量a被赋值"1",此时它是字符串变量。然后使用int()函数将变量转换为整数并加上1再赋值给变量b。最后使用print ()函数输出变量b。运行结果为2。
【例2-5】 使用eval ()函数的例子。
a = "1+2"; print(eval(a));
运行结果为3。
2. 转换为字符串
可以将数字常量或变量转换为字符串,包括如下的情形。
(1)使用str ()函数将数值转换为字符串,语法如下:
str (x)
参数x是待转换的数值。
(2)使用repr ()函数将对象转换为可打印字符串,语法如下:
repr(obj)
参数obj是待转换的对象。
(3)使用chr ()函数将一个整数转换为可对应ASCII的字符,语法如下:
chr(整数)
(4)使用ord()函数将一个字符转换为对应的ASCII,语法如下:
ord(字符)
【例2-6】 使用chr ()函数和ord()函数的例子。
print(chr(65)); print(ord('A'));
运行结果如下:
A 65
(1)使用hex()函数将一个整数转换为一个十六进制字符串,语法如下:
chr(整数)
(2)使用oct()函数将一个整数转换为一个八进制字符串,语法如下:
oct(字符)
【例2-7】 使用hex()函数和oct()函数打印8的十六进制字符串和八进制字符串。
print(hex(8)); print(oct(8));
输出的结果如下:
0x8 0o10
十六进制字符串以0x开头,八进制字符串以0o开头。