第3章
Python数据类型

本章首先介绍了变量的命名和引用,以及各类运算符,如算术运算符、关系运算符、逻辑
然后重点介绍了序列、

运算符、

身份运算符等; 
作,其中,序列类型包括字符串、列表、元组等是具有顺序特征的数据类型;最后,介绍了数据
类型转换的相关知识。


字典和集合等数据类型的相关内容和常用操

hoPty

n数据类型

3.变量
1 

在Python中,每个变量在使用之前都必须赋值,变量只有在赋值之后才会被创建。

3.1 
变量命名
1.
变量的命名必须遵循以下规则。

(1)变量名由字母、数字和下画线组成。
(2)变量名的第一个字符必须是字母或者下画线,不能以数字开头
。
下面的变量命名不符合变量命名规则,导致语法错误,如图3-1所示
。
图3-1 错误变量命名示例

(3)尽量不要使用容易混淆的单个字符作为标识符。例如,数字0和字母o,数字1和
字母l等。
(4)变量名不能与关键字同名。在Ant下输入命令“”查
看Python的关键字,如图3-2所示。
acondaPrompimportkeyword
(5)变量名区分大小写。例如,myname 和myName 不是同一个变量。

38 
图3-2 Python的关键字 
(6)以双下画线开头的标识符是有特殊意义的,是Python采用特殊方法的专用标识, 
如__init__()代表类的构造函数。
(7)Python中,单独的下画线用于表示上一次运算的结果。
例如: 
>>>20 
20 
>>>_*10 
200 
(8)变量名和函数名一般用英文小写字母,以增加程序的可读性。
(9)变量命名应见名知义,通过变量名知道变量的含义,一般选用英文单词或拼音缩写
的形式,如求“和”用“sum”,不要使用简单符号,如x、y、z等。
3.1.2 变量引用
Python中的变量通过赋值得到值。
【例3-1】 变量引用。 
>>>number =5 
>>>number 
5>
>>number =7 
>>>print(number) 
7 
3.2 运算符
变量之间的运算可以通过运算符实现,运算符包括算术运算符、关系运算符、赋值运算
符、逻辑运算符、位运算符、成员运算符和身份运算符等。
3.2.1 算术运算符
算术运算符如表3-1所示。

3
9 

表3-
1 
算术运算符

运算符含义运算符含义
+ 加法// 取整除
-减法** 幂运算
* 乘法% 取模
/ 除法

运算符的使用和运算数的数据类型关系很大,加法运行结果如图3-3所示。


图3-3 加法运行结果

【例3-2】算术运算符。
下面给出除法(/)、整除(//)、求余数(%)的运行结果,如图3-4所示。


图3-4 除法(/)、整除(//)、求余数(%)的运行结果

3.2 
关系运算符
2.
关系运算符又称为比较运算符,是双目运算符,用于两个操作数的大小比较,结果是布
尔值,即True(真)或False(假)。操作数可以是数值型或字符型。表3-2列出了Python中
的关系运算符。

表3-
2 
关系运算符

运算符描述运算符描述
== 等于< 小于
> 大于<= 小于或等于
>= 大于或等于! = 不等于

关系运算符在进行比较时,需注意以下规则。

(1)两个操作数是数字,按大小进行比较。需要注意的是,Python中“== ”是等于号,
“!=”是不等于号,如图3-5所示。
(2)两个操作数是字符型,按字符的ASCI 
码值从左到右逐一比较,首先比较两个字符

40 


图3-5 操作数为数字的运行结果

串的第一个字符,ASCI 
码值大的字符串为大,如果第一个字符相同,比较第二个字符,以此
类推,直到出现不同的字符为止,如图3-6所示。


图3-6 操作数为字符串的运行结果

3.3 
赋值运算符
2.
赋值运算符如表3-3所示。

表3-
3 
赋值运算符

运算符描述运算符描述
= 简单赋值运算符/= 除法赋值运算符
+= 加法赋值运算符%= 取模赋值运算符
-= 减法赋值运算符**= 幂赋值运算符
*= 乘法赋值运算符//= 取整除赋值运算符

【例3-3】赋值运算符。
赋值运算符举例如图3-7所示。


41 


图3-7 赋值运算符举例

3.4 
逻辑运算符
2.
逻辑运算符如表3-4所示。not是单目运算符,其余都是双目运算符,逻辑运算的结果
是布尔值True或False。

表3-
4 
逻辑运算符

运算符含义描述
not 取反当操作数为假时,结果为真;当操作数为真时,结果为假
and 与当两个操作数均为真时,结果为真;否则为假
or 或当两个操作数至少有一个为真时,结果为真;否则为假

【例3-4】逻辑运算符
。
逻辑运算符举例如图3-8所示
。
注意:False不能写成F、false等
。


3.5 
位运算符
2.
位运算是把十进制数字转换为二进制数字的运算。Python中的位运算符有左移
(<< )、右移(>> )、按位与(&)、按位或(|)、按位翻转(~)等,如表3-5所示。

表3-
5 
位运算符

运算符名称描述
<< 左移把一个数的二进制数字向左移一定数目
>> 右移把一个数的二进制数字向右移一定数目


续表 
42 
运算符名 称描 述
& 按位与 数的按位与
| 按位或 数的按位或
^ 按位异或数的按位异或
~ 按位翻转x的按位翻转是-(x+1) 
图3-8 逻辑运算符举例 
【例3-5】 位运算符。
位运算符举例如图3-9所示。
图3-9 位运算符举例

4 3 
3.2.6 成员运算符
成员运算符主要用于字符串、列表或元组等序列数据类型,如表3-6所示。
表3-6 成员运算符
运算符描 述
in 在指定的序列中找到值返回True,否则返回False 
notin 在指定的序列中没有找到值返回True,否则返回False 
【例3-6】 成员运算符。 
>>>'a' not in 'bcd' 
True 
>>>3 in [1,2,3,4] 
True 
3.2.7 身份运算符
身份运算符又称为同一运算符,用于比较两个对象的存储单元,如表3-7所示。
表3-7 身份运算符
运算符描 述
is 判断两个标识符是不是引用自一个对象
isnot 判断两个标识符是不是引用自不同对象 
【例3-7】 身份运算符。 
>>>x=y=3.5 
>>>z=3.5 
>>>x is y 
True 
>>>x is z 
False 
>>>x is not z 
True 
3.3 表达式
3.3.1 概念 
表达式通常由运算符号(操作符)和参与运算的数(操作数)两部分组成。例如,2+3就
是一个表达式。+就是运算符,2和3就是操作数。
数学表达式转换为Python表达式,如表3-8所示。

44 
表3-8 数学表达式转换为Python表达式
数学表达式Python表达式
abcd 
efg a*b*c*d/e/f/g 或a*b*c*d/(e*f*g) 
sin45+e10+ln10 
x 
math.sin(45*3.14/180)+ (math.exp(10)+ math.log 
(10))/math.sqrt(x) 
[(3x+y)-z]1/2/(xy)4 math.sqrt((3*x+y)-z)/(x*y)^4 
数学表达式转换为Python表达式应注意如下区别。
(1)乘号不能省略。例如,x乘以y写成Python表达式为x*y。
(2)括号必须成对出现,均使用圆括号,出现多个圆括号时,从内向外逐层配对。
(3)运算符不能相邻。例如,a+-b是错误的。
(4)添加必要的函数。例如,数学表达式25转换为Python表达式为sqrt(25)。
3.3.2 操作
表达式计算根据运算符的优先次序逐一进行计算,Python运算符的优先级如表3-9所示。
表3-9 Python运算符的优先级别
优先级运 算 符描 述
高
低
** 指数
~、+、- 按位翻转、正号、负号
*、/、%、// 乘法、除法、取模和取整除
+、- 加法、减法
>>、<< 右移、左移
& 按位与
^、| 按位异或、按位或
<=、<、>、>= 比较运算符
<>、==、! = 等于运算符
=、%=、/=、//=、-=、+=、*=、**= 赋值运算符
is、isnot 身份运算符
in、notin 成员运算符
not、or、and 逻辑运算符
3.4 数据类型
Python3具有6个标准的数据类型:Number(数字),String(字符串),List(列表), 
Tuple(元组),Dictionary(字典),Set(集合)。其中,不可变的数据类型有Number、String和

4 5 
Tuple。可变的数据类型有List、Dictionary和Set。
3.5 数字
3.5.1 概念 
Python中数值有4种类型:整型、布尔型、浮点数和复数。
(1)整型(int)———表示整数。例如,1,1024,-982。
(2)布尔型(bool)———表示布尔逻辑值。例如,True,False。
(3)浮点数(float)———表示小数。例如,1.23,3.14,-9.01等。之所以称为浮点数,是
因为按照科学记数法表示,浮点数的小数点位置可变。例如,53.3E4就是科学记数法,E表
示10的幂,53.3E4表示53.3×10^4。53.3E4和5.33E5表示同一数字,但是它们的小数点
位置不同。
(4)复数(complex)———表示复数。例如,1+2j,1.1+3.2j。
3.5.2 操作
【例3-8】 数值。 
>>>a, b, c, d =20, 5.5, True, 4+3j 
>>>print(type(a), type(b), type(c), type(d)) 
<class 'int'><class 'float'><class 'bool'><class 'complex'> 
数学函数如表3-10所示。
表3-10 数学函数
函 数含 义举 例
abs(x) 数字的绝对值math.abs(-10)返回10 
ceil(x) 数字的上入整数math.ceil(4.1)返回5 
exp(x) e的x次幂(ex) math.exp(1) 返回3.718 281 828 
459045 
fabs(x) 数字的绝对值math.fabs(-10)返回10.0 
floor(x) 数字的下舍整数math.floor(4.9)返回4 
log(x) x的对数math.log(100,10)返回2.0 
log10(x) 以10为基数的x的对数math.log10(100)返回2.0 
max(x1,x2,…) 给定参数的最大值,参数可以为序列math.max(2,3)返回3 
min(x1,x2,…) 给定参数的最小值,参数可以为序列math.min(2,3)返回2 
pow(x,y) x**y运算后的值math.pow(2,3)返回8 
round(x[,n]) 浮点数x的四舍五入值,n代表舍入到小数
点后的位数math.round(3.4)返回3 
sqrt(x) 数字x的平方根math.sqrt(4)返回2

46 
3.6 字符串
3.6.1 概念 
字符串在Python中是以单引号、双引号或三引号括起来的符号来表示,例如,'Hello'、
"Pythonisgroovy"、"""Whatisfootnote5?"""等。
注意,"或""本身只是一种表示方式,不是字符串的一部分。因此,字符串a' bc'中只有a, 
b,c三个字符。另外,用单引号或双引号括起来没有任何区别,只是一个字符串用什么引号
开头,就必须用什么引号结尾。
单引号与双引号只能创建单行字符串,为了创建多行字符串或者为了使得字符串的数
据中出现双引号,则出现了三引号,如图3-10所示。
图3-10 单引号与双引号举例
3.6.2 操作
字符串(String)与列表和元组都是序列,其方法如表3-11所示。
表3-11 字符串方法
函 数描 述
s.index(sub,[start,end]) 定位子串sub在s里第一次出现的位置
s.find(sub,[start,end]}) 与index函数一样,但如果找不到会返回-1 
s.replace(old,new [,count]) 替换s里所有old子串为new子串,count指定多少个字符可被替换
s.count(sub[,start,end]) 统计s里有多少个sub子串
s.split() 默认分隔符是空格
s.join() join()方法是split()方法的逆方法,用来把字符串连接起来
s.lower() 返回将大写字母变成小写字母的字符串
s.upper() 返回将小写字母变成大写字母的字符串
sep.join(sequence) 把sequence的元素用连接符sep连接起来 
下面介绍字符串的操作。
1.index()方法举例 
>>>s="Python" 
>>>s.index('P') 
字符串

4 7 
0>
>>s.index('h',1,4) 
3>
>>s.index('y',3,4) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: substring not found 
>>>s.index('h',3,4) 
3 
2.find()方法举例 
>>>s="Python" 
>>>s.find('s') 
-1 
>>>s.find('t',1) 
2 
3.replace()方法举例 
>>>s="Python" 
>>>s.replace('h','i') 
'Pytion' 
4.count()方法举例 
>>>s="Python" 
>>>s.count('n') 
1 
5.split()方法举例 
>>>s="Python" 
>>>s.split() 
['Python'] 
>>>s="hello Python i like it" 
>>>s.split() 
['hello', 'Python', 'i', 'like', 'it'] 
>>>s ='name:zhou,age:20|name:python,age:30|name:wang,age:55' 
>>>print(s.split('|') ) 
['name:zhou,age:20','name:python,age:30','name:wang,age:55'] 
>>>x,y=s.split('|',1) 
>>>print(x) 
name:haha,age:20 
>>>print(y) 
name:python,age:30|name:fef,age:55 
6.join()方法举例 
>>>li=['apple','peach','banana','pear'] 
>>>sep=',' 
>>>s=sep.join(li) #连接列表元素

48 
>>>s 
'apple,peach,banana,pear' 
>>>s5=("Hello","World") 
>>>sep="" 
>>>sep.join(s5) #连接元组元素
'HelloWorld' 
3.7 列表
3.7.1 概念 
列表(List)是Python中使用最频繁的数据类型。列表中的每一个数据称为元素,元素
用逗号分隔并放在一对中括号“[”和“]”中,列表可以认为是下标从零开始的数组。列表可
以包含混合类型的数据,即在一个列表中的数据类型可以各不相同。
列表举例: 
[10, 20, 30, 40] #所有元素都是整型数据的列表
['frog', 'cat', 'dog'] #所有元素都是字符串的列表
['apple', 3.0, 5, [10, 20],True] #列表中包含字符串、浮点类型、整型、列表类型、布尔类型
Python创建列表时,解释器在内存中生成一个类似数组的数据结构,数据项自下而上
存储,如表3-12所示。
表3-12 列表存储方式
4 True 
3 [10,20] 
2 5 
1 3.0 
0 apple 
3.7.2 操作
下面介绍列表操作。
1.创建列表
使用“=”将一个列表赋值给变量。 
>>>a_list =['a', 'b', 'c'] 
2.读取元素
(1)读取某个元素:用列表名加元素序号。
序列中的每个元素被分配一个序号,即元素的位置,也称为索引。从左至右依次是
0,…,n,从右向左计数来存取元素称为负数索引,依次是-1,-2,…,-n。li[-n]== 
li[len(list)-n]。
列表

4 9 
【例3-9】 列表索引。 
>>>l1=[1,1.3,"a"] 
>>>l1[0] 
1>
>>l1[-1] 
'a' 
注意:Python从0开始计数。
(2)读取若干元素。
序列切片是指使用序列序号截取其中的任何部分从而得到新的序列。切片操作符是在[] 
内提供一对可选数字,用“:”分隔。冒号前的数字表示切片的开始位置,冒号后的数字表示
切片截止(但不包含)位置。
注意:数字可选,冒号必需,开始位置包含在切片中,不包括结束位置。
【例3-10】 列表切片。 
>>>l1=[1,1.3,"a"] 
>>>l1[1:2] #取出位置从1 开始到位置为2 的字符,但不包含偏移为2 的元素
[1.3] 
>>>l1[:2] #不指定第一个数,切片从第一个元素直到但不包含偏移为2 的元素
[1, 1.3] 
>>>l1[1:] #不指定第二个数,从偏移为1 直到末尾之间的元素
[1.3, 'a'] 
>>>l1[:] #数字都不指定,则返回整个列表的一个拷贝
3.修改元素
只需直接给元素赋值。 
>>>a_list =['a', 'b', 'c'] 
>>>a_list[0]=123 
>>>print a_list 
[123, 'b', 'c'] 
4.添加元素
列表添加元素有“+”、append()、extend()和insert()方法。
方法1:使用“+”将一个新列表附加在原列表的尾部。 
>>>a_list =[1] 
>>>a_list =a_list +['a', 3.0] 
>>>a_list 
[1, 'a', 3.0] 
方法2:使用append()方法向列表尾部添加一个新元素。 
>>>a_list =[1, 'a', 3.0] 
>>>a_list.append(True) 
>>>a_list 
[1, 'a', 3.0, True]

50 
方法3:使用extend()方法将一个列表添加在原列表的尾部。 
>>>a_list=[1, 'a', 3.0, True] 
>>>a_list.extend(['x', 4]) 
>>>a_list 
[1, 'a', 3.0, True, 'x', 4] 
方法4:使用insert()方法将一个元素插入列表的任意位置。 
>>>a_list=[1, 'a', 3.0, True, 'x', 4] 
>>>a_list.insert(0, 'x') 
>>>a_list 
['x', 1, 'a', 3.0, True, 'x', 4] 
【例3-11】 比较“+”和append()两种方法。 
import time 
result =[] 
start =time.time() 
for i in range(10000): 
result =result +[i] 
print("+操作执行",len(result), '次,用时', time.time()-start) 
result =[] 
start =time.time() 
for i in range(10000): 
result.append(i) 
print("append 操作执行",len(result), '次,用时', time.time()-start) 
程序运行结果如下。 
+操作执行10000 次,用时0.2020115852355957 
append 操作执行10000 次,用时0.0009999275207519531 
【例3-12】 比较insert()和append()两种方法。 
import time 
def Insert(): 
a =[] 
for i in range(10000): 
a.insert(0, i) 
def Append(): 
a =[] 
for i in range(10000): 
a.append(i) 
start =time.time() 
for i in range(10): 
Insert() 
print('Insert:', time.time()-start) 
start =time.time()

5 1 
for i in range(10): 
Append() 
print('Append:', time.time()-start) 
程序运行结果如下。 
Insert: 0.578000068665 
Append: 0.0309998989105 
5.删除元素
列表删除元素有del、remove()和pop()方法。
方法1:使用del语句删除某个特定位置的元素。 
>>>a_list=['x', 1, 'a', 3.0, True, 'x', 4] 
>>>del a_list[1] 
>>>a_list 
['x', 'a', 3.0, True, 'x', 4] 
方法2:使用remove()方法删除某个特定值的元素。 
>>>a_list =['x', 'a', 3.0, True, 'x', 4] 
>>>a_list.remove('x') 
>>>a_list 
['a', 3.0, True, 'x', 4] 
>>>a_list.remove('x') 
>>>a_list 
['a', 3.0, True, 4] 
>>>a_list.remove('x') 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
ValueError: list.remove(x): x not in list 
【例3-13】 比较两组代码。 
>>>x =[1,2,1,2,1,2,1,2,1] 
>>>for i in x: 
if i ==1: 
x.remove(i) 
>>>x 
[2, 2, 2, 2] 
>>>x =[1,2,1,2,1,1,1] 
>>>for i in x:
if i ==1: 
x.remove(i) 
>>>x 
[2, 2, 1] 
同样的代码,仅仅是处理的列表数据不同,结果不同。两组数据的区别在于有没有连续
的“1”。由于列表的自动内存管理功能,删除列表元素,Python会自动对列表内存进行收缩
并移动列表元素,以保证所有元素之间没有空值。增加列表元素时也会自动扩展内存并对
元素进行移动,以保证元素之间没有空值。每当插入或删除一个元素之后,该元素位置后面
所有元素的索引都会改变。

52 
为此,修改正确的代码如下。 
>>>x =[1,2,1,2,1,1,1] 
>>>for i in x[::]: #切片
if i ==1: 
x.remove(i) 
>>>x =[1,2,1,2,1,1,1] 
>>>for i in range(len(x)-1,-1,-1): 
if x[i ]==1: 
del x[i] 
方法3:使用pop()方法弹出指定位置的元素,省略参数时弹出最后一个元素。 
>>>a_list=['a', 3.0, True, 4] 
>>>a_list.pop( ) #省略参数时弹出最后一个元素
4>
>>a_list 
['a', 3.0, True] 
>>>a_list.pop(1) 
3.0 
>>>a_list 
['a', True] 
>>>a_list.pop(1) 
True 
>>>a_list 
['a'] 
>>>a_list.pop( ) 
'a' 
>>>a_list 
[] 
>>>a_list.pop( ) 
Traceback (most recent call last): 
File "<stdin >", line 1, in <module> 
IndexError: pop from empty list 
6.得到列表中指定元素的下标 
>>>a=[72, 56, 76, 84, 76, 80, 88] 
>>>print(a.index(56)) #输出元素56 的下标
1>
>>b=list(enumerate(a)) #enumerate()将list 的元素元组化
>>>print(b) 
[(0, 72), (1, 56), (2, 76), (3, 84), (4, 76), (5, 80), (6, 88)] 
>>>print("输出元素76 的下标") 
>>>print([i for i,x in b if x==76]) #利用循环方法获取相应的匹配结果
[2, 4] 
列表方法如表3-13所示。

5 3 
表3-13 列表方法
函 数描 述
alist.append(obj) 列表末尾增加元素obj 
alist.count(obj) 统计元素obj出现次数
alist.extend(sequence) 用sequence扩展列表
alist.index(obj) 返回列表中元素obj的索引
alist.insert(index,obj) 在index索引之前添加元素obj 
alist.pop(index) 删除索引的元素
alist.remove(obj) 删除指定元素
3.8 元组
3.8.1 概念 
元组(Tuple)和列表类似,相当于只读列表,其元素不可以修改。元组适合于只需进行
遍历操作的运算,对于数据进行“写保护”,其操作速度比列表快。
元组不可以被修改,代码如下。 
>>>b=(4,5,6) 
>>>b[0] 
4>
>>b[0]=1 
Traceback (most recent call last): 
File "<pyshell#6>", line 1, in <module> 
b[0]=1 
TypeError: 'tuple' object does not support item assignment 
如果对于已知的列表a进行复制,命名为变量b,那么b=a是无效。此时b仅仅是a的
别名(引用),修改b也会修改a,正确的复制方法应该是b=a[:]。 
>>>a=[1,2,3] 
>>>b=a 
>>>b[0]=4 
>>>a 
[4, 2, 3] 
元组与列表相比,具有如下不同点。
(1)元组在定义时所有元素是放在一对圆括号中,而不是方括号。
(2)不能向元组增加元素,元组没有append()、insert()或extend()方法。
(3)不能从元组中删除元素,元组没有remove()或pop()方法。
(4)元组没有index()方法,但可以使用in()方法。
(5)元组可以在字典中被用作“键”,但列表不行。
元组

54 
3.8.2 操作
下面介绍元组操作。
1.创建元组
使用赋值运算符“=”将一个元组赋值给变量,即可创建元组对象。 
>>>tup1 =('a', 'b', 1997, 2000) 
>>>tup2 =(1, 2, 3, 4, 5, 6, 7 ) 
当创建只包含一个元素的元组时,需要注意它的特殊性。此时,只把元素放在圆括号里
是不行的,这是因为圆括号既可以表示元组,又可以表示数学公式中的小括号,从而产生歧
义。因此,Python 规定:当创建只包含一个元素的元组时,需在元素的后面加一个
逗号“,”。 
>>>x=(1) 
>>>x 
1>
>>y=(1,) 
>>>y 
(1,) 
>>>z=(1,2) 
>>>z 
(1, 2) 
2.访问元组
可以使用下标索引来访问元组中的值。 
>>>tup1 =('a', 'b', 1997, 2000) 
>>>tup2 =(1, 2, 3, 4, 5, 6, 7 ) 
>>>print("tup1[0]: ", tup1[0]) 
tup1[0]: a 
>>>print("tup2[1:5]: ", tup2[1:5]) 
tup2[1:5]: (2, 3, 4, 5) 
3.元组连接
元组可以进行连接操作。 
>>>tup1 =(12, 34.56) 
>>>tup2 =('abc', 'xyz') 
#tup1[0]=100 #修改元组元素操作是非法的
>>>tup3 =tup1 +tup2; #创建一个新的元组
>>>print(tup3) 
(12, 34.56, 'abc', 'xyz') 
4.删除元组
元组中的元素值是不允许删除的,但可以使用del语句删除整个元组。 
>>>tup =('physics', 'chemistry', 1997, 2000)

5 5 
>>>del tup[1] 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'tuple' objext doesn't support item deletion 
>>>del tup 
>>>print(tup) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'tup' is not defined 
3.9 字典
3.9.1 字典的概念 
【例3-14】 根据同学的名字查找对应的成绩。
采用列表实现,需要names和scores两个列表,并且列表中元素的次序一一对应,例
如,zhou→95,Bob→75等,如下。 
names =['zhou', 'Bob', 'Tracy'] 
scores =[95, 75, 85] 
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历
取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。
字典在其他程序设计语言中称为映射(map),通过键/值对(key/value)存储数据,键和
值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号括起来。字典语法结构
如下。 
dict_name={key:value,key:value} 
字典具有如下特性。
(1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
(2)键/值对用冒号分隔,而元素项之间用逗号分隔,所有这些都包括在大括号中。
(3)键/值没有顺序。
(4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值
会覆盖前面的值。 
>>>dict ={'Name': 'Zara', 'Age': 7, 'Name': 'Zhou'} 
dict['Name']: Zhou 
(5)键必须不可变,只能使用数字、字符串或元组充当,不能使用列表,如图3-11所示。
图3-11 键的取值
字典

56 
因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不
同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希(Hash)算法。为了
保证Hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变
的,而list是可变的,因此,list不能作为key。
字典与列表比较,具有以下几个特点。
(1)字典通过用空间来换取时间,其查找和插入的速度极快,不会随着“键”的增加而
增加。
(2)字典需要占用大量的内存,内存浪费多。
(3)字典是无序的对象集合,字典当中的元素是通过键来存取的,而不是通过偏移
存取。采
用字典实现例3-14,则只需创建“名字”/“成绩”的键值对,便可直接通过名字查找成
绩。字典实现代码如下。 
>>>d ={'zhou': 95, 'Bob': 75, 'Tracy': 85} 
>>>d['zhou'] 
95 
3.9.2 字典操作
下面介绍字典元素的创建、访问、删除、修改、增加等相关操作。
1.字典的创建
(1)使用“=”将一个字典赋给一个变量。 
>>>a_dict={'Alice':95,'Beth':82,'Tom':65.5,'Emily':95} 
>>>a_dict 
{'Emily': 95, 'Tom': 65.5, 'Alice': 95, 'Beth': 82} 
>>>b_dict={} 
>>>b_dict 
{} 
(2)使用内建函数dict()。 
>>>c_dict=dict(zip(['one', 'two', 'three'], [1, 2, 3])) 
>>>c_dict 
{'three': 3, 'one': 1, 'two': 2} 
>>>d_dict =dict(one =1, two =2, three =3) 
>>>e_dict=dict([('one', 1),('two',2),('three',3)]) 
>>>f_dict=dict((('one', 1),('two',2),('three',3))) 
>>>g_dict=dict() 
>>>g_dict 
{} 
(3)使用内建函数fromkeys()。 
>>>h_dict={}.fromkeys((1,2,3),'student’) 
>>>h_dict