一篇看清 Python 中迭代器

迭代器:从一个实例对象中一个一个的取内容,取一个,指针移动到下一个内容,在往出去一个,指针在移动到下一个

最常见的实现迭代功能的方法是   for 循环  for i  in xx:

# 想要判断一个实力对象是否可以迭代 需要使用 collections 函数中 Iterable 类
# 例如
from collection import Iterable
   isinstance() 方法的作用判断 一个东西的生成是否受到另一个东西的影响
   isinstance(a,A) 如果a的出现是受到A的影响 isinstance() 方法就会返回一个True


Iterable 被称为可迭代对象,在python 中任意对象 只要它定义了一个可迭代方法 __iter__ 方法,或者定义了可以支持下标索引的__getitem__方法 ,那么它就是一个可迭代对象
# 我们常见的可迭代对象包括 list, tuple dict set str  ,不可迭代对象 int folt
# 自定义类
class Classmate(object):
    def __init__(self):
        self.names = [11,22,33]
# 创建类对象从概念上理解也可以称为调用类实例
classmate = Classmate()

# for 循环实现迭代功能  从一个实例对象中一个一个的取内容,取一个,指针移动到下一个内容,在往出去一个,指针在移动到下一个

for i in classmate:
    pass
# 如果一个对象想要被迭代,即可以正确使用for 循环 ,那么这个实例对象必要要有 __iter__ 方法
def __iter__():
    pass     # 即便我什么也不做,但他只要有__iter__() 方法,它就是一个可迭代对象,但它不具备可以被迭代的功能
    return  xxx    # 这个对象想要被迭代 你只有__iter__ 方法只是第一步,第二步还要__iter__ 返回一个对象的引用

场景:

class Classmate(object):
    def __init__(self):
        self.names = list()

    def add(self,name):
         self.names.append(name)
   # 重点

    def __iter__(self):
        return ClassIterable(self) 

实例对象: 指的是    Classmate

 步骤二:

# 想要使用for 循环 第一步先要看对象是否是可迭代对象,即它具备__iter__ 方法,第二步要看可迭代对象的__iter__ 方法,引用的返回值是否具备 __iter__ 方法 和__next__ 方法
class Classmate(object):
    def __init__(self):
        self.names = [11,22,33]
    # 首要具备条件
    def __iter__(self):
        return ClassIterable   # 返回ClassIterable对象的引用   / 必须返回一个迭代器

迭代器具备:__iter__  和 __next__  方法

 # 所谓引用它就会执行ClassIterable中的内容
class ClassIterable(object):
    def __iter__(self):
        pass
    # 如果引用ClassIterable类 对于for循环来说 ,就会调用 __next__ 方法
    # 调用一次取一个,for 每循环一次,都会调用__next__ ,直到 可迭代对象中没有内容
    def __next__(self):
        pass
__next__  方法类似c++ 中的指针  [11,22,33]  我如果已经取了11,__next__ 方法会将指针指向22,等待我区22,如果我取了22,__next__ 方法会指向33
class Classmate(object):
    def __init__(self):
        self.names = [11,22,33]

    def __iter__(self):
        return ClassIterable(self)  # 这是什么意思,Classmate()对象把自己的引用返回给了 ClassIterator 一份

class ClassIterable(object):
    def __iter__(self,obj):
        self.obj = obj
    def __init__(self):
         pass
    def __next__(self):
        return self.obj.names

classmate = Classmate()

如果类 Classmate 实例对象想要被迭代,必须具备以上函数功能要求

1. 实例对象自己有没有 __iter__ 方法

2. 自己的__iter__方法的返回值(实例对象)是不是一个迭代器。

3.如何判断是不是一个迭代器,看它具备  __iter__ 和__next__ 方法不。

4.如果都满足说明这个小伙子可以使用for循环来遍历结果,迭代对象不一定能被for循环遍历,看它自己 __iter__方法,返回的实例对象具备 __iter__ 和__next__ 方法不,如果具备说明可行,如果不具备,说明不能被for循环遍历

5.for 循环遍历的对象一定是一个迭代器或者 迭代器对象

上代码:

可迭代的实例对象:

import time

class Classmate(object):
    def __init__(self):
        self.names = list()

    def add(self,name):
         self.names.append(name)

    def __iter__(self):
        return ClassIterable(self)  # 这是什么意思,Classmate()对象把自己的引用返回给了 ClassIterator 一份

class ClassIterable(object):
     def __init__(self,obj):
         self.obj = obj
         self.current = 0
     def __iter__(self,obj):
         pass

     def __next__(self):
         if self.current < len(self.obj.names) :
                ret = self.obj.names[self.current]
                self.current += 1
                return ret
         else:
                raise StopIteration   # 抛出异常 异常的作用我想是结束for循环
classmate = Classmate()
classmate.add("小王")
classmate.add("小李")

for d in  classmate:
    print(d)
    time.sleep(1)

 迭代器对象:

import time

class Classmate(object):
    def __init__(self,):
        self.names = list()
        self.current = 0

    def add(self,name):
         self.names.append(name)

    def __iter__(self):
        return self    #  返回自己

    def __next__(self):
         if self.current < len(self.names) :
                ret = self.names[self.current]
                self.current += 1
                return ret
         else:
                raise StopIteration   # 抛出异常 异常的作用我想是结束for循环
classmate = Classmate()
classmate.add("小王")
classmate.add("小李")

for d in  classmate:
    print(d)
    time.sleep(1)
# 迭代器一定可以迭代,可迭代的对象不一定是迭代器

 那么python中如何检查一个对象是不是迭代器对象呢

什么可以称为迭代对象 一个类中存在__iter__方法

什么可以称作迭代器对象  一个类中存在 __iter__ 和 __next__() 方法我们就可以把他称为迭代器对象

如何检查一个对象是不是迭代器对象

from collection import Iterable   # 导入模块
Iterable 被称为可迭代对象,在python 中任意对象 只要它定义了一个可迭代方法 __iter__ 方法,或者定义了可以支持下标索引的__getitem__方法 ,那么它就是一个可迭代对象
# 我们常见的可迭代对象包括 list, tuple dict set str  ,不可迭代对象 int folt
# isinstance()   方法的作用判断 一个东西的生成是否受到另一个东西的影响
# isinstance(a,A)  如果a的出现是受到A的影响 isinstance() 方法就会返回一个True

猜你喜欢

转载自blog.csdn.net/weixin_59131972/article/details/131013796