Python 在基本的计算机级别上,循环是如何工作的?
例如,在python中Python 在基本的计算机级别上,循环是如何工作的?,python,Python,例如,在python中 for i in range(5): print(i) 这是一个基本的循环,但在计算机内部,通常会处理循环。计算机如何执行循环? 对于我们人类来说,我们只需为编写,循环就能工作,但计算机是如何做到的呢?Python包含了用于“反汇编”代码的功能。这会让您了解函数的字节码可能是什么样子的*-计算机执行的分步指令 >>> def example(): ... for i in range(5): ... print(i) ..
for i in range(5):
print(i)
这是一个基本的循环,但在计算机内部,通常会处理循环。计算机如何执行循环?
对于我们人类来说,我们只需为编写,循环就能工作,但计算机是如何做到的呢?Python包含了用于“反汇编”代码的功能。这会让您了解函数的字节码可能是什么样子的*-计算机执行的分步指令
>>> def example():
... for i in range(5):
... print(i)
...
>>> import dis
>>> dis.dis(example)
2 0 LOAD_GLOBAL 0 (range)
2 LOAD_CONST 1 (5)
4 CALL_FUNCTION 1
6 GET_ITER
>> 8 FOR_ITER 12 (to 22)
10 STORE_FAST 0 (i)
3 12 LOAD_GLOBAL 1 (print)
14 LOAD_FAST 0 (i)
16 CALL_FUNCTION 1
18 POP_TOP
20 JUMP_ABSOLUTE 8
>> 22 LOAD_CONST 0 (None)
24 RETURN_VALUE
在这里,我们可以看到这个过程大致如下:
预加载函数range()
将常量5
推到堆栈顶部
调用函数range()
将结果迭代器放在堆栈的顶部
使用FOR_ITER
指令,该指令似乎起到了“如果ITER被扩展则跳转”到第22行的作用,否则什么也不做
反复点击迭代器,加载print()
函数,调用它,然后跳回for
循环的开头
一旦for
循环结束,将None
加载到堆栈顶部并返回它(因为函数example()
不会显式返回任何其他内容)
*请注意,dis
不会提供计算机运行的实际机器代码。相反,它返回python字节码:
字节码是CPython解释器的一个实现细节
换句话说,您的python代码被编译成字节码,然后python运行时解释该字节码。python字节码指令和汇编指令之间并没有完美的一对一匹配(特别是因为这些ASM指令会因计算机的CPU体系结构而有所不同),但对于大多数情况来说,这足以说明发生了什么
在这种情况下,习语非常相似。不同之处在于,在主要的ASM类型中,您可能更容易看到函数range()
和print()
的参数加载到特定的CPU寄存器中,而不是推到堆栈顶部。for
循环的典型汇编实现将使用类似的习惯用法-在for
循环的开始处使用条件跳转(“如果为零则跳转”),并在结束前无条件跳转回到开始处。Python是一种高级语言,所以这个答案并不合适,因为它在引擎盖下有很多额外的东西
但在最低级别,处理器可以访问内存,存储处理器指令(例如“将此寄存器添加到此寄存器”和“将此寄存器保存到此内存位置”)。它还有一个非常重要的指令指针,指示它应该执行的下一条指令在内存中的位置
循环本质上是一个代码块,在结束时将指令指针设置回循环的开始,除非满足某些条件(在您的示例中,当i>=5
)。这相当于:
做点什么
多做些事情
我们在做事李>
将1添加到i
我等于5吗?转至说明7
转到步骤1
我们已经出局了李>
如果您想了解for
循环在while
循环方面的工作原理,可以参考以下代码:
sequence = iter(range(5))
try:
while True:
i = next(sequence)
print(i)
except StopIteration:
pass
我相信这就是它的工作原理。如果你想在更低的层次上理解它,你应该阅读@Green Coep Guy的答案。尝试学习计算机体系结构和汇编语言编程。for循环是Python语言的一个元素。虽然它的行为是由语言定义的,但没有定义它应该如何实现。实现是解释器的主题,每个解释器都有自己的主题。如果你想知道sbout实现的细节,你应该检查你感兴趣的解释器的源代码。