Python里的推导式

老听到课程里讲,列表推导式。总也不明白,什么是列表推导式。
今天查了一些资料。记录一下学习成果。

首先看看比较官方的说法:

什么是推导式?
推导式 comprehensions(又称解析式),是 python 的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列。

抽象吧,看不懂吧。我刚开始看的时候也这样。

用例子说明吧。

1、列表推导式

比如下面这一道题:需要得出一个列表,这个列表里,存0-8每个数字的平方。

先别往下看,自己想一下怎么写。

第一种写法:(常规)

list1 = []
for i in range(9):
    list1.append(i*i)
print(list1)

第二种写法:(推导式)

list1 = [x*x for x in range(9)]
print(list1)

两种写法最后的结果都是

[0, 1, 4, 9, 16, 25, 36, 49, 64]

第二种写法就是推导式。因为我们是推导list列表的,所以又叫列表推导式

列推导式的语法是这样的:

变量名 = [表达式 for 变量 in 列表]

这里多说一点:
1、表达式,不止上边的乘法*
2、变量 ,也不止上边的一个变量

上面的例子只用了一个数乘法
两个数乘法呢?如下

list2 = [x * y for x in range(1,10) for y in range(1,10)]

两个数加法呢?也可以,如下

list3 = [x + y for x in range(1,10) for y in range(1,10)]

那能不能加if判断条件?也可以,如下

list4 = [x  for x in range(1,10) if x % 2 == 0]

2、字典推导试

跟列表推导式一样,就是返回值是字典。

变量名 = {key: value表达式}

比如:

dic = {x:x/2 for x in range(1,10)}
# 运行结果:{1: 0.5, 2: 1.0, 3: 1.5, 4: 2.0, 5: 2.5, 6: 3.0, 7: 3.5, 8: 4.0, 9: 4.5}

多说一个知识点,举例说明:
如下代码,执行结果会是什么?

dic = {'half': x/2 for x in range(1,10) if x % 2 == 0}

估计会有人觉的答案是:

{'half':1.0, 'half':2.0,'half': 3.0, 'half': 4.0}

其实答案是:

{'half': 4.0}

这里有个知识点比较容易忘。就是字典的键值是唯一的,键重复了,后边的会覆盖前边的。
'half’是字典的键,同时又是个字符串,是个固定值。所以最后的{‘half’: 4.0}就吧前边的都给覆盖了
Python里的推导式_第1张图片

又比如:
根据一个字典生成另一个字典。假设场景:学校考试完成后,把考试成绩生成到了一个字典里。
找出及格的人and不及格的人

# 所有学生的成绩(假设所有人都不重名)
dic_all = {
    '张三': 90,
    '李四': 78,
    '王五': 98,
    '马六': 79,
    '小明': 92,
    '小张': 59,
    '小李': 57,
    '小王': 50,
    '小马': 80,
    '小小': 80,
    '小小小': 40,
}

# 及格的同学
dic_pass= {key:value for key, value in dic_all.items() if value >= 60}
print('及格的同学有',len(dic_pass),'人',dic_pass)
# 不及格的同学
dic_unpass= {key:value for key, value in dic_all.items() if value < 60}
print('不及格的同学有:',len(dic_unpass),'人',dic_unpass)

运行结果:
在这里插入图片描述

3、集合推导式

跟列表推导式一样,就是返回值是集合。

变量名 = {表达式 for 变量 in 列表 for 变量 in  xxx}

例如:

set1 = {x for x in range(10) if x % 2 == 0}
# 运行结果: {0, 2, 4, 6, 8}

4、元组推导式

根据上边的经验,元组推导式的公式,推测应该是:

变量名 = (表达式 for 变量 in 列表 for 变量 in  xxx)

先来看个例子:

tuple1=(x for x in range(1,10))
# 运行结果: at 0x00000237ECF97F20>

在这里插入图片描述

问:为什么运行结果是这么个鬼画符?
答:上面的代码返回的变量其实是一个生成器,并不是一个元组。这一点和列表生成器是不同的。有人管这个叫“伪元组推导式”

问:那怎么才能访问里边的元素呢?
答:可以使用tuple()或list()将其转换为元组或列表。

# 转换为元组
tuple1=tuple((x for x in range(1,10)))
# 运行结果:(1, 2, 3, 4, 5, 6, 7, 8, 9)
# 转换为列表
list1 = list((x for x in range(1,10)))
# 运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

以上

总结:
Python 支持4种数据结构的推导式:

列表(list)推导式
字典(dict)推导式
集合(set)推导式
元组(tuple)推导式

这篇文章里把所有的都实验了。推导式主要是用来简化循环的代码,生成不同的数据结构用的。推导式功能强大,用处广泛,而且可以使代码简洁。

参考:
https://www.runoob.com/python3/python-comprehensions.html

你可能感兴趣的:(Python学习,python)