我们的教授今天告诉我们,我们可以建立一个迭代器,例如
class IteratorExample:
def __init__(self, n):
pass
def __iter__(self):
return self
def __next__(self):
if cond:
pass
else:
raise StopIteration
并且当我们将使用它时,如(在iteratorExample中为i),解释器将调用__iter __(self)和__next __(self)方法。我的问题是:
答案 0 :(得分:2)
你可以查看Python字节码反汇编,看看如何在Python中实现for
- 循环:
>>> 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 source repository。
中查看它们内置方法来自builtins
模块,该模块在Python/bltinmodule.c e.g., len()
次调用PyObject_Size()
中实施。
int
是Python中的整数类。它在Objects/longobject.c(Python 3)中实现。
不是Python文件夹中的CPython代码吗?
没有。 Python安装文件夹不包含CPython的源代码。它可能包含标准库中的纯Python模块,例如Lib/fractions.py,除非它们是压缩的,或者只安装了.pyc
,.pyo
文件等编译模块。
要获取完整的源代码,请运行:
$ hg clone https://hg.python.org/cpython
其中hg
是Mercurial executable。
作为练习,您可以找到其他Python implementations的位置,例如Pypy,Jython定义GET_ITER
,FOR_ITER
,len()
,int()
。
答案 1 :(得分:0)
您要求内置于Python中的行为。特别是你使用的是用C语言编写的Python解释器,通常称为CPython。你可以找到CPython here的源代码,虽然它需要一段时间才能找到执行len()
,int()
和迭代器协议的确切代码。