云计算百科
云计算领域专业知识百科平台

快速学习Python基础知识详细图文教程17--类型注解和断点调试

来源引用网络知识与某站曹老师视频相互结合学习记录,仅供参考!

Python 基础知识

类型注解

类型注解的概念

类型注解(Type Hints) 是一种为代码添加"说明标签"的技术,明确地指出变量、函数参数和返回值应该是什么数据类型;就是在代码中为变量、函数参数及返回值等添加类型信息的一种方式;这并不是强制性的,Python依然保持着动态类型的特性,但通过类型提示(Type Hints) ,开发者可以明确地表达出预期的数据类型。简单来说就是“在代码中注明数据类型的语法,在代码中涉及数据交互的地方,提供数据类型的注解(显示说明)”。

主要功能:

  • 帮助第三方 IDE(PyCharm)工具对代码进行类型推断,协助做代码提示;
  • 帮助开发者自身对变量进行类型注释;
核心目的
  • 提高代码可读性:让他人(以及未来的你)一眼就能看懂代码的意图;
  • 便于静态检查:在运行代码前,通过工具发现潜在的类型错误;
  • 增强IDE支持:让代码编辑器提供更准确的自动补全和提示;
为什么需要类型注解?

Python 以其动态类型特性而闻名——不需要提前声明变量的类型,解释器会在运行时自动推断。

这虽然灵活,但也带来了问题:

  • 代码难以理解:看到一个函数时,不清楚应该传入什么类型的数据;
  • 隐藏的bug:可能不小心传入了错误类型,直到运行时才报错;
  • 开发效率低:IDE 无法提供准确的代码提示和补全;
  • 类型注解通过提供可选的类型信息来解决这些问题,让代码更加健壮和可维护。类型注解一般用于看不出变量的类型,只是备注,不会影响到代码运行。

    常见类型(部分)

    描述

    str

    字符串类型。

    int

    整数类型。

    float

    浮点数类型。

    bool

    布尔类型。

    List

    列表类型。

    Dict

    字典类型。

    Set

    集合类型。

    Tuple

    元组类型。

    Union

    联合类型,是一个变量的值可以是多个类型。

    Optional

    可选类型,当值可能是某种类型或者是 None 使用 。

    Any

    Any 是一种特殊的类型,可以为任意类型。

    变量的类型注解

    从 Python 3.6 版本开始,可以直接为变量添加类型注解;变量类型注解是在变量后面加上“ : 类型 ”;

    像这样注解完成后,运行不会报错,给提示和注释作用;

    例如有下面的一些变量定义:

    # 导包
    import random

    # 注解为字符串 (str)– “name: str” 读作"变量 name 的类型是 str"
    name: str = "ZhangSan"
    # 注解为整型 (int)
    age: int = 20
    # 注解为布尔值 (bool)
    b: bool = True

    # 类对象–类型注解
    class Person:
    pass

    # 实例对象类型注解–给‘lisi’这个对象指定为“Person”类型
    lisi: Person = Person()

    # 基础容器–类型注解
    my_list: list = [1, 2, 3, 4]
    my_tuple: tuple = (1, 2, "ZhangSan", 'LiSi', False)
    my_dict: dict = {1: 'a', 2: 'b', 3: 'c'}
    my_set: set = {1, 2, 3, 4}

    # 容器类型元素–类型注解
    # 表示这是一个只包含整数的列表
    my_list2: list[int] = [1, 2, 3, 4]
    # 元组需要将每一个元素都标记出来–表示这是一个包含整数、字符串、布尔值的元组
    my_tuple2: tuple[int, int, str, str, bool] = (1, 2, "ZhangSan", 'LiSi', False)
    # 字典需要2个类型,一个是key,一个是value–表示这是一个键为字符串、值为浮点数的字典
    my_dict2: dict[str, float] = {"a": 1.23, "b": 2.34}
    # 表示这是一个键为整数、值为字符串的字典
    my_dict3: dict[int, str] = {1: 'a', 2: 'b', 3: 'c'}
    # 表示这是一个只包含字符串的集合
    my_set2: set[str] = {"a", "b", "c"}

    # 在注释中进行类型注解–在注释里面添加类型注解 “# type:类型"
    name1 = "WangWu" # type:str
    my_list3 = [1, 2, 3, 4] # type:list[int]
    r1 = random.randint(1, 100) # type:int

    函数方法的类型注解

    在函数参数后加“ : 类型 ”。函数注解是类型注解最常见的应用场景。

    形参类型注解

    def 函数方法名(形参名1: 类型, 形参名2: 类型, ……, 形参名N: 类型)

            pass

    # 自定义一个添加方法add–形参a应该是整型,形参b应该是整型
    def add(a: int, b: int):
    # 返回结果
    return a + b

    # 直接打印调用结果
    print(add(1, 2))

    返回值类型注解

    def 函数方法名(形参名1: 类型, 形参名2: 类型, ……, 形参名N: 类型) -> 返回值类型:

            pass

    “形参名1: 类型”–表示 参数(形参名)应该是 某类型(设置类型);

    “-> 返回值类型: ”–表示此函数执行后返回一个 某类型(自定义设置的类型);

    # 自定义方法–指定形参类型并指定返回值类型
    def add(a: int, b: int) -> int:
    # 返回值“a + b”结果应该是整型
    return a + b

    # 直接打印调用结果
    print(add(1, 2))

    联合类型(Union)注解

    假如存在多个值 (value)类型不一致,当值 (value) 可能是多种类型之一,可以通过 Union 联合类型注解,来实现多类型注解;多个类型之间使用竖线 | 分割(简写);在变量注解、函数(方法)形参和返回值注解中,均可使用;

    基本语法

    变量、函数方法、返回值后加“ : Union[类型1, 类型2,……, 类型N] ”

    # 导包–若需要使用Union类型注解,务必需要先引入 Union 联合类型依赖
    from typing import Union

    Union[类型1, 类型2,……, 类型N]

    以下示例可供测试参考学习;

    # 导包–若需要使用Union类型注解,务必需要先引入 Union 联合类型依赖
    from typing import Union

    # 变量name可以是整型或者浮点型或者字符串类型或者为None
    name: Union[int, float, str, None] = 18

    # 列表list1是列表(list)类型,里面的元素(value)值可能是整型、字符串、浮点型、布尔类型
    list1: list[Union[int, str, float, bool]] = [1, "ZhangSsan", 'lisi', 3.1415926, False]
    list2: list[Union[int | str | float | bool]] = [1, "ZhangSsan", 'lisi', 3.1415926, False]

    # 元组需要将每一个元素都标记出来
    tuple1: tuple[int, float, str, str, bool] = (1, 3.14, "ZhangSan", 'LiSi', False)
    # 常用面向对象方式–使用tuple()对象方式定义空元组
    tuple2: tuple[Union[int, float, str, bool]] = tuple()
    tuple3: tuple[Union[int | str | float , bool]] = tuple()

    # 字典dict1是字典(dict)类型,里面key值是字符串类型,value值可以是整型、浮点型、布尔类型
    dict1: dict[str, Union[int, float, bool]] = {"a": 100, "b": 3.14159, "c": False}

    # 集合set1是字典(set)类型,里面元素可以是整型、浮点型、布尔类型
    set1: set[Union[int, float, bool]] = {"a", True, 3.14}

    # 定义add方法–参数a可以是整型或者浮点型,参数b可以是整型或者浮点型;返回值可以是整型或者浮点型
    def add(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
    # 函数返回值可以是整型或者浮点型
    return a + b

    print(add(1, 2))

    代码断点调试

    基于 PyCharm 工具断点调试

    PyCharm Debug(断点调试)可以帮助开发者在代码运行时进行实时的调试和错误排查(主要是排错用的),提高代码开发效率和代码质量。

    建议可参考:PyCharm 运行与调试、PyCharm 界面说明

    如果遇到错误,不使用 Debug 方法,以前使用输出语句的话,效率会比较低;

    准备一段测试代码:

    # 定义
    def add(a, b):
    return a + b

    if __name__ == '__main__':

    # 遍历
    for i in range(1, 5):
    # 返回
    result = add(i, i + 1)
    # 打印
    print("result {}".format(result))

    假如说需要查看代码里面的执行过程,这时可以使用 Debug ;

    第一步:放置断点

    例如:需要查看”result = add(i, i + 1)“ 里面执行过程的数据;

    打断点,在想要放置断点的位置(地方,所在代码行前)鼠标左键单击(再次点击则取消);点击后会出现一个实心的圆点,此刻表示断点已经放置成功。

    鼠标光标移动到某代码行号(行数)前时会出现透明红色圆点;

    实际整个红色方框内都能触发断点圆点;

    第二步:启动 Debug 调试
    启动 debug 的方式方法

    快捷键: Shift + F9

    方法一:点击”main“ 函数旁边的绿色三角图标,然后选择”调式(”Debug'debug'“ )“,即可进入 Debug 模式;

    方法二:选择需要”Debug“ 的文件,再点击工具栏的 🐞 调试 按钮;一般这种方法使用的最多,或者使用快捷键( shift+F9 )方式;

    方法三:在代码空白处鼠标右键→选择”Debug“

    调试界面详解

    断点调试的意思就是程序在执行到”打断点“位置时,暂时挂起(可以理解为是等待)此时可以看到之前运行程序的一些变量参数等信息;启动调试后会在下方出现调试控制台界面;

    操作

    描述

    重新运行 Ctrl+F5

    重新 debug 运行代码。

    停止 Ctrl+F2

    停止运行,程序终止,终止调试会话;找到错误原因就停止程序。

    恢复程序 F9

    继续运行直到下一个断点处,若没有下一个断点,则程序执行结束。

    暂停程序

    暂时停止运行代码,暂停。

    步过 F8

    顺着代码逐行运行,执行当前行,不会进入函数内部方法;

    单步执行,一行一行的代码往下执行(最重要的,单步执行)。

    步入 F7

    进入函数内部调试,进入方法,可进入库类;在单步执行时,遇到子函数就进入并且继续单步执行,有的会跳到源代码里面去执行。步过不会进入当前执行的方法,但是这个方法会进入到方法里面。

    单步执行 Alt+Shift+F7

    在单步执行时,遇到子函数就进入并继续单步执行。

    步出 Shift+F8

    执行完当前函数,返回到调用处;跳出当前方法;假如进入了函数体中,看了两行代码,突然不想看了,或者觉得没啥问题时,可以使用步出,返回到跳转处的下一行;跳出当前函数体内,返回到调用此函数的地方,即使用此功能。

    查看断点 Ctrl+Shift+F8

    显示当前所有断点位置。

    忽略断点

    忽略所有断点。

    更多

    未完待续……

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 快速学习Python基础知识详细图文教程17--类型注解和断点调试
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!