新页面 Python数据类型有哪些 考点: 你是否懂 可变 / 不可变 ,会不会踩坑 你是否清楚各类型 适用场景 你基础扎不扎实,有没有写过实际代码 Python 数据类型主要分为 基本数据类型 和 复合 / 容器数据类型 两大类,另外还有一些高级常用类型。 基本数据类型(不可变类型) int :整数,如 1、100、-5 float :浮点数,如 3.14、2.0 bool :布尔型,只有 True 和 False str :字符串,用单引号 / 双引号包裹,如 "test" NoneType :空类型,只有一个值 None 容器 / 复合数据类型(可存放多个元素) list(列表) :有序、可变、可重复,用 [] 表示 tuple(元组) :有序、不可变、可重复,用 () 表示 dict(字典) :键值对结构,key 必须不可变,用 {} 表示 set(集合) :无序、无重复元素,用于去重和集合运算 常见高级 / 扩展类型(加分项) bytes /bytearray:字节类型 complex:复数 内置模块中的类型: datetime 、 array 、 enum 等 这里有一个非常关键的考点: 可变类型和不可变类型 。 不可变类型 :int、float、str、bool、tuple、None特点:修改后会生成新对象,不会改变原数据。 可变类型 :list、dict、set特点:可以在原对象上直接增删改,不会生成新对象。 这道题本身不难,但 可变与不可变 是后面一系列问题的基础。回答时先分类、再举例、最后点出核心考点,面试官会直接觉得你基础很扎实。 可变类型和不可变类型有哪些使用场景? 一、不可变类型的实际工作例子(int /str/tuple /bool) int 整数(不可变) 用例编号: case_id = 1001 接口用例的超时时间: timeout = 5 断言状态码: assert status_code == 200 循环次数: for i in range(10) 特点 :数字一旦定义,不会在代码里偷偷被改掉,非常安全。 str 字符串(不可变) 接口地址: url = " http://xxx.com/login " 请求头: token = "Bearer xxxxx" 测试数据: username = "test01" 断言信息: assert "登录成功" in response.text 工作重点 :字符串不可变,所以 不会在函数传递中被意外修改 ,非常适合做配置、固定参数。 tuple 元组(不可变)【测试高频】 接口用例的参数集合: 暂时无法在飞书文档外展示此内容 多环境配置: 暂时无法在飞书文档外展示此内容 数据库查询条件: 暂时无法在飞书文档外展示此内容 为什么用 tuple? 因为 不可变 = 安全 ,防止代码里不小心把用例关键字段改掉,导致用例失败。 bool 布尔(不可变) 用例开关: is_run = True 断言结果: assert is_success is True 二、可变类型的实际工作例子(list /dict/set) list 列表(可变)【最常用】 存储多条测试用例: 暂时无法在飞书文档外展示此内容 动态添加用例: 暂时无法在飞书文档外展示此内容 接口返回的列表数据: 暂时无法在飞书文档外展示此内容 特点 :可以随时增删改,适合 动态数据、批量数据 。 dict 字典(可变)【测试核心】 接口请求参数: 暂时无法在飞书文档外展示此内容 接口返回结果: 暂时无法在飞书文档外展示此内容 测试报告数据: 暂时无法在飞书文档外展示此内容 工作重点 :字典是 键值对 ,取数据极快,是接口测试最最常用的数据类型。 set 集合(可变) 自动去重: 暂时无法在飞书文档外展示此内容 判断用户是否已存在: 暂时无法在飞书文档外展示此内容 用途 :去重、快速判断存在。 不可变类型(int/str/tuple) 用于: 固定配置、用例关键字段、环境信息、数据库参数 目的: 保证数据不被意外修改,安全稳定 可变类型(list/dict/set) 用于: 请求参数、返回数据、测试用例列表、动态数据 目的: 方便增删改查,灵活处理业务数据 Python中数据类型相互直接转换方法 Python 类型转换非常统一,基本就是 内置函数强转 ,记住这 8 个就够: int() → 转整数 float() → 转浮点数 str() → 转字符串 bool() → 转布尔值 list() → 转列表 tuple() → 转元组 set() → 转集合 dict() → 转字典(需要键值对结构) 字符串 ↔ 数字(接口测试最常用) 暂时无法在飞书文档外展示此内容 工作场景 :接口返回是字符串,要做数值断言;或把数字拼接到 URL 里。 列表、元组、集合互转 暂时无法在飞书文档外展示此内容 工作场景 :需要去重用 set,需要不可变数据用 tuple。 转布尔值 bool ()(面试坑点) 暂时无法在飞书文档外展示此内容 考点 :空内容、0、None 为假,其他都为真。 转字典 dict () 暂时无法在飞书文档外展示此内容 工作场景 :处理用例数据、数据库结果转字典。 高频注意点 不是所有字符串都能转数字 纯数字字符串才行, int("abc") 直接报错 集合、字典不能直接转数字 tuple 转 list 后才能增删改 list 转 set 会自动去重、且无序 总结 在 Python 里,类型转换就是用对应的内置函数: int、float、str、bool、list、tuple、set、dict 。 实际工作中,最常用的就是 字符串和数字互转、列表集合互转 ,做接口测试、自动化脚本时几乎天天用到。 除了内置函数,还有哪些方法可以实现数据类型转换? 除了 int()/str()/list() 这类内置强转函数,常用的类型转换方式还有 4 类 ,都是工作中高频使用的: json 模块(str ↔ dict/list 互转) eval /literal_eval(字符串转原有类型) encode /decode(str ↔ bytes 互转) split /join(字符串与列表互转) 下面一个个讲用法和场景。 json 模块(接口测试最最常用) 接口测试:把返回的字符串转成字典(最常用) 接口返回的数据是 字符串格式 ,不能直接取值,必须用 json.loads() 转成字典。 暂时无法在飞书文档外展示此内容 场景 :接口请求、接口自动化、结果判断。 接口测试:把字典转成字符串发送请求 构造请求体是字典,需要转成 json 字符串 传给接口。 暂时无法在飞书文档外展示此内容 场景 :POST 请求、请求体封装、接口联调。 读取配置文件:json 文件 → 字典 项目里的环境配置、用例配置,都存在 config.json 文件中。 暂时无法在飞书文档外展示此内容 场景 :多环境切换、读取配置、数据驱动。 写入数据到 json 文件 把测试结果、token、用例数据保存到文件。 暂时无法在飞书文档外展示此内容 场景 :自动化测试结果记录、登录态保存、数据持久化。 【必须记住的两个核心方法】 json.loads() :字符串 → 字典 json.dumps() :字典 → 字符串 json.load() :读 json 文件 → 字典 json.dump() :字典 → 写入 json 文件 在软件测试工作中, json 模块最核心的 4 个场景: 接口返回字符串转字典,用于断言 请求字典转字符串,用于接口请求 读取 json 配置文件 写入数据到 json 文件 它是 接口测试、自动化测试 最核心、最基础、最常用的模块。 除了 json 模块,常用的还有 3 种方式 ,都能实现字符串和字典互转: eval(简单粗暴,但不安全) ast.literal_eval(官方推荐、最安全) 正则表达式 re(极端场景手动解析) eval(最简单,但不推荐生产使用) 直接把字符串当成 Python 代码执行。 暂时无法在飞书文档外展示此内容 优点: 支持 单引号、双引号 不用导入模块 能解析 list/tuple/dict 全部类型 缺点: 极度不安全 用户传入恶意代码会直接执行 公司项目 严禁使用 ast.literal_eval(最推荐、最安全、企业标准方案) 这是 eval 的安全版 ,只会解析数据类型,不执行代码。 面试必说这个! 暂时无法在飞书文档外展示此内容 优点: ✅ 支持单引号、双引号 ✅ 安全、不会执行恶意代码 ✅ 接口自动化、数据驱动 最常用 ✅ 能解析 dict、list、tuple、int、str 等 缺点: 不能解析复杂表达式 工作场景:Excel 读取字典字符串、配置文件解析、用例数据处理 表格 还在加载中,请等待加载完成后再尝试复制 正则 re.match/re.findall(手动解析) 极端场景: 字符串不是标准 JSON 不是 Python 格式 脏数据、日志、报文 手动提取 key、value 拼成字典。 暂时无法在飞书文档外展示此内容 优点: 能处理 任何不规则字符串 缺点: 麻烦 一般只用在日志解析、抓包报文处理 json.loads vs ast.literal_eval json.loads 只能解析 双引号 安全 只能解析标准 JSON ast.literal_eval 单引号、双引号都支持 安全 解析能力更强 测试工作中更常用 面试和工作中, 优先用 ast.literal_eval,其次用 json.loads 。 encode /decode(字符串 ↔ 字节串) 暂时无法在飞书文档外展示此内容 场景 接口二进制数据 文件读写 加密、签名、token 处理 split /join(字符串 ←→ 列表) 暂时无法在飞书文档外展示此内容 场景 处理用例参数 处理日志、URL 参数 拼接断言关键字 yaml 模块(自动化框架必备) 作用 :读取 .yaml / .yml 配置文件 → 转字典 / 列表。 测试场景 :环境配置、用例数据、接口地址配置。 暂时无法在飞书文档外展示此内容 pickle 模块(Python 专属序列化) 作用 :把 任意 Python 对象 (列表、字典、类、函数)转二进制存储,再还原。 特点 :只支持 Python,不能跨语言。 场景 :保存登录状态、缓存数据、对象持久化。 暂时无法在飞书文档外展示此内容 csv /openpyxl 模块(数据驱动核心) 作用 :读取 Excel、CSV 文件 → 转列表 / 字典。 测试场景 :测试用例数据驱动、接口参数化。 暂时无法在飞书文档外展示此内容 base64 /hashlib 模块(加密 / 编码转换) 作用 :字符串 ↔ base64 字符串 ↔ 字节串 互转。 场景 :接口加密、签名、图片转码。 暂时无法在飞书文档外展示此内容 总结 除了基础的 int ()、str () 内置函数,真正工作和面试中高频的类型转换还有: json 模块 :str 和 dict/list 互转(接口测试核心) literal_eval :字符串还原成原数据类型 encode/decode :字符串与字节串互转 split/join :字符串与列表互转 yaml → 读取配置 openpyxl → 数据驱动 pickle/base64 → 缓存与加密 这些都是做自动化、接口测试几乎每天都用的。本质是看你 有没有做过自动化框架、数据驱动、配置管理 。 如何将字典转换为列表或元组 在 Python 中,把字典转列表 / 元组,主要有 3 种目标形式 : 只转换 键 (Key) 暂时无法在飞书文档外展示此内容 只转换 值 (Value) 暂时无法在飞书文档外展示此内容 转换 键值对 (整体) 暂时无法在飞书文档外展示此内容 面试大坑:直接强转 千万不要直接用 list (字典)! 暂时无法在飞书文档外展示此内容 面试官必问 :直接转为什么只有键? 答 :因为字典遍历默认遍历的是 键 (Key) 。 工作实际场景 提取接口返回字段名 暂时无法在飞书文档外展示此内容 数据驱动用例 暂时无法在飞书文档外展示此内容 总结 字典转列表 / 元组,记住 三个核心方法 : keys() —— 拿所有 键 values() —— 拿所有 值 items() —— 拿 键值对 直接强转 list(字典) 默认只拿键,这是面试高频坑点。 数据类型转换可能会遇到哪些问题?如何解决 字符串不是纯数字,转 int/float 直接报错 问题场景 接口返回 "123a" 、 "null" 、 "" 空字符串 用 int("123a") 直接抛异常 ValueError 解决方法 先做非空、格式校验,再转换 用 try-except 捕获异常,避免用例直接中断 对脏数据给默认值 暂时无法在飞书文档外展示此内容 单引号字典字符串,json.loads 解析失败 问题场景 Excel / 配置文件里是 {'name':'test'} 单引号格式 json.loads 只认双引号,直接报错 解决方法 优先使用 ast.literal_eval (支持单引号、最安全) 或者替换单引号为双引号再用 json.loads 暂时无法在飞书文档外展示此内容 空值 None、空字符串转数字 / 布尔值不符合预期 问题场景 int(None) 直接报错 bool("False") 结果是 True,因为非空字符串都为真 接口返回 null 转数字失败 解决方法 先判断是否为 None / 空 ,再处理 布尔值不要强转,直接判断字符串内容 暂时无法在飞书文档外展示此内容 集合、字典、列表直接转数字报错 问题场景 int([1]) 、 int({ "a": 1 }) 直接报错 新手常误以为能自动提取里面的值 解决方法 先通过索引、key 把 真实值取出来 ,再转换 不要对容器类型直接强转数字 暂时无法在飞书文档外展示此内容 编码问题导致 str/bytes 转换乱码 问题场景 encode / decode 用了 gbk、utf-8 不统一 接口二进制、图片、加密串转字符串出现乱码 解决方法 统一使用 utf-8 捕获 UnicodeDecodeError ,设置忽略错误 暂时无法在飞书文档外展示此内容 为了避免类型转换出问题,我们在项目里一般会这么做: 所有转换都加 try-except ,不让脚本直接崩 数据先校验再转换 :非空、格式、长度、范围 优先用 ast.literal_eval,少用 eval,标准 json 用 json 模块 对接口返回做 字段类型断言 ,提前发现问题 封装公共工具方法:str_to_int、str_to_dict 统一处理 结尾 在实际项目中,数据类型转换常见问题主要是: 格式不合法、单双引号不兼容、空值脏数据、编码乱码、容器直接强转 。解决思路就是: 先校验、再捕获异常、统一编码、使用安全的转换方法 ,这样写出来的自动化脚本才稳定、不轻易报错。 如何对excel操作 Python 处理 Excel 主要用三个库: xlrd/xlwt、openpyxl、pandas ,根据场景选择。 常用库与适用场景 xlrd / xlwt 读写 .xls 格式(Excel 97-2003) xlrd 新版只支持读,不支持写 适合老旧格式文件 openpyxl 读写 .xlsx (Excel 2007+) 支持单元格样式、公式、图表、批注 适合 精细化操作 (改格式、设置公式、逐单元格处理) pandas 基于 openpyxl/xlrd 封装 读写速度快,适合 数据分析、批量处理 简单几行就能读写、筛选、汇总 企业最常用 核心操作代码 (1)pandas 读写(最常用) 暂时无法在飞书文档外展示此内容 (2)openpyxl 精细化操作 暂时无法在飞书文档外展示此内容 高频考点 读取多个 sheet pandas: sheet_name=None 返回字典 openpyxl: wb.sheetnames 遍历 筛选、过滤数据 pandas 直接条件筛选: 暂时无法在飞书文档外展示此内容 合并、去重、空值处理 暂时无法在飞书文档外展示此内容 设置样式、字体、颜色 用 openpyxl 设置 Font、PatternFill 等。 大数据量处理 pandas 速度远快于逐行循环 超大数据可用 chunksize 分块读取 一句话总结 简单数据分析、批量处理用 pandas ;需要精细控制单元格、样式、公式用 openpyxl ;老旧 .xls 文件用 xlrd/xlwt 。 布尔值可以进行哪些运算? 布尔值(True 和 False)主要用于逻辑判断,支持以下运算: 逻辑运算 与(and) :两边都为 True 时结果才为 True,否则为 False例:True and True → True;True and False → False 或(or) :至少一边为 True 时结果为 True,否则为 False例:True or False → True;False or False → False 非(not) :取反,not True → False,not False → True 比较运算 布尔值可与其他数据类型进行比较(True 等价于 1,False 等价于 0): 例:True == 1 → True;False > 0 → False 数值运算(不推荐,但语法允许) 布尔值可参与加减等运算(本质是 1 和 0 的运算): 例:True + True → 2;False * 5 → 0 列表(list)、元组(tuple)、集合(set)和字典(dict)的区别 这四个是 Python 最核心的数据结构,我用 最直白、最好记 的方式给你讲清楚区别,看完就能直接用。 一句话总览 list(列表) :有序、可改、可重复 tuple(元组) :有序、 不可改 、可重复 set(集合) : 无序 、可改、 不可重复 dict(字典) :键值对、键唯一、无序(3.7 + 有序) 详细对比 list 列表 [] 写法: [1, 2, 3] 有序 :有索引,能按位置取 可修改 :增删改查都行 可重复 用途:存一组有序数据,比如成绩、名单 暂时无法在飞书文档外展示此内容 tuple 元组 () 写法: (1, 2, 3) 有序 不可修改 (不能增删改) 可重复 用途:固定不变的数据,如配置、坐标 暂时无法在飞书文档外展示此内容 set 集合 {} 写法: {1,2,3} 无序 (没有索引) 自动去重 可增删,但不能存重复值 用途:去重、判断是否存在、交集并集 暂时无法在飞书文档外展示此内容 dict 字典 {key:value} 写法: {"name":"张三", "age":20} 键值对结构 键必须唯一 ,重复会覆盖 3.7 版本后有序,之前无序 用途:存结构化信息,类似对象 暂时无法在飞书文档外展示此内容 一张表彻底记住 表格 还在加载中,请等待加载完成后再尝试复制 最简单使用场景口诀 要 有序可改 → list 要 固定不变 → tuple 要 去重 / 快速查找 → set 要 键值对存信息 → dict 列表、元组、集合和字典的应用场景分别是什么 list 列表:最常用,日常 “万能容器” 特点 :有序、可修改、可重复 一句话场景 :需要 按顺序存一堆东西,后面还要增删改 。 你在测试里最常用: 存用例列表: test_cases = ["登录", "退出", "查询"] 存接口参数组合: params = [{"id":1}, {"id":2}] 存循环读取的数据: user_list = [] 后面不断 append 存日志、结果、截图路径 什么时候用 list? 数据要 顺序不乱 ,还要 随时增删改 。 tuple 元组:固定不变的 “安全包” 特点 :有序、 不可修改 、可重复 一句话场景 :数据 一旦确定就不能改 ,防止误操作。 测试 / 开发常用: 配置项: HOST = ("192.168.1.1", 8080) 固定枚举值: STATUS = ("成功", "失败", "异常") 函数多返回值: return code, msg 本质就是元组 作为字典的 key(list 不行,tuple 可以) 什么时候用 tuple? 不想别人 / 自己手贱改了关键数据,用它最安全。 set 集合:去重 + 快速查找 特点 :无序、 自动去重 、查找极快 一句话场景 : 去重、判断是否存在、交集差集 。 测试里非常实用: 去掉重复数据: user_ids = list(set(old_ids)) 判断元素是否存在(比 list 快很多): if name in black_set: 对比两个列表差异: 只在 A 不在 B: set(A) - set(B) 共同数据: set(A) & set(B) 存唯一标识:token、id、手机号去重 什么时候用 set? 只要涉及 去重、快速判断存在、对比差异 ,首选 set。 dict 字典:结构化数据,键值对 特点 :key-value 结构、key 唯一、可修改 一句话场景 : 一个对象有多个属性,用名字取数据 。 测试里几乎天天用: 接口请求参数: 暂时无法在飞书文档外展示此内容 接口返回结果解析 用例信息: case = {"id":1, "title":"登录", "expect":200} 配置字典、header、cookies 什么时候用 dict? 要描述 一个东西的多个属性 ,不用下标,用名字取。 超级精简总结(适合记) list :顺序存放、可修改 → 存列表、用例、结果 tuple :固定不变、防篡改 → 配置、固定参数 set :去重、快速查找 → 去重、判存在、对比差异 dict :键值对、结构化 → 接口参数、返回数据、对象信息 列表的增删改查方法 列表格式: lst = [1, 2, 3, 4] 一、增(添加元素) append (元素) 加到 末尾 暂时无法在飞书文档外展示此内容 insert (索引,元素) 插到 指定位置 暂时无法在飞书文档外展示此内容 extend (列表) 把另一个列表 合并进来 暂时无法在飞书文档外展示此内容 直接 + 暂时无法在飞书文档外展示此内容 二、删(删除元素) del 语句 按 索引 删 暂时无法在飞书文档外展示此内容 pop (索引) 按索引删,并 返回被删元素 暂时无法在飞书文档外展示此内容 不写索引默认删最后一个: 暂时无法在飞书文档外展示此内容 remove (元素) 按 值 删(删第一个匹配的) 暂时无法在飞书文档外展示此内容 clear() 清空列表 暂时无法在飞书文档外展示此内容 三、改(修改元素) 直接通过 索引赋值 暂时无法在飞书文档外展示此内容 四、查(查找、获取) 按索引取 暂时无法在飞书文档外展示此内容 切片取一段 暂时无法在飞书文档外展示此内容 index (元素) 找元素 第一次出现的索引 暂时无法在飞书文档外展示此内容 count (元素) 统计出现次数 暂时无法在飞书文档外展示此内容 in 判断是否存在 暂时无法在飞书文档外展示此内容 五、常用其他方法 排序: lst.sort() 反转: lst.reverse() 长度: len(lst) 一句话速记 增:append /insert/extend 删:del /pop/remove /clear 改:直接索引赋值 查:索引、切片、index、count、in 字典的增删改查 字典(dict)的增删改查非常简单,核心就是通过 键(key) 操作 示例字典: 暂时无法在飞书文档外展示此内容 一、增(添加键值对) 1. 直接赋值(不存在就是新增) 暂时无法在飞书文档外展示此内容 2. update() 批量添加/更新 暂时无法在飞书文档外展示此内容 二、删(删除键值对) 1. del 删除指定 key 暂时无法在飞书文档外展示此内容 2. pop(key) 删除并返回值 暂时无法在飞书文档外展示此内容 3. popitem() 删除最后一对(Python3.7+) 暂时无法在飞书文档外展示此内容 4. clear() 清空字典 暂时无法在飞书文档外展示此内容 三、改(修改值) 通过 key 直接赋值 (存在就是修改) 暂时无法在飞书文档外展示此内容 批量修改用 update() : 暂时无法在飞书文档外展示此内容 四、查(获取值) 1. 直接通过 key 获取(推荐) 暂时无法在飞书文档外展示此内容 ⚠️ 缺点:key 不存在会 报错 。 2. get() 安全获取(最常用) 暂时无法在飞书文档外展示此内容 3. 获取所有 key 暂时无法在飞书文档外展示此内容 4. 获取所有 value 暂时无法在飞书文档外展示此内容 5. 获取所有键值对 暂时无法在飞书文档外展示此内容 6. 判断 key 是否存在 暂时无法在飞书文档外展示此内容 一句话总结 增 : dict[key] = 值 / update() 删 : del / pop() / clear() 改 : dict[key] = 新值 查 : dict[key] / get() / keys/values/items 列表靠「位置下标」操作,字典靠「键名 key」操作 集合的增删改查 集合(set)最核心特点: 无序、无下标、元素不可重复、可哈希 示例: 暂时无法在飞书文档外展示此内容 一、增 1. add(元素) 添加单个元素 暂时无法在飞书文档外展示此内容 2. update(可迭代对象) 批量添加(列表、元组、字符串都行) 暂时无法在飞书文档外展示此内容 二、删 1. remove(元素) 删除指定元素, 不存在会报错 暂时无法在飞书文档外展示此内容 2. discard(元素) 删除指定元素, 不存在不报错 (推荐使用) 暂时无法在飞书文档外展示此内容 3. pop() 随机删除一个元素,并返回它 暂时无法在飞书文档外展示此内容 4. clear() 清空集合 暂时无法在飞书文档外展示此内容 三、改 ⚠️ 集合没有 “修改” 操作 因为: 无序,没有下标 元素不可变(不能改里面的值) 真要改,只能: 先删旧的,再加新的 。 四、查 集合 不能通过下标/索引查 ,只能: 1. 判断是否存在 暂时无法在飞书文档外展示此内容