前
迭代器是python中一种特殊的对象。
讲解(详见代码):
1:
# 自己实现一个可迭代的对象
from collections import Iterable # 判断是否可以迭代
from collections import Iterator # 判断是否是迭代器
class Classmate(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
#要求:
# 1.如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法
def __iter__(self):
# 2.这个方法是否返回一个具有__iter__方法和__next__方法的对象的引用 (其实就是要返回一个迭代器)
return ClassIterator()
# pass
#########
# for temp in xxx_obj:
# pass
# 1.判断xxx_obj是否可以迭代(isinstance(xxx_obj, Iterable)==True,说白了看xxx_obj这个对象有没有__iter__)
# 2.在第一步成立的前提下,调用iter函数
# 得到xxx_obj的对象的__iter__方法的返回值
# 3.__iter__方法的返回值是一个迭代值
# 用for的时候,没调用一次便调用__next__
#########
# 类中有__iter__和__next__就是迭代器
class ClassIterator(object):
def __iter__(self):
pass
def __next__(self):
return 11
classmate = Classmate()
classmate.add('ablic')
classmate.add('adfas')
classmate.add('bidrer')
print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable)) # True
classmate_iterator = iter(classmate) # iter()调用classmate类的__iter__,而__iter__返回一个迭代器
print("判断classmate_iterator是否是迭代器:", isinstance(classmate, Iterator))
# print(next(classmate_iterator)) # next()调用迭代器中的__next__
# for循环取值时:
# step1:判断classmate是否是一个可迭代的对象(看看classmate是否有__iter__)
# step2:嗲用__iter__,得到一个迭代器
# step3:循环调用__next__
for name in classmate:
print(name)
# 所以现在的问题是:ClassIterator如何够到Classmate中的names?
2:
# 自己实现一个可迭代的对象
from collections import Iterable # 判断是否可以迭代
from collections import Iterator # 判断是否是迭代器
class Classmate(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
#要求:
# 1.如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法
def __iter__(self):
# 2.这个方法是否返回一个具有__iter__方法和__next__方法的对象的引用 (其实就是要返回一个迭代器)
return ClassIterator(self)
# pass
#########
# for temp in xxx_obj:
# pass
# 1.判断xxx_obj是否可以迭代(isinstance(xxx_obj, Iterable)==True,说白了看xxx_obj这个对象有没有__iter__)
# 2.在第一步成立的前提下,调用iter函数
# 得到xxx_obj的对象的__iter__方法的返回值
# 3.__iter__方法的返回值是一个迭代值
# 用for的时候,没调用一次便调用__next__
#########
# 类中有__iter__和__next__就是迭代器
class ClassIterator(object):
def __init__(self, obj):
self.obj = obj
def __iter__(self):
pass
def __next__(self):
# return 11
return self.obj.names[0]
classmate = Classmate()
classmate.add('ablic')
classmate.add('adfas')
classmate.add('bidrer')
print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable)) # True
classmate_iterator = iter(classmate) # iter()调用classmate类的__iter__,而__iter__返回一个迭代器
print("判断classmate_iterator是否是迭代器:", isinstance(classmate, Iterator))
# print(next(classmate_iterator)) # next()调用迭代器中的__next__
# for循环取值时:
# step1:判断classmate是否是一个可迭代的对象(看看classmate是否有__iter__)
# step2:嗲用__iter__,得到一个迭代器
# step3:循环调用__next__
for name in classmate:
print(name)
# 所以现在的问题是:ClassIterator如何够到Classmate中的names?
# 解决:ClassIterator用__init__
3:
# 自己实现一个可迭代的对象
from collections import Iterable # 判断是否可以迭代
from collections import Iterator # 判断是否是迭代器
class Classmate(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
#要求:
# 1.如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法
def __iter__(self):
# 2.这个方法是否返回一个具有__iter__方法和__next__方法的对象的引用 (其实就是要返回一个迭代器)
return ClassIterator(self)
# pass
#########
# for temp in xxx_obj:
# pass
# 1.判断xxx_obj是否可以迭代(isinstance(xxx_obj, Iterable)==True,说白了看xxx_obj这个对象有没有__iter__)
# 2.在第一步成立的前提下,调用iter函数
# 得到xxx_obj的对象的__iter__方法的返回值
# 3.__iter__方法的返回值是一个迭代值
# 用for的时候,没调用一次便调用__next__
#########
# 类中有__iter__和__next__就是迭代器
class ClassIterator(object):
def __init__(self, obj):
self.obj = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
# return 11
if self.current_num < len(self.obj.names):
ret = self.obj.names[self.current_num]
self.current_num = self.current_num + 1
return ret
else:
# 抛出“已经取完的异常”
raise StopIteration
classmate = Classmate()
classmate.add('ablic')
classmate.add('adfas')
classmate.add('bidrer')
print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable)) # True
classmate_iterator = iter(classmate) # iter()调用classmate类的__iter__,而__iter__返回一个迭代器
print("判断classmate_iterator是否是迭代器:", isinstance(classmate, Iterator))
# print(next(classmate_iterator)) # next()调用迭代器中的__next__
# for循环取值时:
# step1:判断classmate是否是一个可迭代的对象(看看classmate是否有__iter__)
# step2:嗲用__iter__,得到一个迭代器
# step3:循环调用__next__
for name in classmate:
print(name)
# 所以现在的问题是:ClassIterator如何够到Classmate中的names?
# 解决:ClassIterator用__init__
4.
# 自己实现一个可迭代的对象
from collections import Iterable # 判断是否可以迭代
from collections import Iterator # 判断是否是迭代器
class Classmate(object):
def __init__(self):
self.names = list()
self.current_num = 0
def add(self, name):
self.names.append(name)
#要求:
# 1.如果想要一个对象成为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法
def __iter__(self):
# 2.这个方法是否返回一个具有__iter__方法和__next__方法的对象的引用 (其实就是要返回一个迭代器)
return self
# pass
def __next__(self):
# return 11
if self.current_num < len(self.names):
ret = self.names[self.current_num]
self.current_num = self.current_num + 1
return ret
else:
# 抛出“已经取完的异常”
raise StopIteration
#########
# for temp in xxx_obj:
# pass
# 1.判断xxx_obj是否可以迭代(isinstance(xxx_obj, Iterable)==True,说白了看xxx_obj这个对象有没有__iter__)
# 2.在第一步成立的前提下,调用iter函数
# 得到xxx_obj的对象的__iter__方法的返回值
# 3.__iter__方法的返回值是一个迭代值
# 用for的时候,没调用一次便调用__next__
#########
# 类中有__iter__和__next__就是迭代器
# class ClassIterator(object):
# def __init__(self, obj):
# self.obj = obj
# self.current_num = 0
# def __iter__(self):
# pass
# def __next__(self):
# # return 11
# if self.current_num < len(self.obj.names):
# ret = self.obj.names[self.current_num]
# self.current_num = self.current_num + 1
# return ret
# else:
# # 抛出“已经取完的异常”
# raise StopIteration
classmate = Classmate()
classmate.add('ablic')
classmate.add('adfas')
classmate.add('bidrer')
print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable)) # True
classmate_iterator = iter(classmate) # iter()调用classmate类的__iter__,而__iter__返回一个迭代器
print("判断classmate_iterator是否是迭代器:", isinstance(classmate, Iterator))
# print(next(classmate_iterator)) # next()调用迭代器中的__next__
# for循环取值时:
# step1:判断classmate是否是一个可迭代的对象(看看classmate是否有__iter__)
# step2:嗲用__iter__,得到一个迭代器
# step3:循环调用__next__
for name in classmate:
print(name)
# 所以现在的问题是:ClassIterator如何够到Classmate中的names?
# 解决:ClassIterator用__init__
总结:一个对象是迭代器,一定可以迭代;一个东西可以迭代,不一定是迭代器。