• 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"])
  • 相关阅读:
    CentOS6.5安装Tab增强版:bash-completion
    005_linux下logrotate 配置和理解
    ITIL与ITSM的联系与区别
    C++----练习--bool类型作为特别的int要区别对待
    C++----练习--while求和
    C++----练习
    mysql----二进制包安装
    linux----ulimit 限制
    python----特性003
    python----特性002
  • 原文地址:https://www.cnblogs.com/liruixin/p/6038985.html
Copyright © 2020-2023  润新知