Python 编程/控制流
与大多数命令式语言一样,程序控制流主要分为三大类:
- 循环
- 分支
- 函数调用
函数调用在下一节中介绍。
生成器和列表推导是程序控制流的进阶形式,但这里不涉及。
Python 中的控制流概览
x = -6 # Branching
if x > 0: # If
print("Positive")
elif x == 0: # Else if AKA elseif
print("Zero")
else: # Else
print("Negative")
list1 = [100, 200, 300]
for i in list1: print(i) # A for loop
for i in range(0, 5): print(i) # A for loop from 0 to 4
for i in range(5, 0, -1): print(i) # A for loop from 5 to 1
for i in range(0, 5, 2): print(i) # A for loop from 0 to 4, step 2
list2 = [(1, 1), (2, 4), (3, 9)]
for x, xsq in list2: print(x, xsq) # A for loop with a two-tuple as its iterator
l1 = [1, 2]; l2 = ['a', 'b']
for i1, i2 in zip(l1, l2): print(i1, i2) # A for loop iterating two lists at once.
i = 5
while i > 0: # A while loop
i -= 1
list1 = ["cat", "dog", "mouse"]
i = -1 # -1 if not found
for item in list1:
i += 1
if item=="dog":
break # Break; also usable with while loop
print("Index of dog:", i)
for i in range(1,6):
if i <= 4:
continue # Continue; also usable with while loop
print("Greater than 4:", i)
在 Python 中,有两种循环:'for' 循环和 'while' 循环。
for 循环遍历序列(元组或列表)中的元素。创建一个变量来表示序列中的对象。例如,
x = [100,200,300]
for i in x:
print (i)
这将输出
100 200 300
for
循环遍历列表或迭代器中的每个元素,并将当前元素分配给给定的变量名。在上面的示例中,x
中的每个元素都分配给 i
。
一个名为 range 的内置函数可以更轻松地创建像上面这样的连续列表。上面的循环等效于
l = range(100, 301,100)
for i in l:
print (i)
与切片操作类似,在 range 函数中,第一个参数是起始整数(我们可以只传递一个参数给 range,它将被解释为第二个参数,然后默认值:0 用于第一个参数),第二个参数是结束整数,但不包含在列表中。
>>> range(5)
range(0, 5)
>>> list(range(5)) #need to use list() to really print the list out
[0, 1, 2, 3, 4]
>>> set(range(5)) #we can also print a set out
{0, 1, 2, 3, 4}
>>> list(range(1,5))
[1, 2, 3, 4]
>>> list(range(1,1)) #starting from 1, but 1 itself is excluded from the list
[]
下面的示例使用了一个负步长(内置 range 函数的第三个参数,与切片操作类似)
for i in range(5, 0, -1):
print (i)
这将输出
5 4 3 2 1
负步长可以是 -2
for i in range(10, 0, -2):
print (i)
这将输出
10 8 6 4 2
如果 for 循环遍历元组序列,则可以为元组的每个元素命名
l = [(1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
for x, xsquared in l:
print(x, ':', xsquared)
这将输出
1 : 1 2 : 4 3 : 9 4 : 16 5 : 25
链接
- 4.2. for 语句,Python 教程,docs.python.org
- 4.3. range() 函数,Python 教程,docs.python.org
while 循环会重复执行一系列语句,直到条件变为 false。例如
x = 5
while x > 0:
print (x)
x = x - 1
将输出
5 4 3 2 1
Python 的 while 循环也可以有 'else' 子句,它是一段语句块,当 while 条件计算结果为 false 时(一次)执行。while 循环中的 break 语句(参见下一节)不会将程序流程引导到 else 子句。例如
x = 5
y = x
while y > 0:
print (y)
y = y - 1
else:
print (x)
这将输出
5 4 3 2 1 5
与某些语言不同,这里没有后置条件循环。
当 while 条件永远不会计算结果为 false,即始终为 true 时,我们就有一个无限循环。例如,
x = 1
while x > 0:
print(x)
x += 1
这将导致无限循环,它打印 1,2,3,4,... 。要停止无限循环,我们需要使用 break 语句。
链接
- 3.2. 迈向编程的第一步,Python 教程,docs.python.org
Python 包含语句以提前退出循环(for 循环或 while 循环)。要退出循环,请使用 break 语句
x = 5
while x > 0:
print(x)
break
x -= 1
print(x)
这将输出
5
开始循环的下一轮迭代而不等待当前循环结束的语句是 'continue'。
l = [5,6,7]
for x in l:
continue
print(x)
这将不会产生任何输出。
如果循环中没有遇到 break 语句,则会执行循环的 else 子句。
l = range(1,100)
for x in l:
if x == 100:
print(x)
break
else:
print(x, " is not 100")
else:
print("100 not found in range")
使用 break 语句和 else 语句的 while 循环的另一个示例
expected_str = "melon"
received_str = "apple"
basket = ["banana", "grapes", "strawberry", "melon", "orange"]
x = 0
step = int(raw_input("Input iteration step: "))
while received_str != expected_str:
if x >= len(basket): print("No more fruits left on the basket."); break
received_str = basket[x]
x += step # Change this to 3 to make the while statement
# evaluate to false, avoiding the break statement, using the else clause.
if received_str==basket[2]: print("I hate", basket[2], "!"); break
if received_str != expected_str: print("I am waiting for my ", expected_str,".")
else:
print("Finally got what I wanted! my precious ", expected_str, "!")
print("Going back home now !")
这将输出
Input iteration step: 2 I am waiting for my melon . I hate strawberry ! Going back home now !
Python 通过空白缩进来确定循环的重复位置。缩进的所有内容都是循环的一部分,下一个没有缩进的条目不是。例如,下面的代码打印“1 1 2 1 1 2”
for i in [0, 1]:
for j in ["a","b"]:
print("1")
print("2")
另一方面,下面的代码打印“1 2 1 2 1 2 1 2”
for i in [0, 1]:
for j in ["a","b"]:
print("1")
print("2")
Python 中基本上只有一种分支,即 'if' 语句。if 语句的最简单形式仅在给定谓词为 true 时执行代码块,如果谓词为 false 则跳过它
例如,
>>> x = 10
>>> if x > 0:
... print("Positive")
...
Positive
>>> if x < 0:
... print("Negative")
...
您也可以在 if 语句中添加“elif”(“else if”的简写)分支。如果第一个“if”上的谓词为 false,它将测试第一个 elif 上的谓词,如果为 true 则运行该分支。如果第一个 elif 为 false,它将尝试第二个,依此类推。但是请注意,一旦找到一个 true 谓词,它将停止检查分支,并跳过 if 语句的其余部分。您也可以使用“else”分支结束 if 语句。如果其他分支都没有执行,则 python 将运行此分支。
>>> x = -6
>>> if x > 0:
... print("Positive")
... elif x == 0:
... print("Zero")
... else:
... print("Negative")
...
'Negative'
链接
- 4.1. if 语句,Python 教程,docs.python.org
这些循环、分支和函数调用可以以任何所需的方式嵌套。循环可以循环遍历循环,分支可以再次分支,函数可以调用其他函数,甚至可以调用自身。
- 打印从 0 到 1000 的数字(包括 0 和 1000)。
- 打印从 0 到 1000 的数字,这些数字是 5 的倍数。
- 打印从 1 到 1000 的数字,这些数字是 5 的倍数。
- 使用嵌套的 for 循环打印下面的 3x3 乘法表
1 2 3
2 4 6
3 6 9
- 打印下面的 3x3 乘法表。
1 2 3
------
1|1 2 3
2|2 4 6
3|3 6 9
- 4. 更多控制流工具,Python 教程,docs.python.org