跳转到内容

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 循环

[编辑 | 编辑源代码]

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

链接

While 循环

[编辑 | 编辑源代码]

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 语句。

链接

跳出和继续

[编辑 | 编辑源代码]

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)

这将不会产生任何输出。

循环的 else 子句

[编辑 | 编辑源代码]

如果循环中没有遇到 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'

链接

这些循环、分支和函数调用可以以任何所需的方式嵌套。循环可以循环遍历循环,分支可以再次分支,函数可以调用其他函数,甚至可以调用自身。

  1. 打印从 0 到 1000 的数字(包括 0 和 1000)。
  2. 打印从 0 到 1000 的数字,这些数字是 5 的倍数。
  3. 打印从 1 到 1000 的数字,这些数字是 5 的倍数。
  4. 使用嵌套的 for 循环打印下面的 3x3 乘法表
1 2 3 
2 4 6 
3 6 9
  1. 打印下面的 3x3 乘法表。
  1 2 3 
 ------
1|1 2 3 
2|2 4 6 
3|3 6 9
[编辑 | 编辑源代码]
华夏公益教科书