关于实现:python:理解列表背后的机制

Python: the mechanism behind list comprehension

在for循环上下文中使用list construction或in关键字时,即:

1
2
for o in X:
    do_something_with(o)

1
l=[o for o in X]
  • in背后的机制是如何工作的?
  • 它调用X中的哪些函数方法?
  • 如果X可以遵循多个方法,那么优先级是什么?
  • 如何写一个高效的X,以便快速理解列表?


完整的和正确的,据我所知,答案。

forfor循环,在理解和战略,在Xiter()。在iter()将返回可迭代变量。如果有X__iter____getitem__方法或方法。如果它是工具,是用来__iter__。如果你把它TypeError: 'Nothing' object is not iterable也。

本实施__getitem__:a

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]

在一个实施例__iter__):

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]

你需要为你的湖都在实施这__iter__返回迭代器和迭代器。

你可以把他们:

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)

但这是作弊,因为你只是一__iter__list重用方法。单是在收益更容易使用,使一个__iter__发电机:

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

这是一个很好的方式负载。容易和高效。


X必须可迭代变量。它必须是实现__iter__()迭代器迭代器返回的对象;的对象必须实现next()归来下一项每一次,这是所谓的或举一StopIteration如果没有下一项。

列表、元组和发电机都是可迭代变量。

注意,平原for操作员使用相同的机制。


回答问题的评论,我可以说是最好的阅读源代码的想法在这个案例。这是负责的代码编译的代码执行(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只应检查的实施细节。


X可迭代变量的意义,必须对对象,它需要有一个__iter__()方法。

因此,开始一for..in环,或一个列表的第一X__iter__()理解,方法是要求获得迭代器对象,那么对象的方法是所谓的next()for each迭代直到StopIteration是提出,在这一点上停止迭代。

我不知道你的第三个均值,和如何提供有意义的答案的问题,你的迭代器除了四不构成整个列表中存储一次。


也许这帮助(教程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 的方法是调用?

他指出,在评论下面,它调用iter(X)得到引用。如果有一__iter__()X函数定义方法,这将要求在迭代器返回;否则,如果X__getitem__()的定义,本想出去到Xiterate过。在Python文档的iter()湖:http://docs.python.org /图书馆/ functions.html # ITER

如果x是一个CAN用户比法,precedence什么的?

我不知道你的问题在这里,所有的规则,但安切洛蒂标准Python for IT resolves法知识和他们的名字,他们是在这里。这是一本讨论:

方法顺序(MRO)的决议在Python类的新风格

如何写有效X,这样的理解将快速列表?

我建议你读起来更在Python中iterators和发电机。一个哈希任何类化妆品A是支持迭代,使发电机的功能(ITER)。这里是讨论:a)发电机

linuxgazette.net http:/ / / / pramode.html 100