User:Xyy23330121/Python/循环
Python 中有两种语句可以用作循环。while 语句需要的基础较少,只要学会 if 表达式,while 语句就完全是类似的东西。
而 for 语句则涉及到 Python 的可迭代对象。对于 for 语句而言,Python 的 for 语句和 C 语言等语言的、简单的 for 语句是完全不同的两个东西。
我们先看一个示例:
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 语句,就会立刻停止循环。我们考虑以下代码:
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 语句只能跳出最近一层循环,更外层的循环不受影响。
在循环执行时,如果遇到 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 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
函数可以生成等差数列。我们看以下示例:
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 个参数:
- 起始值
start
,默认值为0
- 终止值
stop
,无默认值 - 步进
step
,默认值为1
3 个参数都应当传入整数,同时step
不能为零。当传入一个参数时,认为传入的是stop
;当传入两个参数时,认为按顺序传入的是start, stop
;当传入三个参数时,认为按顺序传入的是start, stop, step
。因为stop
没有默认值,至少要传入一个参数。
在生成等差数列时,如果step
大于零,则判断start < stop
。如果为True
,则把start
添加到数列里。然后判断start + step
是否小于stop
……直到start + i * step < stop
为False
为止。
如果step
小于零,则改为判断start > stop
。然后做类似的操作,直到start + i * step > stop
为False
为止。
range
对象是读者可以接触的,第一个具有“属性”的对象。range
有三个属性:
- 起始值
start
- 终止值
stop
- 步进
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]
选择的原则应当取决于元素的索引是否参与操作。如果元素的索引参与了操作,则应当用第二种方法;如果元素的索引不参与操作,则使用第一种方法更为简洁。
在 for 语句或 while 语句后,可以添加 else 语句。
else 子句将在退出循环时运行,除非退出循环的原因是 break 语句。在用 break 语句退出循环时,else 子句会被跳过。