码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • python 注解, 装饰器@ 详解


    目录

    1 组合数据类型注解方式

    2 自定义类注解

    3 参数是函数的注解

    4 变量注解

    5 装饰器


    python注解包含: 组合数据类型注解, 自定义类注解,变量注解,参数是函数的注解等;

            python的注解,能够让python 像java, C语言等静态类型语言一样严格,规范我们的代码,更好的实现编程;

    1 组合数据类型注解方式

    1. >>> def func(a: int, b: list):
    2. ... ...
    3. >>> def func(a: int, b: list[int]):
    4. ... ...
    5. >>> from typing import * # 包含List类型
    6. >>> def func(a: int, b: List[int]):
    7. ... ...

    2 自定义类注解

    1. >>> class Node:
    2. def __init__(self):
    3. self.val = None
    4. self.left = None
    5. >>> def func(node: Node) # 直接写下类名,是Node类型

    3 参数是函数的注解

    1. >>> def func(x:int) -> float: # 表示输入类型为int,返回类型为float
    2. return float(x**2)
    3. >>> def func2(f: callable[[int], float])
    4. ...
    5. >>> func2(func) # 调用

    4 变量注解

    >>> a: int = 15 # 说明定义的变量a是int类型

    5 装饰器

            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

  • 相关阅读:
    Yolov4 学习笔记
    高斯DWS数据库分页查询优化思路
    电子画册如何制作,教你几分钟简单上手制作?
    【软件STM32cubeIDE下H73xx配置串口uart1+中断接收/DMA收发+HAL库+简单数据解析-基础样例】
    第三章、栈和队列
    「ETL趋势」FDL数据中心库/表查看和调试功能上线、数据源新增支持MongoDB写入
    使用 TensorFlow.js 在浏览器中进行自定义对象检测
    提升个人效率减少焦虑——GTD法则
    Tomcat实现WebSocket即时通讯 & Java实现WebSocket的两种方式
    免费SSL证书:JoySSL让您的网站更安全
  • 原文地址:https://blog.csdn.net/qq_40671063/article/details/126908633
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号