前面我们讲了 Python 中的几种高级数据类型(列表、字典、集合、元组)

推导式就是一个工具,能构建一种函数关系,从现有对象推导出新对象

而根据新对象的类型,推导式也分为列表推导式、字典推导式、集合推导式和元组推导式

语言的描述总是不够的,最好的理解方式就是来看代码

列表推导式

基本结构:

1
[表达式 for 某元素 in 某对象 if 条件]

它的含义是通过 for 结构枚举出每个元素,然后利用表达式生成新的元素,表达式可以是调用自身的方法,也可以是函数,而条件是可选的,可以过滤列表中不符合条件的值

例1:过滤掉长度小于或等于 3 的字符串列表,并将剩下的转换成大写字母

1
2
3
4
>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
>>> new_names = [name.upper() for name in names if len(name)>3]
>>> print(new_names)
['ALICE', 'JERRY', 'WENDY', 'SMITH']

例2:计算 30 以内可以被 3 整除的整数

1
2
3
>>> multiples = [i for i in range(30) if i % 3 == 0]
>>> print(multiples)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

是不是很优雅?一行就搞定了!

字典推导式

基本格式:

1
{键表达式:值表达式 for 某元素 in 某对象 if 条件}

例1:

1
2
3
4
5
listdemo = ['Google','Runoob', 'Taobao']
# 将列表中各字符串值为键,各字符串的长度为值,组成键值对
>>> newdict = {key:len(key) for key in listdemo}
>>> newdict
{'Google': 6, 'Runoob': 6, 'Taobao': 6}

例2:

1
2
3
>>> dic = {x: x**2 for x in (2, 4, 6)}
>>> dic
{2: 4, 4: 16, 6: 36}

集合推导式

1
{表达式 for 某元素 in 某对象 if 条件}

例1:计算数字 1,2,3 的平方数

1
2
3
>>> setnew = {i**2 for i in (1,2,3)}
>>> setnew
{1, 4, 9}

例2:判断不是 abc 的字母并输出

1
2
3
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'d', 'r'}

元组推导式

基本格式:

1
tuple(表达式 for 某元素 in 某对象 if 条件)

元组推导式与前面的所有推导式都不同,因为元组的括号本身是没有意义的,所以用小括号括起来不能代表一个元组,需要手动转成元组类型

1
2
3
4
5
6
>>> a = (x for x in range(1,10))
>>> a
<generator object <genexpr> at 0x7faf6ee20a50> # 返回的是生成器对象

>>> tuple(a) # 使用 tuple() 函数,可以直接将生成器对象转换成元组
(1, 2, 3, 4, 5, 6, 7, 8, 9)