迭代与循环

本节我们探索的主题是迭代循环。循环通常在计算机编程用用于自动执行重复性任务。
在Python中最常用的迭代形式就是for循环了。for循环允许你迭代出列表中所有的项,迭代出来后你可以做任何你想做的事情。
比如,我们创建了一个列表,并打印出其中所有元素的平方。

  1. >>> for value in [0, 1, 2, 3, 4, 5]:
  2. ... print(value * value)
  3. ...
  4. 0
  5. 1
  6. 4
  7. 9
  8. 16
  9. 25

这样的形式简单又强大!for循环是许多编程中的基础。
比如,你已经知道的sum(list)这个函数,它会将列表中所有的元素相加,但你同样可以使用for循环来干这件事情:

  1. >>> mylist = [1,5,7]
  2. >>> sum = 0
  3. >>> for value in mylist:
  4. ... sum = sum + value
  5. ...
  6. >>> print(sum)
  7. 13

其本质是创建了一个变量”sum”,然后不断的将列表中的元素与其相加。

有时候,你可能不想使用列表中的值,而只需要它们的索引位置。比如,我们不止想获取出它的值还想获取出它在列表中的位置。
请看以下例子:

  1. >>> mylist = [1,5,7]
  2. >>> for i in range(len(mylist)):
  3. ... print("Index:", i, "Value:", mylist[i])
  4. ...
  5. Index: 0 Value: 1
  6. Index: 1 Value: 5
  7. Index: 2 Value: 7

你可以看到我们并没有迭代列表本身,而是迭代了这个列表长度的“range”。“range”函数返回的是一个特殊列表:

  1. >>> list(range(3))
  2. [0, 1, 2]

所以当使用“range”时迭代的就不是“mylist”而是一些用于访问列表里的值的数字索引。更多关于“range”的内容你可以参阅Python文档中关于“range”的部分。 https://docs.python.org/3/tutorial/controlflow.html#the-range-function

有时你可能同时需要这两个(索引和值),这时你可以使用enumerate函数:

  1. >>> mylist = [1,5,7]
  2. >>> for i, value in enumerate(mylist):
  3. ... print("Index:", i, "Value:", value)
  4. ...
  5. Index: 0 Value: 1
  6. Index: 1 Value: 5
  7. Index: 2 Value: 7

请记住Python列表中第一个值的索引总是0。

最后,Python里还提供while声明来让我们重复做一些事情,只要这个特定的条件是True就会一直执行。
比如,下面这个例子中n开始于10,条件是“n”大于0。每次都会从n中减去1。当n变为0时,“n”>0这个条件就失效了,此循环也就结束了。

  1. >>> n = 10
  2. >>> while n > 0:
  3. ... print(n)
  4. ... n = n-1
  5. ...
  6. 10
  7. 9
  8. 8
  9. 7
  10. 6
  11. 5
  12. 4
  13. 3
  14. 2
  15. 1

这个循环永远也不会打印0。

for循环部分练习

解决这一部分你可能很想参阅Python文档中关于循环的部分: https://docs.python.org/3/tutorial/controlflow.html#for-statements

  1. 创建一个名为add的函数,它接受一个列表作为参数,返回的是列表中所有元素的和。请使用for循环来完成。

  2. 创建一个函数,它接受一个列表作为参数,返回的是列表中最大的一个数。
    提示:每迭代完一次你可能都要保存一下目前为止得到的最大的数以进行比较。

  3. 修改之前的那个函数,现在它返回的是是一个列表,列表中第一个元素为最大的一个值,第二个元素为这个值在原列表中的位置。
    提示:除了保存目前为止最大的数,你还要保存下它出现的位置。

  4. 实现一个函数,它返回所接受的列表的翻转列表。
    提示:你可以创建一个空列表,然后从原列表中倒序的添加值。你可能会想参阅Python文档中关于列表的部分:
    https://docs.python.org/3/tutorial/datastructures.html#more-on-lists

  5. 写一个名为is_sorted的函数,它接受一个列表作为参数,如果这个列表里的内容是以升序排列的话则返回True
    比如[1, 2, 2, 3]就是True[1, 2, 3, 2]则不是。
    提示:如果你要将一个数字与接下来的数字做对比,你可能会用到索引,或者你也可以将其保存到一个变量中。

  6. 写一个名为is_sorted_dec的函数,与之前的那个相似但所有的项都是以降序排列的。

  7. 写一个名为has_duplicates的函数,验证所传入的列表里是否存在重复的数。
    提示:你可能需要使用两个for循环,在一个for循环里在使用一个for来检查是否有重复的数。

while循环部分练习

  1. 写一个函数,接受一个数字作为参数并且以降序形式打印出来,打印时标出该数字是奇数还是偶数,一直到0。
    1. >>> even_odd(10)
    2. Even number: 10
    3. Odd number: 9
    4. Even number: 8
    5. Odd number: 7
    6. Even number: 6
    7. Odd number: 5
    8. Even number: 4
    9. Odd number: 3
    10. Even number: 2
    11. Odd number: 1