使用 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_menu。print_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)
- 在這裡,我們定義了一個輔助函式,該函式幫助我們播放音符。該函式以 linkbot 物件和字串音符值(例如“Do”)作為輸入引數,並在 linkbot 上播放該音符 0.5 秒。
- 這是我們建立字典以將音符名稱與音符頻率相關聯的地方。
- 此列表定義了我們要播放的簡單歌曲中的音符。
- 此迴圈獲取我們之前構建的音符列表中的每個音符,並使用我們的
playNote()函式播放它。