zoukankan      html  css  js  c++  java
  • Python学习札记(十九) 高级特性5 迭代器

    参考:迭代器

    Note

    1.可用于for循环的对象有两类:(1)集合数据类型:list tuple dict str set (2)Generator:生成器和含yield语句的函数。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

    2.可以用isinstance()函数判断一个对象是否为可迭代对象(Iterable):

    >>> from collections import Iterable
    
    >>> isinstance([], Iterable)
    True
    
    >>> isinstance({}, Iterable)
    True
    
    >>> isinstance((), Iterable)
    True
    
    >>> isinstance('abc', Iterable)
    True
    
    >>> isinstance((x for x in range(10)), Iterable)
    True
    
    >>> isinstance(100, Iterable)
    False
    

    3.可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

    注意:可迭代对象(Iterable)和迭代器(Iterator)的区别,迭代器一定是可迭代对象,可迭代对象不一定是迭代器。

    可以用isinstance()函数判断是否是迭代器。

    >>> from collections import Iterator
    
    >>> isinstance([], Iterator)
    False
    
    >>> isinstance({}, Iterator)
    False
    
    >>> isinstance((), Iterator)
    False
    
    >>> isinstance('str', Iterator)
    False
    
    >>> isinstance((x for x in range(10)), Iterator)
    True
    

    生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

    4.可以使用iter()函数将一个iterable变成iterator:

    >>> isinstance(iter([]), Iterator)
    True
    
    >>> isinstance(iter(()), Iterator)
    True
    
    >>> isinstance(iter({}), Iterator)
    True
    
    >>> isinstance(iter('str'), Iterator)
    True
    

    5.为什么Iteratable不是Iterator? Key:数据流、无法预知其长度、惰性计算。

    • Iterator对象表示的是一个数据流,可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
    • 可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据。

    所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

    Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

    6.Python的for循环本质上就是通过不断调用next()函数实现的:

    for i in [1, 2, 3, 4, 5]:
        print(i)
    

    等价于:

    #!/usr/bin/env python3
    
    it = iter([1, 2, 3, 4, 5]) # get iterator
    
    while True :
    	try :
    		x = next(it)
    		print(x)
    	except StopIteration :
    		break
    
    sh-3.2# ./iterator1.py 
    1
    2
    3
    4
    5
    

    总结

    1.凡是可作用于for循环的对象都是Iterable类型;

    2.凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

    3.集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

    2017/2/8

  • 相关阅读:
    贝壳找房魔法师顾问[并查集+DAG判断]
    Ubuntu 18.04 安装 virtualbox
    Ubuntu 编译安装 nDPI
    Ubuntu 16.04 安装WPS
    HDU 5046 Airport【DLX重复覆盖】
    Codeforces 622C Not Equal on a Segment 【线段树 Or DP】
    UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
    LA 2995 Image Is Everything
    LA 3708 Graveyard
    HDU 5212 Code【莫比乌斯反演】
  • 原文地址:https://www.cnblogs.com/qq952693358/p/6377989.html
Copyright © 2011-2022 走看看