使用 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()
函数播放它。