第2章:控制流程:深入浅出 Python 循环语句

共 7943字,需浏览 16分钟

 ·

2024-04-11 18:38


71c7e4a99a145702dfb26c05f2eebda7.webp

点击上方“ Python学习开发 ”,选择“ 加为星标

第一时间关注Python技术干货!

Python 3 作为一门动态、解释型的高级编程语言,以其简洁明了的语法和强大的功能库而广受欢迎。在最新版的Python 3中,循环语句是控制程序流程的重要结构之一,主要包括 for 循环和 while 循环。本文将对这两种循环语句进行梳理,帮助你更好地理解和使用它们。

for 循环

for 循环在Python中用于遍历序列(如列表、元组、字符串)或其他可迭代对象。其基本语法结构如下:

      
      for item in iterable:
    # 代码块

这里的 iterable 可以是任何可迭代对象,而 item 是在每次迭代中从 iterable 中取得的元素。for 循环会自动处理迭代器的创建和遍历过程,使得开发者可以专注于处理每个元素。

示例

      
      # 遍历列表
fruits = ['apple''banana''cherry']
for fruit in fruits:
    print(fruit)

# 遍历字符串
for char in "hello":
    print(char)

while 循环

while 循环则用于在条件为真时重复执行代码块。其基本语法结构如下:

      
      while condition:
    # 代码块

这里的 condition 是一个布尔表达式,如果其值为 True,则执行循环体内的代码块;当 condition 变为 False 时,循环结束。

示例

      
      # 计数器
counter = 0
while counter < 5:
    print(counter)
    counter += 1

# 使用条件表达式
condition = True
while condition:
    print("Looping...")
    condition = False  # 改变条件以退出循环

循环控制语句

除了基本的 forwhile 循环,Python 还提供了 breakcontinue 语句来更细致地控制循环的行为。

  • break 语句用于立即退出循环。
  • continue 语句用于跳过当前迭代的剩余部分,并开始下一次迭代。

示例

      
      # 使用 break 退出循环
for i in range(10):
    if i == 5:
        break
    print(i)

# 使用 continue 跳过迭代
for i in range(10):
    if i % 2 == 0:
        continue
    print(i)

高级部分

对于循环语句(forwhile),CPython的字节码和指令集提供了特定的操作码(opcodes)来处理循环的逻辑。以下是一些与循环相关的CPython字节码指令:

for循环的字节码实现

在CPython中,for循环通常转换为FOR_ITERFOR_LOOP指令。FOR_ITER用于初始化循环,而FOR_LOOP用于执行循环体。

      
      for item in sequence:
    # 循环体

这段Python代码会被编译为以下字节码(以Python 3.8为例):

      
        0 LOAD_GLOBAL              0 (sequence)
  3 GET_ITER                 // 获取迭代器
  6 FOR_ITER                // 准备进入循环
  9 SETUP_LOOP              1 (到标签 10)
 12 LOAD_FAST                0 (item)
 14 STORE_FAST               1 (item)
 17 JUMP_ABSOLUTE            9 (跳转到标签 9)
 20 POP_BLOCK               // 清理循环栈
 23 LOAD_CONST               1 (None)
 26 RETURN_VALUE

这里的SETUP_LOOP指令设置了一个循环的开始,JUMP_ABSOLUTE用于无条件跳转回循环的开始点,以便继续迭代。当迭代器耗尽时,会抛出StopIteration异常,循环结束。

while循环的字节码实现

while循环在CPython中通常转换为SETUP_LOOPJUMP_IF_TRUE_OR_POP指令。

      
      while condition:
    # 循环体

这段Python代码会被编译为以下字节码:

      
        0 LOAD_GLOBAL              0 (condition)
  3 JUMP_IF_FALSE           10 (到标签 10,如果条件为假)
  6 JUMP_ABSOLUTE            0 (无条件跳转回循环开始)
  9 POP_BLOCK                // 清理循环栈
 12 LOAD_CONST               1 (None)
 15 RETURN_VALUE

在这里,JUMP_IF_FALSE指令用于检查条件是否为假,如果为假则跳转到标签10,退出循环。如果条件为真,则继续执行循环体。POP_BLOCK指令用于在退出循环时清理栈上的循环状态。

需要注意的是,上述字节码示例是基于特定版本的Python解释器。随着Python版本的更新,字节码指令集可能会有所变化。要查看特定版本的字节码指令集,可以参考CPython的官方文档或使用Python的dis模块来反汇编和分析字节码。

高级部分Cpython中的实现

以下是关于forwhile循环在CPython中实现的一些具体细节。

for循环的实现

for循环在Python中通常用于遍历序列或迭代器。在CPython的实现中,for循环的关键在于迭代器协议的实现。迭代器是一个包含__next____iter__方法的对象,它们分别用于获取下一个元素和创建迭代器。

当Python代码执行for循环时,以下步骤在CPython的C语言层面发生:

  1. 获取迭代器for循环首先调用可迭代对象的__iter__方法来获取一个迭代器对象。
  2. 循环迭代:在循环体内部,通过调用迭代器的__next__方法来获取序列中的下一个元素。如果序列中没有更多元素,__next__方法将抛出一个StopIteration异常,该异常在Python层被捕获,从而结束循环。

以下是CPython中for循环的一个简化实现示例:

      
      PyObject *
PyFor_Iterate(PyObject *seq)
{
    PyObject *iterator = PyObject_GetIter(seq);
    if (iterator == NULL) {
        return NULL;
    }

    while (1) {
        PyObject *item = PyIter_Next(iterator);
        if (item == NULL) {
            if (PyErr_Occurred()) {
                Py_DECREF(iterator);
                return NULL;
            }
            break;  // No more items, exit loop
        }

        // Execute the loop body with the item
        // ...

        Py_DECREF(item);
    }

    Py_DECREF(iterator);
    Py_RETURN_NONE;
}

while循环的实现

while循环在Python中用于重复执行代码块,直到给定的条件不再为真。在CPython中,while循环的实现依赖于条件表达式的求值。

当Python代码执行while循环时,以下步骤在CPython的C语言层面发生:

  1. 条件评估:在每次循环迭代开始时,while循环的条件表达式被求值。
  2. 执行循环体:如果条件为真(非零),则执行循环体内的代码。
  3. 循环继续:循环结束后,再次评估条件表达式,如此往复直到条件为假。

以下是CPython中while循环的一个简化实现示例:

      
      PyObject *
PyWhile_Loop(PyObject *condition, PyObject *block)
{
    while (PyObject_IsTrue(condition)) {
        if (block == NULL) {
            return NULL;
        }

        // Execute the loop block
        // ...

        // Check for and handle exceptions
        // ...

        if (PyErr_Occurred()) {
            return NULL;
        }
    }

    Py_RETURN_NONE;
}

在这两个示例中,我们可以看到CPython如何通过C语言的函数和对象模型来实现Python的高级循环结构。这些实现细节展示了CPython如何将Python代码转换为高效的机器代码执行。

推荐阅读


第2章:控制流程:深入探究 Python 条件语句

第1章:Python基础:标准输入和输出


浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报