from collections import Iterable, Iterator
a = [1, 2, 3]
class A(object):
def __init__(self):
pass
print isinstance(A(), Iterable)
輸出:
False
from collections import Iterable, Iterator
a = [1, 2, 3]
class A(object):
def __init__(self):
pass
def __iter__(self):
return None
obj_a = A()
print isinstance(obj_a, Iterable)
for i in obj_a:
print i
輸出:
True
TypeError: iter() returned non-iterator of type 'NoneType'
對(duì)比上面兩個(gè)例子羡微,可以得出有_iter_方法的對(duì)象就是可迭代對(duì)象谷饿, 但是可迭代對(duì)象不一定就可以用for 循環(huán)去迭代獲取對(duì)象中的數(shù)據(jù),比如上例中有_iter_中的的A()妈倔,就不能用在for循環(huán)中博投,因?yàn)開iter_\返回的不是一個(gè)迭代器對(duì)象。
上例中的for i in A()盯蝴,也說明了一個(gè)python 魔法毅哗,那就是for 循環(huán)一個(gè)對(duì)象的時(shí)候,會(huì)調(diào)用iter函數(shù)生成一個(gè)迭代器對(duì)象捧挺,然后遍歷這個(gè)可迭代的對(duì)象虑绵。 將上面的例子改成如下:
from collections import Iterable, Iterator
a = [1, 2, 3]
class A(object):
def __init__(self):
pass
def __iter__(self):
return iter(a)
obj_a = A()
print isinstance(obj_a, Iterable)
for i in obj_a:
print i
輸出:
true
1
2
3
python中有很多原生的數(shù)據(jù)結(jié)構(gòu)就是可迭代對(duì)象,比如容器中的list set等都是可迭代對(duì)象
a = [1, 2, 3]
print type(a)
print isinstance(a, Iterable)
輸出:
<type 'list'>
True
總結(jié): 就有_iter_方法的對(duì)象就是可迭代對(duì)象闽烙,但是只有_iter_方法返回的是迭代器對(duì)象翅睛,那么這個(gè)可迭代對(duì)象才可以用于for循環(huán)
迭代器對(duì)象:具有_iter_方法,且_iter_返回自身self;并且就有_next_方法捕发,_next_方法返回下一個(gè)元素疏旨。
上面說到list對(duì)象通過iter函數(shù)會(huì)生成一個(gè)迭代器對(duì)象
a = [1, 2, 3]
print type(a)
print isinstance(a, Iterable)
print isinstance(a, Iterator)
print isinstance(iter(a), Iterator)
輸出:
<type 'list'>
True
False
True
實(shí)驗(yàn)說明,list本身不是迭代器對(duì)象扎酷,但是通過iter函數(shù)后充石,返回的是迭代器對(duì)象。
for 循環(huán)可迭代對(duì)象霞玄,就是調(diào)用了iter()函數(shù)骤铃,生成迭代器對(duì)象,然后調(diào)用迭代器對(duì)象的_next_函數(shù)