Python:列表理解背后的机制

2024-01-22

当使用列表理解或infor 循环上下文中的关键字,即:

for o in X:
    do_something_with(o)

or

l=[o for o in X]
  • 背后的机制如何in works?
  • 其中包含哪些函数\方法X它打电话吗?
  • If X可以遵循多种方法,优先顺序是什么?
  • 如何写出高效的X,这样列表理解会很快?

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

for,在 for 循环和列表推导式中,都调用iter() on X. iter()将返回一个可迭代的 ifX要么有一个__iter__方法或__getitem__方法。如果两者都实现的话,__iter__用来。如果两者都没有,你就会得到TypeError: 'Nothing' object is not iterable.

这实现了一个__getitem__:

class GetItem(object):
    def __init__(self, data):
        self.data = data

    def __getitem__(self, x):
        return self.data[x]

Usage:

>>> data = range(10)
>>> print [x*x for x in GetItem(data)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

这是一个实施的例子__iter__:

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)

Usage:

>>> data = range(10)
>>> print [x*x for x in Iter(data)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

如您所见,您需要实现迭代器,并且__iter__返回迭代器。

您可以将它们组合起来:

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

Usage:

>>> well, you get it, it's all the same...

但是这样你一次只能有一个迭代器运行。 好的,在这种情况下你可以这样做:

class CheatIter(object):
    def __init__(self, data):
        self.data = data

    def __iter__(self):
        return iter(self.data)

但这是作弊,因为你只是重复使用__iter__的方法list。 一个更简单的方法是使用yield,然后使__iter__进入发电机:

class Generator(object):
    def __init__(self, data):
        self.data = data

    def __iter__(self):
        for x in self.data:
            yield x

最后是我推荐的方式。简单高效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:列表理解背后的机制 的相关文章

随机推荐