zoukankan      html  css  js  c++  java
  • 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完毕才知道到底有几个值)
    #   - 一次性的,只能往后走,不能往前退
  • 相关阅读:
    JS魔法堂:阻止元素被选中
    JS魔法堂之实战:纯前端的图片预览
    CentOS6.5菜鸟之旅:纯转载Linux目录结构
    Vim杂记:Sublime的配色方案
    Vim杂记:markdown插件
    CentOS6.5菜鸟之旅:中文编辑器忍痛放弃Sublime
    JS魔法堂:Data URI Scheme介绍
    CentOS6.5菜鸟之旅:安装ATI显卡驱动
    JS魔法堂:获取当前脚本文件的绝对路径
    腊八蒜
  • 原文地址:https://www.cnblogs.com/June-King/p/10596207.html
Copyright © 2011-2022 走看看