美文网首页
【python】可迭代对象、生成器、迭代器、itertools

【python】可迭代对象、生成器、迭代器、itertools

作者: 小熊猫笔记 | 来源:发表于2019-06-21 08:35 被阅读0次

    一、迭代(iteration)

    迭代可以理解为循环访问容器中多个元素的遍历行为。
    容器(contaniner)将多个元素组织在一个对象内,可以用in和not in关键字判断元素是否在容器内。
    典型的容器有诸如dict、list、set等,利用for..in..循环可以遍历容器内每个元素。

    x = [1, 2, 3]
    for i in x:
        print i
    Python内str也是容器但int类型不是。
    s="abc"
    for i in s:
        print i
    s=123
    for i in s: #TypeError: 'int' object is not iterable
        pass
    

    二、迭代器(iterator)和可迭代对象(iterable)

    1.迭代器是遍历行为中,一个中间状态的对象。
    2.能够返回一个迭代器的对象可称之为可迭代对象。

    x = [1, 2, 3]
    iter_x = iter(x)
    print next(iter_x) #1
    print next(iter_x) #2
    for i in iter(x):
        print i
    

    迭代器可以利用iter()方法将容器变为迭代器,利用next()方法,逐个返回容器中元素。

    三、生成器(generator)

    生成器算得上是Python语言中最吸引人的特性之一,生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。

    from itertools import islice
    def fib():
        prev, curr = 0, 1
        while True:
            yield curr
            prev, curr = curr, curr + prev
    
    f = fib()
    print type(f)#<type 'generator'>
    print list(islice(f, 0, 10))#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
    

    上面这个斐波那契函数用到了yield生成器,yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。
    调用这个函数的时候,函数内部的代码并不立马执行,这个函数只是返回一个生成器对象。
    使用迭代的时候,函数中的代码才会执行,itertools中islice类似slice方法,可以把切片方法用到迭代器中。
    List(iter)方法即是将迭代器变为列表。
    四、生成器表达式(generator expression)
    生成器表达式针对列表推导式,将其变为一个迭代器。

    a = [x * x for x in range(1000000)] #列表推导式
    b = (x * x for x in range(1000000)) #生成器表达式
    

    大数据量列表推导式会消耗大量内存,但是利用生成器表达式可以暂时不执行保留这个对象,待真正使用时或利用next()方法进行迭代。

    相关文章

      网友评论

          本文标题:【python】可迭代对象、生成器、迭代器、itertools

          本文链接:https://www.haomeiwen.com/subject/ibjeqctx.html