Python学习之路——chapter4{生成器,迭代器,json,pickle}

今天的学习任务:

            1.生成器;

假如我要升程一个list如【1,2,3,4,5,6,7,8,9,10】

可以采用:

#!/usr/bin/env python
#Author By Puppeteer_777

list = [i+1 for i in range(10)]
print(list)

通过列表生成公式,我们可以生成列表;但是受到内存的限制,列表的容量是有限的;

如果我们生成了一个超级大的列表,但是我们只需要使用这个列表生成的前几个数据,这样就会造成极大的浪费;

因此我们隆重推出了 生成器(generator):列表元素既然是通过生成公式生成的,我们可以推算出下一个元素,不需要将列表全部生成,从而浪费空间;


创建生成器的方法很多;

第一种:

#!/usr/bin/env python
#Author By Puppeteer_777
# 
# list = [i+1 for i in range(10)]
# print(list)

generator = (i+1 for i in range(10))
print(next(generator))
print(next(generator))

只需要将 [ ] 更改为 ( )

然后想要生成几个元素就next几次;上面的代码就生成的是1,2

这种方法真是太变态了,所以我们一般使用for循环来使用;

#!/usr/bin/env python
#Author By Puppeteer_777

generator = (i+1 for i in range(10))
for i in generator:
    print(i)

用生成器写斐波那契数列

#!/usr/bin/env python
#Author By Puppeteer_777
import time

def fibo(max):         #定义一个函数
    '''fibo函数'''
    a,b,n = 0,1,1
    while n < max:
        time.sleep(1)
        #print(b)     #普通函数写fibo
        yield b       #生成器写fibo
        a,b=b,a+b
        n=n+1
    return '----done----'

f=fibo(10)
print(f.__next__())
print(f.__next__())
print(f.__next__())

a,b=b,a+b 相当于 t=(b,b+a)   a=t[0] b=t[1]

每当你想要使用下一个数字就 f.__next__( ) 

这是定义生成器(generator)的另一种方法,当一个函数包含关键字 yield ,那么它就是一个generator ;

yield 保存当前状态并且返回;

yield 实现单线程情况下实现并发;(协程)

#!/usr/bin/env python
#Author By Puppeteer_777
import time

def consumer(name):
    print('%s 准备吃水果了'%name)
    while True:
        fruit = yield
        print('[%s]吃了第[%s]个水果'%(name,fruit))


def producer(pname):
    c = consumer('brother')
    c.__next__()
    c2= consumer('sister')
    c2.__next__()
    print('%s开始准备水果'%pname,'水果一分为二')
    for i in range(10):
        i=i+1
        time.sleep(2)
        c.send(i)
        c2.send(i)


producer('baba')

使用debug调试;可以清楚的看出流程;


            2.迭代器

        可以直接于for循环的对象统称为 可迭代对象(iterable);可以使用 isinstance( )判断一个对象是否为可迭代对象;

迭代器:可以被__next__( )函数调用不断返回下一个值的对象程为迭代器(iterator); 生成器(generator)一定是迭代器,迭代器(iterator)不一定是生成器;

可以使用 isinstance( ) 判断一个对象是否为 iterator 对象;

#!/usr/bin/env python
#Author By Puppeteer_777

from collections import Iterator

print(isinstance([],Iterator))  #False
print(isinstance({},Iterator))  #False
print(isinstance('string',Iterator))  #False
print(isinstance((i for i in range(10)),Iterator))  #True


print(isinstance(iter([]),Iterator))  #True
print(isinstance(iter('string'),Iterator))  #True

            3.json和pickle

json的序列化:

#!/usr/bin/env python
#Author By Puppeteer_777

import json

info ={
    'name':'liming',
    'age':22
}

f = open('test.json','w')
data = json.dumps(info)
f.write(data)
print(data)

json的反序列化:

#!/usr/bin/env python
#Author By Puppeteer_777

import json

f = open('test.json','r')
data1 = json.loads(f.read())
print(data1['age'])
pickle的序列化:
#!/usr/bin/env python
#Author By Puppeteer_777

import pickle

info ={
    'name':'liming',
    'age':22
}

f = open('test.pickle','wb')   #注意打开方式b
data = pickle.dumps(info)
f.write(data)
print(data)

pickle的反序列化:

#!/usr/bin/env python
#Author By Puppeteer_777

import pickle

f = open('test.pickle','rb')   #注意打开方式b
data1 = pickle.loads(f.read())
print(data1['age'])


小结:json 和 pickle 的使用方法区别不大;只不过pickle是以二进制方式!其余都差不多;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值