跳轉到內容

Python 2.6 非程式設計師教程/迴圈

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

這是本章新的打字練習

onetoten = range(1, 11)
for count in onetoten:
    print count

以及永遠存在的輸出

1
2
3
4
5
6
7
8
9
10

輸出看起來非常熟悉,但程式程式碼看起來不同。第一行使用range函式。range函式使用兩個引數,如下所示range(start, finish)start是產生的第一個數字。finish比最後一個數字大一。請注意,此程式可以用更短的方式完成

for count in range(1, 11):
    print count

以下是一些示例,展示了range命令的行為

>>> range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(-32, -20)
[-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21]
>>> range(5,21)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(21, 5)
[]

下一行for count in onetoten:使用for控制結構。for控制結構看起來像for variable in list:list從列表的第一個元素開始遍歷到最後一個元素。當for遍歷列表中的每個元素時,它會將每個元素放入variable中。這允許在每次執行for迴圈時使用variable。這裡還有一個示例(你不必輸入它)來演示

demolist = ['life', 42, 'the universe', 6, 'and', 9, 'everything']
for item in demolist:
    print "The Current item is:",
    print item

輸出是

The Current item is: life
The Current item is: 42
The Current item is: the universe
The Current item is: 6
The Current item is: and
The Current item is: 9
The Current item is: everything

注意for迴圈是如何遍歷併為列表中的每個元素設定item的。注意,如果你不希望print轉到下一行,請在語句的末尾新增一個逗號(例如,如果你想在該行上列印其他內容)。那麼,for有什麼用呢?第一個用途是遍歷列表的所有元素並對每個元素執行操作。以下是一種快速新增所有元素的方法

list = [2, 4, 6, 8]
sum = 0
for num in list:
    sum = sum + num

print "The sum is:", sum

輸出只是

The sum is: 20

或者你可以編寫一個程式來找出列表中是否存在重複項,就像這個程式一樣

list = [4, 5, 7, 8, 9, 1, 0, 7, 10]
list.sort()
prev = list[0]
del list[0]
for item in list:
    if prev == item:
        print "Duplicate of", prev, "found"
    prev = item

為了更好地衡量

Duplicate of 7 Found

好的,它是如何工作的?這裡有一個特殊的除錯版本可以幫助你理解(你不需要輸入它)

l = [4, 5, 7, 8, 9, 1, 0, 7, 10]
print "l = [4, 5, 7, 8, 9, 1, 0, 7, 10]", "\t\tl:", l
l.sort()
print "l.sort()", "\t\tl:", l
prev = l[0]
print "prev = l[0]", "\t\tprev:", prev
del l[0]
print "del l[0]", "\t\tl:", l
for item in l:
    if prev == item:
        print "Duplicate of", prev, "found"
    print "if prev == item:", "\tprev:", prev, "\titem:", item
    prev = item
    print "prev = item", "\t\tprev:", prev, "\titem:", item

輸出為

l = [4, 5, 7, 8, 9, 1, 0, 7, 10]        l: [4, 5, 7, 8, 9, 1, 0, 7, 10]
l.sort()                l: [0, 1, 4, 5, 7, 7, 8, 9, 10]
prev = l[0]             prev: 0
del l[0]                l: [1, 4, 5, 7, 7, 8, 9, 10]
if prev == item:        prev: 0         item: 1
prev = item             prev: 1         item: 1
if prev == item:        prev: 1         item: 4
prev = item             prev: 4         item: 4
if prev == item:        prev: 4         item: 5
prev = item             prev: 5         item: 5
if prev == item:        prev: 5         item: 7
prev = item             prev: 7         item: 7
Duplicate of 7 found
if prev == item:        prev: 7         item: 7
prev = item             prev: 7         item: 7
if prev == item:        prev: 7         item: 8
prev = item             prev: 8         item: 8
if prev == item:        prev: 8         item: 9
prev = item             prev: 9         item: 9
if prev == item:        prev: 9         item: 10
prev = item             prev: 10        item: 10

我在程式碼中添加了這麼多print語句,以便你可以看到每行發生了什麼。(順便說一句,如果你無法弄清楚為什麼程式無法正常工作,嘗試新增大量print語句,以便你可以看到發生了什麼。)首先,程式從一個無聊的舊列表開始。接下來,程式對列表進行排序。這樣做是為了將任何重複項放在一起。然後程式初始化一個prev(ious)變數。接下來,刪除列表的第一個元素,這樣第一個專案就不會被錯誤地認為是重複項。接下來進入for迴圈。檢查列表中的每個專案,看看它是否與前一個專案相同。如果它是重複項,則找到了。然後更改prev的值,以便下次執行for迴圈時,prev是當前項的前一項。果然,找到了 7 是一個重複項。(注意如何使用\t來列印一個製表符。)

使用for迴圈的另一種方法是執行某項操作一定次數。以下是一些程式碼來打印出斐波那契數列的前 9 個數字

a = 1
b = 1
for c in range(1, 10):
    print a,
    n = a + b
    a = b
    b = n

令人驚訝的輸出是

1 1 2 3 5 8 13 21 34

所有可以用for迴圈完成的事情也可以用while迴圈完成,但是for迴圈提供了一種簡單的方法來遍歷列表中的所有元素,或者執行某項操作一定次數。

華夏公益教科書