zoukankan      html  css  js  c++  java
  • PYTHON-迭代器、可迭代对象

    1.迭代:

      通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做,上一次产生的结果为下一次产生结果的初始状态,如果中途有任何停顿,都不能算是迭代。

    #1)    非迭代例子
    loop = 0
    while loop < 3:
        print("Hello world!")
        loop += 1
    #2)     迭代例子
    loop = 0
    while loop < 3:
        print(loop)
    loop += 1

    2.容器:

      容器仅仅只是用来存放数据的,我们平常看到的 l = [1,2,3,4]等等,好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。

    3.可迭代对象(Iterable):

      实现了__iter__()就行;

      可迭代对象并不是指某种具体的数据类型,它是指存储了元素的一个容器对象。

      一个可迭代对象是不能独立进行迭代的,Python中,迭代是通过for ... in来完成的。凡是可迭代对象都可以直接用for… in…循环访问,这个语句其实做了两件事:第一件事是调用__iter__()获得一个可迭代器,第二件事是循环调用__next__()。

      常见的可迭代对象包括:a)    集合数据类型,如list、tuple、dict、set、str等;b)生成器(generator)

    4.迭代器(Iterator):

      迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个迭代器对象必须是定义了__iter__()方法和next()方法的对象

      系统的 for i in 可迭代器or可迭代对象:... 这个最后有个 StopIteration  异常来检验是否结束迭代;

    >>> a = [1,2,3]
    >>> b = iter(a)
    >>> b
    <list_iterator object at 0x09CF4210>
    >>> b.__next__()
    1
    >>> b.__next__()
    2
    >>> b.__next__()
    3
    >>> b.__next__()
    Traceback (most recent call last):
      File "<pyshell#18>", line 1, in <module>
        b.__next__()
    StopIteration

    原因如下:

    class B(object):
        def __next__(self):
            raise StopIteration
    
    class A(object):
        def __iter__(self):
            pass
            return B()#return B()
    #A这个类实现了一个__iter__函数,返回的是B()的实例对象,其中B里面实现了__next__这个函数。
    
    from collections.abc import *
    
    a = A()
    b = B()
    print(isinstance(a, Iterable))#因为有__iter__ 所以其是一个可迭代对象Iterable
    print(isinstance(a, Iterator))#因为没有__next__  所以不是一个迭代器Iterator
    
    print(isinstance(b, Iterable))#因为没有__iter__,所以不是一个可迭代对象
    print(isinstance(b, Iterator))#因为没有__iter__ ,所以不是一个迭代器
    #output
    True
    False
    False
    False
    >>> 

    这样B就行了:

    class B(object):
        def __next__(self):
            raise StopIteration
    
        def __iter__(self):
            return None
    
    class A(object):
        def __iter__(self):
            return B()
    
    
    from collections.abc import *
    
    a = A()
    b = B()
    print(isinstance(a, Iterable))#使用 isinstance(obj, Iterable) 可以检测一个类是否已经注册到了 Iterable 或者实现了 __iter__() 函数,
    print(isinstance(a, Iterator))
    
    print(isinstance(b, Iterable))
    print(isinstance(b, Iterator))
    #output:
    True
    False
    True
    True

    raise:

    try:
        a = input("输入一个数:")
        #判断用户输入的是否为数字
        if(not a.isdigit()):
            raise ValueError("a 必须是数字")
    except ValueError as e:
        print("引发异常:",repr(e)) #repr() 函数将对象转化为供解释器读取的形式。

    5.__getitem__(),让对象实现可迭代功能:

    #任何Python序列都可迭代的原因是,他们都实现了__getitem__方法。其实,标准的序列也都实现了 __iter__方法。
    >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

    原文链接:https://blog.csdn.net/LaoYuanPython/article/details/89609187

    参考链接:

    https://www.jianshu.com/p/1b0686bc166d

    collections.abc 可以参考这里:https://docs.python.org/zh-cn/3/library/collections.abc.html

    raise: http://c.biancheng.net/view/2360.html

    repr: https://www.runoob.com/python/python-func-repr.html

    __getitem__(): https://blog.csdn.net/ZT7524/article/details/96479481

  • 相关阅读:
    iOS项目中常见的文件
    RN 导入原有Xcode项目中,引入Pod依赖出现的问题与解决
    Xcode中StoryBoard Reference 新特性的使用
    非等高cell实战(01)-- 实现微博页面
    iOS回顾笔记(09) -- Cell的添加、删除、更新、批量操作
    iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结
    unittest中的测试固件
    unittest测试用例的执行顺序
    unittest各个组件之间的关系
    ubuntu16.04开机时的.local问题
  • 原文地址:https://www.cnblogs.com/xiao-yu-/p/12708866.html
Copyright © 2011-2022 走看看