跳转到内容

使用 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
 ← 布尔表达式 字典 使用模块 → 
华夏公益教科书