Python知识点串连(三)

在软件开发的过程中,程序在运行过程中会出现异常,我们可以使用异常处理的功能让成绩单程序更加健壮,而不至于轻易就终止程序。   

6,python 异常与注释

我们会重点监控并测试用户输入的内容,即使用户输错了内容,程序也会做出相应的提示,而不会结束。例如,用户选择功能如果不是数字,那么会提示输入错误。而输入语文成绩时,我们会对 float(input("请输入语文成绩:")) 这条语句加上异常判断,如果出现异常,那么表示输入的不是数字,会给出相应的提示,而不是让程序直接报错并终止。

另外,我们还为程序加上了注释,让程序变得更容易阅读和理解。在程序开始处,通过注释说明了程序的作者、完成日期等信息。而程序内部的注释,让程序更易于理解。完整代码如下所示。
"""
程序:成绩单V
作者:李强

编写日期:2019年7月1日
"""
studentList=[]  #记录学生信息的列表
while True:
    #显示功能列表,提示用户如何选择功能
    print("-"*30)
    print(" 学生成绩系统 ")
    print(" 1.添加学生的信息")
    print(" 2.删除学生的信息")
    print(" 3.修改学生的信息")
    print(" 4.查询学生的信息")
    print(" 5.列出所有学生的信息")
    print(" 6.退出系统")
    print("-"*30)

    try:
        key = int(input("请选择功能(输入序号1到6):"))
    except:  #如果出现异常,跳出本次循环,不再执行后面的代码
        print("您的输入有误,请输入序号1到6")
        continue

    if key == 1:  #添加学生信息
        print("您选择了添加学生信息功能")
        name = input("请输入姓名:")
        stuId = input("请输入学号(不可重复):")

        hasRecord = False
        for temp in studentList:
            if temp["ID"] == stuId: 
                hasRecord = True
                break   
        if hasRecord == True: 
            print("输入学号重复,添加失败!")
            continue
        else:           
            student = {}
            student["name"] = name
            student["ID"] = stuId

            try:
                score1=float(input("请输入语文成绩:"))
            except:
                print ("输入的不是数字,添加失败!")
                continue           
            if score1 <= 100 and score1 >= 0 :
                student["score1"]=score1
            else:
                print ("输入的语文成绩有错误,添加失败!")
                continue  

            try:
                score2=float(input("请输入数学成绩:"))
            except:
                print ("输入的不是数字,添加失败!")
                continue         
            if score2 <= 100 and score2 >= 0 :
                student["score2"]=score2
            else:
                print ("输入的数学成绩有误,添加失败!")
                continue

            try:
                score3=float(input("请输入英语成绩:"))
            except:
                print ("输入的不是数字,添加失败!")
                continue   
            if score3 <= 100 and score3 >= 0 :
                student["score3"]=score3
            else:
                print ("输入的英语成绩有误,添加失败!")
                continue

            student["total"]=student["score1"] + student["score2"] + student ["score3"]

            studentList.append(student)
            print (student["name"]+"的成绩录入成功!")
    elif key == 2: #删除学生信息
        print("您选择了删除学生信息功能")
        stuId=input("请输入要删除的学号:")

        i = 0
        hasRecord = False
        for temp in studentList:
           if temp["ID"] == stuId:
                hasRecord = True
                break
           else:
               i=i+1
        if hasRecord == True:
            del studentList[i]
            print("删除成功!")           
        else:
            print("没有此学生学号,删除失败!")
    elif key == 3: #修改学生信息
        print("您选择了修改学生信息功能")
        stuId=input("请输入你要修改学生的学号:")      

        hasRecord = False
        for temp in studentList:
            if temp["ID"] == stuId:
                hasRecord = True
                break

        if hasRecord == False:
            print("没有此学号,修改失败!")
        else:
            while True:
                try:
                    alterNum=int(input(" 1.修改姓名\n  2.修改学号 \n 3.修改语文成绩 \n 4.修改数学成绩 \n 5.修改英语成绩 \n 6.退出修改\n"))
                except:
                    print ("输入有误,请输入编号1到6")
                    continue

                if alterNum == 1:
                    newName=input("请输入更改后的姓名:")
                    temp["name"] = newName
                    print("姓名修改成功")
                    break
                elif alterNum == 2:
                    newId=input("请输入更改后的学号:")  
                    hasSameID = False
                    for temp1 in studentList:
                        if temp1["ID"] == newId:
                            hasSameID = True
                            break
                    if hasSameID == True:
                        print("输入学号不可重复,修改失败!")
                    else:
                        temp["ID"]=newId
                        print("学号修改成功")   
                    break
                elif alterNum == 3:
                    try:
                        score1=float(input("请输入更改后的语文成绩:"))
                    except:
                        print ("输入的不是数字,修改失败!")
                        break                   
                    if score1 <= 100 and score1 >= 0 :
                        temp["score1"]=score1
                        temp["total"]=temp["score1"] + temp["score2"] + temp ["score3"]
                        print ("语文成绩修改成功!")
                    else:
                        print ("输入的语文成绩有错误,修改失败!")
                    break         
                elif alterNum == 4:              
                    try:                            
                        score2=float(input("请输入更改后的数学成绩:"))
                    except:
                        print ("输入的不是数字,修改失败!")
                        break                          
                    if score2 <= 100 and score2 >= 0 :
                        temp["score2"]=score2
                        temp["total"]=temp["score1"] + temp["score2"] + temp ["score3"]
                        print ("数学成绩修改成功!")
                    else:
                        print ("输入的数学成绩有错误,修改失败!")   
                    break               
                elif alterNum == 5:                
                    try:                            
                        score3=float(input("请输入更改后的英语成绩:"))
                    except:
                        print ("输入的不是数字,修改失败!")
                        break                          
                    if score3 <= 100 and score3 >= 0 :
                        temp["score3"]=score3
                        temp["total"]=temp["score1"] + temp["score2"] + temp ["score3"]
                        print ("英语成绩修改成功!")
                    else:
                        print ("输入的英语成绩有错误,修改失败!")
                    break
                elif alterNum == 6:
                    break
                else:
                    print("输入错误请重新输入")
    elif key == 4: #查询某位学生信息
        print("您选择了查询学生信息功能")
        stuId=input("请输入你要查询学生的学号:")

        hasRecord = False
        for temp in studentList:
            if temp["ID"] == stuId:
                hasRecord = True
                break
        if hasRecord == False:
            print("没有此学生学号,查询失败!")
        else:           
            print ("学号\t姓名\t语文\t数学\t英语\t总分")
            print(temp["ID"],"\t",temp["name"],"\t",temp["score1"],"\t",temp ["score2"],"\t", temp["score3"],"\t",temp["total"])

    elif key == 5: #打印出所有学生的信息            
        print("接下来进行遍历所有的学生信息......")
        print("学号\t姓名\t语文\t数学\t英语\t总分")
        for temp in studentList:
            print(temp["ID"],"\t",temp["name"],"\t",temp["score1"],"\t",temp ["score2"],"\t", temp["score3"],"\t",temp["total"])

    elif key == 6: #选择退出系统      
        quitConfirm = input("确认要退出系统吗 (Y或者N)?")
        if quitConfirm.upper()=="Y":
            print("欢迎使用本系统,谢谢")
            break

    else:  #没有正确输入编号
        print("您输入有误,请重新输入")

7,Python 自定义函数

通过之前学过的自定义函数,我们来进一步改进成绩单程序,完整代码如下所示。
"""
程序:成绩单VI
作者:李强
编写日期:2019年7月2日
"""
#判断成绩列表中是否已经包含了学号,sList表示成绩列表,sID表示学号
def hasRecord(sList,sID):
    result=-1
    i = 0 
    for temp in sList:
       if temp["ID"] == sID:
            result=i
            break
       else:
           i=i+1
    return result

#判断输入成绩是否有效,subject表示科目,action表示进行操作
def getScore(subject,action):

    try:
        score=float(input("请输入"+subject+"成绩:"))           
    except:
        print ("输入的不是数字,"+action+"失败!")
        return -1                       

    if score <= 100 and score >= 0 :
        return score
    else:
        print ("输入的"+subject+"成绩有错误,"+action+"失败!")
        return -1
   
#显示功能列表,提示用户如何选择功能
def showInfo():
    print("-"*30)
    print(" 学生成绩系统 ")
    print(" 1.添加学生的信息")
    print(" 2.删除学生的信息")
    print(" 3.修改学生的信息")
    print(" 4.查询学生的信息")
    print(" 5.列出所有学生的信息")
    print(" 6.退出系统")
    print(" 7.排序")
    print("-"*30)

def updateStudent(student):
    while True:
        try:
            alterNum=int(input(" 1.修改姓名\n 2.修改学号 \n 3.修改语文成绩 \n 4.修改数学成绩 \n 5.修改英语成绩 \n 6.退出修改\n 7.排序\n"))
        except:
            print ("输入有误,请输入编号1到7")                   
            continue
        if alterNum == 1: #修改姓名
            newName=input("输入更改后的姓名:")
            student["name"] = newName
            print("姓名修改成功")
            break
        elif alterNum == 2: #修改学号
            newId=input("输入更改后的学号:")              
            newIndex=hasRecord(studentList,newId)
            if newIndex>-1:
                print("输入学号不可重复,修改失败!")
            else:                       
                student["ID"]=newId
                print("学号修改成功")
            break
        elif alterNum == 3: #修改语文成绩
            score1=getScore("语文","修改")
            if score1 >-1:
                student["score1"]=score1
                student["total"]=student["score1"] + student["score2"] + student["score3"]
                print ("语文成绩修改成功!")                  
            break
        elif alterNum == 4: #修改数学成绩
            score2=getScore("数学","修改")
            if score2 >-1:
                student["score2"]=score2
                student["total"]=student["score1"] + student["score2"] + student["score3"]
                print ("数学成绩修改成功!")                  
            break
        elif alterNum == 5: #修改英语成绩
            score3=getScore("英语","修改")
            if score3 >-1:
                student["score3"]=score3
                student["total"]=student["score1"] + student["score2"] + student["score3"]
                print ("英语成绩修改成功!")                  
            break                
        elif alterNum == 6: #退出修改
            break
        else:  #输入了错误的数字
            print("输入错误请重新输入")


studentList=[] 
while True:
    showInfo()

    try:
        key = int(input("请选择功能(输入序号1到6):"))
    except:  #如果出现异常,跳出本次循环,不再执行后面的代码,而是要求用户重新输入
        print("您的输入有误,请输入序号1到6")
        continue
   
    if key == 1:#添加学生信息
        print("您选择了添加学生信息功能")
        name = input("请输入姓名:")
        stuId = input("请输入学号(不可重复):")

        index=hasRecord(studentList,stuId)       
        if index >-1:
            print("输入学号重复,添加失败!")
            continue
        else:
            student = {}
            student["name"] = name
            student["ID"] = stuId
   
            score1=getScore("语文","添加")
            if score1 >-1:
                student["score1"]=score1
            else:
                continue           

            score2=getScore("数学","添加")
            if score2 >-1:
                student["score2"]=score2
            else:
                continue

            score3=getScore("英语","添加")
            if score3 >-1:
                student["score3"]=score3
            else:
                continue              
          
            student["total"]=student["score1"] + student["score2"] + student["score3"]
            studentList.append(student)
            print (student["name"]+"的成绩录入成功!")

    elif key == 2:  #删除学生信息
        print("您选择了删除学生信息功能")
        stuId=input("请输入要删除的学号:")
        index=hasRecord(studentList,stuId)       
        if index>-1:
            del studentList[index]
            print("删除成功!")           
        else:
            print("没有此学生学号,删除失败!")

    elif key == 3: #修改学生信息
        print("您选择了修改学生信息功能")
        stuId=input("请输入你要修改学生的学号:")
        index=hasRecord(studentList,stuId)       
        if index == -1:
            print("没有此学号,修改失败!")
        else:
            temp=studentList[index]
            updateStudent(temp)

    elif key == 4: #查询某位学生信息
        print("您选择了查询学生信息功能")
        stuId=input("请输入你要查询学生的学号:")
        index=hasRecord(studentList,stuId)
        if index == -1:
            print("没有此学生学号,查询失败!")
        else:
            temp=studentList[index]
            print ("学号\t姓名\t语文\t数学\t英语\t总分")
            print(temp["ID"],"\t",temp["name"],"\t",temp["score1"],"\t",temp["score2"],"\t",temp["score3"],"\t",temp["total"])

    elif key == 5: #打印出所有学生的信息            
        print("接下来进行遍历所有的学生信息...")
        print("学号\t姓名\t语文\t数学\t英语\t总分")
        for temp in studentList:           
            print(temp["ID"],"\t",temp["name"],"\t",temp["score1"],"\t",temp["score2"],"\t",temp["score3"],"\t",temp["total"])

    elif key == 6: #选择退出系统      
        quitConfirm = input("确认要退出系统吗 (Y或者N)?")
        if quitConfirm.upper()=="Y":
            print("欢迎使用本系统,谢谢")
            break
       
      
    else:  #没有正确输入编号
        print("您输入有误,请重新输入")

首先,可以把重复使用的代码放到自定义函数中,这样就不用重复地复制和粘贴代码。在前面介绍的代码中,无论是选择查询和添加,还是修改和删除,都需要先判断当前的列表中是否已经包含了输入的学号。因此,可以把判断列表中是否包含指定学号这段代码作为一个自定义的函数,将列表和指定的学号作为参数,并且返回一个结果值来表示是否在列表中找到这个学号所对应的元素。

来看一下具体的代码。我们定义了一个名为 hasRecord 的函数,用来判断列表中已有的元素是否包含指定的学号。这个函数有两个形参,一个是表示列表的 sList,一个是表示指定的学号 sID。

在函数中定义了一个变量 result,它将作为函数的返回值。一开始,将变量 result 设置为 −1,表示目前没有找到对应的元素。然后创建了临时变量 i,初始值是 0,它会在 for 循环中对应到当前元素的索引值。然后使用 for 循环,遍历 sList 列表中每个元素,把每个元素赋值给变量 temp。

在每一次迭代中判断 temp 的键“ID”对应的值是否等于参数 sID。如果相等,表示在列表中已存在相同学号的元素,会将变量 i 的值赋值给 result,这样一来,result 的值就是元素所对应的索引,然后调用 break 语句跳出 for 循环;如果不相等,将变量 i 加 1,进入下一次迭代,判断下一个元素。

for 循环执行完毕后,用关键字 return 把 result 返回给函数调用。调用它的函数只要判断返回值是不是等于 −1,就能够知道有没有对应的元素。如果等于 −1,表示没有对应的元素,如果等于其他值,表示找到了对应的元素并且元素的索引就是函数的返回值。
#判断成绩列表中是否已经包含了学号,sList表示成绩列表,sID表示学号
def hasRecord(sList,sID):
    result=-1
    i = 0 
    for temp in sList:
       if temp["ID"] == sID:
            result=i
            break
       else:
           i=i+1
    return result

还可以把反复要用到的判断输入的成绩是否有效的代码,放到一个自定义函数中。这里把这个自定义的函数命名为 getScore,给它指定了两个形参,一个是表示科目的 subject,一个是表示动作的 action,这两个参数都是字符串。

首先,用形参 subject 和其他字符串拼成一句话,例如形参是“语文”,就可以拼成"请输入语文成绩:"。然后把用户输入的内容转换成浮点数保存到变量 score 中。

然后判断变量 score 是不是在 0 到 100 之间,如果在此范围之内,表示 score 是一个有效的数字,用关键字 return 将其直接返回给函数调用。如果不在此范围之内,会提示用户输入错误,并且将 −1 返回给函数调用。调用它的函数只要判断返回值是不是等于 −1,就可以知道输入的值是否有效。
#判断输入成绩是否有效,subject表示科目,action表示进行操作
def getScore(subject,action):   
    try:
        score=float(input("请输入"+subject+"成绩:"))
    except:
        print ("输入的不是数字,"+action+"失败!")
        return -1

    if score <= 100 and score >= 0 :
        return score
    else:
        print ("输入的"+subject+"成绩有错误,"+action+"失败!")
        return -1

自定义函数的另一个作用就是可以把大段代码隐藏到函数中,并给它们起一个容易理解的名字,这样就可以更好地规划和组织代码,从而让核心代码看上去更加简洁明了。这里,我们可以把显示功能列表的代码,放到一个自定义的、名为 showInfo 的函数中。这个函数没有参数,也不需要返回值,它只是调用 print 函数把提示信息打印到屏幕上。
#显示功能列表,提示用户如何选择功能
def showInfo():
    print("-"*30)
    print(" 学生成绩系统 ")
    print(" 1.添加学生的信息")
    print(" 2.删除学生的信息")
    print(" 3.修改学生的信息")
    print(" 4.查询学生的信息")
    print(" 5.列出所有学生的信息")
    print(" 6.退出系统")
    print("-"*30)

还可以把修改学生信息的那一大段代码放到自定义函数 updateStudent 中,为该函数指定表示学生信息的形参 student,它也同样没有返回值。代码内容在上面已经介绍过,这里不再赘述。
def updateStudent(student):
    while True:
        try:
            alterNum=int(input(" 1.修改姓名\n 2.修改学号 \n 3.修改语文成绩 \n 4.修改数学成绩 \n 5.修改英语成绩 \n 6.退出修改\n"))
        except:
            print ("输入有误,请输入编号1到6")
            continue
        if alterNum == 1:  #修改姓名
            newName=input("输入更改后的姓名:")
            student["name"] = newName
            print("姓名修改成功")
            break
        elif alterNum == 2:  #修改学号
            newId=input("输入更改后的学号:")                
            newIndex=hasRecord(studentList,newId)
            if newIndex>-1:
                print("输入学号不可重复,修改失败!")
            else:                       
                student["ID"]=newId
                print("学号修改成功")
            break
        elif alterNum == 3: #修改语文成绩
            score1=getScore("语文","修改")
            if score1 >-1:
                student["score1"]=score1
                student["total"]=student["score1"] + student["score2"] + student ["score3"]
                print ("语文成绩修改成功!")                  
            break
        elif alterNum == 4: #修改数学成绩
            score2=getScore("数学","修改")
            if score2 >-1:
                student["score2"]=score2
                student["total"]=student["score1"] + student["score2"] + student ["score3"]
                print ("数学成绩修改成功!")
            break
        elif alterNum == 5: #修改英语成绩
            score3=getScore("英语","修改")
            if score3 >-1:
                student["score3"]=score3
                student["total"]=student["score1"] + student["score2"] + student ["score3"]
                print ("英语成绩修改成功!")
            break                
        elif alterNum == 6: #退出修改
            break
        else: #输入了错误的数字
            print("输入错误请重新输入")

接下来,就可以在程序中调用这些函数,显然这里的代码看上去要比之前实现同样功能的代码简洁了许多。这里突出显示的代码行表示函数调用。
studentList=[] 
while True:
    showInfo()
    try:        
        key = int(input("请选择功能(输入序号1到6):"))
    except: #如果出现异常,跳出本次循环,不再执行后面的代码,要求用户重新输入
        print("您的输入有误,请输入序号1到6")
        continue    

    if key == 1: #添加学生信息
        print("您选择了添加学生信息功能")
        name = input("请输入姓名:")
        stuId = input("请输入学号(不可重复):")
        index=hasRecord(studentList,stuId)
        if index >-1:
            print("输入学号重复,添加失败!")
            continue
        else:
            student = {}
            student["name"] = name
            student["ID"] = stuId
            score1=getScore("语文","添加")
            if score1 >-1:
                student["score1"]=score1
            else:
                continue           

            score2=getScore("数学","添加")
            if score2 >-1:
                student["score2"]=score2
            else:
                continue

            score3=getScore("英语","添加")
            if score3 >-1:
                student["score3"]=score3
            else:
                continue               

            student["total"]=student["score1"] + student["score2"] + student ["score3"]
            studentList.append(student)
            print (student["name"]+"的成绩录入成功!")
    elif key == 2: #删除学生信息
        print("您选择了删除学生信息功能")
        stuId=input("请输入要删除的学号:")
        index=hasRecord(studentList,stuId)
        if index>-1:
            del studentList[index]
            print("删除成功!")           
        else:
            print("没有此学生学号,删除失败!")
    elif key == 3:
        print("您选择了修改学生信息功能")
        stuId=input("请输入你要修改学生的学号:")
        index=hasRecord(studentList,stuId)
        if index == -1:
            print("没有此学号,修改失败!")
        else:
            temp=studentList[index]
            updateStudent(temp)
    elif key == 4: #查询某位学生信息
        print("您选择了查询学生信息功能")
        stuId=input("请输入你要查询学生的学号:")
        index=hasRecord(studentList,stuId)
        if index == -1:
            print("没有此学生学号,查询失败!")
        else:
            temp=studentList[index]
            print ("学号\t姓名\t语文\t数学\t英语\t总分")
            print(temp["ID"],"\t",temp["name"],"\t",temp["score1"],"\t",temp ["score2"],"\t",
                temp["score3"],"\t",temp["total"])            
    elif key == 5:  #打印出所有学生的信息         
        print("接下来进行遍历所有的学生信息...")
    print("学号\t姓名\t语文\t数学\t英语\t总分")
        for temp in studentList:
            print(temp["ID"],"\t",temp["name"],"\t",temp["score1"],"\t",temp ["score2"],"\t",
                temp["score3"],"\t",temp["total"])
    elif key == 6:  #选择退出系统  
        quitConfirm = input("确认要退出系统吗 (Y或者N)?")
        if quitConfirm.upper()=="Y":
            print("欢迎使用本系统,谢谢")
            break
    else:  #没有正确输入编号
        print("您输入有误,请重新输入")