内容概要:

一、生成器

二、迭代器

三、json&pickle数据序列化

一、生成器generator

在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[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)
...
0
2
4
6
8
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__()
0
>>> a.__next__()
2
>>> a.__next__()
4
>>> a.__next__()
6
>>>

普通的生成器

定义:如果一个函数定义中包含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__())
结果:
1
分割线====
None
2
拿去
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)
结果:
1
2
3
4
5
6
7
8
9
二、迭代器

概念:

可迭代对象(Iterable)):可以被for循环的对象或者数据类型叫做可迭代对象,所以像listtupledictsetstr、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

python基础6之迭代器&生成器、json&pickle数据序列化的更多相关文章

  1. day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数

    回顾下上次的内容 转码过程: 先decode  为 Unicode(万国码 ) 然后encode 成需要的格式     3.0 默认是Unicode  不是UTF-8 所以不需要指定  如果非要转为U ...

  2. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)

    装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不 ...

  3. 装饰器、生成器,迭代器、Json & pickle 数据序列化

    1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...

  4. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  5. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  6. 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范

    1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...

  7. json&pickle数据序列化模块

    用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...

  8. Json & pickle 数据序列化

    前提: 文本文件中只能写入字符串或ascii码格式的内容. info={'name':'zoe','age':18} f=open('test.txt','w') f.write(info) #在文本 ...

  9. Python3 json &pickle 数据序列化

    json 所有语言通用的信息交换格式 json.dumps()将list列表.dict字典.元组.函数等对象转换为可以存储的字符格式存入文件 json.dump(数据对象名,已以写方式打开的对象) 直 ...

随机推荐

  1. Netty对WebSocket的支持(五)

    Netty对WebSocket的支持(五) 一.WebSocket简介 在Http1.0和Http1.1协议中,我们要实现服务端主动的发送消息到网页或者APP上,是比较困难的,尤其是现在IM(即时通信 ...

  2. spring中Bean后置处理器实现总结

    BeanPostProcessor接口 bean的后置处理器实现功能主要是 可以在bean初始化之前和之后做增强处理.自定义MyBeanProcessor实现BeanPostProcessor接口,重 ...

  3. TabHost用法

    tabhost用两种方法 方法一:Activity继承TabActivity后用getTabHost()方法来获取tabhost(前提:Activity的setContentView要删除,这样布局才 ...

  4. python 命令

    pip list 可以查看已经安装的插件 pip show name 可以查看插件的信息(如:pip show selenium) pip install selenium==[version num ...

  5. office漏洞利用--获取shell

    环境: kali系统, windows系统 流程: 在kali系统生成利用文件, kali系统下监听本地端口, windows系统打开doc文件,即可中招 第一种利用方式, 适合测试用: 从git下载 ...

  6. FreeMarker解析json数据

    模拟后台传过来的 json 字符串text <#assign text> {"res":"0","msg":"OK&q ...

  7. 第四章 Windows图形界面-上

    学习<Windows程序设计>记录 概念贴士: 1. 每个GUI应用程序至少应该创建一个窗口,称为主窗口,它作为用户与应用程序间的主界面来提供服务.大多数应用程序也直接或间接地创建其他窗口 ...

  8. 从Unity中的Attribute到AOP(六)

    本文将重点对Unity剩下常用的Attribute进行讲解,其他不常用的Attribute各位可以自行去官方文档查阅. 首先是UnityEngine命名空间下的. ColorUsage,这个主要作用于 ...

  9. Spring Boot快速入门(四):使用jpa进行数据库操作

    原文地址:https://lierabbit.cn/articles/5 添加依赖 新建项目选择web,JPA,MySQL三个依赖 对于已存在的项目可以在bulid.gradle加入,spring b ...

  10. inline-block元素间留白现象探究

    现象说明 最近在项目发布的时候遇到了一个奇怪的问题,在项目使用gulp打包压缩后发现之前一些行内元素间的空白消失了,导致页面中一些布局出现了问题 正常样式如下:    最开始出现这个问题的时候以为是g ...