Python程序设计基础 课件 第5、6章 列表、元组与字典;函数_第1页
Python程序设计基础 课件 第5、6章 列表、元组与字典;函数_第2页
Python程序设计基础 课件 第5、6章 列表、元组与字典;函数_第3页
Python程序设计基础 课件 第5、6章 列表、元组与字典;函数_第4页
Python程序设计基础 课件 第5、6章 列表、元组与字典;函数_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇报人:WPSPython程序设计基础第五章列表、元组与字典目录01列表02列表元素的操作03元组04字典目录05Python生态系统之jieba库06小试牛刀07拓展实践08本章小结

理解并掌握列表的使用方法。

理解元组与列表的区别。

理解并掌握字典的使用方法。了解jieba分词库的使用方法。Python

不仅提供了整型、浮点型等基本的数据类型,还提供了更复杂、功能强大的组合数据类

型,如列表、元组、字典等。当程序要处理一系列彼此关联非常密切的数据时,这些数据类型会给

程序的编写带来极大的方便。本章就来认识一下列表、元组与字典。学习目标PART15.1列表第

3

章在介绍

random

库中的

sample()函数时提到,sample()将抽取的多个元素放置在一个列表中返回。第4

章介绍字符串的split()方法时提到,其分拆得到的多个字符串也被放置在一

个列表中。可见列表非常适合存放一系列的有关联的数据。例如,中国有很多名山大川,它们不仅拥有优美的景致,还有悠久的历史文化。如果希望汇总一批名山的数据,列表是一个很好的选择。代码

5.1

使用方括号定义了一个列表,其中有

5

个元素,元素间使用逗号分隔。从代码注释的

描述可知,列表中的元素可通过索引编号访问,这一点与字符串很类似。列表开头第一个元素的编

号为0,如果编号为负值,则表示从后向前数时元素的序号。除了可以可以通过索引编号输出其中的元素,也可以输出整个列表,注意输出整个列表时结果带有方括号。代码

5.1

认识列表5.1.1认识列表print(mountains[0])#泰山print(mountains[1])#华山print(mountains[-1])#武当山print(mountains)#['泰山','华山','黄山','峨眉山','武当山']mountains=

["泰山","华山","黄山","峨眉山","武当山"]通俗地讲,列表有点类似调料盒。可以将列表想象成一个拥有多个位置的容器,每个位置均可保存数据。列表中的数据可以是不同类型的,字符串、整型、浮点型等数据可同时存在于一个列表

中。例如,如果希望收集有关名山的更多数据而不仅仅只有名称,则可以像代码5.2

这样做,其中

的数值代表山峰的海拔高度。代码

5.2

列表可保存不同类型的数据。5.1.1认识列表['泰山','玉皇顶',1532.7]['华山','南峰',2154.9]['武当山','天柱峰',1612.1]mountains=

["泰山","玉皇顶",1532.7,

"华山","南峰",2154.9,"黄山","莲花峰",1864.8,

"峨眉山","万佛顶",3099.0,

"武当山","天柱峰",1612.1]print(mountains[0:3])

print(mountains[3:6])

print(mountains[-3:])代码

5.2

的运行结果如下,均为原列表的片段,对应着不同的名山。#泰山信息

#华山信息

#武当山信息由代码

5.2可知,列表是一种比较灵活的数据结构,可将不同类型但有关联的数据聚合在一起。

而且,列表也支持切片操作,规则和字符串是一致的。其实,列表的元素还可以是另一个列表,这

时就形成了列表嵌套的局面,下面看代码

5.3

的演示。代码

5.3

列表的嵌套5.1.1认识列表这段代码先定义了几个小列表,分别保存各名山的数据。之后在定义mountains列表时,其元素是这些小列表,如此即形成列表的嵌套。这种写法较之代码5.2的优势在于,单独访问某一座名山的数据时更容易、更清晰。因为存在列表的嵌套,如果要通过

mountains列表访问某一座山的分项数据,如最高峰、海

拔等,则会出现类似

mountains[3][2]的写法。其中,mountains[3]获取列表

mountains

的第

4个元

素,而这个元素本身又是列表,因此

mountains[3][2]表示第

4

个元素即列表

e_mei_shan

的第

3

个元素。tai_shan=

["泰山","玉皇顶",1532.7]hua_shan=

["华山","南峰",2154.9]huang_shan=

["黄山","莲花峰",1864.8]e_mei_shan=

["峨眉山","万佛顶",3099.0]wu_dang_shan=

["武当山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]['泰山','玉皇顶',1532.7]['峨眉山','万佛顶',3099.0]['武当山','天柱峰',1612.1]峨眉山最高峰为万佛顶,海拔

3099.0米。msg=mountains[3][0]+"最高峰为"+mountains[3][1]+

",海拔"

+

\

str(mountains[3][2])+

"米。"print(msg)print(mountains[0])

print(mountains[3])

print(mountains[-1])#泰山信息

#峨眉山信息

#武当山信息代码

5.3

的运行结果如下。列表不仅像字符串一样可以使用索引序号、切片操作访问元素,也可以使用循环语句遍历其中

的各元素。使用

for循环遍历列表,如代码

5.4所示,可以看出与遍历字符串很类似。代码

5.4

使用

for

语句遍历列表在循环过程中,mountains列表的每个元素值会依次被复制到循环变量

m

中。因此

m也是一个

列表,m[0]、m[1]、m[2]分别表示山名、最高峰和海拔。代码

5.4

的运行结果如下。5.1.2遍历列表tai_shan=

["泰山","玉皇顶",1532.7]hua_shan=

["华山","南峰",2154.9]huang_shan=

["黄山","莲花峰",1864.8]e_mei_shan=

["峨眉山","万佛顶",3099.0]wu_dang_shan=

["武当山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]forminmountains:msg=m[0]+m[1]+

"的海拔为"+

str(m[2])

+

"米。"print(msg)泰山玉皇顶的海拔为

1532.7米。华山南峰的海拔为

2154.9米。黄山莲花峰的海拔为

1864.8米。峨眉山万佛顶的海拔为

3099.0米。武当山天柱峰的海拔为

1612.1米。对于嵌套的列表,可以使用单层循环遍历,也可以使用双重循环遍历,下面代码5.5

演示了使

用双重循环遍历

mountains列表。代码

5.5

使用双重循环遍历嵌套列表。5.1.2遍历列表tai_shan=

["泰山","玉皇顶",1532.7]hua_shan=

["华山","南峰",2154.9]huang_shan=

["黄山","莲花峰",1864.8]e_mei_shan=

["峨眉山","万佛顶",3099.0]wu_dang_shan=

["武当山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]forminmountains:for

item

inm:print(item,end="")print("米。")使用

for语句遍历列表很方便,但不排除有时需要使用

while语句来遍历列表。当使用

while语

句遍历列表时,需要知道列表的长度,因此先使用

Python

内置的

len()函数来测量列表的长度,如

代码

5.6所示。代码

5.6

使用

while语句遍历列表函数

len()可用来测量一个序列的长度,如字符串、列表、元组、字典等。另外需要注意的是,

代码中while循环的条件不可以写成“<=”,因为列表最后一项的索引序号比列表的长度小

1。5.1.2遍历列表tai_shan=

["泰山","玉皇顶",1532.7]hua_shan=

["华山","南峰",2154.9]huang_shan=

["黄山","莲花峰",1864.8]e_mei_shan=

["峨眉山","万佛顶",3099.0]wu_dang_shan=

["武当山","天柱峰",1612.1]mountains=

[tai_shan,hua_shan,huang_shan,e_mei_shan,wu_dang_shan]length=len(mountains)i

=

0whilei<

length:#不可以写成<=m=mountains[i]msg=m[0]+m[1]+

"海拔"+

str(m[2])

+

"米。"print(msg)i

+=

1第

4章介绍的运算符“+”和“*”可以用于字符串,同为序列的列表,也可以使用这两个运算

符,且含义和字符串有异曲同工之妙。下面看代码

5.7

的演示。代码

5.7

加法与乘法运算符用于列表加法运算符可以将两个列表连接成一个更长的列表,注意是形成一个新的更长的列表,参与加

法运算的原始两个列表没有发生变化。而列表与整数之间的乘法运算则是将这个列表重复整数遍,得到一个新的更长的列表。5.1.3列表的运算符south_mountains=

["武夷山","仓山","黄山","峨眉山","武当山"]

north_mountains=

["泰山","华山","恒山","长白山","天山"]mountains=south_mountains+north_mountainsrivers=

["黄河","长江"]

*2

print(len(mountains))print(len(rivers))同样与字符串类似的是,判断一个元素是否在列表中时,可以使用成员运算符

in或

notin,如

代码

5.8所示。代码

5.8

判断元素是否在列表中5.1.3列表的运算符buddhism_mountains=

["五台山","峨眉山","普陀山","九华山"]mountain=input("输入一座名山:")ifmountainnotinbuddhism_mountains:print(f"{mountain}不属于佛教四大名山。")else:print(f"{mountain}是佛教四大名山之一。")输入一座名山:天山天山不属于佛教四大名山。代码

5.8

的运行结果如下。PART25.2列表元素的操作前面介绍过可以使用内置函数

len()测量列表的长度,其实还可以使用内置函数

min()和

max()求得列表中多个元素的最小值和最大值,如代码

5.9所示。

代码

5.9

求取列表元素的最值代码中的列表保存了几座名山的海拔高度,因此可以使用

min()和

max()方便地得到列表中的最

小海拔和最大海拔。5.2.1元素最值height=

[1532.7,2154.9,1864.8,3099.0,1612.1]print(min(height))

#1532.7print(max(height))

#3099.0有多种方法可以向列表中添加新的元素,这里介绍以下

3种。1.append()方法列表的append()方法可以向列表尾部追加一个元素。中国的名山大川还有很多,如果希望将更

多的名山追加到列表中,一次一座,可如代码

5.10

所示。代码

5.10

向列表中添加元素——append()方法这段代码首先通过一个空的方括号定义了一个不含任何元素的空列表,之后通过循环从键盘上

接收一个个的山名。这里的哨兵值为英文字母

Q,输入

Q循环结束(大小写均可)。代码后半段统计列表的长度,并遍历输出列表中的各山名。5.2.2增加元素mountains=

[]

#空列表m=input("你知道祖国的哪些名山(退出:Q)?")whilem.upper()

!="Q":mountains.append(m)m=input("你知道祖国的哪些名山(退出:Q)?")count=len(mountains)print(f"你说出了{count}座祖国的名山,它们是")forminmountains:print(m,end=",")你知道祖国的哪些名山(退出:Q)?泰山你知道祖国的哪些名山(退出:Q)?黄山你知道祖国的哪些名山(退出:Q)?长白山你知道祖国的哪些名山(退出:Q)?q你说出了

3座祖国的名山,它们是泰山,黄山,长白山,代码

5.10

的运行结果如下。2.insert()方法append()方法只能将元素添加到列表的尾部,如果需要将新的元素添加到列表中间的某个位置,

则可以使用

insert()方法,如代码

5.11所示。代码

5.11

向列表中添加元素——insert()方法除了需要添加的新元素,insert()方法还需要指明新元素插入的位置,因此insert()方法需要两个

参数,第一个参数为插入的位置,第二个元素为新的元素。添加新元素后,该位置及后面的原有元

素均会后移一个位置,列表长度增加

1。5.2.2增加元素mountains=

["泰山","华山","黄山","峨眉山","武当山"]mountains.insert(2,"嵩山")print(mountains)

#['泰山','华山','嵩山','黄山','峨眉山','武当山']3.extend()方法如果希望一次性向列表添加多个元素,则可以使用

extend()方法。它可将一个列表的所有元素一次性添加到另外一个列表中,如代码

5.12所示。代码

5.12

向列表中添加元素——extend()方法代码中的

mountains列表一开始是空列表,在连续调用两次

extend()方法将另外两个列表中的元

素复制到本身后,长度变为

10。extend()方法没有返回值,也不会改变提供元素的两个列表。5.2.2增加元素south_mountains=

["武夷山","仓山","黄山","峨眉山","武当山"]north_mountains=

["泰山","华山","恒山","长白山","天山"]mountains=

[]mountains.extend(south_mountains)mountains.extend(north_mountains)print(len(mountains))

#10列表中的元素是可以修改的,使用索引序号指明要修改的元素即可,注意索引不要越界。代码

5.13将列表中的前两个元素修改为省份加名山,但在修改九华山时报错,原因是弄错了元素的索引,

导致索引越界。代码

5.13

修改列表的元素在修改列表元素时,也可以使用切片式写法一次修改多个元素,被换的元素和用来替换的元素个数可以不同。如代码

5.14

将原始列表中的四大佛教名山替换为五岳,列表的长度也因此增加

1。代码

5.14

修改列表的片段5.2.3修改元素buddhism_mountains=

["五台山","峨眉山","普陀山","九华山"]buddhism_mountains[0]="山西五台山"buddhism_mountains[1]="四川峨眉山"#buddhism_mountains[4]="安徽九华山"

#报错,索引越界print(buddhism_mountains)mountains=

["太行山","五台山","峨眉山","普陀山","九华山","祁连山"]print(len(mountains))#6mountains[1:5]=

["泰山","华山","衡山","恒山","嵩山"]print(len(mountains))#7print(mountains)#列表变为

['太行山','泰山','华山','衡山','恒山','嵩山','祁连山']删除列表中已有元素的方法有多种,这些方法有的需要指明要删除的元素本身,有的需要指明

要删除元素的索引序号,有的会将删除的元素返回,还有的没有返回值。1.del()函数del()函数根据指定的索引序号删除相应的元素,没有返回值。注意,del()函数不是列表拥有的

方法,因此在书写形式上与后面的pop()等方法不同,这一点从代码5.15可明显地看出来。代码

5.15

使用

del()函数删除列表元素代码开始的列表中,佛教名山中混有武当山、龙虎山、青城山、终南山

4个道教名山。代码首

先删除索引序号为

2

的武当山,原列表中从峨眉山开始,其后的元素序号均发生变化。龙虎山、青

城山、终南山等道教名山的索引序号不再是

4、5、6,而应是

3、4、5,因此在使用

del()函数删除这

几座道教名山时,切片起止位置应写为[3:6],结尾位置索引6

不包含在内。列表最后的效果如代码

中的注释所示,只剩佛教名山了。5.2.4删除元素mountains=

["梵净山","五台山","武当山","峨眉山","龙虎山","青城山","终南山","普陀山","九华山","鸡足山"]del(mountains[2])#删除"武当山",武当山之后的元素索引有变化del(mountains[3:6])

#删除"龙虎山","青城山","终南山"print(mountains)#列表变为

['梵净山','五台山','峨眉山','普陀山','九华山','鸡足山']2.pop()方法与

del()函数不同,pop()是列表的方法,因此在书写时要按照面向对象的“点”格式来书写,即

列表名.方法名。与del()函数相同的是,pop()方法也根据元素的序号位置删除相应的元素,但

pop()

方法会返回被删除的元素,如代码

5.16所示。代码

5.16使用

pop()方法删除列表元素5.2.4删除元素mountains=

["梵净山","五台山","武当山","峨眉山","龙虎山","青城山","终南山","普陀山","九华山","鸡足山"]taoism_mountains=

[]#保存被删除的道教名山ix=

[2,3,3,3]for

i

in

ix:m=mountains.pop(i)taoism_mountains.append(m)print(mountains)#['梵净山','五台山','峨眉山','普陀山','九华山','鸡足山']print(taoism_mountains)#['武当山','龙虎山','青城山','终南山']这段代码同样要将名山列表中的道教名山删除,只留下佛教名山,但因为使用了pop()方法,所

以每次

pop()方法会将删除的山名返回并保存到变量

m

中。代码预备了一个空的道教名山列表,被

删除的山名都被追加到这个列表中。3.remove()方法删除列表中元素的第三种方法是使用列表的remove()方法,这个方法不是根据索引序号来删除

元素,而是需要指明要删除的元素本身。另外,remove()方法不返回被删除的元素。代码

5.17

清楚

地演示了这一点。代码

5.17使用

remove()方法删除列表元素以上介绍的删除列表元素的

3种方法各具特点,适用于不同的情景。5.2.4删除元素mountains=

["梵净山","五台山","武当山","峨眉山","龙虎山","青城山","终南山","普陀山","九华山","鸡足山"]taoism_mountains=

['武当山','龙虎山','青城山','终南山']formintaoism_mountains:mountains.remove(m)print(mountains)#['梵净山','五台山','峨眉山','普陀山','九华山','鸡足山']表

5.1对

del()函数、pop()

方法、remove()方法进行了对比。5.2.4删除元素删除列表元素的方法根据索引序号根据元素本身返回被删除元素del()函数√pop()方法√√remove()方法√表5.1

3种删除列表元素方法的对比4.clear()方法如果需要将列表中所有的元素都删除,即将列表清空,则可以使用列表的

clear()方法。代码

5.18

需要互动者输入多条河流的流经省份。程序使用双重循环,外层循环遍历每一条河流,内层循环不

断询问当前河流的流经省份,直到输入的是哨兵值“Q”或“q”。得到的省份被追加到provinces

列表中,代码最后在输出当前河流的流经省份后,外层循环进入下一条河流,因此循环体一开始要

将provinces列表清空,为记录新的河流流经省份做好准备。代码

5.18使用

clear()方法清空列表元素5.2.4删除元素rivers=

["长江","黄河"]provinces=

[]print("说出以下河流主干流经的省、自治区、直辖市,一次一个,输入

Q结束。")for

r

in

rivers:provinces.clear()p=

input(f"{r}:")whilep.upper()

!=

"Q":provinces.append(p)p=

input(f"{r}:")print(f"{r}主干流经:{provinces}")代码

5.18

的运行结果如下。5.2.4删除元素说出以下河流主干流经的省、自治区、直辖市,一次一个,输入

Q结束。长江:青海长江:西藏长江:四川长江:云南长江:重庆长江:湖北长江:湖南长江:江西长江:安徽长江:江苏长江:上海长江:Q长江主干流经:['青海','西藏','四川','云南','重庆','湖北','湖南','江西','安徽','江苏','上海']黄河:青海黄河:四川黄河:甘肃黄河:宁夏黄河:内蒙古黄河:陕西黄河:山西黄河:河南黄河:山东黄河:Q黄河主干流经:['青海','四川','甘肃','宁夏','内蒙古','陕西','山西','河南','山东']前面介绍了可以对列表元素求最值,其实如果将列表中的元素排好序,最值就很容易获得了。

对列表中的元素排序时,可以使用列表的

sort()方法,如代码

5.19所示。代码

5.19使用

sort()方法对列表元素排序sort()方法会直接在原列表上进行排序操作。如果希望进行降序排序,则可以启用sort()方法的

reverse参数,该参数为

True时意味着降序排序。5.2.5元素排序height=

[1532.7,2154.9,1864.8,3099.0,1612.1]height.sort()#升序print("升序:",height)height.sort(reverse=True)#降序print("降序:",height)升序:

[1532.7,1612.1,1864.8,2154.9,3099.0]降序:

[3099.0,2154.9,1864.8,1612.1,1532.7]代码

5.19

的运行结果如下。另外,列表还有一个reverse()方法,其含义是将列表中元素的当前顺序颠倒过来,因此它既不

是进行升序排序,也不是进行降序排序,而是原始顺序的逆序排列。代码

5.20

列表的

reverse()方法特别要将列表的

reverse()方法和

sort()方法的

reverse参数区分开,二者没有必然的联系。5.2.5元素排序height=

[1532.7,2154.9,1864.8,3099.0,1612.1]print("原序:",height)height.reverse()print("逆序:",height)原序:

[1532.7,2154.9,1864.8,3099.0,1612.1]逆序:

[1612.1,3099.0,1864.8,2154.9,1532.7]代码

5.20

的运行结果如下。PART35.3元组元组是

Python

中另一个常用的组合数据类型,其很多用法与列表类似。元组的创建使用圆括号

tuple()函数,如代码

5.21所示。代码

5.21

认识元组代码使用圆括号定义了一个元组来保存一些山名。从代码可见元组的切片语法规则和列表完

全相同。但代码的最后一行却会报错,这是因为元组中的元素是无法修改的。这一点是元组区

别于列表的一个显著特征,可以简单地认为元组是“只读的列表”,因此元组的访问速度要优

于列表5.3.1认识元组mountains=

("武当山","龙虎山","青城山","终南山","五台山","峨眉山","普陀山","九华山")print("道教名山:",mountains[:4])print("佛教名山:",mountains[4:])mountains[0]=

"三清山"

#报错#TypeError:

'tuple'objectdoesnotsupportitem

assignment。元组既然也保存有一系列的数据,当然可以使用

for语句进行遍历,过程与列表一般无二,如代

5.22所示。代码

5.22

遍历元组river_provinces列表中有两个元素,每个元素又是一个列表,分别保存长江与黄河的流经省份。在收集流经省份时使用了临时列表

temp,收集完长江流经省份后,该列表被追加到

river_provinces列表中,成为

river_provinces列表的第

1个元素。

而后外层循环开始第

2轮循环,此时会有一个新的

temp空列表诞生,收集的黄河流经省份保存在这个新的

temp列表中,最后被追加到river_provinces列表中成为它的第

2个元素。5.3.2遍历元组rivers=

("长江","黄河")#元组river_provinces=

[]print("说出以下河流主干流经的省、自治区、直辖市,一次一个,输入

Q结束。")forr

in

rivers:

#遍历元组temp

=

[]p=

input(f"{r}:")whilep.upper()

!=

"Q":temp.append(p)p=

input(f"{r}:")river_provinces.append(temp)foriinrange(len(rivers)):

#遍历元组的另一种形式print(f"{rivers[i]}流经:{river_provinces[i]}")PART45.4字典字典也是一种组合数据类型,但其与列表、元组最大的不同在于,字典中的每一个元素都由两

部分构成,中间用冒号分隔,称为一个键值对。为了更好地理解键值对的概念,可以设想这样一个

问题:如何同时保存一系列名山的山名和海拔高度。如果使用列表或元组,大概类似代码

5.23

中的方式1

或方式

2。这两种方式都有使用上的不便,如用户想要输入山名来查询相应的海拔高度,方式

1和方式

2实现起来都不方便。此时字典的效用就凸显出来了。代码的第

3种方式使用了字典来

保存山名和对应的高度。使用花括号“{}”定义字典,字典中的每一个元素都由山名和高度两部分

构成,中间用冒号分隔,冒号左侧部分被称为键(Key),冒号右侧部分被称为值(Value)。一个元素即为一个键值对,代码中的字典共有

3个元素,长度为

3。5.4.1认识字典代码

5.23

认识字典代码中的方式

3无论用户输入的是

3

座山中的哪一个,最后的

print()都可以根据山名直接得到

对应的高度。这是使用字典的优点,字典可以根据键来访问相应的值。因此字典特别适合保存有映

射关系的数据,如这里的山名与相应的高度就具有映射关系。通过对比代码

5.23方式

2

中保存高度的列表和方式

3

中的字典可以看出,方式

2

的列表

height

保存了

3个高度值,但没有对应的山名信息(山名在另外一个列表中),访问列表

height

中的高

度值时需要使用索引序号。而从方式

3

的字典则能明确看出高度值与山名的对应关系,访问高度

值时使用对应的键也就是山名即可。因此字典的键可以看作是对列表的索引序号进行了扩展,让

索引序号有了明确的称谓。字典既然通过键来访问元素值,键即为元素的标识,一个字典中不允

许有重复的键,但值可以重复。例如,上面的字典中,山名不可重复,但如果两座山的高度相同

是没问题的。5.4.1认识字典#保存山名、高度,方式

1mountains_height=

["泰山",1532.7,"华山",2154.9,"黄山",1864.8]#保存山名、高度,方式

2mountains=

["泰山","华山","黄山"]height=

[1532.7,2154.9,1864.8]#保存山名、高度,方式

3mountains_height_dic=

{"泰山":1532.7,"华山":2154.9,"黄山":1864.8}m_name=input("泰山、华山、黄山选一个:")print(mountains_height_dic[m_name])与列表类似,字典也有很多常用的操作,掌握这些操作是使用字典必备的技能。1.通过键访问值字典是通过键来访问相应的值的,但如果提供了一个字典中不存在的键,则代码会报

KeyError

的错误。例如,在上面的代码

5.23

中,如果用户输入的山名在字典中不存在,那么最后的

print()就

会出问题。因此为了避免程序出错,可以使用

in操作符来判断一下,确保该键存在,如代码

5.24

所示。代码

5.24

通过键访问值这样无论用户查询的山名是否在字典中,程序都可以给出合理的回应,就不会崩溃了。5.4.2字典的常见操作mountains_height=

{"泰山":1532.7,"华山":2154.9,"黄山":1864.8}m_name=input("想知道哪座山的海拔?")ifm_nameinmountains_height:print(mountains_height[m_name])else:print(f"对不起,程序未收录{m_name}的海拔高度")只是如果每次读取字典中某个键的值时都需要用

if

语句进行判断,这样有些烦琐,字典提供了

get()方法来

解决这个问题。通过

get()方法读取一个键的值,如果要访问的键在字典中存在,则一切正常;如果

该键不存在,则程序不会报错崩溃,而是返回事先指定的值。下面看代码

5.25

的示范。代码

5.25

字典的

get()方法这段代码最关键的一句是使用get()方法来访问m_name这座山的高度值,如果m_name在

mountains_height字典中存在,则正常返回m_name对应的值。如果输入的

m_name不在字典当中,

get()方法会返回第二个参数指定的预设值,即

msg这个消息。这样程序无论在哪种情形下都不会

崩溃,同时代码又比较简洁。5.4.2字典的常见操作mountains_height=

{"泰山":1532.7,"华山":2154.9,"黄山":1864.8}m_name=input("想知道哪座山的海拔?")msg="对不起,程序未收录{}的海拔高度".format(m_name)result=mountains_height.get(m_name,msg)print(result)2.字典的遍历与列表、元组类似,字典中的元素同样可以使用

for语句进行遍历。但因为字典的元素是键值对,

所以遍历的花样多一些。第一种:遍历字典中的所有键,如代码

5.26所示。代码

5.26

遍历字典中的所有键这段代码构造了一个有关桥梁的字典,其中桥梁的类型作为字典的键,具体的桥梁作为字典的值。代码通过字典的keys()方法得到所有的键,然后使用

for语句

遍历所有键构成的序列。5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}forkey

inbridges.keys():print(key,bridges[key])梁桥湖北武汉长江大桥拱桥河北赵州桥斜拉桥上海南浦大桥悬索桥江苏五峰山长江大桥代码

5.26

的运行结果如下。遍历所有键是最常用的一种遍历字典的方法。因为键是字典中元素的标识,所以上面的代码

5.26

可以省去

keys(),直接在

for语句中写字典名即可,如代码

5.27所示。代码

5.27遍历字典中的所有键的简略写法为了使代码的运行结果更美观,使用字符串格式化对输出文字进行对齐。其中,键的部分宽度

3个字符,不足的填补全角空格,右对齐。代码中的

chr(12288)即为全角空格。代码

5.27

的运行

结果如下,对比上一段代码整齐了很多。5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}forkey

inbridges:print(f"{key:{chr(12288)}>3}:{bridges[key]}")梁桥:湖北武汉长江大桥拱桥:河北赵州桥斜拉桥:上海南浦大桥悬索桥:江苏五峰山长江大桥第二种:遍历字典中所有的值,如代码

5.28所示。

代码

5.28

遍历字典中所有的值代码使用字典的

values()方法获取所有的值,然后进行遍历,输出结果只有字典的值,也就是具

体的桥梁代表。5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}forbridgeinbridges.values():print(bridge)湖北武汉长江大桥河北赵州桥上海南浦大桥江苏五峰山长江大桥第三种:遍历所有的键值对,如代码

5.29所示。

代码

5.29

遍历字典的所有键值对这段代码使用字典的

items()方法得到所有的键值对,每个键值对就是一个元素,包含两部分。

从下面的运行结果可看出,键值对以元组的形式输出。上述代码中的每个元素都以一个元组的形式返回,如果不喜欢这种形式,则可以在

for语句循环

变量的位置书写两个变量名,一个为每个元素的键预备,另一个为每个元素的值预备。如代码

5.30

所示,这样就可以有不一样的运行结果。需要说明的是,for语句中的两个循环变量不一定命名为key

value,只要有描述意义就可以。5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}foritem

inbridges.items():print(item)('梁桥','湖北武汉长江大桥')('拱桥','河北赵州桥')('斜拉桥','上海南浦大桥')('悬索桥','江苏五峰山长江大桥')代码

5.30遍历字典的所有键值对(另一种写法)代码

5.30

的运行结果如下,已经没有元组的圆括号了。如果希望对齐或其他更灵活的展现形式,

则可以使用字符串格式化知识来实现。5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}forkey,valueinbridges.items():print(key,value)梁桥湖北武汉长江大桥拱桥河北赵州桥斜拉桥上海南浦大桥悬索桥江苏五峰山长江大桥3.修改已有元素与列表类似,字典中的数据是可以修改的。列表中的元素可以通过元素的索引序号来直接修改。

同样地,修改字典中的元素值时可以通过键来实现。别忘了,字典的键即对列表的索引序号的扩展。

下面的代码

5.31将字典中的“梁桥”对应的具体桥梁案例改成了江苏丹昆特大桥,它起自丹阳,途

径常州、无锡、苏州,终于昆山,全长超过

164千米。代码

5.31

修改字典已有的元素值5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}bridges["梁桥"]="江苏丹昆特大桥"print(bridges["梁桥"])

#输出江苏丹昆特大桥4.添加新元素向字典中添加元素的方法非常简单,只需通过赋值语句直接将新元素的值赋给新元素的键即可。

例如,有一种刚构桥,虽然外观和梁桥很像,但结构又有不同,一些桥梁专家将其单独列为一类。

代码

5.32想要在桥梁字典中添加刚构桥类型,一开始字典中只有

4个元素,通过赋值语句添加了一个“刚构桥”的桥梁案例,字典的长度变为

5。代码

5.32

向字典添加新元素5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}print(len(bridges))

#字典长度为4bridges["刚构桥"]="贵州赫章特大桥"print(len(bridges))

#字典长度为55.删除已有元素删除字典中已有元素的方法有多种,和列表很类似,对比着记忆效果会更好。首先,使用字典的

pop()方法来删除已有元素。列表的

pop()方法根据索引序号来删除元素,字

典的

pop()方法根据键来删除元素。其次,也可以使用

del()函数来删除已有元素。代码

5.33

开始时

的桥梁字典长度为

5,使用

pop()方法删除刚构桥后,字典的长度变为

4,再使用

del()函数删除拱桥

后,字典的长度为

3。另外,与列表一致的是,pop()方法有返回值,而

del()函数没有返回值。代码

5.33

删除字典中的已有元素5.4.2字典的常见操作bridges=

{"梁桥":"湖北武汉长江大桥","刚构桥":"贵州赫章特大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}poped_bridge=bridges.pop("刚构桥")print(poped_bridge)#贵州赫章特大桥print(len(bridges))#长度为

4del(bridges["拱桥"])print(len(bridges))#长度为3bridges=

{"梁桥":"湖北武汉长江大桥","刚构桥":"贵州赫章特大桥","拱桥":"河北赵州桥","斜拉桥":"上海南浦大桥","悬索桥":"江苏五峰山长江大桥"}bridges.clear()print(len(bridges))

#长度为0代码

5.34

清空字典中的元素调用了字典的

clear()方法之后,bridges

中现在有

0

个元素。PART55.5Python生态系统之jieba库因为

jieba

库是第三方库,所以安装Python

环境时是没有这个库的,需要额外单独安装。如果

使用的是

PyCharm

编程工具,那么启动

PyCharm

后在其界面下方图

5.2

所示的位置选择【Python

Packages】面板,然后在图中左上角的搜索框中输入jieba,就可以在下方的列表中看到jieba库了,

选择jieba库后单击图中右上角的【Installpackage】按钮即可开始安装,显示成功信息之后就可以如

标准库一样导入使用了。如果使用的不是

PyCharm,则可以在

Windows“开始”菜单的“运行”对话框中输入

cmd,然

后按

Enter键,在打开的命令行窗口中输入pipinstall

jieba,同样可以安装jieba库。5.5.1jieba库的安装马可·波罗在他闻名于世的游记中描述了中国的很多城市,这些城市即使是对来自西方美丽城

市威尼斯的马可

·波罗而言也好比天堂般的存在,游记让欧洲人对东方世界产生了强烈向往,甚至

对新航路的开辟都产生了重大影响。游记的第

2

卷着重描述了元朝时期的中国,下面就来对这部游

记的第

2卷进行词频分析,看看马可·波罗都写了什么。要进行词频分析,首先要将游记的文本进

行分词操作。本案例中《马可·波罗游记》的文本以一个

TXT文本文件提供,因此首先要将文本中的内容读

入内存,这可以使用

Python

的内置函数

open()来完成。有关

open()函数的内容将在第

7章中进行介

绍。读入文本文件后会得到一个长长的字符串,接下来的分词就是基于这个字符串完成的。代码

5.35

演示了整个流程。代码

5.35使用jieba库进行中文分词

5.5.2分词的基本操作import

jiebatxt_file=open("file\\马可

·波罗游记第

2卷.txt",encoding="utf-8")marco_txt=txt_file.read()print(marco_txt[:20])#查看原文的前

20个字words=jieba.lcut(marco_txt)

#分词print(words[:10])#查看分词结果的前

10个词代码

5.35

的运行结果如下,第一行为原文的前

20个字,第二行显示分词结果的前

10个词。方

括号意味着分词得到的是一个列表。简单分析上面的代码。使用

open()函数读入文件时要提供文件名,这里假设游记对应的

TXT文

件位于

file文件夹下,该文件夹与代码

5.35

的代码文件在同一目录位置。open()函数会返回一个文件

对象,调用该对象的

read()方法可将文本文件的内容读出,保存在变量

marco_txt

中。为了直观看到

效果,程序在这里输出游记的前

20个字。接下来是核心的分词工作。分词操作使用jieba库中的

lcut()

函数来完成。函数名中的

l表示

list,分词完成后返回的是一个列表,其中保存着分好的一个个词汇。

代码最后输出前

10个词,从结果可以看出,jieba库分词的结果还是很好的。5.5.2分词的基本操作第二卷忽必烈大汗和他的宫廷西南行程中各省['第二卷','忽必烈','大汗','和','他','的','宫廷','西南','行程','中']有了分词结果,接下来就可以做很多统计工作了,如词频统计,查看游记第

2

卷中哪些词的出现频率比较高。如何完成这个工作呢?还是按照

IPO建构法来进行分析。输入:jieba库分词后的列表。输出:某某词,多少次;某某词,多少次;这明显是映射效果,可以使用字典。处理:如何将输入的列表变为一个字典输出呢?列表中的词可以重复,而字典应该是一个词作

为一个键,该词在列表中重复的遍数作为对应的值。所以应该遍历列表,碰到一个词就去字典中给

这个词对应的次数加

1。代码

5.36实现了这个过程,这段代码和前面的代码

5.35是接着的,其中的

words变量就是分词

得到的列表。5.5.3词频统计代码

5.36

根据分词结果进行词频统计按照

IPO分析,代码首先对

words列表进行遍历,略过其中的单字词,只统计两个字以上的词汇。代码使用了字典的

get()方法巧妙地解决了第一次遇见某个词,但该词在字典中还未出现的情形。得到词频字典后为了更好地输出,代码将字典的所有键值对按照值的大小降序排列,最后输出前

10

个频度最高的词,结果如下。5.5.3词频统计word_freq=

{}#保存词频的字典forword

inwords:iflen(word)==

1:#忽略一个字的词continueelse:word_freq[word]=word_freq.get(word,0)+1#按词频降序排好word_freq_lst=list(word_freq.items())word_freq_lst.sort(key=lambdax:x[1],reverse=True)#输出前

10个高频词fori

in

range(10):print(f"{word_freq_lst[i][0]}

:

{word_freq_lst[i][1]}")他们:344一个:245大汗:218这里:152这个:128许多:121这些:117居民:116这种:114自己:100从结果可以看出,有很多价值不大的词出现在前面,如排在第一位的“他们”、排在第二位的

“一个”等。可以将这些价值不大的词从词频字典中去掉,这其实就是停用词(StopWords)处理。

代码

5.37在上述代码的基础上添加了去掉停用词的代码,见代码中的粗体部分。代码

5.37

去掉停用词后的词频统计5.5.3词频统计word_freq=

{}#保存词频的字典forword

inwords:iflen(word)==

1:#忽略一个字的词continueelse:word_freq[word]=word_freq.get(word,0)+1#停用词表stop_words=

("他们","一个","这里","这个","许多","这些","这种","其他","所以","可以","因为","

这样","自己","没有","所有","我们","如果","还有","并且","同样","一种","于是","一切","经过","必须")forstop_win

stop_words:del(wordfreq[stopw])

#删去停用词#按词频降序排好word_freq_lst=list(word_freq.items())word_freq_lst.sort(key=lambdax:x[1],reverse=True)#输出前

10个高频词fori

in

range(10):print(f"{word_freq_lst[i][0]}

:

{word_freq_lst[i][1]}")去掉停用词后输出的词频结果如下。排名前三的是“大汗”“居民”“城市”,而表示程度的

副词“十分”排在第四位。大汗:218居民:116城市:99十分:94地方:91军队:66各种:61美丽:49一样:47任何:46PART65.6小试牛刀本章介绍了几个高级的组合数据类型,有了它们后程序的编写将如虎添翼。很多靠单个数值变

量、字符串等不易解决的问题会变得迎刃而解。下面通过几个案例来小试牛刀一下。5.6.1随机分配办公室假设有

3

个办公室、8

位老师,要将老师们随机分配到办公室中,暂时不考虑办公室人数是否

平衡,应该如何实现呢?5.6.2

模拟婚介假设某婚介机构用代码

5.39

members所示的复合数据结构来保存会员信息,每个会员的信息

是一个字典,id、姓名、年龄、爱好为字典的键。其中,爱好有多个,因此对应的值是一个列表。

所有的会员信息放在一起又是一个大的列表——members。已知会员编号即id

为奇数的是男生,会

员编号为偶数的是女生。现在某会员输入想要查询的性别(奇数代表男生,偶数代表女生)和年龄

要求,程序可以在会员数据中寻找符合要求的会员,并将其个人信息输出。小试牛刀5.6.3

模拟抽奖假设某商场搞购物抽奖活动,设置有一等奖

1名,二等奖

2名,三等奖

4名,纪念奖若干。抽

奖规则如下:消费满

300元可以抽

1张奖券;满

500元可以抽

2张奖券;满

1000元可以抽

3张奖券。

先来先得,抽完为止。编写一段程序模拟有

10位顾客排队抽奖的过程,要求给出每位顾客抽奖的结果,如果顾客中了一等奖,要特别祝贺。如果奖券池中的奖券数量不足该顾客应抽的数量,则应给出抱歉说明。5.6.4谁是天际社交达人2022年

11月

30

日,随着神舟十五号

3名航天员顺利进驻中国空间站,两个航天员乘组共

6名航天员首次实现“太空会师”,中国空间站进入长期有人驻守阶段。在这漫长的岁月中,中国航天人脚踏实地,说到做到,一步一个脚印地将载人航天事业发展壮大,

成为世人瞩目的亮点。神舟飞船从无人到有人,从一人到三人。在这个过程中,一大批优秀的航天员脱颖而出。统计哪位航天员是天际社交达人,即一同飞天的队友最多。小试牛刀PART75.7拓展训练5.7.1文本的精确比对判断两段文本是否一模一样,是计算机很擅长的,只需判断这两段文本是否相等即可。当然,

英语有大小写之分,汉字也有繁简体之别。如果两篇英文文章内容相同只是大小写不一样,在人看

来应该是一样的。计算机处理只有大小写之别的英文文本也不难,字符串有upper()和

low()方法,可

以进行大小写转换。

5.7.2相似度与散点图要衡量文章

A和文章

B

的相似程度,判断两篇文章是风马牛不相及,还是说的同一个话题,甚

至是完全雷同,对于计算机来说并不是一件容易做到的事。如果有

3篇文章,文章A是和文章

B更

相似,还是和文章

C更相似呢?这些问题计算机之所以不好回答,是因为计算机面对的第一个难题是什么是相似。让机器理解文章的相似性5.7.3散点图的实现(1)只比较相同位置的字(2)比较所有的字(3)使用

n-gram

模型5.7.4

自然语言处理与人工智能判断两篇文章的相似性其实是一个自然语言处理的问题。让计算机理解人类语言还有很多工作

要做,这个研究领域被称为自然语言处理。Python在这个领域有一个有名的工具包——NLTK(Nature

LanguageToolKit)。自然语言处理是目前以机器学习、深度学习为代表的人工智能技术的一个主要的应用领域。让机器理解文章的相似性PART85.8本章小结本章重点讲解了列表与字典等组合数据类型,介绍了如何遍历它们,以及其内部元素的增、删、改、查等常用操作,并通过实际案例演练了这些知识的运用。在

Python生态系统环节介绍了著名的

中文分词库jieba。小结汇报人:WPSPython程序设计基础第六章函数目录01函数的定义和调用02函数的参数与返回值03函数的嵌套调用与变量的作用域04递归目录05Python生态系统之time库06小试牛刀07拓展实践:利用递归绘制分形图案08本章小结

理解函数的概念与意义。

掌握函数的定义与调用过程。

理解函数的参数与返回值。

理解变量的作用域。

理解递归思想。

了解

time库的使用。在前面的学习中已经接触了很多

Python

内置的函数,如print()、input()、len()等。这些函数在需

要时即可随时调用,为程序的编写带来很大的便利。但内置的函数毕竟数量有限,而且主要面向通

用问题。在解决具体的实际问题时,程序员能不能编制自己的函数,从而进一步利用函数的优势提

升程序的质量呢?答案当然是肯定的,本章就来介绍如何定义及使用函数。学习目标PART16.1函数的定义与调用在第

1章介绍

turtle库时,代码

1.8绘制了一个彩色的螺旋。现将代码

1.8

附在下方。当时这段

代码中的一些细节没有正式介绍,现在回过头来重读这段代码,对其中的所有细节,尤其是列表与

模运算的运用,应该都会比较清楚了。代码

1.8

绘制彩色螺旋在第

1

章时就提到,左转不同的度数代码会得到不同的图案。既然如此,可以将绘制图案的一般逻辑提取出来,编写为一段代码,但不限定左转度数,而是等到后期具体绘制时再指定度数,根据指定的度数不同,同一段代码可以绘制出不同的图案。6.1.1函数定义importturtlet=turtle.Turtle()t.speed(0)

#速度设为最快colors=

["red","yellow","green"]

#这是一个颜色盒forxin

range(20,100):#循环t.pencolor(colors[x%3])

#在

3个颜色中挑一个t.circle(x)

#以

x

为半径画个圆t.left(10)

#左转

10°t.getscreen().exitonclick()这段代表绘制逻辑的代码就是一个函数,

如代码

6.1所示。代码

6.1

函数的定义。上述代码中使用

def关键字定义了一个函数,名称为

draw_circles(t,degree),括号内的两个变量

是函数的参数。参数为函数工作提供了必要的数据,如这里的函数draw_circles()要想工作的话,就必须提供一个绘图的小海龟,以及绘制过程中左转的度数两个信息。有了这两个信息,函数内部的代码就可以完成绘制工作了。6.1.1函数定义importturtle#定义函数defdraw_circles(t,degree):

#括号内为参数:t

为小海龟,degree

为左转度数colors=

["red","yellow","green"]forxin

range(20,100):t.pencolor(colors[x%3])

#在

3个颜色中挑一个t.circle(x)t.left(degree)

#左转相应的度数artist=turtle.Turtle()artist.speed(0)#通过函数名调用函数draw_circles(t=artist,degree=120)#draw_circles(artist,130)

#简略写法artist.getscreen().exitonclick()那么什么时候为函数提供这些参数的值呢?答案是调用的时候。代码

6.1在创建了一个具体的小海龟后,通过函数名调用

draw_circles()函数,并为两个参数提供了值。在

参数传值时可以明确指明参数与值的对应关系,也可以如代码中注释所示的简略写法一样,通过位

置来表明参数与值的对应关系。下面总结一下函数的使用流程。在Python

中,函数要先定义后调用。函数的定义使用

def

关键字

来完成,def

之后是函数名,后续调用函数时就通过这个名称来完成。函数名之后是括号,其内可以有

参数,但参数不是必需的,不是所有的函数都需要参数,如random()函数。def

所在行的行尾要有冒号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论