day4心得

装饰器:

定义:本质就是函数,(装饰其他函数)就是为其他函数添加附加功能

原则:1、不能修改被装饰的函数的源代码

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

实现装饰器知识储备:

1、函数即"变量"

2、高阶函数

  a:把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)

  b:返回值中包含函数名(不修改函数的调用方式)

3、嵌套函数

高阶函数+嵌套函数=》装饰器

高级装饰器

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:kiko0o0
 4 
 5 import time
 6 
 7 user,passwd = 'zk','123'
 8 def auth(auth_type):
 9     def outer_wrapper(func):
10         def wrapper(*args, **kwargs):
11             if auth_type == 'local':
12                 username = input('username = ').strip()
13                 password = input('password = ').strip()
14                 if username == user and password == passwd:
15                     print('33[32;1m User has passed authentication 33[0m')
16                     res = func(*args, **kwargs)
17                     return res
18                 else:
19                     print('33[31;1m Invalid username or password33[0m')
20             elif auth_type =='ldap':
21                 print('ldap,不过去了')
22                 res = func(*args, **kwargs)
23                 return res
24         return wrapper  #返回地址
25     return outer_wrapper    #返回地址
26 
27 @auth(auth_type='ldap')
28 def index(name):
29     print('welcome to index page :',name)
30 
31 @auth(auth_type='local')    #home = auth()
32 def home(name):
33     print('welcome to home page:',name)
34     return 'from home'
35 
36 def bbs():
37     print('welcome to bbs page')
38 
39 index('zk')
40 print(home('syf'))
41 bbs()
高阶参数装饰器

 斐波那契,以及异常抓取

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:kiko0o0
 4 
 5 #一种
 6 # def fib(max):
 7 #     n,a,b=0,0,1
 8 #     while n<max:
 9 #         print(b)
10 #         a,b = b,a+b     #相当于  F = (b,a+b)   a = F[0]  b=F[1]
11 #         n+=1
12 #     return 'done'
13 # fib(100)
14 
15 
16 #生成器
17 def fib(max):
18     n,a,b=0,0,1
19     while n<max:
20         yield b
21         a,b = b,a+b     #相当于  F = (b,a+b)   a = F[0]  b=F[1]
22         n+=1
23     return 'done'
24 f = fib(10)
25 while True:
26     try:
27         x = next(f)
28         print('f:',x)
29     except StopIteration as e:
30         print('Generator return value:',e.value)
31         break
斐波那契

 通过生成器实现协程并行运算

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:kiko0o0
 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__()        #next只唤醒yield ,调用下生成器 也就是才能开始运行生成器
17     c2.__next__()       #等同c2.send(None)
18     print("准备传包!")
19     for i in range(10):
20         time.sleep(1)
21         print("传2个上线包!")
22         c.send(i)      #send 是唤醒yield并传值给他
23         c2.send(i)
24 
25 producer("alex")
View Code

 内置函数

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:kiko0o0
 4 
 5 
 6 print(abs(-123))   #abs()取绝对值
 7 print(all([1,2,3,0]) )      #如果可迭代对象里全为真,返回为真
 8 print(any([0,1]))           #如果可迭代对象里只要有一个为真,返回就为真,但是空为假
 9 print(type(ascii([1,1,1]))) #把内存数据对象,表示成一个可打印字符串形式
10 repr()                      #用字符串表示这个对象
11 print(bin(1))                 #把数字转换2进制
12 print(bool(1))              #判断真假  0和空为False
13 #字符串和二进制字节默认不可以修改
14 a = bytearray('abcd',encoding='utf-8') #变成可修改的二进制字节格式
15 print(a)
16 a[1] = 100
17 print(a)
18 
19 def zl(): pass
20 print(callable(zl))      #判定一个是不是可以调用的(就是是否可以后面加'()',例如函数就是可以调用)
21 print(chr(101))                   #返回ascii的对应表,必须数字
22 print(ord('a'))                   #和chr()相反,必须输入ascii的字符
23 # classmethod()
24 code = '1+3*2+5'
25 c = compile(code,' ','eval')                   #把字符串编译成可执行的代码
26 print(eval(c))
27 code = '''
28 def fib(max):
29     pass
30 print('ok')
31 
32 '''
33 d = compile(code,' ','exec')
34 exec(d)                 #或是直接exec(code)
35 
36 complex()       #可以使用参数real + imag*j方式创建一个复数。也可以转换一个字符串的数字为复数;或者转换一个数字为复数
37 delattr()       #函数作用用来删除指定对象的指定名称的属性,和setattr函数作用相反。
38 dir()           #可以查看对像内所有属于及方法
39 print(divmod(5,2))      #把除数和余数运算结果结合起来,返回一个包含商和余数的元组
40 print(eval('1+2+3+7*3'))            #将字符串str当成有效的表达式来求值并返回计算结果
41 exec()             #用来执行储存在字符串或文件中的Python语句
42 cale = lambda n:print(n)    #匿名函数 只能处理简单的运算
43 cale(5)
44 res = filter(lambda n:n>5,range(10))
45 #接收一个函数f和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,
46 # filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list
47 res1 = map(lambda n:n*n,range(5))
48 # 将func作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回
49 import functools
50 res2 = functools.reduce(lambda x,y:x*y,range(1,10))     #阶乘
51 print(res2)
52 for i in res1:
53     print(i)
54 
55 frozenset([1,4,222,3,4,3,444]) #不可变集合
56 print(globals())        #整个程序里会以字典类型返回当前位置的全部 全局变量。
57 hash()                  #用于获取取一个对象(字符串或者数值等)的哈希值。
58 hex()                   #转换16进制
59 id()                    #返回内存地址
60 locals()                #会以dict类型返回当前位置的全部 局部变量
61 max()                   #返回列表里的最大值
62 min()                   #返回列表里的最小值
63 oct()                   #转换8进制
64 pow(2,8)                   #返回多少的幂次方
65 reversed()              #反转一个序列对象,将其元素从后向前颠倒构建成一个新的迭代器。
66 round(1.332435,3)       #小数保留小数点后3位
67 a = {3:2,1:4,-3:4,444:3}
68 print(sorted(a.items()))                #字典排序默认按KEY排序
69 print(sorted(a.items(),key = lambda x:x[1]))                #字典排序按value排序
70 sum()                   #列表求和
71 vars()                  #返回一个对象的所有属性
72 zip()                   #拉链,数据结合 数据不一样多就按照最少的组合
73 map()                   #类似zip 但是可以按照最多的组合,缺少的默认用None或指定一个值
74 __import__('decorat')   
View Code

 json和pickle

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:kiko0o0
 4 import json     #只能处理简单的 列表 字典 字符串等
 5 import pickle   #复杂可以
 6 info = {
 7     'name':'alex',
 8     'age':22
 9 }
10 
11 f = open('test.txt','w')
12 f.write(json.dumps(info))   #序列化
13 f.close()
14 
15 #--------------------------------
16 f = open('test.txt','wb')       #pickle 需要用b 二进制
17 f.write(pickle.dumps(info))   #序列化
18 f.close()
19 #---------------------------------
20 f = open('test.txt','wb')
21 pickle.dump(info,f)    #等同f.write(pickle.dumps(info))
22 f.close()
序列化
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:kiko0o0
 4 import json         #只能处理简单的 列表 字典 字符串等
 5 import pickle
 6 f = open('test.txt','r',encoding='utf-8')
 7 data = json.loads(f.read())         #反序列化
 8 f.close()
 9 print(data)
10 #-----------------------------
11 f = open('test.txt','rb')   #需要二进制
12 data = pickle.loads(f.read())
13 print(data)
14 
15 #------------------------
16 f = open('test.txt','rb')
17 data = pickle.load(f)       #等同data = pickle.loads(f.read())
18 print(data)
反序列化
原文地址:https://www.cnblogs.com/kiko0o0/p/8299048.html