第2章:控制流程:深入浅出 Python 循环语句
点击上方“Python学习开发”,选择“加为星标”
第一时间关注Python技术干货!
Python 3 作为一门动态、解释型的高级编程语言,以其简洁明了的语法和强大的功能库而广受欢迎。在最新版的Python 3中,循环语句是控制程序流程的重要结构之一,主要包括 for 循环和 while 循环。本文将对这两种循环语句进行梳理,帮助你更好地理解和使用它们。
for 循环
for 循环在Python中用于遍历序列(如列表、元组、字符串)或其他可迭代对象。其基本语法结构如下:
for item initerable:
# 代码块这里的 iterable 可以是任何可迭代对象,而 item 是在每次迭代中从 iterable 中取得的元素。for 循环会自动处理迭代器的创建和遍历过程,使得开发者可以专注于处理每个元素。
示例# 遍历列表fruits = [apple, banana, cherry]
for fruit infruits:
print(fruit)
# 遍历字符串for char in "hello":
print(char)
while 循环
while 循环则用于在条件为真时重复执行代码块。其基本语法结构如下:
whilecondition:
# 代码块这里的 condition 是一个布尔表达式,如果其值为 True,则执行循环体内的代码块;当 condition 变为 False 时,循环结束。
示例# 计数器counter = 0while counter < 5:
print(counter)
counter += 1# 使用条件表达式condition = Truewhilecondition:
print("Looping...")
condition = False # 改变条件以退出循环循环控制语句
除了基本的 for 和 while 循环,Python 还提供了 break 和 continue 语句来更细致地控制循环的行为。
break 语句用于立即退出循环。continue 语句用于跳过当前迭代的剩余部分,并开始下一次迭代。示例# 使用 break 退出循环for i in range(10):
if i == 5:
breakprint(i)
# 使用 continue 跳过迭代for i in range(10):
if i % 2 == 0:
continueprint(i)
高级部分
对于循环语句(for和while),CPython的字节码和指令集提供了特定的操作码(opcodes)来处理循环的逻辑。以下是一些与循环相关的CPython字节码指令:
for循环的字节码实现
在CPython中,for循环通常转换为FOR_ITER和FOR_LOOP指令。FOR_ITER用于初始化循环,而FOR_LOOP用于执行循环体。
for item insequence:
# 循环体这段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指令。
whilecondition:
# 循环体这段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代码转换为高效的机器代码执行。
推荐阅读