User:Xyy23330121/Python/循环

来自维基学院


Python 中有两种语句可以用作循环。while 语句需要的基础较少,只要学会 if 表达式,while 语句就完全是类似的东西。

而 for 语句则涉及到 Python 的可迭代对象。对于 for 语句而言,Python 的 for 语句和 C 语言等语言的、简单的 for 语句是完全不同的两个东西。

while 语句[编辑 | 编辑源代码]

我们先看一个示例:

a = 0
while a < 3:
    print("a 的值为", a)
    a += 1

程序输出的结果为:

a 的值为 0
a 的值为 1
a 的值为 2

while 语句执行时,只要 while 后面紧跟的表达式返回 True ,就会执行一次后面语句组的语句。在后面语句组的语句执行完后,再进行一次判断。只要 while 后面紧跟的表达式返回 True ,就会再执行一次后面语句组的语句。

由于 while 语句的上述特性,读者请一定要注意不要造出“无限循环”来。

类似 if 语句,while 语句也可以放在语句组里,从而进行嵌套。

break 语句[编辑 | 编辑源代码]

在循环执行时,如果遇到 break 语句,就会立刻停止循环。我们考虑以下代码:

b = 0
while b < 2:
    a = 0
    while a < 3:
        print("a 的值为", a)
        if a == 1:
            break
        print("a 的值为", a)
        a += 1
    b += 1

程序输出的结果为:

a 的值为 0
a 的值为 0
a 的值为 1
a 的值为 0
a 的值为 0
a 的值为 1

a 的值为 1 时,在执行过一次print函数后执行了 break 语句,从而语句组中、所有 break 语句之后的语句都被跳过,并且循环直接结束。break 语句只能跳出最近一层循环,更外层的循环不受影响。

continue 语句[编辑 | 编辑源代码]

在循环执行时,如果遇到 break 语句,就会立刻跳过该次循环,并进入下一次循环。我们考虑以下代码:

b = 0
while b < 2:
    a = 0
    while a < 2:
        print("a 的值为", a)
        if a == 0:
            continue
        print("a 的值为", a)
        a += 1
    b += 1

程序输出的结果为:

a 的值为 0
a 的值为 1
a 的值为 1
a 的值为 0
a 的值为 1
a 的值为 1

a 的值为 1 时,在执行过一次print函数后执行了 continue 语句,从而语句组中、所有 continue 语句之后的语句都被跳过,然后进入下一次循环。continue 语句只能跳过最近一层循环中的一次循环,更外层的循环不受影响。

for 语句[编辑 | 编辑源代码]

对于可迭代对象,for 语句会按迭代顺序,遍历可迭代对象中的所有元素。我们看以下示例:

for i in "python":
    print(i)

程序输出的结果为:

p
y
t
h
o
n

在上面代码中,先检查可迭代对象的第一个元素。本例中"python"的第一个元素为"p"。于是,Python 先让i = "p",然后执行语句组。语句组执行完成后,检查python的下一个元素。下一个元素是"y"。于是,Python 先让i = "y",然后执行语句组……这一过程直到检查下一个元素时,发现可迭代对象没有下一个元素为止。

我们可以在循环结束后,再输出一遍i的数值,

与 while 语句类似,for 语句中遇到 break 语句时会立即跳出循环、遇到 continue 语句时会立即进行下一次循环。

注意事项[编辑 | 编辑源代码]

for 语句很难正确地在迭代多项集的同时修改多项集的内容。比如我们要删除列表中所有的0。

a = [0,0,1,2,0,3,4]
for i in a:
	if i == 0:
		del i
print(a)

由于之前提到的 for 语句的原理,我们每一次循环前,都执行了一遍对i赋值。因此,列表a根本就没有变!此时用 while 语句更好处理,比如:

a = [0,0,1,2,0,3,4]
i = 0
while i < len(a):
    if a[i] == 0:
        del a[i]
        continue
    i += 1

range 函数[编辑 | 编辑源代码]

可迭代对象并非只有列表、元组和字符串。range函数可以生成等差数列。我们看以下示例:

for i in range(2):
    print(i)

输出的结果为:

0
1

我们也可以用list函数将range函数生成的等差数列直接写出来。

print(list(range(3)))        #[0, 1, 2]
print(list(range(1, 3)))     #[1, 2]
print(list(range(0, 5, 2)))  #[0, 2, 4]
print(list(range(5, 0, -2))) #[5, 3, 1]
print(list(range(0)))        #[]

具体来讲,range函数总共有 3 个参数:

  1. 起始值start,默认值为0
  2. 终止值stop,无默认值
  3. 步进step,默认值为1

3 个参数都应当传入整数,同时step不能为零。当传入一个参数时,认为传入的是stop;当传入两个参数时,认为按顺序传入的是start, stop;当传入三个参数时,认为按顺序传入的是start, stop, step。因为stop没有默认值,至少要传入一个参数。

在生成等差数列时,如果step大于零,则判断start < stop。如果为True,则把start添加到数列里。然后判断start + step是否小于stop……直到start + i * step < stopFalse为止。

如果step小于零,则改为判断start > stop。然后做类似的操作,直到start + i * step > stopFalse为止。

属性[编辑 | 编辑源代码]

range 对象是读者可以接触的,第一个具有“属性”的对象。range有三个属性:

  1. 起始值start
  2. 终止值stop
  3. 步进step

对应生成 range 对象时的三个参数。知道属性的名称后,我们可以用以下方式调用属性:

a = range(3)
print(a.start)   #输出:0
print(a.stop)    #输出:3
print(a.step)    #输出:1
print(a.start + a.stop - a.step)  #输出:2

提示[编辑 | 编辑源代码]

我们要对列表内所有元素作操作,有两种方法。第一种:

for i in list:
    i

和第二种:

for i in range(len(list)):
    list[i]

选择的原则应当取决于元素的索引是否参与操作。如果元素的索引参与了操作,则应当用第二种方法;如果元素的索引不参与操作,则使用第一种方法更为简洁。

else[编辑 | 编辑源代码]

在 for 语句或 while 语句后,可以添加 else 语句。

else 子句将在退出循环时运行,除非退出循环的原因是 break 语句。在用 break 语句退出循环时,else 子句会被跳过。