跳转到内容

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循环提供了一种简单的方法来遍历列表中的所有元素,或者执行某项操作一定次数。

华夏公益教科书