python参数注解
使用环境
def add(x:int, y:int) -> int:
return x + y
不具有强制的约束力,仅仅只声明一下,对于结果的输出没有任何影响
-> int:表示对于返回值的声明,是一个整型
或者是在函数内部进行注解:
def add(x,y):
"""
x : int
y : int
return int
"""
return x + y
但是程序员都比较懒,不愿意去做大量的注解,而且函数被调用后有可能还进行修改,这种在内部做注解的方法太麻烦。还不如直接告诉用户需要什么类型的参数。
在IDE环境中进行代码编写时:
def add(x:int, y:int) -> int:
return x + y
print(add(4, 5))
print(add('4', '5'))
print(add([4], [5]))
def add(x:int, y:int) ->int:
"""
:param x: int
:param y: int
return: int
add function
"""
return x + y
print(add.__name__,add.__doc__)
print('-' * 30)
print(add.__annotations__)
add(4,5)
#运行后输出的结果为:
add
:param x: int
:param y: int
return: int
add function
------------------------------
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
9
在声明过参数类型后,输入的参数假如不是声明的int类型时,IDE会在不为int的参数上面做一个提醒,但是不会影响任何运行过程和结果。因为python是动态语言
所以靠解释文档来解决函数的参数输入类型问题不好。老项目继续用2.x的版本,新项目建议用3.4以上的版本。
python注解的目的
对于用户输入的参数做一个界限,符合条件的输入进去是可以运行的,不符合的返回一个提示或者报错,并且可以对多数函数适用,那么就可以利用装饰器来写一个判断参数类型的函数。(例: if instance(x, int): #判断 x 是不是 int)
inspect
用到inspect模块做判断
import inspect
inspect.insclass(int)
True
signature
查看函数的签名
inspect.signature(add) # 查看add函数的签名
<Signature (x:int, y:int) -> int>
查看add的参数:
sig = inspect.signature(add)
sig.parameters
mappingproxy({'x': <Parameter "x:int">, 'y': <Parameter "y:int">})
不判断返回值,一般参数的类型一致的话返回值是和参数的类型一致的
装饰器的思路:
利用可变未知参数和可变关键字参数收集参数
将收集的参数放进字典里:
sig = inspect.signature(add)
params = sig.parameters # OrderedDict
判断字典中的元素
利用收集到的字典中的V值来判断,当然是在函数运行之前判断参数是否符合标准
1.对的话 if xxxx:
就过去,不报任何异常
2.错的话 else:
raise Exception # 抛异常
或者是 raise TypeError #类型错误
functools模块使用
print(reduce(lambda x,y: x + y, range(5), 10)) # 等同于下面的sum函数
print(sum(range(5), 10))
#1到6的阶乘
print(reduce(lambda x,y: x * y, range(1,6)))
partial
def add(x,y):
return x + y
print(partial(add,4)(5))
9#输出
查看partial的函数签名,得到的是(y)
import inspect
def add(x,y):
return x + y
print(partial(add,4)(5))
print(inspect.signature(partial(add,4)))
9
(y)
对于有的partial是看不出来新的函数的传参变成什么样,就需要查看一下
def add(x,y,*args,**kwargs):
return x + y + z
newfunc = partial(add, 1,2,3,z=100)
print(newfunc.func,newfunc.args,newfunc.keywords)
<function add at 0x00000000054B5620> (1, 2, 3) {'z': 100}
#lru_cache()
##lru_cache()
import functools
import time
@functools.lru_cache()
def add(x, y, z=2):
time.sleep(z)
return x + y
add(4, 5)
第一次运行add(4, 5)时,会花费2s的时间。等到第二次运行add(4, 5)时,就不会再运行2s的时间。
利用内存记录曾经运行过的数据
import functools
@functools.lru_cache(maxsize=60)
def fib(n):
return 1 if n < 3 else fib(n-1) + fib(n-2)