python基础6之迭代器&生成器、json&pickle数据序列化详解编程语言
在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10],当然有很多方法,下面的方法就叫列表生成式。
[ i*2 for i in range(6) ] [0, 2, 4, 6, 8, 10]
当然还有其他方法:
a=map(lambda x:x*2,range(6)) for i in a: ... print(i) 10
lambbda版本
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。
( i*2 for i in range(6) ) generator object genexpr at 0x000000000106B360
当我们把列表生成式变成了生产器,它会有__next__()方法(在2.7中是next()),此时我们每调用一次,就会生成一次数据:
a=( i*2 for i in range(6) ) a.__next__() a.__next__() a.__next__() a.__next__()
普通的生成器
定义:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
yield作用:使函数状态停留在yield关键字执行完之后的状态,并返回当前的迭代值,当我们使用next方法的时候,会重新唤醒该函数,并从之前保留的状态继续执行下去yield下面的代码;
后续还提到send方法,作用是给yield发送返回数据,让我们来看看普通生成器。
def gen(): a=1 while a 10: res=yield a print(res) a+=1 a=gen() print(a.__next__())#调用next方法唤醒函数 print("分割线====") print(a.__next__()) a.send("拿去")#向yield发送返回值 print(a.__next__()) 分割线==== None None 4
通常我们在使用的生成器的时候并不使用next的方法,而是使用for循环取得返回值(tips:当生成器执行到最后时候使用next方法会抛出StopIteration异常,而for循环不会。);
def gen(): a=1 while a 10: yield a a+=1 for i in gen(): print(i) 9
概念:
可迭代对象(Iterable)):可以被for循环的对象或者数据类型叫做可迭代对象,所以像list、tuple、dict、set、str、generator都是可迭代对象,这些可迭代对象可以通过iter()方法成为迭代器;
迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器,生成器是迭代器,但迭代器不一定是生成器;
可以使用isinstance()判断一个对象是否是Iterator对象
from collections import Iterator,Iterable isinstance([],Iterator)#不是迭代器返回false False isinstance([],Iterable)#可迭代对象返回True True isinstance((i*2 for i in range(6)),Iterator)#是迭代器 True isinstance((i*2 for i in range(6)),Iterable) True
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12463.html
cjavapython相关文章
- python求逆矩阵的方法,Python 如何求矩阵的逆「建议收藏」
- Python获取时间戳_python爬虫时间戳
- 2022年最新Python大数据之Python基础【七】参数与管理系统
- 2022年最新Python大数据之Python基础【八】文件的操作与类
- python爬虫基础源代码
- centos7使用nginx+uwsgi部署python django项目
- aic准则python_Python数据科学:线性回归
- 浙江新增python编程_9月起,浙江省八年级新增Python编程课,未来编程是处理大数据的手段…「建议收藏」
- python中dtype的使用规范_Python numpy.dtype() 使用实例
- 关于python中lambda 函数使用小结
- Python实验报告二
- python基础系列教程——Python的安装与测试:python解释器、PyDev编辑器、pycharm编译器
- Python抓取数据_python抓取游戏数据
- Python编程 pip的安装与使用
- Python基础速刷一周目
- 【说站】python socket连接客户端的方法
- python分析人口出生率代码_国家统计局居然也能用的上Python?人口数据Python脚本了解一下?…[通俗易懂]
- python scipy库_micropython移植
- python抛出异常写法_零基础学 Python(32):如何抛出和捕获异常?「建议收藏」
- Linux(centos 8)定时运行python脚本
- vim 配置python3环境_vim怎么运行python
- Python基础(十三):集合的详细讲解
- Python基础(十九):函数加强
- python 基础面试题
- Python基础语法-基本数据类型-字符串的常用方法
- Python基础语法-函数-函数装饰器-多个装饰器
- python-数据库编程-如何在Python中连接到数据库
- Python_Day34_Socket模块2和黏包现象详解编程语言
- Python生成器、迭代器、可迭代对象详解编程语言
- 11个新手快速入门Python知识点!
- 使用Python连接MySQL数据库,实现高效数据交互(python连接mysql)
- Python实现MySQL数据库的读取(python读取mysql)
- Python爬取MySQL数据,助力数据分析(python读取mysql数据)
- Python如何使用MySQL构建立连接(python怎么连接mysql)
- 简明Python基础学习教程