zoukankan      html  css  js  c++  java
  • python三大神器===》迭代器

    迭代器:

    1.认识迭代器

      迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

      我们怎样才能判定一个对象是都是可以迭代的呢?

    2.可迭代对象

      list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,这类对象被称为可迭代对象

    3. 如何判断一个对象是否是一个可迭代对象

      可以使用 isinstance() 判断一个对象是否是 Iterable 对象

     

    from collections import Iterable
    # 使用isinstance() 函数检测某个对象是否是一个可迭代的对象
    
    # 列表是可迭代对象
    result = isinstance([1,2], Iterable)
    print(result)
    
    # 元组是可迭代对象
    result = isinstance((1,2), Iterable)
    print(result)
    
    # 字符串是可迭代对象
    result = isinstance("hello", Iterable)
    print(result)
    
    # 字典是可迭代对象
    result = isinstance({"a": 10, "b": 100}, Iterable)
    print(result)
    
    # 数字不是可迭代对象
    result = isinstance(100, Iterable)
    print(result)
    
    # 定义类
    class MyClass(object):
        pass
    
    # 创建对象
    c1 = MyClass()
    # 对象c1不是可迭代对象
    result = isinstance(c1, Iterable)
    print(result)

    运行结果

    True
    True
    True
    True
    False
    False
    

    4.如何将一个不可迭代的对象转换为可迭代对象:

      在探讨这个问题之前我们需要了解,可迭代对象的本质:可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。而在python中内置的魔法方法__iter__()方法可以将一个对象转换为可迭代对象,因此只要一个类中有__iter__()方法,那么这个类实例出的对象就是个可迭代对象,接下来我们你验证下:

    from collections import Iterable
    # 使用isinstance() 函数检测某个对象是否是一个可迭代的对象
    
    
    class MyClass(object):
        # 可迭代对象的本质是,类中是否定义了 __iter__() 方法
        def __iter__(self):
            return self
    
    
    c1 = MyClass()
    # 对象c1不是可迭代对象
    result = isinstance(c1, Iterable)
    print(result)
    

     运行结果

    true
    

    5.创建一个迭代器类

      那么上面的创建的迭代对象能用next()访问吗?结果肯定是不能的,我们虽然在类中定义了一个__iter__()方法,但我们并没有定义一个函数去迭代这个类,这时我们需要用python的内置方法__next__()去迭代这个对象,接下来我们会分别创建一个迭代器和迭代对象去s验证:

    from collections import Iterable
    from collections import Iterator
    
    
    class StudentList(object):
    
        def __init__(self):
            # 创建列表
            self.items = list()
    
        def addItem(self,item):
            # 追加元素到列表中
            self.items.append(item)
    
        def __iter__(self):
    
            # 创建迭代器对象
            studentIterator = StudentIterator(self.items)
    
            # 返回迭代器对象
            return studentIterator
    
    
    # 定义迭代器
    class StudentIterator(object):
        # 定义构造方法
        # 1)完成 索引下标定义和初始化
        # 2)接收要遍历的列表值
    
        def __init__(self, items):
    
            self.items = items
            self.current_index = 0
    
        def __iter__(self):
            return self
    
        def __next__(self):
            # 判断位置是否合法
            if self.current_index < len(self.items):
                # 根据current_index 返回列表值
                item = self.items[self.current_index]
                # 让 下标+1
                self.current_index += 1
                # 返回元素内容
                return item
    
            else:
                # 停止迭代
                # 主动抛出异常,迭代器没有更多的值(到了迭代器末尾)
                raise StopIteration
    
    # 实例化对象
    stulist = StudentList()
    
    stulist.addItem("小明")
    stulist.addItem("小红")
    stulist.addItem("小刚")
    # 检查是否是可迭代对象
    result = isinstance(stulist, Iterable)
    print(result)
    
    for value in stulist:
        print(value)
    
    image-20180704185515374
    

      运行结果

    小明
    小红
    小刚
    

      注意:如果我们用next()访问的次数超过迭代对象的范围会报错,也许你会疑问为什么平时我们遍历列表,元组等可迭代对象时为什么没有这种情况,那是因为python内部在我们遍历可迭代对象时超出范围会自动停止,我们定义迭代器类时直接抛出错误了,没有做那么复杂的处理。

        

      

     

      

  • 相关阅读:
    liunx下一些服务小知识
    hausaufgabe--python 32
    hausaufgabe--python 31
    UnicodeDecodeError: 'gbk' codec can't decode byte 0xbc in position 21: illegal multibyte sequence
    hausaufgabe--python 30
    Running error: 'utf-8' codec can't decode byte 0xb4 in position 0: invalid start byte
    hausaufgabe--python 29- File 2
    Hausaufgabe--Python 28-- File 1
    hausaufgabe--python 27
    hausaufgabe--python 26 -Dict 2
  • 原文地址:https://www.cnblogs.com/xuchuankun/p/9508329.html
Copyright © 2011-2022 走看看