1、1 9.1列表推导式 列表推导式语法:expression for expr1 in sequence1 if condition1 for expr2 in sequence2 if condition2 for expr3 in sequence3 if condition3 .for exprN in sequenceN if conditionN29.1列表推导式 aList=x*x for x in range(10)相当于 aList=for x in range(10):aList.append(x*x)39.1列表推导式 freshfruit=banana,loganberry
2、,passion fruit aList=w.strip()for w in freshfruit等价于下面的代码 aList=for item in freshfruit:aList.append(item.strip()49.1列表推导式 阿凡提与国王比赛下棋,国王说要是自己输了的话,阿凡提想要什么他都可以拿得出来。阿凡提说那就要点米吧,棋盘一共有 64 个小格子,在第一个格子里放 1 粒米,第二个格子里放2 粒米,第三个格子里放 4 粒米,第四个格子里放 8 粒米,以此类推,后面每个格子里的米都是前一个格子里的 2 倍,一直到把 64 个格子都放满为止。那么到底需要多少粒米呢?使用列表推
3、导式再结合内置函数sum()很容易得到答案。sum(2*i for i in range(64)1844674407370955161559.1列表推导式 例例 5-17 有一个包含一些同学成绩的字典,编写程序计算所有成绩的最高分、最低分和平均分,并查找所有最高分同学。scores=Zhang San:45,Li Si:78,Wang Wu:99,Zhou Liu:96,Zhao Qi:65,Sun Ba:90,Zheng Jiu:78,Wu Shi:99,Dong Shiyi:60highest=max(scores.values()#最高分lowest=min(scores.values(
4、)#最低分average=round(sum(scores.values()/len(scores),2)#平均分print(highest,lowest,average)highestPerson=name for name,score in scores.items()if score=highestprint(highestPerson)69.2生成器推导式 生成器推导式的结果是一个生成器对象(generator object),具有惰性求值的特点,只在需要时返回元素,并且其中的每个元素只能使用一次。在使用生成器对象的元素时,可以根据需要将其转化为列表或元组,也可以使用内置函数 next
5、()进行遍历,或者直接使用 for 循环来遍历其中的元素。但不管使用哪种方法访问其元素,只能从前向后正向访问每个元素,没有任何方法可以再次访问已访问过的元素。当所有元素访问结束后,若需要重新访问其中的元素,则必须重新创建该生成器对象。79.2生成器推导式 g=(i+2)*2 for i in range(10)#创建生成器对象 ggenerator object at 0 x0000000003095200 tuple(g)#将生成器对象转换为元组(4,9,16,25,36,49,64,81,100,121)list(g)#生成器对象已遍历结束,没有元素了 g=(i+2)*2 for i in
6、 range(10)#重新创建生成器对象 next(g)#使用内置函数next()获取生成器对象中的元素4 next(g)#获取下一个元素989.2生成器推导式 g=(i+2)*2 for i in range(10)for item in g:#使用循环直接遍历生成器对象中的元素 print(item,end=)4 9 16 25 36 49 64 81 100 121 g=(i+2)*2 for i in range(10)36 in g#执行该语句之后,g中不再有36True 36 in g#这个语句会使用完g中剩余的所有元素False 49 in gFalse99.3 序列解包 序列解
7、包(sequence unpacking)的本质是对多个变量同时赋值,要求等号左侧变量的数量与等号右侧值的数量相等,或与等号右侧可迭代对象中包含的值的数量相等。109.3 序列解包 x,y,z=1,2,3#多个变量同时赋值 a,b=b,a#交换变量a和b的值 x,y,z=(False,3.5,exp)x,y,z=range(3)#对range对象进行序列解包 x,y,z=map(str,range(3)#对map对象进行序列解包119.3 序列解包 keys=a,b,c,d values=1,2,3,4 for k,v in zip(keys,values):print(k,v)a 1b 2c
8、 3d 4129.3 序列解包 s=a:1,b:2,c:3 for k,v in s.items():#字典中每个元素包含“键”和“值”两部分 print(k,v)a 1c 3b 2139.4 切片 切片的格式由 2 个冒号及被其分隔的 3 个数字组成:start:stop:step149.4.1使用切片获取列表、元组、字符串中的部分元素 aList=3,4,5,6,7,9,11,13,15,17 aList:#三个数字都使用默认值#返回包含原列表中所有元素的新列表3,4,5,6,7,9,11,13,15,17 aList:-1#step为-1,从后往前逐个元素进行切片#返回包含原列表中所有元
9、素的逆序列表17,15,13,11,9,7,6,5,4,3 aList:2#从下标0开始,隔一个取一个,获取偶数位置的元素3,5,7,11,15 aList1:2#从下标1开始,隔一个取一个,获取奇数位置的元素4,6,9,13,17 aList3:6#从下标3到下标6,不包括下标66,7,9 aList0:100#切片结束位置大于列表长度时,从列表尾部截断3,4,5,6,7,9,11,13,15,17 aList100:#切片开始位置大于列表长度时,返回空列表15 Explicit is better than implicit.:8#前8个字符Explicit Explicit is bet
10、ter than implicit.9:23#下标9到下标22之间的字符is better than path=C:Python35test.bmp path:-4+_new+path-4:C:Python35test_new.bmp169.4.1使用切片获取列表、元组、字符串中的部分元素 例 5-18 编写程序,利用字符串切片操作判断一个字符串是否为回文。text=input(请输入一个字符串:)if text:-1=text:print(是回文。)else:print(不是回文)179.4.1使用切片获取列表、元组、字符串中的部分元素9.4.2使用切片对列表进行元素插入、删除、修改操作(1
11、)使用切片为列表元素进行增加或插入元素 aList=3,5,7 aListlen(aList):=9#在列表尾部增加元素 aList:0=1,2#在列表头部插入多个元素 aList3:3=4#在列表中间位置插入元素 aList1,2,3,4,5,7,918(2)使用切片替换和修改列表中的元素 aList=3,5,7,9 aList:3=1,2,3#替换列表元素,等号两边的列表长度相等 aList3:=4,5,6#切片连续,等号两边的列表长度可以不相等 aList1,2,3,4,5,6 aList:2=0*3#切片不连续,等号两边的列表长度必须相等 aList0,2,0,4,0,6 aList:2=a,b,c#隔一个修改一个 aLista,2,b,4,c,6 aList:2=1#切片不连续时,等号两边列表必须长度一样ValueError:attempt to assign sequence of size 1 to extended slice of size 3199.4.2使用切片对列表进行元素插入、删除、修改操作(3)使用切片删除列表中的元素 aList=3,5,7,9 aList:3=#删除列表中前3个元素 aList9209.4.2使用切片对列表进行元素插入、删除、修改操作