Python-高级:迭代器2

      迭代器是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__

总结:一个对象是迭代器,一定可以迭代;一个东西可以迭代,不一定是迭代器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值