Python--推导式与生成器推导式(化简代码,适合于创建或控制有规律的序列)

1. 推导式与生成器推导式概述

推导式与生成器推导式概述:推导式(又称解析式),是Python的一种独有特性。
推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
Python中共有三种推导,在Python2和3中都有支持:列表(list)推导式、
字典(dict)推导式、集合(set)推导式。推导式的最大优势是化简代码,
主要适合于创建或控制有规律的序列。

1.1 列表推导式

使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。
列表推导式通常有以下几种常用的语法格式。

1.1.1 生成指定范围的数值列表

语法格式如下:
listName ={expression for var in range}={expression for var in range}

参数说明:
listName : 生成列表的名称。
expression: 表达式,用于计算新列表的元素。
var: 循环遍历。
range: 采用range()函数生成range对象。

示例: 生成一个包括5个随机数的列表,要求数的范围为1~10(包括10)

import random  # 导入random标准库 ,使用随机函数

rand_num = [random.randint(1, 10) for i in range(5)]
print(rand_num)

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


1.1.2 根据列表生成指定需求的列表

语法格式如下:

newlist = {expression for var in oldlist}

参数说明:
newlist:新生成的列表名称。
expression:表达式,用于计算新列表的元素。
var:变量,值为后面列表的每个元素值。
oldlist:用于生成新列表的原列表。

示例:这里有一组价格不同的商品,要求这些商品全部打95折。

price = [3500, 3800, 5200, 6400, 5000, 4700]
sale = [int(i * 0.95) for i in price]
print("原价格: ", price)
print("新价格: ", sale)

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


1.1.3 从列表中选择符合条件的元素组成新的列表

语法格式如下:

newlist = [exprssion for var in oldlist if condition]

此处if主要起到判断作用,oldlist数据中只有满足if条件的才会被留下,
最后统一生成为一个数据列表。
newlist:新生成的列表名称。
expression:表达式,用于计算新列表的元素。
var:变量,值为后面列表的每个元素值。
oldlist:用于生成新列表的原列表。
condition:条件表达式,用于指定删选条件。

示例:这里有一组价格不同的商品,应用列表推导式生成一个低于5000元的价格列表。

price = [3500, 3800, 5200, 6400, 5000, 4700]
sale = [i for i in price if i < 5000]
print("原价格: ", price)
print("新价格: ", sale)

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


1.1.4 多个for实现列表推导式

多for的列表推导式可以实现for循环嵌套功能:

示例:求(x,y),其中x是0~5的偶数,y是0~5的技术组成的元组列表。
list_03 = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
print(list_03)

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


1.2 字典推导式

字典推导式的基础模板:

{key:value for key,value in existing_data_structure}
这里和list有所不同,因为dict里面有2个关键的数学key和value。字典推导式
的作用是快速合并列表为字典或提取字典中的目标数据。

1.2.1 利用字典推导式创建一个字典

示例:生成字典key是1~5的数字,value是这个数字的2次方
dict_01 = {
    
    i: i ** 2 for i in range(1, 5)}
print(dict_01)

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


1.2.2 将2个列表合并为1个字典

示例:利用字典推导式合并字典。
list_01 = ['name', 'age', 'gender']
list_02 = ['周天天', 20, '男']
dict_02 = {
    
    list_01[i]: list_02[i] for i in range(len(list_01))}
print(dict_02)

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

将2个列表合并为1个字典需要注意

  • 如果2个列表数据个数相同,len()函数统计任何一个列表的长度都可以。
  • 如果2个列表的数据个数不同,则需要统计数据少的列表的长度。

1.2.3 提取字典中的目标数据

示例: 提取计算机价格大于等于2000的字典数据
goods_lists = {
    
    'MAC': 6680, 'HP': 1200, 'DELL': 3400}
new_goods_lists = {
    
    key: value for key, value in goods_lists.items() if value >= 2000}
print(new_goods_lists)

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


1.3 集合推导式

集合推导式跟列表推导式是相似的,唯一的区别就是它使用的是大括号。
集合推导式基础模板: {exprssion for value in collection if condition}

示例:将名字去重并且把名字的格式统一为首字母大写。

names = ['Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob', 'JAMES', 'jAMeS']
new_names = {
    
    n[0].upper() + n[1:].lower() for n in names}
print(new_names)

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


1.4 元组的生成器推导式

元组一旦创建,没有任何方法可以修改元组中的元素,
只能使用del命令删除整个元组。

生成器推导式的结果是一个生成器对象,而不是列表,也不是元组。
使用生成器对象的元素时,可以根据需要将其转化为列表或元组。
可以使用_next___()或者内置函数访问生成器对象,
但不管使用何种方法访问其元素,当所有元素访问结束以后,
如果需要重新访问其中的元素,必须重新创建该生成器对象。

生成器对象创建与列表推导式不同的是,生成器推导式是用圆括号创建。

使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,
只是将列表推导式中的中括号修改为小括号。

示例:使用元组推导式生成一个包含5个随机数的生成器对象。

import random

random_num = (random.randint(1, 10) for i in range(5))
print("由随机数生成的元组对象: ", random_num)

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

从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组或者列表,
而是一个生成器对象,这一点和列表推导式是不同的。要使用该对象生成器,可以将
其转换为元组或者列表。其中,转换为元组需要使用tuple()函数,
而转换为列表则需要使用list()函数。

示例:使用元组推导式生成一个包含5个随机数的生成器对象,然后将其转换位元组并且输出。

import random

random_num = (random.randint(1, 10) for i in range(5))
print("由随机数生成的元组对象: ", tuple(random_num))

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


猜你喜欢

转载自blog.csdn.net/I_r_o_n_M_a_n/article/details/115206895
今日推荐