今天的学习任务:
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是以二进制方式!其余都差不多;