用 Linkbot 学习 Python 3/列表
您已经见过存储单个值的普通变量。但是,其他变量类型可以保存多个值。这些被称为容器,因为它们可以包含多个对象。最简单的类型称为列表。以下是一个使用列表的示例
which_one = int(input("What month (1-12)? "))
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
'August', 'September', 'October', 'November', 'December']
if 1 <= which_one <= 12:
print("The month is", months[which_one - 1])
以及一个输出示例
What month (1-12)? 3 The month is March
在这个示例中,months
是一个列表。months
通过以下代码行定义: months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
和 'August', 'September', 'October', 'November', 'December']
(请注意,也可以使用 \
来拆分长行,但在本例中没有必要,因为 Python 足够智能,可以识别括号内的所有内容都属于一起)。[
和 ]
用逗号 (,
) 分隔列表项,开始和结束列表。该列表在 months[which_one - 1]
中使用。列表包含从 0 开始编号的项。换句话说,如果您想要 January,则使用 months[0]
。给列表一个数字,它将返回存储在该位置的值。
语句 if 1 <= which_one <= 12:
只有在 which_one
在 1 到 12 之间(包含 1 和 12)时才为真(换句话说,如果您在代数中见过它,它就是您所期望的)。
列表可以被认为是一系列盒子。每个盒子都有不同的值。例如,由 demolist = ['life', 42, 'the universe', 6, 'and', 9]
创建的盒子将如下所示
盒子编号 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
demolist | "life" | 42 | "the universe" | 6 | "and" | 9 |
每个盒子都由它的编号引用,因此语句 demolist[0]
将获取 'life'
,demolist[1]
将获取 42
,依此类推,直到 demolist[5]
获取 9
。
下一个示例只是为了展示列表可以执行的许多其他操作(我这一次不希望您输入它,但您应该在交互模式下玩弄列表,直到您对它们感到满意为止)。下面是
demolist = ["life", 42, "the universe", 6, "and", 9]
print("demolist = ",demolist)
demolist.append("everything")
print("after 'everything' was appended demolist is now:")
print(demolist)
print("len(demolist) =", len(demolist))
print("demolist.index(42) =", demolist.index(42))
print("demolist[1] =", demolist[1])
# Next we will loop through the list
for c in range(len(demolist)):
print("demolist[", c, "] =", demolist[c])
del demolist[2]
print("After 'the universe' was removed demolist is now:")
print(demolist)
if "life" in demolist:
print("'life' was found in demolist")
else:
print("'life' was not found in demolist")
if "amoeba" in demolist:
print("'amoeba' was found in demolist")
if "amoeba" not in demolist:
print("'amoeba' was not found in demolist")
another_list = [42,7,0,123]
another_list.sort()
print("The sorted another_list is", another_list)
输出为
demolist = ['life', 42, 'the universe', 6, 'and', 9] after 'everything' was appended demolist is now: ['life', 42, 'the universe', 6, 'and', 9, 'everything'] len(demolist) = 7 demolist.index(42) = 1 demolist[1] = 42 demolist[ 0 ] = life demolist[ 1 ] = 42 demolist[ 2 ] = the universe demolist[ 3 ] = 6 demolist[ 4 ] = and demolist[ 5 ] = 9 demolist[ 6 ] = everything After 'the universe' was removed demolist is now: ['life', 42, 6, 'and', 9, 'everything'] 'life' was found in demolist 'amoeba' was not found in demolist The sorted another_list is [0, 7, 42, 123]
这个示例使用了许多新函数。请注意,您可以直接 print
整个列表。接下来,使用 append
函数将新项添加到列表的末尾。len
返回列表中包含的项数。列表的有效索引(如可以在 []
内使用的数字)范围从 0 到 len - 1
。index
函数指示项在列表中的第一个位置。请注意,demolist.index(42)
返回 1,当运行 demolist[1]
时,它返回 42。要在交互式 Python 解释器中获取列表提供的所有函数的帮助,请键入 help(list)
。
行 # Next we will loop through the list
只是对程序员的提醒(也称为注释)。Python 忽略 #
后当前行上的所有内容。接下来是这些行
for c in range(len(demolist)):
print('demolist[', c, '] =', demolist[c])
创建一个名为 c
的变量,它从 0 开始并递增,直到达到列表的最后一个索引。同时,print
语句打印出列表的每个元素。
执行上述操作的更好的方法是
for c, x in enumerate(demolist):
print("demolist[", c, "] =", x)
del
命令可用于从列表中删除给定元素。接下来的几行使用 in
运算符来测试元素是否在列表中或不在列表中。sort
函数对列表进行排序。如果需要按从小到大或按字母顺序排序的列表,这将非常有用。请注意,这会重新排列列表。总而言之,对于列表,将执行以下操作
示例 | 说明 |
---|---|
demolist[2]
|
访问索引 2 处的元素 |
demolist[2] = 3
|
将索引 2 处的元素设置为 3 |
del demolist[2]
|
删除索引 2 处的元素 |
len(demolist)
|
返回 demolist 的长度 |
"value" in demolist
|
如果"value"是 demolist 中的元素,则为True |
"value" not in demolist
|
如果 "value" 不是 demolist 中的元素,则为True |
another_list.sort()
|
对 another_list 进行排序。请注意,列表必须全部是数字或全部是字符串才能进行排序。 |
demolist.index("value")
|
返回 "value" 首次出现的索引 |
demolist.append("value")
|
在列表末尾添加元素 "value" |
demolist.remove("value")
|
从 demolist 中删除 value 的第一个出现位置(与 del demolist[demolist.index("value")] 相同) |
下一个示例以更实用的方式使用这些特性
menu_item = 0
namelist = []
while menu_item != 9:
print("--------------------")
print("1. Print the list")
print("2. Add a name to the list")
print("3. Remove a name from the list")
print("4. Change an item in the list")
print("9. Quit")
menu_item = int(input("Pick an item from the menu: "))
if menu_item == 1:
current = 0
if len(namelist) > 0:
while current < len(namelist):
print(current, ".", namelist[current])
current = current + 1
else:
print("List is empty")
elif menu_item == 2:
name = input("Type in a name to add: ")
namelist.append(name)
elif menu_item == 3:
del_name = input("What name would you like to remove: ")
if del_name in namelist:
# namelist.remove(del_name) would work just as fine
item_number = namelist.index(del_name)
del namelist[item_number]
# The code above only removes the first occurrence of
# the name. The code below from Gerald removes all.
# while del_name in namelist:
# item_number = namelist.index(del_name)
# del namelist[item_number]
else:
print(del_name, "was not found")
elif menu_item == 4:
old_name = input("What name would you like to change: ")
if old_name in namelist:
item_number = namelist.index(old_name)
new_name = input("What is the new name: ")
namelist[item_number] = new_name
else:
print(old_name, "was not found")
print("Goodbye")
以下是一部分输出
-------------------- 1. Print the list 2. Add a name to the list 3. Remove a name from the list 4. Change an item in the list 9. Quit Pick an item from the menu: 2 Type in a name to add: Jack Pick an item from the menu: 2 Type in a name to add: Jill Pick an item from the menu: 1 0 . Jack 1 . Jill Pick an item from the menu: 3 What name would you like to remove: Jack Pick an item from the menu: 4 What name would you like to change: Jill What is the new name: Jill Peters Pick an item from the menu: 1 0 . Jill Peters Pick an item from the menu: 9 Goodbye
这是一个很长的程序。让我们看一下源代码。行 namelist = []
使变量 namelist
成为一个没有项目(或元素)的列表。下一条重要的行是 while menu_item != 9:
。这行代码开始一个循环,允许该程序的菜单系统。接下来的几行显示一个菜单并确定要运行程序的哪个部分。
这一部分
current = 0
if len(namelist) > 0:
while current < len(namelist):
print(current, ".", namelist[current])
current = current + 1
else:
print("List is empty")
遍历列表并打印每个名称。len(namelist)
指示列表中包含多少个项目。如果 len
返回 0
,则列表为空。
然后,在几行之后,出现了语句 namelist.append(name)
。它使用 append
函数将一个项目添加到列表的末尾。向下跳两行,注意这段代码
item_number = namelist.index(del_name)
del namelist[item_number]
这里使用 index
函数来查找稍后将用于删除项目的索引值。del namelist[item_number]
用于删除列表中的一个元素。
下一部分
old_name = input("What name would you like to change: ")
if old_name in namelist:
item_number = namelist.index(old_name)
new_name = input("What is the new name: ")
namelist[item_number] = new_name
else:
print(old_name, "was not found")
使用 index
查找 item_number
,然后将 new_name
放置到 old_name
所在的位置。
恭喜,掌握了列表后,您现在已经足够了解这种语言,可以执行计算机所能执行的任何计算(这在技术上被称为图灵完备性)。当然,仍然有很多功能可以使您的工作更轻松。
test.py
## This program runs a test of knowledge
# First get the test questions
# Later this will be modified to use file io.
def get_questions():
# notice how the data is stored as a list of lists
return [["What color is the daytime sky on a clear day? ", "blue"],
["What is the answer to life, the universe and everything? ", "42"],
["What is a three letter word for mouse trap? ", "cat"]]
# This will test a single question
# it takes a single question in
# it returns True if the user typed the correct answer, otherwise False
def check_question(question_and_answer):
# extract the question and the answer from the list
# This function takes a list with two elements, a question and an answer.
question = question_and_answer[0]
answer = question_and_answer[1]
# give the question to the user
given_answer = input(question)
# compare the user's answer to the tester's answer
if answer == given_answer:
print("Correct")
return True
else:
print("Incorrect, correct was:", answer)
return False
# This will run through all the questions
def run_test(questions):
if len(questions) == 0:
print("No questions were given.")
# the return exits the function
return
index = 0
right = 0
while index < len(questions):
# Check the question
#Note that this is extracting a question and answer list from the list of lists.
if check_question(questions[index]):
right = right + 1
# go to the next question
index = index + 1
# notice the order of the computation, first multiply, then divide
print("You got", right * 100 / len(questions),\
"% right out of", len(questions))
# now let's get the questions from the get_questions function, and
# send the returned list of lists as an argument to the run_test function.
run_test(get_questions())
值 True
和 False
分别指向 1 和 0。它们通常用于健全性检查、循环条件等。您稍后将详细了解这一点(第 布尔表达式 章)。请注意,get_questions() 本质上是一个列表,因为即使它在技术上是一个函数,但返回列表的列表是它唯一的功能。
示例输出
What color is the daytime sky on a clear day? green Incorrect, correct was: blue What is the answer to life, the universe and everything? 42 Correct What is a three letter word for mouse trap? cat Correct You got 66 % right out of 3
LinkbotMelody.py
我们还可以创建自己的项目列表,并使用 for 循环来循环遍历它们。让我们尝试制作一个键盘按键列表,以按顺序播放它们,以演奏一个简单的曲调。我们将使用以下知识编写这个程序:中央 C 是键盘上的第 40 个键。当您运行此程序时,它应该演奏一个非常熟悉的曲调的开头。您能猜出是什么吗?
import barobo
dongle = barobo.Dongle()
dongle.connect()
robot = dongle.getLinkbot('6wbn') # Replace '6wbn' with the serial ID on your Linkbot
import time # Need to "import time" so we can use time.sleep()
myNotes = [44, 42, 40, 42, 44, 44, 44] # Put some notes into a list
t=0.5 # Set a value to be used for the duration of the note
for i in myNotes: # Select which keys on a piano keyboard to use for the tones
k=pow(2,(i-49)/12)*440 # Determines the frequency of the note to be played
robot.setBuzzerFrequency(k) # Directs the Linkbot to play this frequency
time.sleep(t) # Pauses the program while the note is played
robot.setBuzzerFrequency(0) # Turns off the piezo speaker at the end of each note
扩展 test.py 程序,使其具有一个菜单,提供以下选项:进行测试、查看问题和答案列表以及退出。此外,添加一个新问题: “真正先进的机器会发出什么声音?”,答案为“ping”。
扩展 test.py 程序,使其具有一个菜单,提供以下选项:进行测试、查看问题和答案列表以及退出。此外,添加一个新问题: “真正先进的机器会发出什么声音?”,答案为“ping”。
## This program runs a test of knowledge
questions = [["What color is the daytime sky on a clear day? ", "blue"],
["What is the answer to life, the universe and everything? ", "42"],
["What is a three letter word for mouse trap? ", "cat"],
["What noise does a truly advanced machine make?", "ping"]]
# This will test a single question
# it takes a single question in
# it returns True if the user typed the correct answer, otherwise False
def check_question(question_and_answer):
# extract the question and the answer from the list
question = question_and_answer[0]
answer = question_and_answer[1]
# give the question to the user
given_answer = input(question)
# compare the user's answer to the testers answer
if answer == given_answer:
print("Correct")
return True
else:
print("Incorrect, correct was:", answer)
return False
# This will run through all the questions
def run_test(questions):
if len(questions) == 0:
print("No questions were given.")
# the return exits the function
return
index = 0
right = 0
while index < len(questions):
# Check the question
if check_question(questions[index]):
right = right + 1
# go to the next question
index = index + 1
# notice the order of the computation, first multiply, then divide
print("You got", right * 100 / len(questions),
"% right out of", len(questions))
#showing a list of questions and answers
def showquestions():
q = 0
while q < len(questions):
a = 0
print("Q:" , questions[q][a])
a = 1
print("A:" , questions[q][a])
q = q + 1
# now let's define the menu function
def menu():
print("-----------------")
print("Menu:")
print("1 - Take the test")
print("2 - View a list of questions and answers")
print("3 - View the menu")
print("5 - Quit")
print("-----------------")
choice = "3"
while choice != "5":
if choice == "1":
run_test(questions)
elif choice == "2":
showquestions()
elif choice == "3":
menu()
print()
choice = input("Choose your option from the menu above: ")