恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Python数据类型和常用操作
首页
资讯中心
/
Python数据类型和常用操作
Python数据类型和常用操作
发布时间:2026/10/11 10:47:38
前言写 Python 的日常大半时间是在跟内置类型打交道字符串怎么切、列表怎么删、字典怎么合并。这些操作单个看都不难难的是记准——哪个方法返回新对象、哪个是原地修改、哪个返回None、参数是位置还是关键字。记错一个代码不会报错只会静默地做错事。最容易踩的一类误解是把「返回新对象」和「原地修改」混为一谈。比如list.sort()是原地排序且返回None很多人写成sorted_list lst.sort()拿到的是None后面再调用就报错。再比如字符串的str.upper()返回新字符串原字符串不变——这一点跟列表的lst.append()完全不同。本文按类型分块把数字、字符串、列表、元组、字典、集合的增删改查、切片、推导式和最常用方法集中整理成可查的清单每个动作都标明「原地还是新建」。示例以 Python 3 为准涉及较新版本特性的地方会单独标注版本。一、数字与字符串数字类型里int是任意精度整数float是双精度浮点。要注意的是除法Python 3 里3 / 2得1.5整除要用//。这一点跟 Python 2 不同——Python 2 里3 / 2得1。Python 2.7 已于 2020 年 1 月 1 日停止维护新代码一律按 3 的语义写。字符串是不可变对象所有「修改」类方法都返回新字符串。常用操作速查操作写法返回说明切片s[1:4]新 str左闭右开去空白s.strip()新 str另有lstrip/rstrip切分s.split(sepNone, maxsplit-1)新 list不传 sep 按空白切并丢弃空段拼接sep.join(iterable)新 str分隔符在前比拼装更合适替换s.replace(old, new, count-1)新 str默认全部替换查找s.find(sub)/s.index(sub)int找不到时find返回 -1index抛异常判断s.startswith(p)/s.endswith(p)bool可传 tuple 试多个前缀去前后缀s.removeprefix(p)/s.removesuffix(p)新 str需要 Python 3.9 及以上大小写s.lower()/s.upper()新 str比较时常用casefold()更彻底在 Python 3.9 之前没有removeprefix等价写法是s[len(p):] if s.startswith(p) else s。二、列表与元组列表是可变序列方法分成「原地修改」和「返回新对象」两类用错就是 bug。方法作用返回原地lst.append(x)尾部加一个元素None是lst.extend(it)尾部追加可迭代对象的所有元素None是lst.insert(i, x)在下标 i 前插入None是lst.remove(x)删除第一个等于 x 的元素None是找不到抛ValueErrorlst.pop(i-1)弹出并返回元素被弹出的元素是lst.clear()清空None是lst.index(x)返回第一个 x 的下标int否lst.count(x)统计出现次数int否lst.sort(keyNone, reverseFalse)排序None是lst.reverse()反转None是lst.copy()浅拷贝新 list否sorted(iterable, keyNone, reverseFalse)排序新 list否注意sort和sorted的区别前者是 list 的方法、原地排序、返回None后者是内置函数、接受任意可迭代对象、返回新列表。key是一个函数作用在每个元素上排序按它的返回值比较。元组不可变方法只有count和index两个。它的价值在于定长和可哈希。解包是元组最实用的特性# 适用于 Python 3.8point (3, 5)x, y pointprint(x, y) # 3 5# 星号解包PEP 3132Python 3.0 起first, *rest [1, 2, 3, 4]print(first, rest) # 1 [2, 3, 4]# 交换变量本质是元组打包解包a, b 1, 2a, b b, aprint(a, b) # 2 1# 单个元素的元组必须带逗号one (1,)print(type(one).__name__, len(one)) # tuple 1not_tuple (1)print(type(not_tuple).__name__) # int括号只是分组三、字典与集合字典按 key 增删改查从 Python 3.7 起保证按插入顺序遍历注意3.6 是 CPython 的实现细节不要依赖。操作写法返回说明取值d[k]值键不存在抛KeyError安全取值d.get(k, defaultNone)值或默认值不修改字典取或写入d.setdefault(k, defaultNone)值键不存在时先写入默认值再返回增改d[k] v无键存在则覆盖删除d.pop(k, default)被删的值无 default 且键不存在抛异常删除末条d.popitem()(k, v) 元组3.7 起是 LIFO批量更新d.update(other)None原地合并成新字典d1 \d2新 dict遍历d.items()/.keys()/.values()视图是视图不是列表会随字典变化其中|运算符是 Python 3.9 引入的PEP 5843.9 之前要合并两个字典得用{**d1, **d2}或先copy()再update()。另外.items()等方法返回的是视图对象不是列表需要快照就显式list(d.items())。Python 2 里dict.iteritems()这类方法在 3 中已被移除直接用.items()即可它本身已经是惰性的。集合用于去重和集合运算操作写法说明加一个s.add(x)已存在则无变化加多个s.update(iterable)逐个加入删不存在不报错s.discard(x)常用安全删不存在报错s.remove(x)不存在抛KeyError随意弹出一个s.pop()空集抛KeyError并集s1 \s2/s1.union(s2)交集s1 s2/s1.intersection(s2)公共元素差集s1 - s2/s1.difference(s2)在 s1 不在 s2对称差s1 ^ s2只在一侧的四、切片与推导式切片适用于 list、tuple、str、range 等序列语法是seq[start:stop:step]左闭右开。它永远不会越界[1, 2, 3][10:20]得到空列表。索引则相反[1, 2, 3][10]抛IndexError。切片结果以s [0, 1, 2, 3, 4, 5]为例s[1:4][1, 2, 3]s[:3][0, 1, 2]s[3:][3, 4, 5]s[-2:][4, 5]s[::2][0, 2, 4]s[::-1][5, 4, 3, 2, 1, 0]s[1:5:2][1, 3]推导式是构造容器的紧凑写法列表、字典、集合都支持写法如下# 适用于 Python 3.8nums [1, 2, 3, 4, 5, 6]squares [n * n for n in nums] # 列表推导式evens [n for n in nums if n % 2 0] # 带条件pairs {n: n * n for n in nums} # 字典推导式unique_mod {n % 3 for n in nums} # 集合推导式print(squares) # [1, 4, 9, 16, 25, 36]print(evens) # [2, 4, 6]print(pairs[4]) # 16print(sorted(unique_mod)) # [0, 1, 2]# 生成器表达式用圆括号惰性求值不一次性建表total sum(n * n for n in nums)print(total) # 91列表推导式一定会把结果全部建出来放在内存里生成器表达式generator expression只在迭代时逐个产出适合「边算边用」的场景。两者写法只差一对方括号还是圆括号但一个会占用与元素个数成正比的内存另一个不会。常见坑点把原地排序的返回值赋出去。❌lst lst.sort()——sort()返回Nonelst变成None后续操作全部报错。✅ 原地排序就单独写一行lst.sort()要新列表用lst sorted(lst)。用索引去访问可能不存在的位置。❌s[10]直接抛IndexError越界判断还得手写。✅ 提前用len(s)判断只想要「安全地取一段」就用切片s[10:20]越界返回空。循环里用拼字符串。❌res 后for x in data: res x—— 字符串不可变每次都在新建对象。✅ 收集到列表再.join(parts)一次性拼接或直接用生成器表达式。用remove删除不存在的元素。❌lst.remove(x)在元素不存在时抛ValueError。✅ 先判断if x in lst:再删或用try/except ValueError要按位置删就用pop。把dict.get当成会写入。❌d.get(k, [])之后往返回的列表里 append以为字典里多了这个键——其实没有。✅ 需要「不存在就建」用d.setdefault(k, [])或collections.defaultdict(list)。忘记单元素元组的逗号。❌t (1)得到的是int不是元组。✅ 写成t (1,)逗号才是元组的标志。以为(k, v)遍历时能直接改 dict。❌for k, v in d.items(): d[k] v * 2这种改值本身可以但增删键会抛RuntimeError。✅ 需要增删键时先list(d.items())取快照再遍历。用is比较字符串或数字的值。❌if s is abc:——is比的是身份字符串驻留是实现细节不保证成立。✅ 比内容用is只用于is None这类身份判断。总结类型可变增删查改str否拼接得新串切片得新串find/in方法返回新串list是append/insertpop/remove下标 /indexlst[i] vtuple否不适用不适用下标 /count不适用dict是d[k] vpop/deld.get/ind[k] vset是add/updatediscard/removein只能删了再加把这张表记牢的关键不在方法名而在「返回什么」。凡是你拿不准的先问自己这一步是原地改还是产生新对象返回None的几乎都是原地改——这条经验能挡掉一大半错误。