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('\033[32;1m User has passed authentication \033[0m') 16 res = func(*args, **kwargs) 17 return res 18 else: 19 print('\033[31;1m Invalid username or password\033[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")
内置函数
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')
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)
                    
                
                
            
        
浙公网安备 33010602011771号