您可以查看 Python 字节码反汇编,了解for
-loop 在 Python 中是如何实现的:
>>> import dis
>>> dis.dis('for x in it: pass')
1 0 SETUP_LOOP 14 (to 17)
3 LOAD_NAME 0 (it)
6 GET_ITER
>> 7 FOR_ITER 6 (to 16)
10 STORE_NAME 1 (x)
13 JUMP_ABSOLUTE 7
>> 16 POP_BLOCK
>> 17 LOAD_CONST 0 (None)
20 RETURN_VALUE
即使不查看源代码,我们也可以猜测它__iter__
是由GET_ITER
操作码__next__
调用并在FOR_ITER
.
事实上,CPython 的Python/ceval.c证实了这一点,例如,GET_ITER
调用PyObject_GetIter(iterable)
等效于iter(iterable)
可以调用iterable.__iter__()
方法的调用。
在 python 文件夹中,我在哪里可以看到其他内置方法的代码(如 len() 或 int()?
这些函数也在 C 中(在 CPython 中)实现。您可以在CPython 源代码库中看到它们。
内置方法来自在Python/bltinmodule.cbuiltins
中实现的模块,例如,调用。len()
PyObject_Size()
int
是 Python 中的整数类。它在Objects/longobject.c (Python 3) 中实现。
Python文件夹里不是CPython代码吗?
不,Python 安装文件夹不包含 CPython 的源代码。它可能包含来自标准库(例如Lib/fractions.py )的纯 Python 模块,除非它们被压缩或仅安装了编译模块(例如.pyc
,.pyo
文件)。
要获取完整的源代码,请运行:
$ hg clone https://hg.python.org/cpython
Mercurial 可执行文件hg
在哪里。
作为练习,您可以找到其他Python 实现(例如 Pypy、Jython 定义、、、、、GET_ITER
)FOR_ITER
的len()
位置int()
。