控制流

在我们目前看到的程序中,语句总是按照从上到下的精确顺序被 Python 忠实地执行。如果你想改变程序的执行流程呢?例如,你希望程序根据不同的情况做出不同的决策,比如根据一天中的不同时间打印"早上好"或"晚上好"?

你可能已经猜到了,这可以通过控制流语句来实现。Python 中有三种控制流语句——ifforwhile

if 语句

if 语句用来检查一个条件:如果条件为真,我们就运行一个语句块(称为 if 块),否则我们处理另一个语句块(称为 else 块)。else 子句是可选的。

示例(保存为 if.py):

number = 23
guess = int(input('Enter an integer : '))

if guess == number:
    # New block starts here
    print('Congratulations, you guessed it.')
    print('(but you do not win any prizes!)')
    # New block ends here
elif guess < number:
    # Another block
    print('No, it is a little higher than that')
    # You can do whatever you want in a block ...
else:
    print('No, it is a little lower than that')
    # you must have guessed > number to reach here

print('Done')
# This last statement is always executed,
# after the if statement is executed.

输出:

$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done

$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done

$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done

工作原理

在这个程序中,我们接收用户的猜测,并检查它是否是我们设定的数字。我们将变量 number 设置为我们想要的任何整数,比如 23。然后,我们使用 input() 函数获取用户的猜测。函数就是可重复使用的程序片段。我们将在下一章中了解更多关于函数的知识。

我们向内置的 input 函数提供一个字符串,它会将其打印到屏幕上并等待用户输入。一旦我们输入内容并按下 kbd:[Enter] 键,input() 函数就会以字符串的形式返回我们输入的内容。然后我们使用 int 将这个字符串转换为整数,并将其存储在变量 guess 中。实际上,int 是一个类,但你现在只需要知道可以用它来将字符串转换为整数(假设字符串中包含有效的整数值)。

接下来,我们将用户的猜测与我们选择的数字进行比较。如果它们相等,我们就打印一条成功消息。请注意,我们使用缩进层级来告诉 Python 哪些语句属于哪个块。这就是为什么缩进在 Python 中如此重要。希望你一直在遵守"一致的缩进"规则。是吗?

注意 if 语句的末尾包含一个冒号——我们在告诉 Python 后面跟着一个语句块。

然后,我们检查猜测是否小于那个数字,如果是,我们通知用户需要猜得更大一些。我们在这里使用的是 elif 子句,它实际上将两个相关的 if else-if else 语句组合成一个 if-elif-else 语句。这使得程序更简洁,也减少了所需的缩进量。

elifelse 语句也必须在逻辑行的末尾有一个冒号,后面跟着相应的语句块(当然要有正确的缩进)。

你可以在 if 语句的 if 块中再嵌套一个 if 语句,以此类推——这被称为嵌套 if 语句。

请记住,elifelse 部分是可选的。一个最小的有效 if 语句是:

if True:
    print('Yes, it is true')

在 Python 执行完完整的 if 语句以及相关的 elifelse 子句后,它会继续执行包含该 if 语句的块中的下一条语句。在这个例子中,就是主块(程序开始执行的地方),下一条语句是 print('Done') 语句。之后,Python 看到程序结束,就完成了运行。

虽然这是一个非常简单的程序,但我一直在指出很多你应该注意的细节。所有这些都相当直观(对于有 C/C++ 背景的人来说,甚至简单得出奇)。你最初需要了解所有这些细节,但经过一些练习后,你会变得很习惯,一切对你来说都会变得"自然"。

给 C/C++ 程序员的提示

Python 中没有 switch 语句。你可以使用 if..elif..else 语句来实现同样的功能(在某些情况下,可以使用字典来快速实现)。

while 语句

while 语句允许你只要条件为真就重复执行一个语句块。while 语句是所谓循环语句的一个例子。while 语句可以有一个可选的 else 子句。

示例(保存为 while.py):

number = 23
running = True

while running:
    guess = int(input('Enter an integer : '))

    if guess == number:
        print('Congratulations, you guessed it.')
        # this causes the while loop to stop
        running = False
    elif guess < number:
        print('No, it is a little higher than that.')
    else:
        print('No, it is a little lower than that.')
else:
    print('The while loop is over.')
    # Do anything else you want to do here

print('Done')

输出:

$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done

工作原理

在这个程序中,我们仍然在玩猜数字游戏,但好处是用户可以不断猜测,直到猜对为止——不需要像我们在上一节中那样为每次猜测反复运行程序。这很好地演示了 while 语句的用法。

我们将 inputif 语句移到 while 循环内部,并在 while 循环之前将变量 running 设置为 True。首先,我们检查变量 running 是否为 True,然后继续执行相应的 while 块。这个块执行完毕后,会再次检查条件,在这个例子中就是 running 变量。如果为真,我们再次执行 while 块,否则我们继续执行可选的 else 块,然后继续下一条语句。

while 循环条件变为 False 时,else 块会被执行——这甚至可能是第一次检查条件的时候。如果 while 循环有一个 else 子句,除非你用 break 语句跳出循环,否则它总是会被执行。

TrueFalse 被称为布尔类型,你可以将它们分别视为等价于值 10

给 C/C++ 程序员的提示

记住,while 循环也可以有一个 else 子句。

for 循环

for..in 语句是另一种循环语句,它对一个对象序列进行迭代(iterate),即遍历序列中的每个项目。我们将在后面的章节中详细了解序列。你现在只需要知道序列就是一个有序的项目集合。

示例(保存为 for.py):

for i in range(1, 5):
    print(i)
else:
    print('The for loop is over')

输出:

$ python for.py
1
2
3
4
The for loop is over

工作原理

在这个程序中,我们打印一个数字序列。我们使用内置的 range 函数来生成这个数字序列。

我们在这里做的是向它提供两个数字,range 返回一个从第一个数字开始到第二个数字结束的数字序列。例如,range(1,5) 给出序列 [1, 2, 3, 4]。默认情况下,range 的步长为 1。如果我们向 range 提供第三个数字,那么它就变成步长。例如,range(1,5,2) 给出 [1,3]。请记住,range 的范围延伸到第二个数字,即它不包含第二个数字。

请注意,range() 每次只生成一个数字,如果你想获得完整的数字列表,可以在 range() 上调用 list(),例如,list(range(5)) 将得到 [0, 1, 2, 3, 4]。列表将在数据结构章节中解释。

然后 for 循环对这个范围进行迭代——for i in range(1,5) 等同于 for i in [1, 2, 3, 4],就像将序列中的每个数字(或对象)依次赋值给 i,然后为 i 的每个值执行语句块。在这个例子中,我们只是在语句块中打印值。

请记住,else 部分是可选的。当包含它时,它总是在 for 循环结束后执行一次,除非遇到 break 语句。

请记住,for..in 循环适用于任何序列。在这里,我们有一个由内置 range 函数生成的数字列表,但一般来说,我们可以使用任何类型的对象序列!我们将在后面的章节中详细探讨这个概念。

给 C/C++/Java/C# 程序员的提示

Python 的 for 循环与 C/C++ 的 for 循环截然不同。C# 程序员会注意到 Python 的 for 循环类似于 C# 中的 foreach 循环。Java 程序员会注意到它类似于 Java 1.5 中的 for (int i : IntArray)

在 C/C++ 中,如果你想写 for (int i = 0; i < 5; i++),那么在 Python 中你只需写 for i in range(0,5)。如你所见,Python 中的 for 循环更简单、更具表达力,也不容易出错。

break 语句

break 语句用来跳出循环语句,即停止循环语句的执行,即使循环条件还没有变为 False 或者序列中的项目还没有被完全遍历。

需要注意的是,如果你从 forwhile 循环中 break 出来,任何相应的循环 else 块都不会被执行。

示例(保存为 break.py):

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    print('Length of the string is', len(s))
print('Done')

输出:

$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done

工作原理

在这个程序中,我们反复获取用户的输入,并每次打印输入的长度。我们通过检查用户输入是否为 'quit' 来提供一个特殊的停止条件。我们通过 break 跳出循环来停止程序,到达程序的末尾。

输入字符串的长度可以使用内置的 len 函数来获取。

请记住,break 语句也可以与 for 循环一起使用。

Swaroop 的诗意 Python

我在这里使用的输入是我写的一首小诗:

Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!

continue 语句

continue 语句用来告诉 Python 跳过当前循环块中剩余的语句,继续到循环的下一次迭代。

示例(保存为 continue.py):

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    if len(s) < 3:
        print('Too small')
        continue
    print('Input is of sufficient length')
    # Do other kinds of processing here...

输出:

$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit

工作原理

在这个程序中,我们接受用户的输入,但只有当输入字符串长度至少为 3 个字符时才进行处理。因此,我们使用内置的 len 函数来获取长度,如果长度小于 3,我们使用 continue 语句跳过块中剩余的语句。否则,循环中剩余的语句会被执行,执行我们想要进行的任何处理。

请注意,continue 语句也可以与 for 循环一起使用。

小结

我们已经了解了如何使用三种控制流语句——ifwhilefor,以及它们相关的 breakcontinue 语句。这些是 Python 中最常用的部分之一,因此熟练掌握它们是至关重要的。

接下来,我们将学习如何创建和使用函数。

results matching ""

    No results matching ""