函数:
函数参数注解:
Python3.5引入:
1,对函数的参数进行类型注解
2,对函数的返回值进行类型注解
3,只对函数参数做一个辅助的说明,并不对函数参数进行类型检查
4,提供给第三方工具,做代码分析,发现隐藏的bug
5,函数注解的信息,保存在annotations属性中
annotations属性:
add.annotations # 返回 {‘return’: int, ‘x’: int, ‘y’: int}
代码:
def add(x:int, y:int) -> int:
return x + y
变量注解3.6引入:
代码:
def add(x:int = 3, y:int = 4):
return x + y
业务应用:
函数参数类型检查:
思路:
1,函数参数的检查,一定是在函数外
2,函数应该作为参数,传入到检查中
3,检查函数拿到函数传入的实际参数,与形参声明对比
函数定义的弊端:
1,Python是动态语言,变量随时可以被赋值,且能赋值为不同的类型
2,Python的变量类型是在运行时决定的
3,
inspet模块:
介绍:提供获取对象信息的函数,可以检查函数和类、类型检查。
signature(callable):
介绍:获取签名(函数签名包含了一个函数的信息,包括函数名、它的参数类型、它所在的类和名称空间及其他信息)
sig = inspect.signature(add)
#返回 <Signature (x:int, y:int) -> int>
import inspect
def add(x, y:int=7, *args, z, t=10, **kwargs) -> int:
return x + y
sig = inspect.signature(add)
print(sig)
parameters:
介绍:inspect.signature函数返回一个inspect.Signature对象。这个对象有parameters属性。
这是一个有序的字典;把参数名和inspect.Parameter对象对应起来。
# mappingproxy({'x': <Parameter "x:int">, 'y': <Parameter "y:int">})
1,保存在元组中,是只读的
name:参数的名字
annotation:参数的注解
default:参数的缺省值
empty:特殊的类,用来标记default属性或注释annotation属性的空值
kind:实参如何绑定到形参,就是形参的类型
POSITIONAL_OR_KEYWORD:值可以作为关键字或者位置参数提供
VAR_POSITIONAL:可变位置参数,对应*args
KEYWORD_ONLY:keyword-only参数,对应*或者*args之后的出现的非可变关键字参数
VAR_KEYWORD:可变关键字参数,对应**kwargs
标准库中的装饰器:
property:
classmethod:
staticmethod:
functools模块:
1,@functools.wraps:
解释:使用functools.wraps装饰器把相关的属性从被装饰的函数复制到装饰函数中。
2,partial
解释:基于一个函数创建一个新的可调用对象,把原函数的某些参数固定。
应用:使用这个函数可以把接受一个或多个参数的函数改编成需要回调的API,这样参数更少!
示例:
def add(x, y):
return x + y
from functools import partial
triple = partial(add, 3)
3,functools.lru_cache:
解释:这是一项优化技术,它把耗时的函数的结果保存起来,避免传入相同的参数时重复计算。
应用:@functools.lru_cache(maxsize=128, typed=False)
maxsize:指定存储多少个调用的结果,缓存满了之后,旧的结果会被丢弃,腾出空间。
1,maxsize是二的幂。
typed:如果为True,把不同参数类型得到的结果分开保存,即把浮点数和整数区分开。