序列的心你摸透了吗😆😆😆

在 Python 中,序列是一类按顺序排列元素的数据结构,是数据处理的基础。根据元素是否可修改,序列可分为可变序列与不可变序列,二者在操作特性上存在显著差异。本文将系统解析序列的分类、核心操作、对象属性及相关函数,并结合代码示例帮助理解,为数据处理提供扎实基础。

一、序列的分类

序列按元素可修改性分为两类,适用场景各有不同:

  • 可变序列:元素可动态修改,包括列表(list)、numpy 数组等,适合需要频繁增删改的场景。
  • 不可变序列:元素创建后不可修改,包括元组(tuple)、字符串(str)等,适合存储固定数据或作为字典键。

二、序列的基本操作

序列支持多种通用操作,但可变与不可变序列在部分操作中表现不同,需重点注意。

1. 拼接与重复

  • 拼接(+) :将两个同类型序列连接为新序列,结果类型与原序列一致。
  • 重复(*) :将序列元素重复指定次数生成新序列,可快速创建有规律的序列。
ini 复制代码
# 列表操作示例
list1 = [1, 2]
list2 = [3, 4]
print(list1 + list2)  # 拼接结果:[1, 2, 3, 4]
print(list1 * 2)      # 重复结果:[1, 2, 1, 2]
# 字符串操作示例
str1 = "ab"
str2 = "cd"
print(str1 + str2)    # 拼接结果:"abcd"
print(str1 * 3)       # 重复结果:"ababab"

2. 增量赋值(*=)与对象标识变化

增量赋值(*=)本质是扩展序列后重新赋值,但因序列可修改性不同,表现存在差异:

  • 可变序列(如列表):*= 会在原对象上直接修改,对象唯一标识(id)保持不变。
  • 不可变序列(如元组):因无法修改,*= 会创建新对象,原对象 id 发生改变。
bash 复制代码
# 列表(可变序列)的 *= 操作
lst = [1, 2]
id_before = id(lst)
lst *= 2  # 原地扩展
print(id(lst) == id_before)  # 输出:True(id不变)
print(lst)  # 结果:[1, 2, 1, 2]
# 元组(不可变序列)的 *= 操作
tpl = (1, 2)
id_before = id(tpl)
tpl *= 2  # 创建新元组
print(id(tpl) == id_before)  # 输出:False(id改变)
print(tpl)  # 结果:(1, 2, 1, 2)

三、对象的基本属性

Python 中所有对象都具备三个核心属性,决定其行为特性:

  • 唯一标识(id) :通过id()函数获取,相当于对象的内存地址,创建后永久不变,可用于判断是否为同一对象。
  • 类型(type) :通过type()函数获取,决定对象支持的操作(如列表有append()方法,元组没有)。
  • 值(value) :对象存储的具体数据,可变对象的值可修改,不可变对象的值不可修改。
bash 复制代码
s = "hello"
print("id:", id(s))      # 示例输出:140705223456752(内存地址标识)
print("类型:", type(s))  # 输出:<class 'str'>(决定支持字符串方法)
print("值:", s)          # 输出:hello(实际存储的数据)

四、序列的成员判断与元素删除

1. 成员判断(in /not in)

通过in和not in可高效判断元素是否存在于序列中,返回布尔值,避免手动遍历。

vbscript 复制代码
s = "鱼c"
print("鱼" in s)      # 输出:True("鱼"是序列元素)
print("水" not in s)  # 输出:True("水"不是序列元素)
lst = [1, 3, 5]
print(2 in lst)       # 输出:False(2不在列表中)

2. 删除元素(del)

del语句用于删除序列元素或切片(左闭右开区间),仅支持可变序列,不可变序列因无法修改不支持此操作。

ini 复制代码
x = [1, 2, 3, 4, 5]
del x[1:4]  # 删除索引1到3的元素(含1不含4)
print(x)    # 输出:[1, 5](修改原列表)

五、序列相关函数

1. 类型转换函数

可在不同序列类型间灵活转换,满足多样化处理需求:

  • list(a):将可迭代对象a转换为列表(如元组转列表实现修改)。
  • tuple(a):将可迭代对象a转换为元组(如列表转元组实现固定)。
  • str(a):将对象a转换为字符串(便于输出或拼接)。
python 复制代码
a = (1, 2, 3)  # 元组(不可修改)
print(list(a))   # 转为列表:[1, 2, 3](可修改)
print(str(a))    # 转为字符串:'(1, 2, 3)'(便于打印)
b = "123"
print(tuple(b))  # 转为元组:('1', '2', '3')(固定元素)

2. 最值、长度与求和函数

快速获取序列统计信息,避免手动循环计算:

  • min(s) / max(s):返回序列最小值 / 最大值,空序列可指定default参数避免报错。
  • len(s):返回序列元素个数,是处理循环的基础函数。
  • sum(s):计算序列元素总和(元素需为数值类型)。
python 复制代码
nums = [3, 1, 4, 2]
print(min(nums))  # 输出:1(最小值)
print(max(nums))  # 输出:4(最大值)
print(len(nums))  # 输出:4(元素个数)
print(sum(nums))  # 输出:10(总和)
# 处理空序列的安全方式
empty_list = []
print(min(empty_list, default=0))  # 输出:0(指定默认值避免报错)

3. 排序相关函数

提供灵活的排序与逆序功能,注意原地排序与返回新列表的区别:

  • sorted(s):返回新排序列表(不修改原序列),默认升序,支持reverse=True降序。
  • reversed(s):返回逆序迭代器,需通过list()转换为列表,原序列不变。
ini 复制代码
nums = (3, 1, 4, 2)  # 元组(不可修改)
sorted_asc = sorted(nums)        # 升序新列表:[1, 2, 3, 4]
sorted_desc = sorted(nums, reverse=True)  # 降序新列表:[4, 3, 2, 1]
print("原元组:", nums)  # 原序列不变:(3, 1, 4, 2)
# 逆序操作
reversed_iter = reversed(nums)
print(list(reversed_iter))  # 输出:[2, 4, 1, 3]

注意:列表的sort()方法是原地排序(直接修改原列表),无返回值;sorted()则返回新列表,原序列保持不变。

4. 元素判断函数

批量判断元素真假性,常用于数据过滤:

  • all(s):所有元素为真(非 0、非空、非 None 等)返回 True,空序列返回 True。
  • any(s):至少一个元素为真返回 True,空序列返回 False。
python 复制代码
lst1 = [1, 2, 3]
print(all(lst1))  # 输出:True(所有元素为真)
print(any(lst1))  # 输出:True
lst2 = [0, 1, 2]
print(all(lst2))  # 输出:False(存在0为假)
print(any(lst2))  # 输出:True(存在1、2为真)

5. 枚举与聚合函数

  • enumerate(s):将元素与索引组合为二元组,便于遍历同时获取位置信息。
python 复制代码
fruits = ["苹果", "香蕉", "橙子"]
for idx, fruit in enumerate(fruits):
    print(f"索引{idx}:{fruit}")  # 输出:索引0:苹果 等
  • zip(*iterables):将多个可迭代对象按位置聚合为元组,长度以最短对象为准。需完整保留元素时,可使用itertools.zip_longest()。
ini 复制代码
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9, 10]
# 普通zip(取最短长度)
print(list(zip(x, y, z)))  # 输出:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
# 保留所有元素(需导入itertools)
import itertools
print(list(itertools.zip_longest(x, y, z)))  # 输出:[(1, 4, 7), (2, 5, 8), (3, 6, 9), (None, None, 10)]

6. 映射与过滤函数

  • map(func, iterable):对可迭代对象每个元素应用函数func,返回迭代器,适合批量转换数据。
  • filter(func, iterable):保留使func返回 True 的元素,返回迭代器,适合数据过滤。
python 复制代码
# map示例:字符转ASCII码
print(list(map(ord, "FishC")))  # 输出:[70, 105, 115, 104, 67]
# filter示例:保留小写字母
print(list(filter(str.islower, "FishC")))  # 输出:['i', 's', 'h']

六、迭代器与可迭代对象

理解迭代器与可迭代对象的区别,是掌握 Python 高效遍历的关键:

  • 可迭代对象(Iterable) :能被for循环遍历的对象(列表、元组、字符串等),可重复遍历,内部存储所有元素。
  • 迭代器(Iterator) :通过iter()从可迭代对象转换而来,逐个生成元素(不提前存储),只能遍历一次,通过next()提取元素。
python 复制代码
# 可迭代对象(列表)可重复遍历
lst = [1, 2, 3]
for i in lst:
    print(i, end=" ")  # 输出:1 2 3
print()
for i in lst:
    print(i, end=" ")  # 再次输出:1 2 3
# 迭代器(一次性遍历)
it = iter(lst)
print(next(it))  # 输出:1
print(next(it))  # 输出:2
print(next(it))  # 输出:3
# print(next(it))  # 报错:StopIteration(无更多元素)

总结

序列是 Python 数据处理的基础结构,掌握其分类特性与操作方法,能显著提升代码效率。可变序列适合动态数据处理,不可变序列适合固定数据存储。通过本文介绍的操作与函数,可灵活应对序列的创建、转换、遍历与过滤等需求,为复杂数据处理奠定基础。实际应用中,需根据场景选择合适的序列类型,并注意可变与不可变序列的操作差异。

此外,随着Python版本的更新与第三方库的发展,序列处理功能也在不断丰富,例如Pandas库中的Series和DataFrame类型,在继承序列基本特性的同时,拓展了数据统计与分析功能。建议开发者在实践中持续关注新特性,通过阅读官方文档、参与开源项目等方式,深化对序列及相关数据结构的理解与应用。

相关推荐
MZ_ZXD00113 分钟前
flask校园学科竞赛管理系统-计算机毕业设计源码12876
java·spring boot·python·spring·django·flask·php
倔强青铜三1 小时前
苦练Python第16天:Python模块与import魔法
人工智能·python·面试
wa的一声哭了1 小时前
python基础知识pip配置pip.conf文件
java·服务器·开发语言·python·pip·risc-v·os
LuckyLay2 小时前
1.1.5 模块与包——AI教你学Django
python·django·sqlite
LuckyLay2 小时前
Django专家成长路线知识点——AI教你学Django
后端·python·django
陈晨辰熟稳重2 小时前
20250713-`Seaborn.pairplot` 的使用注意事项
python·seaborn
魔力之心2 小时前
sklearn study notes[1]
人工智能·python·sklearn
云空3 小时前
《PyQt6-3D:开启Python 3D开发新世界》
python·3d·pyqt
Q_Q19632884753 小时前
python的平安驾校管理系统
开发语言·spring boot·python·django·flask·node.js·php
白毛大侠3 小时前
在 Ubuntu 24.04 中安装 Python 2.7、pip 及 mysqlclient==1.4.6 的完整指南
python·ubuntu·pip