0

我正在尝试编写从课程编号(CS101)的输入中检索课程、讲师和时间的代码

在您输入正确的课程编号后,它应该会告诉您房间号、讲师和上课时间。

这就是我到目前为止所拥有的。

def main():
    courses, instructors, times = create_info()

    print('Please enter a course number...')
    choice = input(': ').upper()

    if choice == 'CS101':
        courses.get(CS101)
        instructors.get(CS101)
        times.get(CS101)
    elif choice == 'CS102':
        print()
    elif choice == 'CS103':
        print()
    elif choice == 'NT110':
        print()
    elif choice == 'CM241':
        print()
    else:
        print('Sorry, invalid course number')
        print()
        main()

    print()
    main()



def create_info():
    courses = {'CS101':'3004', 'CS102':'4501', 'CS103':'6755', 'NT110':'1244',
               'CM241':'1411'}
    instructors = {'CS101':'Haynes', 'CS102':'Alvarado', 'CS103':'Rich',
                   'NT110':'Burke', 'CM241':'Lee'}
    times = {'CS101':'8:00 a.m.', 'CS102':'9:00 a.m.', 'CS103':'10:00 a.m.',
             'NT110':'11:00 a.m.', 'CM241':'1:00 p.m.'}

    return courses, instructors, times

main()

它给出了以下内容:

NameError:未定义全局名称“CS101”

4

2 回答 2

3

问题在于这些行:

    courses.get(CS101)
    instructors.get(CS101)
    times.get(CS101)

CS101假定为变量,而不是字符串或字典键。

它应该是这样的:

print(courses.get('CS101'))

或者

print(courses['CS101'])

键需要用单引号或双引号括起来,以表明它是字符串,而不是变量。

于 2012-12-19T00:13:28.127 回答
0

使用字典的一个好处是您可以使用in运算符快速检查其中是否有键。所以你可以用以下内容替换你的大if//块elifelse

if choice in courses:
    # do the output with choice as a key to the dictionaries
    print("Course Number:", courses[choice])
    print("Instructor:", instructors[choice])
    print("Times:", times[choice])
else: 
    # choice is not a valid key to the dictionaries
    print("Sorry, invalid course number")

这种编码风格在 Python 世界中被称为“跳前检查”(LBYL),因为您在执行操作之前检查您将要执行的操作(在字典中查找所选类)是否有效。另一种风格(更高级)被称为“比许可更容易请求宽恕”(EAFP),您可以在其中使用tryexcept子句来处理在某些异常情况下生成的异常。以下是您如何以 EAFP 样式执行上述代码:

try:
    # try do the output unconditionally
    print("Course Number:", courses[choice])
    print("Instructor:", instructors[choice])
    print("Times:", times[choice])
except KeyError:
    # a KeyError is raised if choice isn't in the dictionaries
    print("Sorry, invalid course number")

在这种情况下,这两种方法没有太大区别,但在某些情况下(如果检查情况是否有效需要很多时间),EAFP 可能会更快,因为可能失败的操作已经在检查无效情况(所以它可以引发适当的异常)。

于 2012-12-19T00:35:17.087 回答