Python入门教程第56篇 循环进阶之while…else语句

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门教程第56篇 循环进阶之while…else语句相关的知识,希望对你有一定的参考价值。

第 18 篇介绍了 Python 中的 while 循环语句。本篇讨论一下 while 语句的 else 分支选项。

while else 语句

Python 中的 while 语句支持一个可选的 else 分支,语法如下:

while condition:
    # code block to run
else:
    # else clause code block

以上语法中,每次迭代开始都会检测 condition,如果结果为 True,执行 while 语句中的代码。如果 condition 条件为 False,将会执行 else 分支。然而,如果循环被 break 或者 return 语句终止,则不会执行 else 分支。

以下流程图演示了 while…else 语句的执行过程:

接下来我们看一个示例。

while else 语句示例

以下是一个列表,包含了各种水果;每个水果由一个字典组成,包含了它的名称和数量。

basket = [
    'fruit': 'apple', 'qty': 20,
    'fruit': 'banana', 'qty': 30,
    'fruit': 'orange', 'qty': 10
]

现在我们需要编写一个程序,允许用户输入一个水果名称。然后基于该输入搜索 basket 列表,如果找到相应的水果则显示它的数量。如果没有找到相应的水果,允许用户输入该水果的数量并将其添加到列表中。

为此,我们可以编写以下程序:

basket = [
    'fruit': 'apple', 'qty': 20,
    'fruit': 'banana', 'qty': 30,
    'fruit': 'orange', 'qty': 10
]

fruit = input('Enter a fruit:')

index = 0
found_it = False

while index < len(basket):
    item = basket[index]
    # check the fruit name
    if item['fruit'] == fruit:
        found_it = True
        print(f"The basket has item['qty'] item['fruit'](s)")
        break

    index += 1

if not found_it:
    qty = int(input(f'Enter the qty for fruit:'))
    basket.append('fruit': fruit, 'qty': qty)
    print(basket)

以上代码并不是最佳实现,在此仅用于演示。它的执行过程如下:

  • 首先,使用 input() 函数接收用户输入。
  • 其次,将下标 index 初始化为 0,将 found_it 标识初始化为 False。下标 index 用于访问 basket 列表。found_it 标识将会在找到相应水果时被设置为 True。
  • 然后,遍历列表并检测对应水果名称是否和输入匹配。如果匹配,将 found_it 设置为 True,显示水果数量并退出循环。
  • 最后,循环结束后检查 found_it 标识,如果 found_it 结果为 False 则将新的水果追加到列表中。

使用 apple 作为输入时的运行结果如下:

Enter a fruit:apple
The basket has 20 apple(s)

使用 lemon 作为输入时的运行结果如下:

Enter a fruit:lemon
Enter the qty for lemon:15
['fruit': 'apple', 'qty': 20, 'fruit': 'banana', 'qty': 30, 'fruit': 'orange', 'qty': 10, 'fruit': 'lemon', 'qty': 15]

该程序可以按照预期运行,但是如果使用 while else 实现,可以更加简洁。例如:

basket = [
    'fruit': 'apple', 'qty': 20,
    'fruit': 'banana', 'qty': 30,
    'fruit': 'orange', 'qty': 10
]

fruit = input('Enter a fruit:')

index = 0

while index < len(basket):
    item = basket[index]
    # check the fruit name
    if item['fruit'] == fruit:
        print(f"The basket has item['qty'] item['fruit'](s)")
        found_it = True
        break

    index += 1
else:
    qty = int(input(f'Enter the qty for fruit:'))
    basket.append('fruit': fruit, 'qty': qty)
    print(basket)

修改后的程序不需要使用 found_it 标识和循环语句之后的 if 语句。如果没有找到相应的水果,while 循环将会正常终止,并且执行 else 分支增加新的水果。如果找到了相应的水果,while 循环将会通过 break 语句提前终止,此时不会执行 else 分支。

总结

  • 如果 while else 语句的循环检查条件为 False,并且循环不是通过 break 或者 return 语句终止,将会执行 else 分支。
  • 如果 while 循环中存在任何标识变量,可以尝试使用 while else 语句。

以上是关于Python入门教程第56篇 循环进阶之while…else语句的主要内容,如果未能解决你的问题,请参考以下文章

Python入门教程第55篇 循环进阶之for…else语句

Python入门教程第18篇 while循环语句

Python从入门到进阶10流程控制语句-循环语句(for-while)

Python入门教程第62篇 函数进阶之类型提示

Python入门教程第61篇 函数进阶之偏函数

Python入门教程第58篇 函数进阶之元组解包