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():br/>print(111)
- @wrpperout(flag)
- def func2(): mailto:br/%3Eprint(111)%3Cbr/%3E@wrpperout(flag)%3Cbr/ br/>print(222)
- @wrpperout(flag)
- def func3():
- print(333) mailto:br/%3Eprint(222)%3Cbr/%3E@wrpperout(flag)%3Cbr/
- 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
- mailto:br/%3Eprint(222)%3Cbr/%3E@wrpperout(flag)%3Cbr/
- @wrapper3 mailto:br/%3Eprint(222)%3Cbr/%3E@wrpperout(flag)%3Cbr/ br/>@wrapper2
- @wrapper1
- def f():
- print('f') mailto:br/%3E@wrapper2%3Cbr/
- 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:nn #calc 函数名, lambda 关键字, n 参数: nn 参数运算 **
- mailto:br/%3E@wrapper2%3Cbr/
mailto:br/>@wrapper2
来源: http://www.bubuko.com/infodetail-2635932.html