1.装饰器
1 import os 2 import time 3 def auth(type): 4 def timeer(func): 5 def inner(*args,**kwargs): 6 start = time.time() 7 func(*args,**kwargs) 8 print ("auth to %s"%type) 9 stop = time.time() 10 print ("it is running %s minit"%(stop-start)) 11 return inner 12 return timeer 13 14 15 16 17 @auth("qq") 18 def test1(name,age,six): 19 time.sleep(2) 20 print ("this is test1%s"%name) 21 @auth("weixin") 22 def test2(): 23 time.sleep(2) 24 print ("it is test 2") 25 26 27 test1("liruixin",22,"m") 28 test2()
2.生成器
生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
例如: a = (i for i in range(10))
2.1 yield 介绍
通过yield实现在单线程的情况下实现并发运算的效果
1 #_*_coding:utf-8_*_ 2 __author__ = 'Alex Li' 3 4 import time 5 def consumer(name): 6 print("%s 准备吃包子啦!" %name) 7 while True: 8 baozi = yield 9 10 print("包子[%s]来了,被[%s]吃了!" %(baozi,name)) 11 12 13 def producer(name): 14 c = consumer('A') 15 c2 = consumer('B') 16 c.__next__() 17 c2.__next__() 18 print("老子开始准备做包子啦!") 19 for i in range(10): 20 time.sleep(1) 21 print("做了2个包子!") 22 c.send(i) 23 c2.send(i) 24 25 producer("alex") 26 27 通过生成器实现协程并行运算
迭代器
我们已经知道,可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
可以使用isinstance()
判断一个对象是否是Iterable
对象:
*可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
小结
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
3.json and pickle 序列化
二者区别 1.json可以对列表,字典,进行序列化,支持所有开发语言。
2.pickle可以序列的对象比json多,可以对函数进行序列化,但是pickle只有python中有
json 示例
pickle用法与json完全相同
1 import json 2 # dic = { 3 # "name":"liruixin", 4 # "age":"22", 5 # "country":"cn" 6 # 7 # } 8 # 9 # #序列化 10 # f = open("test.json","a+") 11 # #f.write(json.dumps(dic)) #第一种方式 12 # #json.dump(dic,f) #第二种方式 13 # f.close() 14 15 # #反序列化 16 # f = open("test.json") 17 # a = json.loads(f.read()) 18 # print(a["age"]) 19 20 # f = open("test.json") 21 # a = json.load(f) 22 # print(a["age"])