跳轉至內容

面向非程式設計師的 Python 2.6 教程/列表

來自華夏公益教科書,開放書籍,開放世界

包含多個值的變數

[編輯 | 編輯原始碼]

您已經看到了儲存單個值的普通變數。但是,其他型別的變數可以儲存多個值。最簡單的型別稱為列表。以下是一個使用列表的示例

which_one = 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 之間時才為真(換句話說,如果您在代數中見過它,就會像您預期的那樣)。

可以將列表看作是一系列盒子。每個盒子都有不同的值。例如,由 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
c = 0
while c < len(demolist):
    print "demolist[", c, "] =", demolist[c]
    c = c + 1

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"

demolist.sort()
print "The sorted demolist is", demolist

輸出是

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 demolist is [6, 9, 42, 'and', 'everything', 'life']

此示例使用了一堆新函式。請注意,您可以直接 print 整個列表。接下來,append 函式用於在列表末尾新增一個新專案。len 返回列表中包含的專案數。列表的有效索引(如在 [] 內使用的數字)範圍為 0 到 len - 1index 函式告訴專案在列表中的第一個位置在哪裡。請注意 demolist.index(42) 返回 1,而 demolist[1] 執行時返回 42。行 # Next we will loop through the list 只是對程式設計師的提醒(也稱為註釋)。Python 將忽略以 # 開頭的任何行。接下來,以下幾行

c = 0
while c < len(demolist):
    print 'demolist[', c, '] =', demolist[c]
    c = c + 1

建立一個變數 c,它從 0 開始,並不斷遞增,直到達到列表的最後一個索引。同時,print 語句打印出列表中的每個元素。del 命令可用於刪除列表中的給定元素。接下來的幾行使用 in 運算子來測試元素是否在列表中或不在列表中。sort 函式對列表進行排序。如果您需要按從小到大或按字母順序排序的列表,這將很有用。請注意,這會重新排列列表。總之,對於列表,會發生以下操作

示例 解釋
demolist[2] 訪問索引 2 處的元素
demolist[2] = 3 將索引 2 處的元素設定為 3
del demolist[2] 刪除索引 2 處的元素
len(demolist) 返回 demolist 的長度
"value" in demolist 如果為 True,則"value"demolist 中的元素
"value" not in demolist 如果 "value" 不是 demolist 中的元素,則為 True
demolist.sort() demolist 進行排序
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 = 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 = raw_input("Type in a name to add: ")
        namelist.append(name)
    elif menu_item == 3:
        del_name = raw_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 = raw_input("What name would you like to change: ")
        if old_name in namelist:
            item_number = namelist.index(old_name)
            new_name = raw_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 = raw_input("What name would you like to change: ")
if old_name in namelist:
    item_number = namelist.index(old_name)
    new_name = raw_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
    question = question_and_answer[0]
    answer = question_and_answer[1]
    # give the question to the user
    given_answer = raw_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
            index = index + 1
        # go to the next question
        else:
            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 run the questions

run_test(get_questions())

TrueFalse 分別指向 1 和 0。它們通常用於健全性檢查、迴圈條件等。您將在稍後(章節 布林表示式)瞭解有關此內容的更多資訊。

示例輸出

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

擴充套件 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 = raw_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(questions):
    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(questions)
    elif choice == "3":
        menu()
    print
    choice = raw_input("Choose your option from the menu above: ")


華夏公益教科書