Python进阶教程,生成器、迭代器一文掌握( 二 )
- 通过列表生成式 , 我们可以直接创建一个列表 , 但是 , 受到内存限制 , 列表容量肯定是有限的 。
- 而且 , 创建一个包含100万个元素的列表 , 不仅占用很大的存储空间 , 如果我们仅仅需要访问前面几个元素 , 那后面绝大多数元素占用的空间都白白浪费了 。
- 所以 , 如果列表元素可以按照某种算法推算出来 , 那我们是否可以在循环的过程中不断推算出后续的元素呢?
- 这样就不必创建完整的list , 从而节省大量的空间 。 在Python中 , 这种一边循环一边计算的机制 , 称为生成器:generator 。
- 生成器是这样一个函数 , 它记住上一次返回时在函数体中的位置 。
- 对生成器函数的第二次(或第 n 次)调用跳转至该函数中间 , 而上次调用的所有局部变量都保持不变 。
- 生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造中的位置 。
- 生成器是一个函数 , 而且函数的参数都会保留 。
- 迭代到下一次的调用时 , 所使用的参数都是第一次所保留下的 , 即是说 , 在整个所有函数调用的参数都是第一次所调用时保留的 , 而不是新创建的
- 当你问生成器要一个数时 , 生成器会执行 , 直至出现 yield 语句 , 生成器把yield 的参数给你 , 之后生成器就不会往下继续运行 。
- 当你问他要下一个数时 , 他会从上次的状态开始运行 , 直至出现yield语句 , 把参数给你 , 之后停下 。 如此反复
- 在python中 , 当你定义一个函数 , 使用了yield关键字时 , 这个函数就是一个生成器
- 它的执行会和其他普通的函数有很多不同 , 函数返回的是一个对象 , 而不是你平常所用return语句那样 , 能得到结果值 。 如果想取得值 , 那得调用next()函数
- 每当调用一次迭代器的next函数 , 生成器函数运行到yield之处 , 返回yield后面的值且在这个地方暂停 , 所有的状态都会被保持住 , 直到下次next函数被调用 , 或者碰到异常循环退出 。
- 对象首先得实现 iter 和 next 方法
- 其次iter 方法必须返回它自己
在 Python 中 , list 是个可迭代对象 , 所以我们经常会写这样的代码:
l = [1, 2, 3]for element in l: print(element)
但你想过为什么我们可以这么写吗?为啥在 c 语言里面 , 我们访问数组元素的时候 , 必须要通过 index?因为:list 是个可迭代对象 , 我们在 Python 中使用 for … in 时 , Python 会给我们生成一个迭代器对象 , 而如上所说:迭代器是个数据流 , 它可以产生数据 , 我们一直从里面取数据就好了 , 而不需要我们在代码中维护 index , Python 已经通过迭代器给我们完成了这个事情 。
构建生成器:将列表推导式的方括号 改为 小括号
- 想自学Python来开发爬虫,需要按照哪几个阶段制定学习计划
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 音乐玩家的进阶之选 惠威D1500有源HiFi音箱评测
- 2021年Java和Python的应用趋势会有什么变化?
- 非计算机专业的本科生,想利用寒假学习Python,该怎么入手
- 用Python制作图片验证码,这三行代码完事儿
- 历时 1 个月,做了 10 个 Python 可视化动图,用心且精美...
- 同质化时代玩法进阶 2020年手机行业技术回顾
- 为何在人工智能研发领域Python应用比较多
- iOS 14系统可以支持自主更换图标了,教程赶紧收藏了