Python: the mechanism behind list comprehension
在for循环上下文中使用list construction或
1 2 | for o in X: do_something_with(o) |
或
1 | l=[o for o in X] |
in 背后的机制是如何工作的?- 它调用
X 中的哪些函数方法? - 如果
X 可以遵循多个方法,那么优先级是什么? - 如何写一个高效的
X ,以便快速理解列表?
完整的和正确的,据我所知,答案。
本实施
1 2 3 4 5 6 | class GetItem(object): def __init__(self, data): self.data = data def __getitem__(self, x): return self.data[x] |
用法:
1 2 3 | >>> data = range(10) >>> print [x*x for x in GetItem(data)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] |
在一个实施例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class TheIterator(object): def __init__(self, data): self.data = data self.index = -1 # Note: In Python 3 this is called __next__ def next(self): self.index += 1 try: return self.data[self.index] except IndexError: raise StopIteration def __iter__(self): return self class Iter(object): def __init__(self, data): self.data = data def __iter__(self): return TheIterator(data) |
用法:
1 2 3 | >>> data = range(10) >>> print [x*x for x in Iter(data)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] |
你需要为你的湖都在实施这
你可以把他们:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class CombinedIter(object): def __init__(self, data): self.data = data def __iter__(self): self.index = -1 return self def next(self): self.index += 1 try: return self.data[self.index] except IndexError: raise StopIteration |
用法:
1 | >>> well, you get it, it's all the same... |
然后你可以一个迭代器只能去一次。好的,你只是在做这个案例:
1 2 3 4 5 6 | class CheatIter(object): def __init__(self, data): self.data = data def __iter__(self): return iter(self.data) |
但这是作弊,因为你只是一
1 2 3 4 5 6 7 | class Generator(object): def __init__(self, data): self.data = data def __iter__(self): for x in self.data: yield x |
这是一个很好的方式负载。容易和高效。
列表、元组和发电机都是可迭代变量。
注意,平原
回答问题的评论,我可以说是最好的阅读源代码的想法在这个案例。这是负责的代码编译的代码执行(ceval.c)不似乎是一个非常详细的Python源湖人的第一次。这里是代码,代表在for循环迭代。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | TARGET(FOR_ITER) /* before: [iter]; after: [iter, iter()] *or* [] */ v = TOP(); /* Here tp_iternext corresponds to next() in Python */ x = (*v->ob_type->tp_iternext)(v); if (x != NULL) { PUSH(x); PREDICT(STORE_FAST); PREDICT(UNPACK_SEQUENCE); DISPATCH(); } if (PyErr_Occurred()) { if (!PyErr_ExceptionMatches( PyExc_StopIteration)) break; PyErr_Clear(); } /* iterator ended normally */ x = v = POP(); Py_DECREF(v); JUMPBY(oparg); DISPATCH(); |
找到什么是发生在这里,你需要一个高压堆其他冗长的文件是没有太多的更好。因此,我认为在搜索实例文档和网站像是走在第一位的源uncovered只应检查的实施细节。
因此,开始一
我不知道你的第三个均值,和如何提供有意义的答案的问题,你的迭代器除了四不构成整个列表中存储一次。
也许这帮助(教程http:/ / / classes.html第9.9 docs.python.org教程):
Behind the scenes, the for statement
calls iter() on the container object.
The function returns an iterator
object that defines the method next()
which accesses elements in the
container one at a time. When there
are no more elements, next() raises a
StopIteration exception which tells
the for loop to terminate.
在回答你的问题:
怎么在作品背后的机制?
它是一个确切的机制用于普通的for循环,因为别人已经注意到。
它的功能在X 的方法是调用?
他指出,在评论下面,它调用
如果x是一个CAN用户比法,precedence什么的?
我不知道你的问题在这里,所有的规则,但安切洛蒂标准Python for IT resolves法知识和他们的名字,他们是在这里。这是一本讨论:
方法顺序(MRO)的决议在Python类的新风格
如何写有效X,这样的理解将快速列表?
我建议你读起来更在Python中iterators和发电机。一个哈希任何类化妆品A是支持迭代,使发电机的功能(ITER)。这里是讨论:a)发电机
linuxgazette.net http:/ / / / pramode.html 100