Python学习6 之 【Lambda表达式、列表与元组、推导式】

目录

1.可迭代对象与序列、Lambda表达式

[(2)Lambda 表达式](#(2)Lambda 表达式)

2.元组

(2)创建

(3)元组的不可变性

[(4)count 与 index](#(4)count 与 index)

(5)元组的访问

多变量赋值

3.列表

(2)创建

(3)修改

del

(5)排序

sorted()

(6)反转

reversed()

(7)赋值

(8)复制

4.推导式


1.可迭代对象与序列、Lambda表达式

序列一定是可迭代对象,可迭代对象不一定是序列

  • 可迭代对象可以"被遍历",但不一定能按索引取值、不一定有长度
  • 序列有顺序、有长度、可下标访问
特性 可迭代对象 序列
for i in obj:
obj[0] 按索引取值 大部分不行
len(obj) 不一定有
reversed(obj)
典型代表 生成器字典集合 列表元组字符串

(2)Lambda 表达式

  • 基础语法

    普通函数

    def add(x, y):
    return x + y

    Lambda 写法

    lambda x, y: x + y

部分 含义 类比普通函数
lambda 关键字,表示"我要写一个匿名函数了" 相当于 def
x, y 参数列表,这里有两个参数 相当于 def add(x, y): 里的 (x, y)
: 分隔符,后面是函数体 相当于普通函数里的冒号 :
x + y 返回值 (自动返回,不用写 return 相当于 return x + y
  • 示例

    按字典某个字段排序

    users = [{"name": "A", "age": 20}, {"name": "B", "age": 15}]

    Lambda 提取 age 作为排序依据

    sorted_users = sorted(users, key=lambda u: u["age"])
    print(sorted_users) # B 在前

    nums = [1, 2, 3, 4, 5]

    用 lambda 过滤偶数(filter 返回迭代器,不是序列)

    evens = filter(lambda x: x % 2 == 0, nums)
    print(list(evens)) # [2, 4]

    用 lambda 做映射计算

    squared = map(lambda x: x**2, nums)
    print(list(squared)) # [1, 4, 9, 16, 25]

    data = ["10", "20", "invalid", "30"]

    过滤并转换,lambda 处理转换逻辑

    cleaned = map(lambda x: int(x) if x.isdigit() else 0, data)
    print(list(cleaned)) # [10, 20, 0, 30]

2.元组

(1)定义

元组是不可变的、有序的、可包含任意类型元素的序列

(2)创建

复制代码
# 1. 小括号(最常用)
t1 = (1, 2, 3)

# 2. 省略括号(逗号是关键)
t2 = 1, 2, 3          # 这也是元组

# 3. 单元素元组(必须加逗号)
t3 = (1,)             # 不加逗号就是整数 1

# 4. 空元组
t4 = ()

# 5. 使用 tuple() 构造
t5 = tuple([1, 2, 3]) # 从列表转换
t6 = tuple("abc")     # ('a', 'b', 'c')

(2.2)tuple() 函数用法表

参数是可迭代对象

用法分类 代码示例 结果 说明
创建空元组 tuple() () 创建一个空元组
列表转元组 tuple([1, 2, 3]) (1, 2, 3) 将列表转换为元组
字符串转元组 tuple("hello") ('h', 'e', 'l', 'l', 'o') 将字符串拆分为字符元组
范围转元组 tuple(range(3)) (0, 1, 2) 将 range 对象转换为元组
字典转元组 tuple({'a':1, 'b':2}) ('a', 'b') 只转换字典的键
集合转元组 tuple({1, 2, 3}) (1, 2, 3) 将集合转换为元组

(3)元组的不可变性

  • 直接修改会报错
操作类型 代码示例 结果
修改元素 t = (1, 2, 3); t[0] = 10 TypeError: 'tuple' object does not support item assignment
追加元素 t = (1, 2); t.append(3) AttributeError: 'tuple' object has no attribute 'append'
删除元素 t = (1, 2, 3); del t[0] TypeError: 'tuple' object doesn't support item deletion
  • 间接修改的方法(创建新元组)
代码 结果 说明
拼接 t1 = (1, 2); t2 = t1 + (3, 4) (1, 2, 3, 4) 创建新元组
重复 t = (1, 2); t * 2 (1, 2, 1, 2) 创建新元组
切片+拼接 t = (1, 2, 3, 4); t[:2] + (99,) + t[3:] (1, 2, 99, 4) 替换中间元素
类型转换 t = (1, 2, 3); lst = list(t); lst[1]=99; t2 = tuple(lst) (1, 99, 3) 转列表修改再转回
  • 元组的元素是列表、字典或集合时,可以修改元素内的数据

元组的不可变性 指的是:不能改变元组中存储的引用(即不能改变元组指向哪个对象),但元组内的可变对象本身是可以被修改的

复制代码
t = (1, [2, 3], 4)
print(t)  # (1, [2, 3], 4)

# 修改列表内容(允许)
t[1].append(99)
print(t)  # (1, [2, 3, 99], 4)

# 修改列表元素
t[1][0] = 100
print(t)  # (1, [100, 3, 99], 4)

# 替换整个列表(不允许)
t[1] = [5, 6]  # TypeError: 'tuple' object does not support item assignment

(4)count 与 index

复制代码
t = (1, 2, 2, 3, 2, 4, 5)

print(t.count(2))   # 3(2 出现了 3 次)
print(t.count(9))   # 0(不存在的元素返回 0)
print(t.count('a')) # 0(类型不同也算不存在)

t = (10, 20, 30, 20, 40)

# 基本用法
print(t.index(20))      # 1(第一次出现的位置)

# 指定搜索范围(索引 2 到 结束)
print(t.index(20, 2))   # 3(从索引 2 开始找)

# 指定搜索范围(索引 2 到 4)
print(t.index(20, 2, 4)) # 3

# 元素不存在会报错
# t.index(99)  # ValueError: tuple.index(x): x not in tuple

# 安全写法
if 99 in t:
    print(t.index(99))
else:
    print("元素不存在")

(5)元组的访问

元组的访问方式与列表几乎完全相同,支持索引、切片、遍历、解包、成员判断等

访问方式 语法 说明 示例
正向索引 t[index] 从 0 开始 t[0] → 第一个元素
负向索引 t[-index] 从 -1 开始 t[-1] → 最后一个元素
切片 t[start:stop:step] 获取子元组 t[1:4]
遍历 for x in t 逐个访问 -
解包 a,b,c = t 拆分成变量 -
成员判断 x in t 是否存在 5 in t
内置函数 len(t), max(t) 统计/计算 -

多变量赋值

多变量赋值是值一次性给多个变量赋值,本质是解包操作

赋值方式 语法 示例 说明
平行赋值 a, b = 1, 2 x, y = 10, 20 最基础的多变量赋值
链式赋值 a = b = c = 1 x = y = z = 0 多个变量赋同一个值
交换变量 a, b = b, a x, y = y, x 无需临时变量
解包赋值 a, b = (1, 2) x, y = [10, 20] 从序列中解包
星号表达式 a, *b = (1,2,3) x, *y = [10,20,30] 收集剩余元素
忽略变量 a, _, c = (1,2,3) x, _, z = [1,2,3] _ 忽略不需要的值

3.列表

(1)定义

列表是可变的、有序的、可包含任意类型元素的序列
原理:空列表 \[\] 在布尔上下文中被视为 False,非空列表被视为 True

(2)创建

方式 语法 示例
方括号 [元素1, 元素2, ...] [1, 2, 3]
list() 构造 list(可迭代对象) list("abc")['a','b','c']
列表推导式 [表达式 for 变量 in 可迭代对象] [x*2 for x in range(5)]
空列表 []list() []

(3)修改

操作类型 方法/语法 说明
修改元素 lst[i] = x 替换指定位置的元素
切片赋值 lst[i:j] = iterable 替换/插入/删除切片
追加 lst.append(x) 末尾添加一个元素
扩展 lst.extend(iterable) 末尾添加多个元素
插入 lst.insert(i, x) 在指定位置插入
删除 lst.remove(x)(直接删,删不到就报错,pop也是 删除第一个匹配元素
弹出 lst.pop(i)(i省略就弹出最后一个) 删除并返回元素
清空 lst.clear() 删除所有元素
排序 lst.sort() 原地排序
反转 lst.reverse() 原地反转

以上操作均原地修改

del

del 是 Python 的内置语句 ,用于删除对象。它可以删除变量、列表元素、字典键值对、对象属性等

  • 特点
特性 说明
类型 语句(Statement),不是函数
语法 del 目标
返回值 无(不返回任何值)
作用 删除变量或容器中的元素
pop 区别 pop 返回被删除的值,del 不返回
  • 常见用法
用法 语法 说明
删除变量 del var 删除变量本身
删除列表元素 del lst[i] 删除指定索引元素
删除列表切片 del lst[i:j] 删除一段连续元素
删除整个列表 del lst 删除列表对象
删除字典键值对 del d[key] 删除指定键
删除对象属性 del obj.attr 删除属性

Python 中的 del、pop、remove 都是**"逻辑删除"**------删除的是引用,不是物理擦除数据。真正的物理删除需要底层内存操作,Python 中几乎用不到

(5)排序

Python 中列表排序有两种方式:原地排序返回新列表

对比项 list.sort() sorted()
是否修改原列表
返回值 None 新列表
适用类型 仅列表 任何可迭代对象
链式调用 不可以 可以
内存占用 更低 更高(需复制)
  • list.sort() 原地排序
参数 类型 默认值 说明
key 函数 None 指定排序依据
reverse bool False True 表示降序
复制代码
# 升序(默认)
lst = [3, 1, 4, 1, 5, 9, 2]
lst.sort()
print(lst)  # [1, 1, 2, 3, 4, 5, 9]

# 降序
lst = [3, 1, 4, 1, 5, 9, 2]
lst.sort(reverse=True)
print(lst)  # [9, 5, 4, 3, 2, 1, 1]

# 按绝对值排序
lst = [-5, 3, -2, 8, -1, 4]
lst.sort(key=abs)
print(lst)  # [-1, -2, 3, 4, -5, 8]

# 按字符串长度排序
words = ["banana", "apple", "cherry", "date"]
words.sort(key=len)
print(words)  # ['date', 'apple', 'banana', 'cherry']

# 按长度降序
words.sort(key=len, reverse=True)
print(words)  # ['banana', 'cherry', 'apple', 'date']

# 按最后一个字符排序
words = ["apple", "banana", "cherry"]
words.sort(key=lambda x: x[-1])
print(words)  # ['banana', 'apple', 'cherry']

sorted()

复制代码
sorted(iterable, key=None, reverse=False)
参数 说明 默认值
iterable 可迭代对象(列表、元组、字符串、字典等) 必填
key 在排序之前,先拿这个函数把每个元素处理一下,然后按处理后的结果来排序 None
reverse True=降序,False=升序 False
可迭代对象 原数据 sorted() 结果 原对象是否改变
列表 [3,1,4,1,5] [1,1,3,4,5] 不变
元组 (3,1,4,1,5) [1,1,3,4,5] 不变(返回列表)
字符串 "31415" ['1','1','3','4','5'] 不变(返回字符列表)
字典 {'a':3,'b':1,'c':4} ['a','b','c'] 不变(返回键列表)
集合 {3,1,4,1,5} [1,3,4,5] 不变

(6)反转

  • list.reverse()
项目 说明
语法 list.reverse()
参数
返回值 None
是否修改原列表 是(原地修改)
时间复杂度 O(n)
空间复杂度 O(1)(不创建新列表)
复制代码
lst = [1, 2, 3, 4, 5]

# 原地反转
lst.reverse()
print(lst)  # [5, 4, 3, 2, 1]

# 再次反转恢复
lst.reverse()
print(lst)  # [1, 2, 3, 4, 5]

# 注意返回值
result = lst.reverse()
print(result)  # None

reversed()

reversed() 是 Python 的内置函数 ,用于返回一个反向迭代器

项目 说明
语法 reversed(seq)
参数 序列(列表、元组、字符串、range 等)
返回值 反向迭代器(reversed 对象)
是否修改原序列 = 否
时间复杂度 O(1)(惰性求值)
空间复杂度 O(1)(不创建新列表)
复制代码
lst = [1, 2, 3, 4, 5]

# 返回迭代器
rev_iter = reversed(lst)
print(rev_iter)  # <list_reverseiterator object at 0x...>

# 转换为列表查看
print(list(rev_iter))  # [5, 4, 3, 2, 1]

# 原列表不变
print(lst)  # [1, 2, 3, 4, 5]
  • 支持类型
类型 是否支持 示例
列表 reversed([1,2,3])
元组 reversed((1,2,3))
字符串 reversed("abc")'c','b','a'
range reversed(range(5))
字典 reversed({'a':1}) 报错
集合 reversed({1,2,3}) 报错

(7)赋值

= 给列表赋值,不会创建新列表,只是给原对象增加了一个新的引用(别名)

复制代码
a = [1, 2, 3]
b = a          # 赋值,b 和 a 指向内存中同一个列表

b.append(4)
print(a)       # [1, 2, 3, 4]  a 也被改变了
print(a is b)  # True,两者是同一个对象

(8)复制

复制会创建一个内容相同但内存独立的新列表

  • 浅拷贝

只复制最外层容器,内部嵌套的可变对象依然共享引用

复制代码
import copy

a = [1, 2, [3, 4]]

# 三种浅拷贝方式
b = a.copy()        # 方法1:list 内置方法
c = a[:]            # 方法2:切片全取
d = list(a)         # 方法3:工厂函数
e = copy.copy(a)    # 方法4:copy 模块

# 修改外层,互不影响
b.append(5)
print(a)  # [1, 2, [3, 4]]  不变

# 修改内层可变对象,会互相影响
b[2].append(5)
print(a)  # [1, 2, [3, 4, 5]]  内层列表被改变了!
  • 深拷贝

递归复制所有层级,内外完全独立

复制代码
import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)

b[2].append(5)
print(a)  # [1, 2, [3, 4]]  完全不受影响
操作 写法 外层修改影响原列表? 内层嵌套修改影响原列表? 对象是否相同
赋值 b = a
浅拷贝 a.copy() 不会
深拷贝 copy.deepcopy(a) 不会 不会

4.推导式

推导式是 Python 中一种简洁、高效的创建序列(列表、字典、集合)的语法

(1)列表推导式

列表推导式由1个表达式跟一个或多个for 从句、0个或多个if从句构成

列表推导式置于一对方括号之中

复制代码
[表达式 for 变量 in 可迭代对象 if 条件]

# 1. 生成平方数
squares = [x**2 for x in range(10)]
print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 2. 带条件过滤
evens = [x for x in range(20) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# 3. 字符串处理
words = ["hello", "world", "python"]
upper_words = [word.upper() for word in words]
print(upper_words)  # ['HELLO', 'WORLD', 'PYTHON']

# 4. 嵌套循环
pairs = [(x, y) for x in range(3) for y in range(2)]
print(pairs)  # [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

# 5. 条件表达式(三目运算)
results = ["even" if x % 2 == 0 else "odd" for x in range(5)]
print(results)  # ['even', 'odd', 'even', 'odd', 'even']

(2)字典推导式

复制代码
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件}

# 1. 列表转字典(值:索引)
lst = ['a', 'b', 'c', 'd']
d = {val: idx for idx, val in enumerate(lst)}
print(d)  # {'a': 0, 'b': 1, 'c': 2, 'd': 3}

# 2. 交换键值
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {v: k for k, v in original.items()}
print(swapped)  # {1: 'a', 2: 'b', 3: 'c'}

# 3. 过滤字典
scores = {'Alice': 85, 'Bob': 92, 'Charlie': 78, 'David': 95}
high_scores = {name: score for name, score in scores.items() if score >= 90}
print(high_scores)  # {'Bob': 92, 'David': 95}

# 4. 对值进行运算
prices = {'apple': 5, 'banana': 3, 'orange': 4}
discounted = {item: price * 0.9 for item, price in prices.items()}
print(discounted)  # {'apple': 4.5, 'banana': 2.7, 'orange': 3.6}

(3)集合推导式

复制代码
{表达式 for 变量 in 可迭代对象 if 条件}

# 1. 去重转换
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_squares = {x**2 for x in numbers}
print(unique_squares)  # {16, 1, 4, 9}

# 2. 过滤并去重
words = ["hello", "world", "hello", "python", "world"]
unique_len = {len(word) for word in words}
print(unique_len)  # {5, 6}

# 3. 条件过滤
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares)  # {0, 64, 4, 36, 16}

(4)生成器表达式

特性 列表推导式 生成器表达式
返回值 列表 生成器
内存 一次性分配 惰性求值
适用场景 小数据量 大数据量
复制代码
(表达式 for 变量 in 可迭代对象 if 条件)

# 1. 基本用法
gen = (x**2 for x in range(10))
print(gen)  # <generator object <genexpr> at 0x...>

# 逐个取值
print(next(gen))  # 0
print(next(gen))  # 1

# 2. 求和(不创建列表)
total = sum(x**2 for x in range(1000000))  # 内存友好

# 3. 转换为列表(需要时)
lst = list(x**2 for x in range(5))
print(lst)  # [0, 1, 4, 9, 16]
相关推荐
青 春 记 忆6 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
GlueNa2SiO36 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
临沂GEO8 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白8 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
荷蒲10 小时前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
数据狐(Datafox)11 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机11 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor69212 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy13 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
月光船幽幽13 小时前
真实即粗糙,光滑是伪造
人工智能·python