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]
相关推荐
kishu_iOS&AI2 小时前
深度学习 —— 正则化&批量归一化BN
人工智能·pytorch·python·深度学习
天天进步20152 小时前
Python全栈项目实战:自建高效多媒体处理工具
开发语言·python
waterHBO2 小时前
python + fast-wahisper 读取麦克风,实现语音转录,而且是实时转录。
开发语言·python
reasonsummer2 小时前
【教学类-160-09】20260417 AI视频培训-练习010“豆包AI视频《熊猫找朋友》+豆包图片风格:水墨画”
python·音视频·豆包视频
JaydenAI2 小时前
[FastMCP设计、原理与应用-15]挂载一个MCP服务器就像挂载一个目录一样容易
python·ai编程·ai agent·mcp·fastmcp
甄心爱学习2 小时前
【项目实训(个人4)】
前端·vue.js·python
西兰先森2 小时前
使用Antv G6渲染neo4j知识图谱数据
python·知识图谱·neo4j
weixin_307779132 小时前
SparkPySetup:基于Python的Windows 11 PySpark环境自动化搭建工具
大数据·开发语言·python·spark
m0_738120722 小时前
渗透基础知识ctfshow——Web应用安全与防护(完结:第八章)
前端·python·sql·安全·web安全·网络安全