第2章:控制流程:深入浅出 Python 循环语句
点击上方“ 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 # 改变条件以退出循环
循环控制语句
除了基本的 for
和 while
循环,Python 还提供了 break
和 continue
语句来更细致地控制循环的行为。
-
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)
高级部分
对于循环语句(for
和while
),CPython的字节码和指令集提供了特定的操作码(opcodes)来处理循环的逻辑。以下是一些与循环相关的CPython字节码指令:
for
循环的字节码实现
在CPython中,for
循环通常转换为FOR_ITER
和FOR_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_LOOP
和JUMP_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中的实现
以下是关于for
和while
循环在CPython中实现的一些具体细节。
for
循环的实现
for
循环在Python中通常用于遍历序列或迭代器。在CPython的实现中,for
循环的关键在于迭代器协议的实现。迭代器是一个包含__next__
和__iter__
方法的对象,它们分别用于获取下一个元素和创建迭代器。
当Python代码执行for
循环时,以下步骤在CPython的C语言层面发生:
- 获取迭代器:
for
循环首先调用可迭代对象的__iter__
方法来获取一个迭代器对象。 - 循环迭代:在循环体内部,通过调用迭代器的
__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语言层面发生:
- 条件评估:在每次循环迭代开始时,
while
循环的条件表达式被求值。 - 执行循环体:如果条件为真(非零),则执行循环体内的代码。
- 循环继续:循环结束后,再次评估条件表达式,如此往复直到条件为假。
以下是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代码转换为高效的机器代码执行。
推荐阅读