Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在基本的计算机级别上,循环是如何工作的?_Python - Fatal编程技术网

Python 在基本的计算机级别上,循环是如何工作的?

Python 在基本的计算机级别上,循环是如何工作的?,python,Python,例如,在python中 for i in range(5): print(i) 这是一个基本的循环,但在计算机内部,通常会处理循环。计算机如何执行循环? 对于我们人类来说,我们只需为编写,循环就能工作,但计算机是如何做到的呢?Python包含了用于“反汇编”代码的功能。这会让您了解函数的字节码可能是什么样子的*-计算机执行的分步指令 >>> def example(): ... for i in range(5): ... print(i) ..

例如,在python中

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实现的细节,你应该检查你感兴趣的解释器的源代码。