Python知识点串连(二)

我们已经实现了用一个嵌套字典的列表来保存学生的信息。在本教程中,我们继续来完善这个程序。

4 ,Python if else条件语句

接下来,我们打算询问用户是否要添加新的学生的信息,如果用户输入 Yes 或者 Y,我们就开始录入信息。录入的时候,我们需要确保输入的表示成绩的数字符合要求,例如大于等于 0 并且小于等于 100,如果录入的成绩不符合要求,就不会在列表中增加这个元素。

完整代码如下。
studentList=[]
student={}
student={"name":"李若瑜","ID":"17","score1":95,"score2":100,"score3":96,"total":291}
studentList.append(student)
student={"name":"张子栋","ID":"11","score1":93,"score2":100,"score3":95,"total":288}
studentList.append(student)
student={"name":"王小明","ID":"25","score1":100,"score2":94,"score3":100,"total":294}
studentList.append(student)

choice = input("是否需要输入新的学生信息(Yes/Y表示需要录入)?")
if choice.upper()=="YES" or choice.upper()=="Y":
    isError=False
    student={}
    student["name"]=input("请输入姓名:")
    student["ID"]=input("请输入学号:")
    score1=float(input("请输入语文成绩:"))
    if score1 <= 100 and score1 >= 0 :
        student["score1"]=score1
    else:
        print ("输入的语文成绩有错误!")
        isError=True           
    score2=float(input("请输入数学成绩:"))
    if score2 <= 100 and score2 >= 0 :
        student["score2"]=score2
    else:
        print ("输入的数学成绩有错误!")
        isError=True
    score3=float(input("请输入英语成绩:"))
    if score3 <= 100 and score3 >= 0 :
        student["score3"]=score3
    else:
        print ("输入的英语成绩有错误!")
        isError=True
    if isError==False:
        student["total"]=student["score1"] + student["score2"] + student["score3"]
        studentList.append(student)
        print (student["name"]+"的成绩录入成功!")
    else:
        print ("输入有误,录入成绩失败!")

当程序运行后,它会询问用户是否需要输入新的学生信息,并且将用户输入的内容赋值给变量 choice。然后使用 upper 方法,将 choice 的值转换为全部大写,再判断它是否等于 YES 或者 Y。

这里使用 upper() 方法的目的是,忽略用户输入的大小写问题,也就是不管用户输入 Yes、yes、YES、Y 还是 y,程序都认为是有效的值。如果输入内容不在以上列举的范围内,则程序结束。例如,输入的是 N,程序结束,如图 1 所示。

Python 条件语句
图 1

如果输入 Yes,那么满足条件,执行缩进的子句。首先创建一个变量 isError,用它来记录用户录入是否出现错误。一开始将这个变量设置为 False,当它的值变为 True 时,表示录入出现了错误。

接下来创建了一个空的字典 student。然后提示用户输入姓名和学号,并且将输入的内容作为值对应到键“name”和“ID”。

然后提示用户输入语文成绩,如果用户输入的数字不是在 0 到 100之间,会提示用户输入错误,并且会将 isError 改为 True。如果输入的是 0 到 100 之间的数字,会将输入内容作为值对应到键“score1”。

然后会提示输入数学成绩和英语成绩,并且会采用同样的方式判读输入的数字是否正确,如果不正确,会将 isError 改为 True。

如果 isError 等于 True,那么会提示输入有误,录入成绩失败,如图 2 所示。

Python 条件语句
图 2

如果输入正确,程序会将语文成绩、数学成绩和英语成绩加和的结果作为键“total”所对应的值。然后使用 append() 方法增加字典 student 到 studentList 列表中,并且提示录入成功,如图 3 所示。

Python 条件语句
图 3
 
使用条件,我们可以更好地和用户互动,并且能够判断用户的输入是否正确。然而,我们又面临一个新的问题,就是每次运行程序,只能录入一次信息,而无法连续录入。没关系,下面,我们会继续完善这个程序,介绍如何连续录入学生的信息以及如何查找和修改学生的信息。

5,Python while for循环

学习过循环,我们就可以使用循环来进一步完善成绩单,从而让它成为一个真正可以使用的程序,并且把前面所提出的问题全部解决掉,让它既可以重复录入学生的信息,又可以查询某位学生的成绩,还可以修改和删除学生的信息。完整代码如下。
studentList=[] 
while True:
    print("-"*30)
    print(" 学生成绩系统 ")
    print(" 1.添加学生的信息")
    print(" 2.删除学生的信息")
    print(" 3.修改学生的信息")
    print(" 4.查询学生的信息")
    print(" 5.列出所有学生的信息")
    print(" 6.退出系统")
    print("-"*30)   
    key = int(input("请选择功能(输入序号1到6):"))

    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
   
            score1=float(input("请输入语文成绩:"))
            if score1 <= 100 and score1 >= 0 :
                student["score1"]=score1
            else:
                print ("输入的语文成绩有错误,添加失败!")
                continue                   
            score2=float(input("请输入数学成绩:"))
            if score2 <= 100 and score2 >= 0 :
                    student["score2"]=score2
            else:
                print ("输入的数学成绩有误,添加失败!")
                continue
            score3=float(input("请输入英语成绩:"))
            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:
                alterNum=int(input(" 1.修改姓名\n 2.修改学号 \n 3.修改语文成绩 \n 4.修改数学成绩 \n 5.修改英语成绩 \n 6.退出修改\n"))
                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:
                    score1=float(input("请输入更改后的语文成绩:"))
                    if score1 <= 100 and score1 >= 0 :
                        temp["score1"]=score1
                        temp["total"]=temp["score1"] + temp["score2"] + temp["score3"]
                        print ("语文成绩修改成功!")
                    else:
                        print ("输入的语文成绩有错误,修改失败!")         
                    break         
                elif alterNum == 4:
                    score2=float(input("请输入更改后的数学成绩:"))
                    if score2 <= 100 and score2 >= 0 :
                        temp["score2"]=score2
                        temp["total"]=temp["score1"] + temp["score2"] + temp["score3"]
                        print ("数学成绩修改成功!")
                    else:
                        print ("输入的数学成绩有错误,修改失败!")   
                    break               
                elif alterNum == 5:
                    score3=float(input("请输入更改后的英语成绩:"))
                    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("您输入有误,请重新输入")

我们要先分析一下要做的事情。

1.首先,还是要定义一个列表来存储学生的信息。

2.然后,我们通过 while 循环,让程序一直运行,只有在主动要求退出系统时,才可以关闭程序。后面要执行的代码都作为子句,放到 while 循环中。

3.程序将功能列表显示给用户,让用户知道如何进行选择。

4.然后,程序根据用户的选项,使用条件语句,分别执行添加、删除、修改、查询、显示所有学生信息和退出程序的功能。

5.添加学生信息的时候,通过 for 循环遍历列表中所有元素,判断系统中是否已有相同的学号,只有在没有相同学号的情况下才可以添加成功。

6.删除学生的时候,也是通过 for 循环找到要删除的元素。

7.修改学生的信息,同样通过 for 循环找到指定元素,进行修改。

8.查询学生的信息,也是通过 for 循环找到指定元素。

9.列出所有学生的信息,也是通过 for 循环把列表中的元素全部打印出来。

来看一下代码。首先,定义一个列表 studentList,用它来存储全部学生的信息。然后使用一个 while 循环,条件为 True,表示这个循环会一直进行下去,直到满足某个条件后,才能跳出循环。这样,用户就可以不断地录入新的学生信息,直到其主动退出程序。
studentList=[] 
while True:

接下来所有的代码都是 while 循环的子语句,需要进行缩进。这里会通过 print 函数来显示一组功能列表,让用户知道该如何进行操作,并且为了更醒目,会在功能列表的第 1 行和最后 1 行分别打印 30 个-号作为分隔。然后提示用户选择功能,他们可以输入 1 到 6 之间的数字,然后把这个数字赋值给变量 key。
    print("-"*30)
    print(" 学生成绩系统 ")
    print(" 1.添加学生的信息")
    print(" 2.删除学生的信息")
    print(" 3.修改学生的信息")
    print(" 4.查询学生的信息")
    print(" 5.列出所有学生的信息")
    print(" 6.退出系统")
    print("-"*30)   
    key = int(input("请选择功能(输入序号1到6):"))

运行程序,结果如图 4 所示。

python if  else循环
图 4

接下来,程序会根据用户的选择来完成相应的功能。当变量 key 等于 1,程序会提示用户选择了“添加学生的信息”这项功能。然后要求用户输入姓名,并将输入内容赋值给变量 name。然后要求用户输入学号,这里会提示用户,学号是唯一的,不允许重复,将输入的内容赋值给变量 stuId。

接下来,程序会验证输入的学号是不是有重复。先创建了一个临时变量 hasRecord,将它设置为 False。然后使用 for 循环,遍历 studentList 列表中的每个元素,把每个元素赋值给变量 temp,这个元素是字典类型,所以变量 temp 也是一个字典。

然后判断 temp 的键“ID”对应的值是否等于 stuId,如果相等,表示已经有了相同的学号,会将变量 hasRecord 设置为 True,并且调用 break 语句跳出 for 循环;如果不相等,不做任何操作,直接进入下一次迭代。

for 循环执行完毕后,判断变量 hasRecord,如果它的值变为 True,表示有重复的学号,提示用户添加失败,然后调用 continue 语句,不再继续执行下面的代码,而是直接返回到 while 循环开头处。

如果 hasRecord 不等于 True,表示没有重复的学号,输入的学号是有效的,那么会创建一个空的字典 student,将变量 name 和 stuId 赋给 student 的键“name”和“ID”,作为其对应的值。

然后提示用户输入语文、数学和英语成绩。判断输入的数字是否符合要求,如果符合则使用 append() 方法把字典 student 添加到 studentList 列表中,并且提示录入成功;如果不符合要求,提示输入错误后直接返回到 while 循环的开头处。判断成绩是否有效的代码在之前已经介绍过,这里不再赘述。
    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

            score1=float(input("请输入语文成绩:"))
            if score1 <= 100 and score1 >= 0 :
                student["score1"]=score1
            else:
                print ("输入的语文成绩有错误,添加失败!")
                continue                   
            score2=float(input("请输入数学成绩:"))
            if score2 <= 100 and score2 >= 0 :
                student["score2"]=score2
            else:
                print ("输入的数学成绩有误,添加失败!")
                continue
            score3=float(input("请输入英语成绩:"))
            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"]+"的成绩录入成功!")

运行程序,结果如图 5 所示。

Python if else循环
图 5
 
当变量 key 等于 2,程序会提示用户选择了“删除学生的信息”这项功能。然后要求用户输入学号,并将输入内容赋值给变量 stuId。

接下来,程序会去 studentList 列表中查找输入的学号对应的元素。创建了临时变量 hasRecord 和 i。使用变量 hasRecord 判断是否找到对应学号,默认值是 False。变量i记录要删除元素的索引,初始值是 0。

然后使用 for 循环,遍历 studentList 列表中每个元素,把每个元素赋值给变量 temp。然后判断 temp 的键“ID”对应的值是否等于 stuId。如果相等,表示找到了记录,会将变量 hasRecord 设置为 True,并且调用 break 语句跳出 for 循环;如果不相等,将变量 i 加 1,进入下一次迭代,判断下一个元素。

for 循环执行完毕后,判断变量 hasRecord。如果 hasRecord 的值变为 True,表示找到了要删除的记录,调用 del 语句删除列表中对应元素,变量i的值是要删除元素的索引值,并且提示用户删除成功。如果 hasRecord 不等于 True,表示没有找到对应的学生信息,提示用户删除失败。
    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("没有此学生学号,删除失败!")

运行程序,结果如图 6 所示。


图 6

当变量 key 等于 3,程序会提示用户选择了“修改学生的信息”这项功能。然后要求用户输入学号,并将输入内容赋值给变量 stuId。

接下来,程序会去 studentList 列表中查找输入的学号对应的元素。如果 hasRecord 等于 False,表示没有找到对应学生信息,提示用户修改失败。否则,表示找到需要修改元素,然后用到 while 循环,条件为 True,表示这个循环会一直进行下去,直到满足某个条件后,才能跳出循环。
    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:

接下来是 while 循环的子语句,需要进行缩进。提示用户输入选择要修改的项目,并且将用户输入的内容保存到变量 alterNum 中。

需要注意的是,提示用户做出选择的每个项目后面都加了一个 \n,这是一个转义符,它在这里的含义是加入一个换行。如果 alterNum 等于 1,表示修改姓名,要求用户输入更改后的姓名,并且将其赋值给选中的元素的“name”键,提示用户修改成功,然后调用 break 语句跳出 while 循环。

如果 alterNum 等于 2,表示修改学号,要求用户输入更改后的学号。然后通过 for 循环确认学号不重复,将其赋值给选中的元素的“ID”键,提示用户修改成功,然后调用 break 语句跳出 while 循环。

如果 alterNum 等于 3,表示修改语文成绩,要求用户输入更改后的成绩,通过条件语句判断输入是有效值,然后将其赋值给选中元素的“score1”键,将“score1”“score2”“score3”之和赋值给“total”键,提示用户修改成功,然后调用 break 语句跳出 while 循环。

如果 alterNum 等于 4,表示修改数学成绩,和修改语文成绩的做法类似,这里不再赘述。

如果 alterNum 等于 5,表示修改英语成绩,和修改语文成绩的做法类似,这里不再赘述。

如果 alterNum 等于 6,调用 break 语句跳出 while 循环,退出修改。

如果 alterNum 等于其他值,提示输入有错误,然后调用 break 语句跳出 while 循环。
                alterNum=int(input(" 1.修改姓名\n 2.修改学号 \n 3.修改语文成绩 \n 4.修改数学成绩 \n 5.修改英语成绩 \n 6.退出修改\n"))
                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:
                    score1=float(input("请输入更改后的语文成绩:"))
                    if score1 <= 100 and score1 >= 0 :
                        temp["score1"]=score1
                        temp["total"]=temp["score1"] + temp["score2"] + temp ["score3"]
                        print ("语文成绩修改成功!")
                    else:
                        print ("输入的语文成绩有错误,修改失败!")
                    break         
                elif alterNum == 4:
                    score2=float(input("请输入更改后的数学成绩:"))
                    if score2 <= 100 and score2 >= 0 :
                        temp["score2"]=score2
                        temp["total"]=temp["score1"] + temp["score2"] + temp ["score3"]
                          print ("数学成绩修改成功!")
                    else:
                        print ("输入的数学成绩有错误,修改失败!")   
                    break
                elif alterNum == 5:
                    score3=float(input("请输入更改后的英语成绩:"))
                    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("输入错误请重新输入")

运行程序,结果如图 7 所示。

Python  if  else循环
图 7

提示:转义字符是指,用一些普通字符的组合来代替一些特殊字符,由于这些组合改变了原来字符表示的含义,因此称为“转义”。通常就是在指定字符前添加反斜杠 \,以此来表示对该字符进行转义。

Python中常用的转义符有:\n(换行)、\r(回车)、\b(退格)、\'(单引号)、\"(双引号)和\t(横向制表符,也就是Tab键)等。

当变量 key 等于 4,程序会提示用户选择了“查询学生的信息”这项功能。然后要求用户输入学号,并将输入的内容赋值给变量 stuId。

接下来,程序会去 studentList 列表中查找输入的学号对应的元素。如果 hasRecord 等于 False,表示没有找到对应的学生信息,提示用户查询失败。否则,表示找到需要查询的元素,然后将该元素的信息打印出来。

在打印学生信息的时候,我们又一次用到了转义字符,这次用到的是 \t,表示增加一个横向制表符,相当于按下Tab键。这样,我们就不用像之前使用空格来分隔每一个项目。
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"])

运行程序,结果如图 8 所示。

python if  else循环
图 8

当变量 key 等于 5,我们会提示用户选择了“列出所有学生的信息”这项功能。我们会遍历 studentList 列表中的所有元素,然后将这些元素的信息打印出来。
  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"])

运行程序,结果如图 9 所示。

python if  else循环
图 9

当变量 key 等于 6,程序会提示用户是否确认要“退出系统”,并且要求用户输入 Y 或 N,并将用户输入的内容保存到 quitConfirm 变量中。如果 quitConfirm 等于 Y,表示用户确认要退出系统,打印“欢迎使用本系统,谢谢”的信息后,调用 break 语句跳出 while 循环。
    elif key == 6:       
        quitConfirm = input("确认要退出系统吗 (Y或者N)?")
        if quitConfirm.upper()=="Y":
            print("欢迎使用本系统,谢谢")
            break

运行程序,结果如图 10 所示。

python if  else循环
图 10
 
当变量 key 等于其他数字,程序提示用户输入有误,进入下一次 while 循环。
   else:
      print("您输入有误,请重新输入")

运行程序,结果如图 11 所示。

python if  else循环
图 11