跳轉到內容

使用 Linkbot 學習 Python 3/字典

來自華夏公益教科書,自由的教科書,自由的世界

本章介紹字典。字典有鍵和值。鍵用於查詢值。以下是一個字典使用的示例

def print_menu():
    print('1. Print Phone Numbers')
    print('2. Add a Phone Number')
    print('3. Remove a Phone Number')
    print('4. Lookup a Phone Number')
    print('5. Quit')
    print()

numbers = {}
menu_choice = 0
print_menu()
while menu_choice != 5:
    menu_choice = int(input("Type in a number (1-5): "))
    if menu_choice == 1:
        print("Telephone Numbers:")
        for x in numbers.keys():
            print("Name: ", x, "\tNumber:", numbers[x])
        print()
    elif menu_choice == 2:
        print("Add Name and Number")
        name = input("Name: ")
        phone = input("Number: ")
        numbers[name] = phone
    elif menu_choice == 3:
        print("Remove Name and Number")
        name = input("Name: ")
        if name in numbers:
            del numbers[name]
        else:
            print(name, "was not found")
    elif menu_choice == 4:
        print("Lookup Number")
        name = input("Name: ")
        if name in numbers:
            print("The number is", numbers[name])
        else:
            print(name, "was not found")
    elif menu_choice != 5:
        print_menu()

這是我的輸出

1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Quit

Type in a number (1-5): 2
Add Name and Number
Name: Joe
Number: 545-4464
Type in a number (1-5): 2
Add Name and Number
Name: Jill
Number: 979-4654
Type in a number (1-5): 2
Add Name and Number
Name: Fred
Number: 132-9874
Type in a number (1-5): 1
Telephone Numbers:
Name: Jill     Number: 979-4654
Name: Joe      Number: 545-4464
Name: Fred     Number: 132-9874

Type in a number (1-5): 4
Lookup Number
Name: Joe
The number is 545-4464
Type in a number (1-5): 3
Remove Name and Number
Name: Fred
Type in a number (1-5): 1
Telephone Numbers:
Name: Jill     Number: 979-4654
Name: Joe      Number: 545-4464

Type in a number (1-5): 5

該程式類似於本章前面關於列表的名稱列表。以下是程式的工作原理。首先定義函式 print_menuprint_menu 只打印一個選單,該選單稍後在程式中使用兩次。接下來是奇怪的程式碼行 numbers = {}。這行程式碼的作用是告訴 Python numbers 是一個字典。接下來的幾行只是使選單工作。程式碼行

for x in numbers.keys():
    print "Name:", x, "\tNumber:", numbers[x]

遍歷字典並列印所有資訊。函式 numbers.keys() 返回一個列表,該列表隨後由 for 迴圈使用。keys() 返回的列表沒有特定的順序,因此如果您希望按字母順序排列,則必須對其進行排序。與列表類似,語句 numbers[x] 用於訪問字典的特定成員。當然,在本例中,x 是一個字串。接下來,程式碼行 numbers[name] = phone 將一個姓名和電話號碼新增到字典中。如果 name 已經存在於字典中,phone 將替換之前儲存的值。接下來,程式碼行

if name in numbers:
    del numbers[name]

檢查字典中是否包含姓名,如果包含,則將其刪除。運算子 name in numbers 如果 name 存在於 numbers 中,則返回真,否則返回假。程式碼行 del numbers[name] 刪除鍵 name 及其關聯的值。程式碼行

if name in numbers:
    print("The number is", numbers[name])

檢查字典是否包含某個鍵,如果包含,則列印與該鍵關聯的數字。最後,如果選單選擇無效,則會重新列印選單以供您檢視。

回顧一下:字典有鍵和值。鍵可以是字串或數字。鍵指向值。值可以是任何型別的變數(包括列表,甚至字典(這些字典或列表當然可以包含字典或列表本身(很嚇人吧?:-) )))。以下是如何在字典中使用列表的示例

max_points = [25, 25, 50, 25, 100]
assignments = ['hw ch 1', 'hw ch 2', 'quiz   ', 'hw ch 3', 'test']
students = {'#Max': max_points}

def print_menu():
    print("1. Add student")
    print("2. Remove student")
    print("3. Print grades")
    print("4. Record grade")
    print("5. Print Menu")
    print("6. Exit")

def print_all_grades():
    print('\t', end=' ')
    for i in range(len(assignments)):
        print(assignments[i], '\t', end=' ')
    print()
    keys = list(students.keys())
    keys.sort()
    for x in keys:
        print(x, '\t', end=' ')
        grades = students[x]
        print_grades(grades)

def print_grades(grades):
    for i in range(len(grades)):
        print(grades[i], '\t', end=' ')
    print()

print_menu()
menu_choice = 0
while menu_choice != 6:
    print()
    menu_choice = int(input("Menu Choice (1-6): "))
    if menu_choice == 1:
        name = input("Student to add: ")
        students[name] = [0] * len(max_points)
    elif menu_choice == 2:
        name = input("Student to remove: ")
        if name in students:
            del students[name]
        else:
            print("Student:", name, "not found")
    elif menu_choice == 3:
        print_all_grades()
    elif menu_choice == 4:
        print("Record Grade")
        name = input("Student: ")
        if name in students:
            grades = students[name]
            print("Type in the number of the grade to record")
            print("Type a 0 (zero) to exit")
            for i in range(len(assignments)):
                print(i + 1, assignments[i], '\t', end=' ')
            print()
            print_grades(grades)
            which = 1234
            while which != -1:
                which = int(input("Change which Grade: "))
                which -= 1    #same as which = which - 1
                if 0 <= which < len(grades):
                    grade = int(input("Grade: "))
                    grades[which] = grade
                elif which != -1:
                    print("Invalid Grade Number")
        else:
            print("Student not found")
    elif menu_choice != 6:
        print_menu()

這是示例輸出

1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit

Menu Choice (1-6): 3
       hw ch 1         hw ch 2         quiz            hw ch 3         test 
#Max    25              25              50              25              100 

Menu Choice (1-6): 5
1. Add student
2. Remove student
3. Print grades
4. Record grade
5. Print Menu
6. Exit

Menu Choice (1-6): 1
Student to add: Bill

Menu Choice (1-6): 4
Record Grade
Student: Bill
Type in the number of the grade to record
Type a 0 (zero) to exit
1   hw ch 1     2   hw ch 2     3   quiz        4   hw ch 3     5   test 
0               0               0               0               0 
Change which Grade: 1
Grade: 25
Change which Grade: 2
Grade: 24
Change which Grade: 3
Grade: 45
Change which Grade: 4
Grade: 23
Change which Grade: 5
Grade: 95
Change which Grade: 0

Menu Choice (1-6): 3
       hw ch 1         hw ch 2         quiz            hw ch 3         test 
#Max    25              25              50              25              100
Bill    25              24              45              23              95 

Menu Choice (1-6): 6

以下是程式的工作原理。基本上,變數 students 是一個字典,其鍵是學生姓名,其值是他們的成績。前兩行只是建立兩個列表。接下來,程式碼行 students = {'#Max': max_points} 建立一個新的字典,其鍵為 {#Max},其值為 [25, 25, 50, 25, 100](因為在分配時,max_points 的值為 [25, 25, 50, 25, 100])(我使用鍵 #Max,因為 # 排在所有字母字元之前)。接下來定義 print_menu。接下來在程式碼行中定義 print_all_grades 函式

def print_all_grades():
    print('\t',end=" ")
    for i in range(len(assignments)):
        print(assignments[i], '\t',end=" ")
    print()
    keys = list(students.keys())
    keys.sort()
    for x in keys:
        print(x, '\t',end=' ')
        grades = students[x]
        print_grades(grades)

請注意,首先使用程式碼行 keys = list(students.keys()) 中的 keys 函式從 students 字典中獲取鍵。keys 是一個可迭代物件,將其轉換為列表後,可以對它使用所有列表函式。接下來,在程式碼行 keys.sort() 中對鍵進行排序。for 用於遍歷所有鍵。成績以列表形式儲存在字典中,因此分配 grades = students[x]grades 賦值為儲存在鍵 x 處的列表。函式 print_grades 只是列印一個列表,並在幾行後定義。

程式的後面幾行實現了選單的各種選項。程式碼行 students[name] = [0] * len(max_points) 將學生新增到其姓名的鍵下。符號 [0] * len(max_points) 只建立一個與 max_points 列表長度相同的 0 列表。

刪除學生條目類似於電話簿示例,只是刪除了學生。記錄成績選項稍微複雜一些。程式碼行 grades = students[name] 獲取學生 name 的成績的引用。然後,在程式碼行 grades[which] = grade 中記錄成績。您可能會注意到,grades 從未被放回學生字典中(例如,沒有 students[name] = grades)。缺少該語句的原因是 grades 實際上是 students[name] 的另一個名稱,因此更改 grades 會更改 student[name]

字典提供了一種簡單的方法來將鍵連結到值。這可以用於輕鬆跟蹤與各種鍵關聯的資料。

使用字典儲存音符

[編輯 | 編輯原始碼]

到目前為止,我們的 Linkbot 程式一直透過指定要播放的特定頻率(例如 myLinkbot.setBuzzerFrequency(440) )或使用方程根據鍵盤鍵號計算頻率來在 Linkbot 上播放音符。如果我們只需告訴 Linkbot 播放“Do-Re-Mi”或“A-B-C”之類的音符,那豈不更好?

也許我們可以使用字典來完成此任務。我們可以使用一個字典,該字典使用字串“Do”、“Re”、“Mi”等作為鍵,而它們的實際頻率作為值。要查詢實際值,我們可以使用方程或線上查詢。快速搜尋顯示了以下頻率

音符名稱 音符頻率
Do 261.63
Re 293.66
Mi 329.63
Fa 349.23
Sol 392.00
La 440
Ti 493.88

現在,我們可以建立並使用字典來播放音符。

import time  # for time.sleep()                                                  
import barobo                                                                    
dongle = barobo.Dongle()                                                         
dongle.connect()                                                                 
myLinkbot = dongle.getLinkbot('ABCD')  # Replace 'ABCD' with your Linkbot's ID   
                                                                                 
def playNote(linkbot, note):  # 1                                                
    notes = { 'Do' : 261.63,  # 2                                                    
              'Re' : 293.66,                                                     
              'Mi' : 329.63,                                                     
              'Fa' : 349.23,                                                     
              'Sol': 392.00,                                                     
              'La' : 440,                                                        
              'Ti' : 493.88 }                                                    
    linkbot.setBuzzerFrequency( notes[note] )                                    
    time.sleep(0.5)                                                              
    linkbot.setBuzzerFrequency(0)                                                
                                                                                 
mySong = [         # 3                                                           
    'Do', 'Do',                                                                  
    'Sol', 'Sol',                                                                
    'La', 'La',                                                                  
    'Sol', 'Sol',                                                                
    'Fa', 'Fa',                                                                  
    'Mi', 'Mi',                                                                  
    'Re', 'Re',                                                                  
    'Do', 'Do',                                                                  
    ]                                                                            
                                                                                 
for note in mySong:  # 4                                                         
    playNote(myLinkbot, note)
  1. 在這裡,我們定義了一個輔助函式,該函式幫助我們播放音符。該函式以 linkbot 物件和字串音符值(例如“Do”)作為輸入引數,並在 linkbot 上播放該音符 0.5 秒。
  2. 這是我們建立字典以將音符名稱與音符頻率相關聯的地方。
  3. 此列表定義了我們要播放的簡單歌曲中的音符。
  4. 此迴圈獲取我們之前構建的音符列表中的每個音符,並使用我們的 playNote() 函式播放它。
使用 Linkbot 學習 Python 3
 ← 布林表示式 字典 使用模組 → 
華夏公益教科書