これが定義の要約です。
容器
__contains__
メソッドを持つオブジェクト
発生器
反復可能
__iter__()
or__getitem__()
メソッドを持つオブジェクト。
- iterableの例には、すべてのシーケンスタイプ(list、str、tupleなど)と、dictやfileなどの非シーケンスタイプが含まれます。
- 反復可能オブジェクトが引数として組み込み関数に渡されると
iter()
、オブジェクトのイテレーターを返します。このイテレータは、値のセットを1回渡すのに適しています。
イテレータ
next()
メソッドを持つiterable 。
__iter__()
イテレータには、イテレータオブジェクト自体を返すメソッドが必要です
。
- イテレータは、値のセットを1回パスするのに適しています。
順序
- 特別なメソッドを介して整数インデックスを使用して効率的な要素アクセスをサポートし、シーケンスの長さを返すメソッド
__getitem__()
を定義するiterable。len()
- いくつかの組み込みシーケンスタイプは、、、、
list
およびです。str
tuple
unicode
- dictも
__getitem__()
and
__len__()
をサポートしますが、ルックアップは整数ではなく任意の不変キーを使用するため、シーケンスではなくマッピングと見なされることに注意してください。
現在、オブジェクトがイテレータ、イテレータ、またはある種のシーケンスであるかどうかをテストする方法は多数あります。これらの方法の概要と、さまざまな種類のオブジェクトを分類する方法を次に示します。
Iterable Iterator iter_is_self Sequence MutableSeq
object
[] True False False True True
() True False False True False
set([]) True False False False False
{} True False False False False
deque([]) True False False False False
<listiterator> True True True False False
<generator> True True True False False
string True False False True False
unicode True False False True False
<open> True True True False False
xrange(1) True False False True False
Foo.__iter__ True False False False False
Sized has_len has_iter has_contains
object
[] True True True True
() True True True True
set([]) True True True True
{} True True True True
deque([]) True True True False
<listiterator> False False True False
<generator> False False True False
string True True False True
unicode True True False True
<open> False False True False
xrange(1) True True True False
Foo.__iter__ False False True False
各列は反復可能オブジェクトを分類するための異なる方法を参照し、各行は異なる種類のオブジェクトを参照します。
import pandas as pd
import collections
import os
def col_iterable(obj):
return isinstance(obj, collections.Iterable)
def col_iterator(obj):
return isinstance(obj, collections.Iterator)
def col_sequence(obj):
return isinstance(obj, collections.Sequence)
def col_mutable_sequence(obj):
return isinstance(obj, collections.MutableSequence)
def col_sized(obj):
return isinstance(obj, collections.Sized)
def has_len(obj):
return hasattr(obj, '__len__')
def listtype(obj):
return isinstance(obj, types.ListType)
def tupletype(obj):
return isinstance(obj, types.TupleType)
def has_iter(obj):
"Could this be a way to distinguish basestrings from other iterables?"
return hasattr(obj, '__iter__')
def has_contains(obj):
return hasattr(obj, '__contains__')
def iter_is_self(obj):
"Seems identical to col_iterator"
return iter(obj) is obj
def gen():
yield
def short_str(obj):
text = str(obj)
if text.startswith('<'):
text = text.split()[0] + '>'
return text
def isiterable():
class Foo(object):
def __init__(self):
self.data = [1, 2, 3]
def __iter__(self):
while True:
try:
yield self.data.pop(0)
except IndexError: # pop from empty list
return
def __repr__(self):
return "Foo.__iter__"
filename = 'mytestfile'
f = open(filename, 'w')
objs = [list(), tuple(), set(), dict(),
collections.deque(), iter([]), gen(), 'string', u'unicode',
f, xrange(1), Foo()]
tests = [
(short_str, 'object'),
(col_iterable, 'Iterable'),
(col_iterator, 'Iterator'),
(iter_is_self, 'iter_is_self'),
(col_sequence, 'Sequence'),
(col_mutable_sequence, 'MutableSeq'),
(col_sized, 'Sized'),
(has_len, 'has_len'),
(has_iter, 'has_iter'),
(has_contains, 'has_contains'),
]
funcs, labels = zip(*tests)
data = [[test(obj) for test in funcs] for obj in objs]
f.close()
os.unlink(filename)
df = pd.DataFrame(data, columns=labels)
df = df.set_index('object')
print(df.ix[:, 'Iterable':'MutableSeq'])
print
print(df.ix[:, 'Sized':])
isiterable()