python学习之day5,装饰器,生成器,迭代器,json,pickle

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循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象:

*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

小结

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是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"])
原文地址:https://www.cnblogs.com/liruixin/p/6038985.html