• python迭代器、生成器、装饰器之迭代器


    迭代是Python最强大的功能之一,是访问集合元素的一种方式。
    一般分为可迭代对象,迭代器,可迭代对象不一定是迭代器,但迭代器一定是可迭代对象
    1、可以直接作用于for循环的数据类型
      第一类:集合数据类型,如list、tuple、dict、set、str等;
      第二类:generator,包括集合定义generator和带yield的generator(也就是generator function)。
    以上这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    可以使用isinstance()判断一个对象是否是Iterable对象:可迭代代对象一般内置__iter__()方法,或者是可以利用iter()函数转变为Iterator的对象,iter()为内置函数,作用是将可迭代对象转变为迭代器,而__iter__()继承于iter()
    def iter(source, sentinel=None): # known special case of iter
        """
        iter(iterable) -> iterator
        iter(callable, sentinel) -> iterator
        
        Get an iterator from an object.  In the first form, the argument must
        supply its own iterator, or be a sequence.
        In the second form, the callable is called until it returns the sentinel.
        """
        pass
        def __iter__(self, *args, **kwargs): # real signature unknown
            """ Implement iter(self). """
            pass
    from collections import Iterable
    print(isinstance([], Iterable))  # True
    print(isinstance({}, Iterable))  # True
    print(isinstance((), Iterable))  # True
    print(isinstance('abc', Iterable))  # True
    print(isinstance(123, Iterable))  # Flase

    2、迭代器(Iterator)

    可以使用isinstace()判断一个对象是否是Iterator对象:

    当一个可迭代对象调用__iter__()或者iter()后得到的就是一个迭代器对象,而迭代器对象可以通过__next__()或者next()方法进行取值,取值特点是,一次取出一个值,不能后退,当值取完时会抛出StopIteration异常

    # 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
    # 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
    # 以使用isinstance()判断一个对象是否是Iterator对象:
    print(isinstance((x for x in range(10)), Iterator))  #True
    print(isinstance([], Iterator))  # Flase
    print(isinstance([].__iter__(), Iterator))  # True
    print(isinstance({}, Iterator))  # Flase
    print(isinstance(iter({}), Iterator))  # True
    print(isinstance((), Iterator))  # Flase
    print(isinstance('abc', Iterator))  # Flase

    迭代器通过__next__()或者next()取值

    l = [1, 2, 3]
    l = l.__iter__()
    print(l.__next__())
    print(next(l))

    迭代器的优缺点:

    # 优点:
    #   - 提供一种统一的、不依赖于索引的迭代方式
    #   - 惰性计算,节省内存
    # 缺点:
    #   - 无法获取长度(只有在next完毕才知道到底有几个值)
    #   - 一次性的,只能往后走,不能往前退
  • 相关阅读:
    SVN使用教程总结
    windows禅道环境搭建
    反编译.NET工程
    DAO层,Service层,Controller层、View层 的分工合作
    MyBatis在insert插入操作时返回主键ID的配置
    MySQL中You can't specify target table for update in FROM clause异常
    MySQL对时间戳的转换处理
    苹果台式一体机笔记本安装win双系统攻略教程
    Eclipse安装SVN教程
    java遇到 Check $M2_HOME 问题 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
  • 原文地址:https://www.cnblogs.com/June-King/p/10596207.html
Copyright © 2020-2023  润新知