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

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

Python 基础知识

类型注解

类型注解的概念

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

主要功能:

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

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

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

  1. 代码难以理解:看到一个函数时,不清楚应该传入什么类型的数据;
  2. 隐藏的bug:可能不小心传入了错误类型,直到运行时才报错;
  3. 开发效率低: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 | 显示当前所有断点位置。 ||
| 忽略断点 | 忽略所有断点。 ||
| 更多 | ||

未完待续......

相关推荐
每天吃饭的羊3 小时前
Chrome DevTools MCP
python
leoZ2314 小时前
AI 辅助开发的五道坎
开发语言·人工智能·视觉检测·bert·php·超分辨率重建·openvino
IT古董4 小时前
【MES学习笔记系列】MES 厂商与产品对比
笔记·学习
程序员老陆4 小时前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频
wangyue_msn_864 小时前
Agent知识学习笔记——03 RAG
笔记·学习·ai编程
呱呱巨基4 小时前
Linux 查找命令
linux·笔记·学习·查找命令
2601_963869955 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
水獭比特5 小时前
localhost 不是安全边界:给 Agent Web 入口补上四层门禁
人工智能·python
Generalzy5 小时前
Whisper + VAD + TTS:一套完整的 Python 本地语音处理流水线
python·whisper·语音识别