第1关:元组的使用:这份菜单能修改吗?
任务描述
元组看起来犹如列表,但元组使用圆括号()
而不是[]
来标识,而且列表的元素可以修改,但元组的元素不能修改。本关介绍元组的常见使用方法以及元组和列表的使用区别。下面用饭店菜单的例子来说明列表和元组使用的应用场景:
现在有一个餐馆要向每个包厢都投放两份菜单,菜单上有4种菜名。我们想将两个菜单上最后一道菜名互换一下,也想快速知道改变后的两份菜单上单词首字母最大的菜名。而我们首先需要判断该用列表的方法还是元组的方法实现这个目标。为了实现这个目标,我们需要先学习元组的相关使用知识以及元组与列表的区别。
相关知识
元组与列表
元组与列表很相似,两者之间的差别在于:
- 列表在初始化后其中的元素还可以进行增删改等操作,但是元组在初始化后其中的元素不能进行更改;
- 列表在赋值时使用方括号
[]
,而元组在赋值时使用小括号()
。
因为元组具有不可变的特性,所以在能用元组替代列表的地方最好都使用元组,这样代码更安全。
创建元组
元组创建很简单,只需要在括号()
中添加元素,元素之间用逗号隔开。元组中只包含单个元素时,需要在该元素后面添加逗号。例如:
menu1 = ('meat','fish','chicken')
menu2 = ('meat',)
访问元组
元组和列表一样,可以使用下标索引来访问元组中的值。例如:
menu = ('meat','fish','chicken','carrot')
print(menu[0])
print(menu[1:3])
输出结果:
meat('fish', 'chicken')
修改元组
元组中的元素值是不可以修改的,如果强行修改会报错。例如我们想修改元组menu
中的某个值:
menu = ('meat','fish','chicken','carrot')
menu[0] = 'pizza'
print(menu[0])
输出结果:
TypeError: 'tuple' object does not support item assignment
系统会自动报错,元组中的元素值不支持修改。
元组内置函数
元组和列表一样,都有一些内置函数方便编程。例如:
len(tuple)
:计算元组中元素个数;max(tuple)
:返回元组中元素的最大值;min(tuple)
:返回元组中元素的最小值;tuple(seq)
:将列表转换为元组。
元组中的元素是不能改变的,它也没有append()
、insert()
这样的方法,但其他获取元素的方法和列表是一样的。
编程要求
本关的编程任务是补全src/Step1/menu_test.py
文件的代码内容,实现如下功能:
- 将输入的菜单
menu_list
转换为元组类型; - 打印输出生成的元组;
- 打印输出元组中首字母最大的元素。
本关涉及的代码文件src/Step1/menu_test.py
的代码框架如下:
# coding=utf-8# 创建并初始化munu_list列表menu_list = []while True: try: food = input() menu_list.append(food) except: break# 请在此添加代码,对menu_list进行元组转换以及元组计算等操作,并打印输出元组及元组最大的元素########## Begin #################### End ##########
测试说明
本关的测试文件是src/Step1/menu_test.py
,测试过程如下:
- 平台自动编译并运行
menu_test.py
,并以标准输入方式提供测评输入; - 平台获取程序的输出,然后将其与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/Step1/menu_test.py
的样例测试集:
测试输入:
pizzachickencarrotturkeybanana
预期输出:
('pizza', 'chicken', 'carrot', 'turkey', 'banana')turkey
参考答案
# coding=utf-8
# 创建并初始化menu_list列表
menu_list = []
while True:
try:
food = input()
menu_list.append(food)
except:
break
# 请在此添加代码,对menu_list进行元组转换以及元组计算等操作,并打印输出元组及元组最大的元素
###### Begin ######
menu_tuple = tuple(menu_list)
print(menu_tuple)
print(max(menu_tuple))
####### End #######
第2关:字典的使用:这份菜单可以修改
任务描述
字典和列表一样,都是 Python 中十分重要的可变容器模型,都可以存储任意类型元素。我们将以菜单的例子来说明字典使用的基本知识,餐馆的菜单上不仅包含菜名,菜名后面还必须包含该道菜的价格。如果要用列表实现,就需要两个列表,例如:
list_menu = ['fish','pork','potato','noodles']
list_price = [40,30,15,10]
给定一个菜名,要查找相应的价格,就先要在list_menu
中找到相应的位置,再在list_price
中找到相应的价格。这种方式效率低下,那么我们是否可以将菜名和价格都存储在一个可变容器中呢?答案是可以的。
在本关中,我们将学习和掌握能够将相关信息关联起来的 Python 字典的相关知识,并完成对包含菜名和价格的菜单的处理操作。
相关知识
字典是 Python 最强大的数据类型之一,通过键-值对的方式建立数据对象之间的映射关系。字典的每个键-值对用冒号:
分割,每个键-值对间用逗号,
分隔开,字典则包含在{}
中。列表格式如下:
d = {'key1' : value1, 'key2' : value2 }
每个键都与一个值相关联,我们可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何 Python 对象用作字典中的值。
访问字典中的值
要获取与键相关联的值,可依次指定字典名和放在方括号内的键,如下所示:
# 创建并初始化menu字典
menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10}
# 获取并返回menu字典中键'fish'键对应的值
print(menu['fish'])
输出结果:
40
添加键-值对
字典是一种动态数据结构,可随时在字典中添加键-值对。要添加键-值对时,可依次指定字典名、键和键对应的值。下面在字典menu
中添加两道菜的菜名和价格:
# 创建并初始化menu字典
menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10}
# 向menu字典中添加菜名和价格
menu['juice'] = 12
menu['egg'] = 5
# 输出新的menu
print(menu)
输出结果:
{'fish': 40,'pork': 30,'potato': 15,'noodles': 10, 'juice': 12,'egg': 5}
新的menu
字典包含6个键-值对,新增加的两个键-值对(菜名和对应价格)添加在了原有键-值对的后面。
注意:字典中键-值对的排列顺序和添加顺序没有必然联系。Python 不关心字典中键-值对的排列顺序,而只关心键与值的对应关系。 同理,字典和列表一样,可以先创建一个空字典,然后可以不断向里面添加新的键-值对。
修改字典中的值
字典和列表一样,里面的值都是可以修改的。要修改字典中的值,可直接指定字典中的键所对应的新值。例如,将menu
中的fish
价格改为50
:
# 创建并初始化menu字典
menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10}
# 修改menu字典中菜fish的价格
menu['fish'] = 50
# 打印输出新的menu
print(menu)
输出结果:
{'fish': 50, 'pork': 30, 'potato': 15, 'noodles': 10}
删除键-值对
我们可以通过del
方法删除字典中不需要的键-值对。使用del
方法时,要指定字典名和要删除的键。例如,在menu
菜单中删除键noodles
和它的值:
# 创建并初始化menu字典
menu = {'fish':40, 'pork':30, 'potato':15, 'noodles':10}
# 删除noodles键值对
del menu['noodles']
# 打印输出新的menu
print(menu)
输出结果:
{'fish': 40, 'pork': 30, 'potato': 15}
如果您想了解更多有关字典使用的知识,请参考:【美】 Eric Matthes 著《 Python 编程——从入门到实践》
第六章。
编程要求
本关的编程任务是补全src/Step2/menu.py
文件的代码,实现相应的功能。具体要求如下:
- 向
menu_dict
字典中添加一道菜名lamb
,它的价格是50
; - 获取
menu_dict
字典中的fish
的价格并打印出来; - 将
menu_dict
字典中的fish
的价格改为100
; - 删除
menu_dict
字典中noodles
这道菜; - 输出新的
menu_dict
菜单。
本关涉及的代码文件src/Step2/menu.py
的代码框架如下:
# coding=utf-8
# 创建并初始化munu_dict字典
menu_dict = {}
while True:
try:
food = input()
price = int(input())
menu_dict[food]= price
except:
break
# 请在此添加代码,实现对menu_dict的添加、查找、修改等操作,并打印输出相应的值
########## Begin #########
########### End ##########
测试说明
本关的测试文件是src/Step2/menu.py
,测试过程如下:
- 平台自动编译并运行
menu.py
,并以标准输入方式提供测试输入; - 平台获取程序输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/Step2/menu.py
的样例测试集:
测试输入:
pizza
40
noodles
30
carrot
20
turkey
34
fish
37
预期输出:
37
{'pizza': 40, 'carrot': 20, 'turkey': 34, 'fish': 100, 'lamb': 50}
参考答案
# coding=utf-8
# 创建并初始化menu_dict字典
menu_dict = {}
while True:
try:
food = input()
price = int(input())
menu_dict[food]= price
except:
break
# 请在此添加代码,实现对menu_dict的添加、查找、修改等操作,并打印输出相应的值
########## Begin ##########
menu_dict['lamb'] = 50
print(menu_dict['fish'])
menu_dict['fish'] = 100
del menu_dict['noodles']
print(menu_dict)
########## End ##########