zoukankan      html  css  js  c++  java
  • Python之迭代器和生成器

    生成器和迭代器

    提到生成器,总不可避免地要把迭代器拉出来对比着讲,生成器就是一个在行为上和迭代器非常类似的对象,如果把迭代器比作Android系统,

    那么生成器就是ios,二者功能上差不多,但是生成器更优雅。

    什么是迭代器

    顾名思义,迭代器就是用于迭代操作(for循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了 __next__ 方法的对象都可以成为迭代器

    它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。比如列表含有一千万个整数,需要占用400M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有元素装载到内存中,而是等到调用next方法时才返回该元素(call by need的方式),本质上for循环就是不断地调用迭代器的next方法。

    什么是生成器

    普通函数用return返回一个值,和Java等其他语言一样,然而在Python中还有一种函数,用关键字 yield 来返回值这种函数叫生成器函数,函数被调用时会返回一个生成器对象,生成器本质上还是一个迭代器,也是用在迭代操作中,因此它有和迭代器一样的特性,唯一的区别在于实现方式上不一样,后者更加简洁

    最简单的生成器函数:

    def func(n):
        yield n*2
    
    func
    <function func at 0x00000000029F6EB8>
    
    g = func(5)

    func就是一个生成器函数,调用该函数时返回对象就是生成器 g ,这个生成器对象的行为和迭代器是非常相似的,可以用在for循环等场景中。注意yield对应的值在函数被调用时不会立刻返回,而是调用next方法时(本质上for循环也是调用next方法)才返回

    >g = func(5)
    >next(g)
    
    >g = func(5)
    >for i in g:
           print(i)

    为什么要用生成器呢?显然,用生成器在逼格上要比迭代器高几个等级,它没有那么多冗长代码了,而且性能上一样的高效

    生成器表达式

    生成器表达式与列表推导式很像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象

    >g = (x*2 for x in range(10))
    >type(g)
    <type 'generator'>
    
    >l = [x*2 for x in range(10)]
    >type{l)
    <type 'list'>
  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/Skeener/p/9903049.html
Copyright © 2011-2022 走看看