推导式
大家好,这个章节我们要聊聊 Python 中的推导式。这是一个非常有用的特性,能够让我们用简洁的语法处理数据。推导式的核心思想就是从一个数据集合中快速生成另一个集合。你可以理解为,通过一个简单的表达式和一些条件,就可以创建一个新的列表、元组、字典或集合,非常高效。
简介
Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
Python 支持各种数据结构的推导式:
- 元组
tuple推导式 - 列表
list推导式 - 字典
dict推导式 - 集合
set推导式
Python 中的推导式其实就是一个很巧妙的方式,它允许我们用一行代码生成新的数据结构。你可以用推导式来快速构建列表、元组、字典和集合。它的好处在于,不仅代码简洁,执行效率也很高。而且,根据不同的数据类型,推导式的写法也稍有不同。
元组推导式
元组推导式可以利用 range 函数、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。
我们先来看看元组推导式。其实元组推导式和列表推导式很像,区别就是生成的是元组而不是列表。用元组推导式,我们可以根据给定的条件从一个序列中生成一个新的元组。比如你可以用它来生成一些 ASCII 码,或者筛选出一些符合条件的数字。
格式
(out_exp_res for item in Sequence )
或
(out_exp_res for item in Sequence if conditional )
out_exp_res:生成元素表达式,可以是有返回值的函数。for out_exp in Sequence:迭代Sequence将out_exp传入到out_exp_res表达式中。if condition:条件语句,可以过滤Sequence 中不符合条件的值。
元组推导式的格式是这样的:(out_exp_res for item in Sequence)。其中,out_exp_res 是你想生成的元素,for item in Sequence 是遍历序列的部分,你可以在后面加上 if condition 来做条件筛选。
示例
# 简单的元组推导式
t1 = (x for x in range(1,10))
# 生成128位ASCII码元组
t2 = (chr(x) for x in range(128))
# 生成100以内能被7整除所有数字的元组
t3 = (x for x in range(100) if x%7==0)
# 生成99乘法表结果元组
t4 = (x*y for x in range(1,10) for y in range(1, x+1))
words = ["apple", "banana", "cherry"]
upper_words = (word.upper() for word in words)
举个例子,假设我们想生成一个从 1 到 9 的元组,可以这么写:t1 = (x for x in range(1, 10))。再比如,我们可以生成一个包含所有 128 个 ASCII 字符的元组,或者从 0 到 100 中所有能被 7 整除的数字元组。甚至可以做一些更复杂的运算,比如生成九九乘法表的结果元组。
列表推导式
列表推导式与元组推导式的区别:
格式上外部由圆括号包裹的表达式改为中括号
列表推导式跟元组推导式的写法非常相似,区别就是它生成的是列表,而不是元组。你会发现,推导式让我们可以通过简单的语法完成比较复杂的数据处理,而且代码更加简洁、可读性也更强。
格式
[out_exp_res for item in Sequence ]
或
[out_exp_res for item in Sequence if conditional ]
out_exp_res:生成元素表达式,可以是有返回值的函数。for out_exp in Sequence:迭代Sequence将out_exp传入到out_exp_res表达式中。if condition:条件语句,可以过滤Sequence中不符合条件的值。
列表推导式的格式是:[out_exp_res for item in Sequence]。跟元组推导式类似,你也可以加上条件判断来筛选符合条件的项。
示例
# 简单的元组推导式
l1 = [x for x in range(1,10)]
# 生成128位ASCII码元组
l2 = [chr(x) for x in range(128)]
# 生成100以内能被7整除所有数字的元组
l3 = [x for x in range(100) if x%7==0]
# 生成99乘法表结果元组
l4 = [x*y for x in range(1,10) for y in range(1, x+1)]
# 将列表中的字符串转换为大写
words = ["apple", "banana", "cherry"]
upper_words = [word.upper() for word in words]
比如,假设我们要生成一个 1 到 9 的数字列表,可以用列表推导式 [x for x in range(1, 10)]。你还可以生成一个包含所有 ASCII 字符的列表,或者筛选出能被 7 整除的数字。甚至,你还可以用它来将一个列表中的所有字符串转成大写字母。
字典推导式
字典推导式与前两种推导式的区别
- 推导式使用花括号包裹
- 结果表达式需要使用 key-value 形式
字典推导式和前面两个很像,不过它生成的是字典。你会发现,它的语法稍微有点不一样,因为我们需要同时定义键和值。比如你可以用字典推导式把一个列表的元素映射为字典的键,把每个元素的长度作为对应的值。
格式
{ key_expr: value_expr for value in collection }
或
{ key_expr: value_expr for value in collection if condition }
字典推导式的格式是这样的:{key_expr: value_expr for value in collection}。在这里,key_expr 是字典的键,value_expr 是字典的值,你还可以像其他推导式一样加上条件来做筛选。
示例
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
# 将列表中各字符串值为键,各字符串的长度为值,组成键值对
newdict = {name:len(name) for name in names}
比如,假设我们有一个名字列表,想要把每个名字的长度作为字典的值,名字作为字典的键,可以这么写:newdict = {name: len(name) for name in names}。这样就可以一行代码搞定。
集合推导式
集合推导式与字典推导式的区别在于结果表达式是单一结果,不是 key-value 形式。
集合推导式和字典推导式有点像,不过它生成的是集合,而且没有键值对,只有单一的元素。集合推导式主要用来从一个序列中提取出符合条件的元素。
格式
{ expression for item in Sequence }
或
{ expression for item in Sequence if conditional }
集合推导式的格式是:{expression for item in Sequence}。它和字典推导式的区别就在于没有 key: value 这种结构,直接返回的是每个元素本身。
示例
data = ['Bob','123','Tom','ab123','alice','123abc','Jerry','456','Wendy','554','Smith']
# 筛选列表中的数字字符串
newset = {n for n in data if n.isdigit()}
比如,我们有一个包含数字和字母的列表,想要筛选出所有数字字符串,可以这么写:newset = {n for n in data if n.isdigit()}。这种方法既简洁又高效。
推导式的优点
- 简洁高效:推导式允许在一行代码中完成复杂的生成操作,避免了使用显式的循环和临时变量的繁琐过程。可以大大减少代码量,并提高编码效率。
- 可读性好:推导式使用简洁的语法,将迭代、条件判断和表达式结合在一起,使得代码更加紧凑和易于理解。它提供了一种清晰、直观的方式来表达列表生成的逻辑,使得代码更加可读性强,降低了出错的可能性。
- 灵活性强:推导式非常灵活,可以根据需要添加条件判断、多个迭代变量和嵌套结构,以满足不同的需求。这使得推导式适用于各种场景,从简单的数据转换到复杂的筛选和操作,都可以通过简单而直观的语法实现。
推导式有很多优点,首先它非常简洁高效,你可以用一行代码完成本来需要几行的操作。其次,推导式的可读性也很好,代码紧凑、直观,不容易出错。最后,推导式的灵活性很强,支持条件判断、多个迭代变量,甚至是嵌套结构,几乎可以满足各种需求。
总结
推导式提供了一种简洁高效、可读性好和灵活性强的方法来处理可迭代数据。
它是 Python 中强大而常用的特性之一,为开发者提供了更好的编码体验和效率。
总的来说,推导式是 Python 中一个非常强大的特性,它不仅让我们的代码更简洁高效,还提高了可读性和灵活性。掌握了推导式,你会发现很多操作都变得更加轻松和高效,是 Python 编程中不可或缺的一个技巧。