目录

  • 1 前言
    • 1.1  Python解释器安装
    • 1.2  PyCharm开发环境
  • 2 Python程序设计实验
    • 2.1  实验1 基本输入输出
    • 2.2  实验2 基本运算
    • 2.3  实验3 字符串处理
    • 2.4  实验4 列表与元组应用
    • 2.5  实验5 列表与元组应用
    • 2.6  实验6 字典与集合应用
    • 2.7  实验7 函数应用1
    • 2.8  实验8 函数应用2
    • 2.9  实验9 类的创建与应用
    • 2.10  实验10 模块应用
    • 2.11  实验11 文件操作
    • 2.12  实验12 异常处理
    • 2.13  实验13 使用正则表达式
    • 2.14  实验14 tkinter基础应用
  • 3 学习参考
    • 3.1  1 Python及其IDLE环境
    • 3.2  2 Python代码规范
    • 3.3  3 使用变量
    • 3.4  4 输入输出
    • 3.5  5 运算符
    • 3.6  6 字符串
    • 3.7  7 条件语句
    • 3.8  8 循环语句
    • 3.9  9 列表
    • 3.10  10 元组
    • 3.11  11 字典
    • 3.12  12 集合
    • 3.13  13 自定义函数
    • 3.14  14 内置函数
    • 3.15  15 类的创建和使用
    • 3.16  16 类的继承与多态
    • 3.17  17 time模块
    • 3.18  18 os模块
    • 3.19  19 random模块
    • 3.20  20 文件
    • 3.21  21 错误与异常处理
 实验6 字典与集合应用

     字典(dict)的每个键值对(key->value)用冒号(:)分隔,每个对之间用逗号(,)分隔,整个字典包括在花括号{ }中。

       { 键1:值1, 键2:值2, 键3:值3 ... }

    集合(set)是一个无序的不重复元素序列。集合基本功能是进行成员关系测试和删除重复元素。

    可以使用大括号 { } 或 set( ) 函数创建集合。需要注意的是:创建一个空集合必须用 set( ) 而不是 { },因为 { } 是用来创建一个空字典。


任务1:单词匹配

    利用下面给出的字典week编写程序s6A.py。要求:

week={'m': 'Monday','tu': 'Tuesday','w': 'Wensday','th': 'Thursday',

      'f': 'Friday','sa': 'Saturday', 'su': 'Sunday'}

1、输入字典的键(不区分大小写),输出键对应的单词。

2、如果输入的键不存在,则显示“ERROR”

3、一轮输入后,询问是否继续

(1)输入y(或Y)继续下一轮输入输出

(2)输入其他退出。

4、程序运行效果:

输入键:M

输出:Monday

"""

(1)通过“键”访问字典(教材P57-59)

    字典中各个元素并没有顺序之分,不需要通过位置查找元素。存储元素时进行了优化,使字典的存储和查询效率极高。

    通过“键”访问字典,应该将相应的键放到字典名称后面的中括号[ ]里。

>>>week={'m': 'Monday','tu': 'Tuesday','w': 'Wensday'}

>>>week['tu']

   'Tuesday'

>>>week['Tu']

   KeyError: 'Tu'   #错误,键'Tu'不存在。

   为了避免引起KeyError异常,访问字典元素时可以先使用in与not in检测某个键是否存在。

    s="tu"

    if s in week:    #判断键s是否存在于字典week中

        print(week[s])

    else:

        print('ERROR')

    或:

    if s in week.keys( ):  #判断键s是否存在于字典week的所有键中

        print(week[s])

    else:

        print('ERROR')

(2)while循环

    处理重复的相同任务,一般采用循环结构。以教材P43猜数游戏为例:

import random    #导入random模块

print("输入一个1-10以内的数字")

computer= random.randint(1, 10)  #生成【1,10】间随机整数

#print(computer)

n=0

while n<3:      #①

    guess = input("请输入一个数字:")

    if computer == int(guess):    #猜数与随机数相同

        print("恭喜你,猜对了!" )

    else:

        print("很遗憾,猜错了!")

    n+=1

    s=input('是否继续?(y-继续,其他退出)')

    if s!="y":   #② 

        break

    程序中共有两处地方可以退出循环。

    ① 尝试3次后,n=3,循环条件不成立,自动退出循环。

    ② 是否继续?选择其他字符后,通过break,强制退出循环。

    根据题目要求,只有选择“是否继续”后,才能退出!

    可以将尝试次数n调大;或者采用 (while True:)/(while 1:)结构,构成无限循环,通过判断“是否继续?”退出循环。这种方法,在后面的错误和异常处理中,经常采用。

(3)upper( ) 、lower( )、capitalize( )、title( )方法

    upper( ):将字符串中字母,小写转换为大写

    lower( ):将字符串中字母,大写转换为小写

    capitalize( ):将字符串中字母,首字母转换为大写,其余小写

    title( ):将字符串中字母,每个单词的首字母转换为大写,其余小写 

>>>a = "monday"

>>>a.upper( )

   'MONDAY'

>>>b="Tuesday"

>>>b.lower( )

   'tuesday'

    注意,和教材P24其他字符串方法类似,原有字符串的内容,本身并没有发生变化。

>>>a     #a的内容,仍然是原来的'monday'

   'monday'

>>>c=a.upper( )

>>>c    #变量c和a.upper( ) 的值,都是 'MONDAY'

   'MONDAY'


任务2:数值提取

1、调试以下代码,并删除全部注释后保存到s6B.py。

s=input("输入包含数字和空格的字符串:")

a=s.split( )  #用空格分割字符串

a=[x for x in a if x.isnumeric( )]  #从列表a中筛选出数字串

a=set(a)  #转换为集合,目的:避免元素重复

a=sorted(a,key=int)  #对集合元素(数字串)按int函数值递增排序

s=" ".join(a)  #将列表a的元素用空格连接成字符串

print(s)

2、按以下要求修改代码,并保存到s6C.py。

(1)提取输入的全部数值(正整数),忽略其他非数字字符。

(2)将提取的数值递增输出(数值不重复)

(3)程序运行效果:

输入:a7d8 11 b15C8 6 3 9 da 6

输出:3 6 7 8 9 11 15


"""

(1)is前缀的方法

isnumeric( ):字符串是否由数字字符组成。

isdigit( ):字符串是否由数字字符组成。

isdecimal( ):字符串是否由十进制字符组成。

    这三者区别在于,isnumeric( )针对的是Unicode对象,即Unicode数字、全角数字、罗马数字和汉字数字。

>>>a="1234"

   a.isnumeric( )、a.isdigit( )和a.isdecimal( ),三者结果均为True。 

>>>a="12三Ⅳ伍"

   只有a.isnumeric( )结果为True,其余二者为False。

islower( ):是否由小写字母组成。

isupper( ):是否由大写字母组成。

isspace( ):是否由空白字符组成。

isalnum( ):是否由字母和数字组成。

isalpha( ):是否由字母组成

isinstance( ):判断一个对象是否是一个已知的类型,类似 type( )。

>>> a = 4

>>> isinstance (a,int)

    True

>>> isinstance (a,str)

    False


(2)字符串的遍历

方法①,使用for in遍历字符串。

s="a7d8 11 b15C8"

t=""

for ch in s:

   if ch.isdigit( ):

       t+=ch

print(t)

#输出:"7811158"     #删除非数字字符

方法②,使用range( )遍历字符串。

s="a7d8 11 b15C8"

t=""

for i in range(len(s)):

   if s[i] in "0123456789":

       continue

   t+=s[i]

print(t)

#输出:"ad  bC"     #删除数字字符

方法①和方法②结合,应该知道实验4中S4E.py,如何将for循环,修改为while循环了!!

m=input("输入一个大于1的正整数:")

i=0

while i<len(m):

    if m[i] not in "0123456789":

        break

    i+=1

    列表和元组的遍历,方法和字符串是一样的。

    字典的遍历,用前面讲的:for s in week:  或 for s in week.keys( ): ,就可以了。


(3)s6B.py和s6C.py输入输出比较:

s6B.py:

输入:"a7d8 11 b15C8 6 3 9 da 6"

输出:3 6 9 11

    ① 递增输出;

    ② 重复的6删除了;

    ③“a7d8”和“b15C8”中夹杂的数字没有了。

s6C.py:

输入:"a7d8 11 b15C8 6 3 9 da 6"

输出:3 6 7 8 9 11 15


附加练习:

现有一个字典存放学生姓名和三门课程成绩:

    s={"张三":[67,88,45],"李四":[97,68,85],"王五":[98,97,95],"赵六":[67,48,45]}

编程计算每个学生的平均成绩和自己三科中的最高分。

程序输出结果:

张三,平均分:66.7,最高分:88

李四,平均分:83.3,最高分:97

王五,平均分:96.7,最高分:98

赵六,平均分:53.3,最高分:67