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辞書を使用する利点の 1 つは、演算子を使用して辞書にキーが含まれているかどうかをすばやく確認できることです。ifしたがって、大きな/ elif/elseブロックを次のように置き換えることができます。

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 の世界では "Look Before You Leap" (LBYL) として知られています。これは、実行しようとしている操作 (選択したクラスを辞書で検索すること) が実行前に有効であることを確認するためです。別のスタイル (もう少し高度な) は、"許可よりも許しを求める方が簡単" (EAFP) として知られており、tryandexcept句を使用して、いくつかの異常な状況で生成される例外を処理します。上記のコードを 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")

この場合、2 つのアプローチに大きな違いはありませんが、状況によっては (状況が有効であることを確認するのに時間がかかる場合)、失敗する可能性のある操作が既に無効な状況を確認しているため (そのため、EAFP の方が高速である可能性があります)。適切な例外を発生させることができます)。

于 2012-12-19T00:35:17.087 に答える