Python程序设计基础(第2版计算机系列教材)

Python程序设计基础(第2版计算机系列教材)
作者: 编者:董付国
出版社: 清华大学
原售价: 49.00
折扣价: 36.80
折扣购买: Python程序设计基础(第2版计算机系列教材)
ISBN: 9787302490562

作者简介

内容简介

第3章第3章玄之又玄,众妙之门: 详解Python序列结构 Python中常用的序列结构有列表、元组、字典、字符串、集合等(虽然有人并不主张把字典和集合看作序列,但这真的不重要)。从是否有序这个角度看,Python序列可以分为有序序列和无序序列;从是否可变来看,Python序列则可以分为可变序列和不可变序列两大类,如图31所示。另外,生成器对象和range、map、enumerate、filter、zip等对象的某些用法也类似于序列,尽管这些对象更大的特点是惰性求值。列表、元组、字符串等有序序列以及range对象均支持双向索引,第一个元素下标为0,第二个元素下标为1,以此类推;如果使用负数作为索引,则最后一个元素下标为-1,倒数第二个元素下标为-2,以此类推。可以使用负整数作为索引是Python有序序列的一大特色,熟练掌握和运用可以大幅度提高开发效率。 图31Python序列分类示意图 3.1列表: 打了激素的数组 列表(list)是最重要的Python内置对象之一,是包含若干元素的有序连续内存空间。当列表增加或删除元素时,列表对象自动进行内存的扩展或收缩,从而保证相邻元素之间没有缝隙。Python列表的这个内存自动管理功能可以大幅度减少程序员的负担,但插入和删除非尾部元素时涉及列表中大量元素的移动,会严重影响效率。另外,在非尾部位置插入和删除元素时会改变该位置后面的元素在列表中的索引,这对于某些操作可能会导致意外的错误结果。所以,除非确实有必要,否则应尽量从列表尾部进行元素的追加与删除操作。〖1〗〖2〗Python程序设计基础(第2版)〖1〗第3章玄之又玄,众妙之门: 详解Python序列结构〖2〗在形式上,列表的所有元素放在一对方括号[]中,相邻元素之间使用逗号分隔。在Python中,同一个列表中元素的数据类型可以各不相同,可以同时包含整数、实数、字符串等基本类型的元素,也可以包含列表、元组、字典、集合、函数以及其他任意对象。如果只有一对方括号而没有任何元素则表示空列表。下面几个都是合法的列表对象: \\\\[10,20,30,40\\\\] \\\\['crunchy frog','ram bladder','lark vomit'\\\\] \\\\['spam',2.0,5,\\\\[10,20\\\\]\\\\] \\\\[\\\\['file1',200,7\\\\],\\\\['file2',260,9\\\\]\\\\] \\\\[{3},{5:6},(1,2,3)\\\\]Python采用基于值的自动内存管理模式,变量并不直接存储值,而是存储值的引用或内存地址,这也是python中变量可以随时改变类型的重要原因。同理,Python列表中的元素也是值的引用,所以列表中各元素可以是不同类型的数据。 需要注意的是,列表的功能虽然非常强大,但是负担也比较重,开销较大,在实际开发中,最好根据实际的问题选择一种合适的数据类型,要尽量避免过多使用列表。 3.1.1列表创建与删除 使用“=”直接将一个列表赋值给变量即可创建列表对象。>>> a_list= \\\\['a','b','mpilgrim','z','example'\\\\] >>> a_list= \\\\[\\\\] #创建空列表也可以使用list()函数把元组、range对象、字符串、字典、集合或其他可迭代对象转换为列表。需要注意的是,把字典转换为列表时默认是将字典的“键”转换为列表,而不是把字典的元素转换为列表,如果想把字典的元素转换为列表,需要使用字典对象的items()方法明确说明,当然也可以使用values()来明确说明要把字典的“值”转换为列表。>>> list((3,5,7,9,11)) #将元组转换为列表 \\\\[3,5,7,9,11\\\\] >>> list(range(1,10,2))#将range对象转换为列表 \\\\[1,3,5,7,9\\\\] >>> list('hello world') #将字符串转换为列表 \\\\['h','e','l','l','o',' ','w','o','r','l','d'\\\\] >>> list({3,7,5}) #将集合转换为列表 \\\\[3,5,7\\\\] >>> list({'a':3,'b':9,'c':78}) #将字典的“键”转换为列表 \\\\['a','c','b'\\\\] >>> list({'a':3,'b':9,'c':78}.items()) #将字典的“键:值”对转换为列表 \\\\[('b',9),('c',78),('a',3)\\\\] >>> x= list() #创建空列表当一个列表不再使用时,可以使用del命令将其删除,这一点适用于所有类型的Python对象。>>> x= \\\\[1,2,3\\\\] >>> del x#删除列表对象 >>> x #对象删除后无法再访问,抛出异常 NameError: name 'x' is not defined3.1.2列表元素访问 创建列表之后,可以使用整数作为下标来访问其中的元素,其中下标为0的元素表示第1个元素,下标为1的元素表示第2个元素,下标为2的元素表示第3个元素,以此类推;列表还支持使用负整数作为下标,其中下标为-1的元素表示最后一个元素,下标为-2的元素表示倒数第2个元素,下标为-3的元素表示倒数第3个元素,以此类推,如图32所示(以列表['P', 'y', 't', 'h', 'o', 'n']为例)。>>> x= list('Python') #创建列表对象 >>> x \\\\['P','y','t','h','o','n'\\\\] >>> x\\\\[0\\\\] #下标为0的元素,第一个元素 'P' >>> x\\\\[-1\\\\]#下标为-1的元素,最后一个元素 'n'图32双向索引示意图 3.1.3列表常用方法 列表、元组、字典、集合、字符串等Python序列有很多操作是通用的,而不同类型的序列又有一些特有的方法或者支持某些特有的运算符和内置函数。列表对象常用的方法如表31所示。续表表31列表对象常用的方法方法说明append(x)将x追加至列表尾部extend(L)将列表L中的所有元素追加至列表尾部insert(index, x)在列表index位置处插入x,该位置后面的所有元素后移并且在列表中的索引加1,如果index为正数且大于列表长度则在列表尾部追加x,如果index为负数且小于列表长度的相反数则在列表头部插入元素xremove(x)在列表中删除第一个值为x的元素,该元素之后所有元素前移并且索引减1,如果列表中不存在x则抛出异常pop(\\\\[index\\\\])删除并返回列表中下标为index的元素,如果不指定index则默认为-1,弹出最后一个元素;如果弹出中间位置的元素则后面的元素索引减1;如果index不是\\\\[-L, L)区间的整数则抛出异常,L表示列表长度clear()清空列表,删除列表中的所有元素,保留列表对象index(x)返回列表中第一个值为x的元素的索引,若不存在值为x的元素则抛出异常count(x)返回x在列表中的出现次数reverse()对列表所有元素进行原地逆序,首尾交换sort(key=None, reverse=False)对列表中的元素进行原地排序,key用来指定排序规则,reverse为False表示升序,True表示降序copy()返回列表的浅复制1. append()、insert()、extend() 这3个方法都可以用于向列表对象中添加元素,其中append()用于向列表尾部追加一个元素,insert()用于向列表任意指定位置插入一个元素,extend()用于将另一个列表中的所有元素追加至当前列表的尾部。这3个方法都属于原地操作,不影响列表对象在内存中的起始地址。对于长列表而言,使用insert()方法在列表首部或中间位置插入元素时效率较低。如果确实需要在首部按序插入多个元素,可以先在尾部追加,然后使用reverse()方法进行翻转,或者考虑使用标准库collections中的双端队列deque对象提供的appendleft()方法。>>> x= \\\\[1,2,3\\\\] >>> id(x) #查看对象的内存地址 50159368 >>> x.append(4)#在尾部追加元素 >>> x.insert(0,0) #在指定位置插入元素 >>> x.extend(\\\\[5,6,7\\\\]) #在尾部追加多个元素 >>> x \\\\[0,1,2,3,4,5,6,7\\\\] >>> id(x) #列表在内存中的地址不变 501593682. pop()、remove()、clear() 这3个方法用于删除列表中的元素,其中pop()用于删除并返回指定位置(默认是最后一个)上的元素,如果指定的位置不是合法的索引则抛出异常,对空列表调用pop()方法也会抛出异常;remove()用于删除列表中第一个值与指定值相等的元素,如果列表中不存在该元素则抛出异常;clear()用于清空列表中的所有元素。这3个方法也属于原地操作,不影响列表对象的内存地址。另外,还可以使用del命令删除列表中指定位置的元素,这个方法同样也属于原地操作。>>> x= \\\\[1,2,3,4,5,6,7\\\\] >>> x.pop() #弹出并返回尾部元素 7 >>> x.pop(0)#弹出并返回指定位置的元素 1 >>> x.clear()#删除所有元素 >>> x \\\\[\\\\] >>> x= \\\\[1,2,1,1,2\\\\] >>> x.remove(2) #删除首个值为2的元素 >>> del x\\\\[3\\\\] #删除指定位置上的元素 >>> x \\\\[1,1,1\\\\]必须强调的是,由于列表具有内存自动收缩和扩张功能,在列表中间位置插入或删除元素时,不仅效率较低,而且该位置后面所有元素在列表中的索引也会发生变化,必须牢牢记住这一点。 3. count()、index() 列表方法count()用于返回列表中指定元素出现的次数;index()用于返回指定元素在列表中首次出现的位置,如果该元素不在列表中则抛出异常。>>> x= \\\\[1,2,2,3,3,3,4,4,4,4\\\\] >>> x.count(3) #元素3在列表x中的出现次数 3 >>> x.count(5) #不存在,返回0 0 >>> x.index(2) #元素2在列表x中首次出现的索引 1 >>> x.index(5) #列表x中没有5,抛出异常 ValueError: 5 is not in list通过前面的介绍我们已经知道,列表对象的很多方法在特殊情况下会抛出异常,而一旦出现异常,整个程序就会崩溃,这是我们不希望的。为避免引发异常而导致程序崩溃,一般来说有两种方法: ①使用选择结构确保列表中存在定元素再调用有关的方法;②使用异常处理结构。下面的代码使用异常处理结构保证用户输入的是三位数,然后使用关键字in来测试用户输入的数字是否在列表中,如果存在则输出其索引,否则提示不存在。from random import samplelst= sample(range(100,1000),100)while True: x= input('请输入一个三位数: ') try: assert len(x)==3,'长度必须为3' x= int(x) break except: passif x in lst: print('元素{0}在列表中的索引为: {1}'.format(x,lst.index(x))) else: print('列表中不存在该元素.')4. sort()、reverse() 列表对象的sort()方法用于按照指定的规则对所有元素进行排序,默认规则是所有元素从小到大升序排序;reverse()方法用于将列表所有元素逆序或翻转,也就是第一个元素和倒数第一个元素交换位置,第二个元素和倒数第二个元素交换位置,以此类推。>>> x= list(range(11)) #包含11个整数的列表 >>> import random >>> random.shuffle(x) #把列表x中的元素随机乱序 >>> x \\\\[6,0,1,7,4,3,2,8,5,10,9\\\\] >>> x.sort(key=lambda item:len(str(item)),reverse=True) #按转换成字符串以后的长度降序排列 >>> x \\\\[10,6,0,1,7,4,3,2,8,5,9\\\\] >>> x.sort(key=str)#按转换为字符串后的大小升序排序 >>> x \\\\[0,1,10,2,3,4,5,6,7,8,9\\\\] >>> x.sort() #按默认规则排序 >>> x \\\\[0,1,2,3,4,5,6,7,8,9,10\\\\] >>> x.reverse() #把所有元素翻转或逆序 >>> x 案例丰富、注释量大、实用性强。书中几乎每段代码都配有大量注释,读者能够在最短时间内理解代码的思路和要点,大幅度缩短阅读和学习时间,由浅入深,层层递进,平滑学习曲线。