一、装饰器:

  本质是函数,装饰其他函数,为其他函数添加附加功能。

  原则:

    1.不能修改被装饰函数的源代码。 

    2.不能修改被装饰函数的调用方式。

  装饰器用到的知识:

          1.函数即变量   (把函数体赋值给函数名)

          2.高阶函数 (1.一个函数接受另一个函数名作为实参2.返回值中含有函数名)

          3.嵌套函数(一个函数嵌套这另一个函数)  

    先看高阶函数 :

           1。要实现不修改被装饰函数的源代码,就要使用一个函数接受另一个函数名作为实参

 

          

 

            2.要实现不修改源代码的调用方式,使用返回值中包含函数名

 

 

    嵌套函数:

def test1():
    print("in the test1")
    def test2():
        print("in the test2")
    test2()
test1()           #一个函数中包含另一个函数,而且内部的函数只能在内部调用

      装饰器的实现

#给计算test的运行时间
def timer(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print("函数运行时间:%s"%(end_time-start_time))
    return wrapper
@timer
def test():
    time.sleep(1)
# test = timer(test)
test()       
import time
def timer(func):
    def wrapper(n):
        start_time = time.time()
        func(n)
        end_time = time.time()
        print("函数运行时间:%s"%(end_time-start_time))
    return wrapper
@timer
def test(n):       #当函数中含有参数时
    time.sleep(1)
    print("打印的值为:%s"%n)
# test = timer(test)
test(5)  
 1 import time
 2 def timer(func):
 3     def wrapper(*args,**kwargs):     #当函数中含有任意多个参数参数时
 4         start_time = time.time()
 5         func(*args,**kwargs)
 6         end_time = time.time()
 7         print("函数运行时间:%s"%(end_time-start_time))
 8     return wrapper
 9 @timer
10 def test(age,name):       
11     time.sleep(1)
12     # print("打印的值为:%s")
13     print("年龄是%s,名字是%s"%(name,age))
14 # test = timer(test)
15 test(24,name='小明')

二、迭代器与生成器

  列表生成式     [i *2 for i in range(10)]

  生成器      1.只有在调用的时候才会生成数据。2.只记录当前位置。3.只有next方法,直到最后抛出stopiteration才终止

      第一种形式

1 [i *2 for i in range(10)]   #列表生成式
2 x = (i *2 for i in range(10))    #生成器
3 print(x.__next__())
4 print(x.__next__())  
5 print(next(x))   

       第二种形式

1 def f(maxiter):
2     n,a,b = 0,0,1
3     while n<maxiter:
4         yield b       #用函数形成生成器 含有 yield
5         a,b = b,a+b
6         n += 1
7 x = f(10)
8 print(x.__next__())    #要想生成数据,需要调用next方法
9 print(x.__next__())

 

      

    如果要获取生成器的值,就要捕获stopiteration异常

 1 def f(maxiter):
 2     n,a,b = 0,0,1
 3     while n<maxiter:
 4         yield b
 5         a,b = b,a+b
 6         n += 1
 7     return "done"     #如果要获取函数的返回值,就要捕获stopiteration异常
 8 x = f(3)
 9 while True:
10     try:
11         print("x:",x.__next__())
12     except StopIteration as e:
13         print("生成器返回值:",e.value)
14         break          
 1 #最简单的生产者消费者模型
 2 import time
 3 def consumer(name):
 4     print("%s要准备吃包子了"%name)
 5     while True:
 6         baozi = yield
 7         print("%s包子被%s吃了"%(baozi,name))
 8 def produser(name):
 9     c1 = consumer('A')
10     c2 = consumer('B')
11     c1.__next__()
12     c2.__next__()
13     for  i in range(10):
14         time.sleep(1)
15         print("%s做了2个包子"%name)
16         c1.send(i)
17         c2.send(i)
18 produser('xiaoming')
  可迭带对象iterable:可以直接用for循环的对象称为可迭代对象   可以用isinstance()函数判断是不是可迭代对象

  迭代器iterator:可以调用next方法,并不断返回下一个值的对象     生成器都是迭代器,list、dict、str 都是可迭代对象,但不是迭代器。可用iter方法使之称为迭代器

          

三、map、filter、reduce函数

  

1 print(map(lambda x:x*2,range(10)))
2 print(list(map(lambda x:x*2,range(10))))
3 #map(func,iterable)对iterable调用func 得到的是
4 print(list(filter(lambda x:x>5,range(10))))
5 #filter(func,iterable)  #对可迭代对象进行筛选
6 print(list(filter(lambda x:x.startswith('m'),['mn','mb','b'])))
7 from functools import reduce
8 print(reduce(lambda x,y:x+y,range(10)))     #进行累加操作
9 # reduce(func,iterable) 

四、json和pickle模块

  

 1 data ={'name':'zqq','age':8,'sex':"boy"}
 2 f = open("file.json","r")
 3 # f.write(str(data))
 4 import json
 5 x = json.dumps(data)   #序列化  或 json.dump(data,f)    dump可以多次,load只能一次
 6 f.write(x)
 7 data = json.loads(f.read())       #反序列化 或json.load(f)
 8 print(data)
 9 f.close()       
10   
11 f = open("ddd.txt","wb")
12 import pickle
13 x = pickle.dumps(data)        #序列化   pickle.dump(data,f)
14 f.write(x)
15 f.close()
16 f = open("ddd.txt","rb")
17 import pickle
18 data = pickle.loads(f.read())     #反序列化    pickle.load(f)
19 print(data)

 

版权声明:本文为Ezhizen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Ezhizen/p/10226512.html