【Python学习教程】推导式与生成器

枫铃3年前 (2021-10-03)Python252

当我们对一批可迭代的数据(如列表或字典)进行提取或处理,最后要得到一个新的列表或字典时,推导式是一种非常简洁的表达方式。

列表推导式

比如,有一批数据

data = [
    {'name': '张三', 'gender': 'male',  'age': 12},
    {'name': '李四', 'gender': 'female',  'age': 10},
    {'name': '王五', 'gender': 'male',  'age': 20},
    {'name': '赵六', 'gender': 'male',  'age': 11},
    {'name': '周七', 'gender': 'female',  'age': 16},
    {'name': '孙八', 'gender': 'male',  'age': 13},
]

我们想要把数据中的name都提取出来形成一个新的列表,一般的操作是这样的。

names = []  # 定义一个空列表

for item in data:  # 遍历数据
    name = item['name']  # 提取每行中的name
    names.append(name)  # 追加到列表中

如果用推导式的话,形式如下。

names = [item['name'] for item in data]     # 遍历data,提取每项中的name生成一个新列表

数据处理

在提取数据时,我们还可以对每一项数据进行,处理,假设我们需要每个名称前加上’姓名: '这个字符串,可以这样。

names = ['姓名: '+item['name'] for item in data]

'姓名: '+item[‘name’] 就是每一项的数据

数据筛选

同样我们还可以对数据进行筛选,比如我们只要年龄大于12岁,后面可以使用if进行过滤

names = [item['name'] for item in data if item['age']>12] 

多重循环

推导式还支持多重循环,比如

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for x in range(1,5)
    if x > 2
        for y in range(1,4)
            if y < 3
                x*y

使用推导式表示如下

[x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]

批量执行操作

由于推导式就是一种循环操作,我们也可以使用推导式来批量执行一些相似操作,比如:

def step1(driver):
    print('步骤1)

def step2(driver):
    print('步骤2)

def step3(driver):
    print('步骤3)

我们可以将函数名放到一个列表里,然后使用推导式循环执行

steps = [step1, step2, step3]   # 函数名列表

[step(driver) for step in steps]  # 不需要变量接收,我们只需要它循环执行

字典推导式

当我们需要遍历一批数据最后得到一个字典时,同样可以使用字典推导式,如:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
data = [
    {'name': '张三', 'gender': 'male',  'age': 12},
    {'name': '李四', 'gender': 'female',  'age': 10},
    {'name': '王五', 'gender': 'male',  'age': 20},
    {'name': '赵六', 'gender': 'male',  'age': 11},
    {'name': '周七', 'gender': 'female',  'age': 16},
    {'name': '孙八', 'gender': 'male',  'age': 13},
]

假设我们想得到一个{‘张三’: 12, ‘李四’: 10, …}这样的一个字典,使用字典推导式方式如下:

persons = {item['name']: item['age'] for item in data}

字典推导式同样支持if筛选等操作。

生成器

生成器实际上是一种包含初始数据和推导法则的对象,比如我们可以轻松的写出1w以内所有的奇数,原因是因为我只需要记住从1开始每次加2即可。

生成器便是这样。对应大量的数据或者CSV/Excel文件中的数据,生成器可以大量的节省内存,比如csv.Reader(f)就是一个生成器,只存了当前位置和读取下一行数据的方法。

当你需要遍历时,它再每次给你读取一行数据给你。
如列表推导式的例子,

data = [
    {'name': '张三', 'gender': 'male',  'age': 12},
    {'name': '李四', 'gender': 'female',  'age': 10},
    {'name': '王五', 'gender': 'male',  'age': 20},
    {'name': '赵六', 'gender': 'male',  'age': 11},
    {'name': '周七', 'gender': 'female',  'age': 16},
    {'name': '孙八', 'gender': 'male',  'age': 13},
]
names = [item['name'] for item in data] 

我们把列表的中括号改为小括号就得到一个生成器

names2 = (item['name'] for item in data)

注意:生成器和推导式不同,其中的循环不是立即执行的,只用你遍历这个生成器时才会执行

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for name in names:  # 遍历列表推导式生成的新列表
    print(name)

for name in names2:  # 遍历一个生成器
    print(name)

两个打印结果是一样的,生成器更节省内存,只有遍历时才运行。

相关文章

python的22个基本语法

“人生苦短,我用Python”。Python编程语言是最容易学习、并且功能强大的语言。只需会微信聊天、懂一点英文单词即可学会Python编程语言...

Python丢弃返回值

函数多个返回值 pyt...

Python中的负索引是什么?

Python中的序列索引可以是正也可以是负。 如果是正索引,0是序列中的第一个索引,1是第二个索引。 如果是负索引࿰...

零基础学Python:作用域详解

1.作用域介绍 pyt...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。