目录
1 组合数据类型注解方式
2 自定义类注解
3 参数是函数的注解
4 变量注解
5 装饰器
python注解包含: 组合数据类型注解, 自定义类注解,变量注解,参数是函数的注解等;
python的注解,能够让python 像java, C语言等静态类型语言一样严格,规范我们的代码,更好的实现编程;
>>> def func(a: int, b: list):
... ...
>>> def func(a: int, b: list[int]):
... ...
>>> from typing import * # 包含List类型
>>> def func(a: int, b: List[int]):
... ...
>>> class Node:
def __init__(self):
self.val = None
self.left = None
>>> def func(node: Node) # 直接写下类名,是Node类型
>>> def func(x:int) -> float: # 表示输入类型为int,返回类型为float
return float(x**2)
>>> def func2(f: callable[[int], float])
...
>>> func2(func) # 调用
>>> a: int = 15 # 说明定义的变量a是int类型
python中所有的东西都是object;
因此python中构建的函数,本身也是一个对象, 构建函数,也可以理解为构建了一个变量,变量包含了一个函数对象(Callable,使用加()的方式调用);
1 函数可以被当做普通的参数被传进其他函数; 如下面的例子:
2 函数也可以称为一个函数的返回值; 如下面的例子:
函数返回的函数做什么事情,是由get_multiple_func得到的参数(argument)有关;
比如 double = get_multiple_func(2),就是返回一个函数,函数对象赋值给变量double,这个变量是可以被调用的,也就是Callable; 因此会得到下图右侧的输出;
3 加入@函数名 后,如下面的例子:
@dec
def double(x):
return x*2
就完全等价于:
double = dec(double), 也就是dec调用double, 返回一个函数/其他对象给double;
然后将double输出;
4 加入*arg 和 **kwargs后, 下面例子:
*arg 和 **kwargs就相当于允许变长的函数参数:
下面 第一个装饰器: 相当于 my_func = timeit(my_func) , 运行之后是 my_func = wrapper(x) -- 相当于 先把my_func 作为参数传入装饰器,然后函数再和(x)调用函数;
第二个装饰器部分: add = timeit(add), 运行之后是: add = wrapper(x,y)
下面调用输出部分,相当于 add = warpper(2,3); wrapper函数内部的语句 ret = f(*arg, **kwargs),相当于 ret = add(2,3), 然后得到 ret = 5, 然后先输出花费时间,再返回ret,输出计算结果;
5 带参数的装饰器,如下面的例子:
@timeit(1000)
def double(x):
return x*2
完全等价于: double = timeit(1000)(double)
也就是先调用 timeit(1000),得到返回的函数,然后再调用返回的函数;
因此下面函数的运行过程是: double = timeit(1000)(double) -> double = inner(double) -> double = wrapper(2)
wrapper函数内 ret = f(*arg, **kwargs) 相当于 ret = double(2), 然后输出时间;
注解部分参考视频:【python技巧005】注解不是注释!彻底弄懂所有的"注解"怎么写_哔哩哔哩_bilibili
装饰器部分参考视频:【python】装饰器超详细教学,用尽毕生所学给你解释清楚,以后再也不迷茫了!_哔哩哔哩_bilibili