Python二级考试中的最后一题一般是压轴题,有一定的难度,而且分值也高。此题一般分为1~3个问题,步步为赢,才能更好地解决。遇到这种问题,首先是不要怕,能解决几步是几步。今天我们一个通讯录管理题来说明一下:
一、题干
使用字典和列表完成学生通讯录管理,名单由文件 address.txt 给出,每行是一个学生的信息。示例如下:
学号,姓名,电话号码,地址
101,aa,12345678,Beijing
102,bb,23456781,shanghai
...(略)
问题1:修改P301-1.py,在屏幕上显示功能菜单,功能菜单示例如下:
1. 显示所有信息
2. 追加信息
3. 删除信息
请输入数字 1-3 选择功能:
请输入数字 1-3 选择功能(要求:不允许浮点数输入):接收用户输入数字选择功能,如果输入错误,要求用户重新输入。如果输入正确,在屏幕上显示提示语句:您选择了功能1/2/3
。(5分)
问题2:修改P301-2.py,在问题1的代码基础上,当用户选择1的时候,从通讯录文件读取信息,并显示所有信息。(5分) 示例如下:
1. 显示所有信息
2. 追加信息
3. 删除信息
请输入数字1-3选择功能:1
101,aa,12345678,Beijing
102,bb,23456781,shanghai
...(略)
问题3:修改P301-3.py ,在问题2的代码基础上,当用户选择2的时候,让用户从键盘输入一个学生的信息,用逗号隔开。将信息写入文件 new_address.txt 中,文件格式与 address.txt 相同。(10分) new_address.txt 内容示例如下:
101,aa,12345678,Beijing
102,bb,23456781,shanghai
103,cc,34567,tianj
示例1:
输入: "1"
"1"
"2"
"103,cc,34567,tianj"
输出: 内容输出到 new_address.txt 文件中
二、解决步骤
1. 问题一的解决
样例:
menu=["1. 显示所有信息","2. 追加信息","3. 删除信息"]
...
ch = int(input("请输入数字1-3选择功能:") )
...
print("您选择了功能", ch)
解决:用flag定义一个开关,其数值为1时表示开,0表示关。
menu = ["1.显示所有信息","2.追加信息","3.删除信息"]
flag = 1
while flag:
for m in menu:
print(m)
try:
num = int(input("请输入数字1-3选择功能:")) #将获取的字符型数字转化为数字
if num ==1:
flag = 0
except:
flag = 1
if num<1 or num >3:
flag = 1
以上通过while来进行循环,指定flag为1时程序不断循环,flag为0时,程序停止运行。用try...except捕获异常,通过if来判断num的大小。
2. 问题二的解决
在问题一的基础上,增加了一个打印所有通讯录的功能。我们可以定义一个名为display的函数,当输入1时就调用这个函数。注意要把函数写在while循环的前面,否则无法调用。
def display():
with open("address.txt",'r',encoding='utf-8') as f:
for fi in f:
print(fi,end="")
原代码:
def display():
fi = open("address.txt", 'r')
for line in fi:
print(line,end="")
fi.close()
menu = ["1. 显示所有信息", "2. 追加信息", "3. 删除信息"]
flag = 1
while flag:
for m in menu:
print(m)
flag = 0
try:
print("请输入数字1-3选择功能:")
ch = int(input())
flag = 0
except:
flag = 1
if flag <1 or flag >3:
flag = 1
elif ch == 1:
display ()
官方给出的代码中,最后的if判断写在了while循环的外面,但经过测试应该写在里面,如下面图所示:
3. 问题三的解决
我们还需要另外定义一个插入函数,接受屏幕输入的字符后用append追加到列表中,再用for循环写入到new_address.txt中。
def display():
fi = open("address.txt", 'r')
for line in fi:
print(line,end="")
fi.close()
def insertrec(text):
with open("address.txt",'r',encoding='utf-8') as file:
newline = file.readlines()
newline.append(text+"\n")
with open("new_address.txt","w+",encoding='utf-8') as newfile:
for line in newline:
newfile.write(line)
menu = ["1. 显示所有信息", "2. 追加信息", "3. 删除信息"]
flag = 1
while flag:
for m in menu:
print(m)
flag = 0
try:
print("请输入数字1-3选择功能:")
ch = int(input())
flag = 0
except:
flag = 1
if flag <1 or flag >3:
flag = 1
elif ch == 1:
display ()
elif ch == 2:
insertrec()
以上代码中采用的是我自己编写的代码,下面是官方的代码:
def insertrec():
fi = open("address.txt",'r')
fo = open("new_address.txt",'w')
la=[]
for l in fi:
la.append(l.replace('\n',''))
print("请输入要插入的信息,以逗号隔开,示例:103, cc, 34567812, tianjing:")
rec = input()
la.append(rec)
for l in la:
fo.write(l)
fo.write('\n')
fi.close()
fo.close()
官方代码中fo写入的方式应该是用w+,如果是w,则如果文件不存在就会报错。 la.append(l.replace('\n',''))这一步看似没有什么用。我只用在append时加入一个【\n】,再用write直接写入就可以了,本身就自带了换行,就不用再折腾了。
三、学后反思
- 官方给出的解法要深刻理解其原理,在理解的基础上可以进一步优化和改进算法。
- 对于\n的处理可以有多种方法,如str.strip()可以去掉换行,用print(string,end="\n")添加换行等等。