如何迭代实例?

时间:2016-01-24 17:56:19

标签: python python-2.7 iteration instance self

datatstructures.py中,有一种方法values()

def values(self):
    """Iterate over all values."""
    for item in self:
        yield item[0]

self是该类的一个实例;如何迭代?

4 个答案:

答案 0 :(得分:2)

给定方法所属的类扩展start()-> Pid2 = spawn(?MODULE,check2,[]), spawn(?MODULE,check1,[Pid2]). check1(Pid2) -> {ok, Data} = file:read_file("input.txt"), B = binary:split(Data, [<<" ">>], [global]), K = [binary_to_list(Item) || Item <- B], [Pid2 ! Element || Element <- K]. check2() -> {ok,IoDevice} = file:open("check.txt", [read]), L = string:tokens(io:get_line(IoDevice,""), "! ."), receive Element -> case lists:member(Element,L)of true -> io:format(Element); false -> io:format("not_ok") end end. ,它是可迭代的,因此该方法可以迭代该类。

答案 1 :(得分:1)

很简单,它必须实现__iter__方法,例如

class Test:
    def __iter__(self):
        yield 1
        yield 2

>>> instance = Test()
>>> for val in instance:
...     print val
...
1
2

答案 2 :(得分:1)

如果有问题的对象是Iterable,则可以迭代它。这就是设计列表,序列和其他序列的方法。

答案 3 :(得分:1)

  

我的问题不是如何,而是如何(如:如何可能)

self指的是您处理的实际有形对象,classes更像是他们的界面(不要过于严格地解释这一点);如果一个实例&#39; class定义了__iter__(或__getitem__)方法,它们可以在for循环中迭代。 PEP 234 处理迭代器的语义和实现。

在您的特定情况下,功能是一个生成器,其中__iter__方法无关,它只是转换values函数生成器以支持表单的迭代:

for i in instance.values(): # do stuff

如果对象没有定义__iter__,那么它将无法迭代,例如:

class myfoo:
    def func(self):
        for i in range(10): yield i

f = myfoo()

实例f现在可迭代:

for i in f: print(i) # TypeError

另一方面,我们可以在func循环中使用for

for i in f.func(): print(i, end=" ")
0 1 2 3 4 5 6 7 8 9

func更改为__iter__会更改图片,现在实例f 可迭代:

class myfoo:
    def __iter__(self):
        for i in range(10): yield i

f = myfoo()

通过f进行迭代,直观地完成:

for i in f: print(i, end=" ")
0 1 2 3 4 5 6 7 8 9

问问为什么,如何这可能就像问为什么字符串可以与"s" * 4相乘。这是事情的实现方式,因为它只是处理循环容器内容的常见情况的一种方式。不要过度思考事情,这是没有必要的。