在datatstructures.py中,有一种方法values()
:
def values(self):
"""Iterate over all values."""
for item in self:
yield item[0]
self
是该类的一个实例;如何迭代?
答案 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
相乘。这是事情的实现方式,因为它只是处理循环容器内容的常见情况的一种方式。不要过度思考事情,这是没有必要的。