1.装饰器详解 def wrpper(f): #f = func1 def inner(*args,**kwargs): print(111) ret = f(*args,**kwargs) print(333) return ret return inner #返回给wrapper(func1)

@wrpper # func1 = wrapper(func1) def func1(): print(222) return 444

func1() #inner() ** # 1,执行wrapper函数,将func1函数名传给f** ** # 2,将inner函数名 返回给了新的变量func1 (func1 = inner) # 3,func1() == inner() 执行inner函数 #4,执行print(111)执行func1 函数print(222) 执行print(333)*

2.函数的有效信息 #########没有装饰器 def logger(username,pwd): ''' #描述此函数的作用及参数和返回值等信息 此函数是登录函数,需要username,pwd两个参数 :return:True ''' print(111) return True

print(logger.doc) #查看函数的描述信息 print(logger.name) #查看函数的函数名 ###########有装饰器 from functools import wraps #1.引入wraps def wrpper(f): @wraps(f) #2.@wraps(f) def inner(*args,**kwargs): ''' inner函数的信息 :param args: 参数 :param kwargs: 参数 :return: True ''' print(222) ret = f(*args,**kwargs) print(333) return ret return inner

@wrpper def logger(username,pwd): ''' 此函数是登录函数,需要username,pwd两个参数 :return:True ''' print(111) return True print(logger.doc) #输出logger函数信息,如果没有1 2的操作,输出inner函数的信息 print(logger.name) #输出logger,如果没有1 2的操作,输出inner函数名

3 装饰器的升级 ##带参数的装饰器 def wrpperout(flag1): #flag1=flag=True def wrpper(f): def inner(*args,**kwargs): if flag1: print(0) ret = f(*args,**kwargs) print(9) return ret else: ret = f(*args, **kwargs) return ret return inner return wrpper

flag = True @wrpperout(flag) #1.将@与函数分开,执行wrpperout(flag)返回wrpper 2.将@与wrpper结合@wrpper def func1(): print(111) @wrpperout(flag) def func2(): print(222) @wrpperout(flag) def func3(): print(333)

func1() func2() func3()

###多个装饰器装饰一个函数 def wrapper1(func): def inner1(): print('wrapper1 ,before func')
func() print('wrapper1 ,after func')
return inner1

def wrapper2(func): def inner2(): print('wrapper2 ,before func') func() # inner1() print('wrapper2 ,after func')
return inner2

def wrapper3(func): def inner3(): print('wrapper3 ,before func') func() print('wrapper3 ,after func') return inner3

@wrapper3 @wrapper2 @wrapper1 def f(): print('f')

f() 输出: wrapper3 ,before func wrapper2 ,before func wrapper1 ,before func f wrapper1 ,after func wrapper2 ,after func wrapper3 ,after func 执行顺序:从上到下装饰器装饰函数之前的操作----执行函数-----从下到上装饰器装饰函数之后操作

4.迭代器 ###可迭代对象:该对象中含有__iter__方法的就是可迭代对象,遵循可迭代协议 print('iter' in dir(str)) #判断该对象是不是可迭代对象 from collections import Iterable print(isinstance('abc',Iterable)) #判断该对象是不是可迭代对象 print(isinstance('abc',str)) #判断该对象是哪种数据类型

#####迭代器:内部含有__iter__且含有__next__方法的对象就是迭代器,遵循迭代器协议 s1 = 'asgsdg' obj_s = s1.iter() #将可迭代对象转换成迭代器或者obj_s = iter(s1) print(obj_s.next()) #取值 print('next' in dir(obj_s)) #判断该对象是不是迭代器 from collections import Iterator print(isinstance(obj_s,Iterator)) #判断该对象是不是迭代器 ####迭代器的好处:1.节省内存 2.惰性机制 3.单向执行,不可逆

5.生成器 生成器本质就是迭代器,自定义的迭代器 def func1(): print(111) yield 222 #yield关键字 yield 333 yield 444 g_obj = func1() #生成器对象 print(g_obj) #<generator object func1 at 0x000001E97F1303B8> print(g_obj.next()) #取值,next()和yield一一对应 print(g_obj.send())#send和next都是对生成器的取值,send会给上一个yield发送一个值,send不能用在第一次取值,最后一个yield不能得到值

6.列表推导式 [变量(加工后的变量) for 变量 in iterable] #遍历模式 [变量(加工后的变量) for 变量 in iterable if 条件] #筛选模式 ####生成器表达式 (变量(加工后的变量) for 变量 in iterable) (变量(加工后的变量) for 变量 in iterable if 条件)

7.内置函数 eval:去除两边的引号 print(eval('1+2+3')) #输出6

exec:执行代码 s1 = ''' for i in range(5): print(i) ''' print(exec(s1))

print(sep='分隔符,默认为空格') print(sep='换行符,默认为\n') print(file=f1w文件句柄)

print(hash('cc')) #将一个不可变的数据类型转换一个哈希值,如果是数字就是数字本身

print(help(str))#帮助信息

callable:检查一个对象是否可调用,可调用返回True,不可调用返回False

print(float(1)) #将整数和字符串转换成浮点数,输出1.0 print(bin((18))) #十进制转换成二进制,输出0b10010 print(oct((18))) #将十进制装换成八进制,输出0o22 print(hex((18))) #将十进制装换成十六进制,输出0x12 print(abs(-1)) #abs取绝对值,输出1 print(divmod(100,7)) #商和余数,输出(14, 2) print(round(1.2345,3)) #保留小数的位数,输出1.234 print(pow(2,3)) #x的y次幂,如果是三个参数表示对z取余 l1 = [1,2,3] print(sum(l1),4) #求和,输出10 l1 = [1,2,-3] print(min(l1,key=abs)) #取最小值,可加key,输出1 print(max(l1,key=abs)) #输出最大值,可加key,输出-3 l_obj=reversed(l1) #翻转形成一个迭代器,用for取值 repr:返回一个对象的原形 sorted:可指定key进行排序 enumerate:枚举,返回一个枚举对象 all:可迭代对象中,全是True才是True any:可迭代对象中,有一个True,就是True zip:拉链方法 map filter

8,匿名函数 calc = lambda n:n**n #calc函数名,lambda关键字,n参数:nn参数运算