1. Descripción general de comprensiones y comprensiones generadoras
推导式与生成器推导式概述:推导式(又称解析式),是Python的一种独有特性。
推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
Python中共有三种推导,在Python2和3中都有支持:列表(list)推导式、
字典(dict)推导式、集合(set)推导式。推导式的最大优势是化简代码,
主要适合于创建或控制有规律的序列。
1.1 Comprensión de listas
使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。
列表推导式通常有以下几种常用的语法格式。
1.1.1 Generar una lista de valores en el rango especificado
语法格式如下:
listName ={expression for var in range}={expression for var in range}
参数说明:
listName : 生成列表的名称。
expression: 表达式,用于计算新列表的元素。
var: 循环遍历。
range: 采用range()函数生成range对象。
Ejemplo: Genere una lista de 5 números aleatorios, el rango de números requerido es 1 ~ 10 (incluido 10)
import random # 导入random标准库 ,使用随机函数
rand_num = [random.randint(1, 10) for i in range(5)]
print(rand_num)
resultado de la operación:
1.1.2 Generar una lista de requisitos especificados basada en la lista
El formato de sintaxis es el siguiente:
newlist = {expression for var in oldlist}
参数说明:
newlist:新生成的列表名称。
expression:表达式,用于计算新列表的元素。
var:变量,值为后面列表的每个元素值。
oldlist:用于生成新列表的原列表。
Ejemplo: Aquí hay un conjunto de productos con diferentes precios, y todos estos productos deben tener un descuento del 5%.
price = [3500, 3800, 5200, 6400, 5000, 4700]
sale = [int(i * 0.95) for i in price]
print("原价格: ", price)
print("新价格: ", sale)
resultado de la operación:
1.1.3 Seleccione elementos elegibles de la lista para formar una nueva lista
El formato de sintaxis es el siguiente:
newlist = [exprssion for var in oldlist if condition]
此处if主要起到判断作用,oldlist数据中只有满足if条件的才会被留下,
最后统一生成为一个数据列表。
newlist:新生成的列表名称。
expression:表达式,用于计算新列表的元素。
var:变量,值为后面列表的每个元素值。
oldlist:用于生成新列表的原列表。
condition:条件表达式,用于指定删选条件。
Ejemplo: Aquí hay un conjunto de productos con diferentes precios y se utiliza una lista comprensiva para generar una lista de precios por debajo de 5000 yuanes.
price = [3500, 3800, 5200, 6400, 5000, 4700]
sale = [i for i in price if i < 5000]
print("原价格: ", price)
print("新价格: ", sale)
resultado de la operación:
1.1.4 Comprensión de lista múltiple para implementos
La comprensión de la lista de múltiples fors puede realizar la función de anidamiento de los bucles 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)
resultado de la operación:
1.2 Comprensión del diccionario
Plantilla básica para la comprensión de diccionarios:
{key:value for key,value in existing_data_structure}
这里和list有所不同,因为dict里面有2个关键的数学key和value。字典推导式
的作用是快速合并列表为字典或提取字典中的目标数据。
1.2.1 Usar la comprensión del diccionario para crear un diccionario
示例:生成字典key是1~5的数字,value是这个数字的2次方
dict_01 = {
i: i ** 2 for i in range(1, 5)}
print(dict_01)
resultado de la operación:
1.2.2 Combinar 2 listas en 1 diccionario
示例:利用字典推导式合并字典。
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)
resultado de la operación:
Debe prestar atención a la combinación de 2 listas en 1 diccionario
- Si el número de datos en las dos listas es el mismo, la función len () puede contar la longitud de cualquier lista.
- Si el número de datos en las dos listas es diferente, se debe contar la longitud de la lista con menos datos.
1.2.3 Extraer los datos del patrón en el diccionario
示例: 提取计算机价格大于等于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)
resultado de la operación:
1.3 Comprensión de conjuntos
集合推导式跟列表推导式是相似的,唯一的区别就是它使用的是大括号。
集合推导式基础模板: {exprssion for value in collection if condition}
Ejemplo: Elimine la duplicación del nombre y unifique el formato del nombre para poner en mayúscula la primera letra.
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)
resultado de la operación:
1.4 Generador de derivación de tuplas
元组一旦创建,没有任何方法可以修改元组中的元素,
只能使用del命令删除整个元组。
生成器推导式的结果是一个生成器对象,而不是列表,也不是元组。
使用生成器对象的元素时,可以根据需要将其转化为列表或元组。
可以使用_next___()或者内置函数访问生成器对象,
但不管使用何种方法访问其元素,当所有元素访问结束以后,
如果需要重新访问其中的元素,必须重新创建该生成器对象。
生成器对象创建与列表推导式不同的是,生成器推导式是用圆括号创建。
使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,
只是将列表推导式中的中括号修改为小括号。
Ejemplo: use la comprensión de tuplas para generar un objeto generador que contenga 5 números aleatorios.
import random
random_num = (random.randint(1, 10) for i in range(5))
print("由随机数生成的元组对象: ", random_num)
resultado de la operación:
从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组或者列表,
而是一个生成器对象,这一点和列表推导式是不同的。要使用该对象生成器,可以将
其转换为元组或者列表。其中,转换为元组需要使用tuple()函数,
而转换为列表则需要使用list()函数。
Ejemplo: use la comprensión de tuplas para generar un objeto generador que contenga 5 números aleatorios, luego conviértalo en un byte y déle salida.
import random
random_num = (random.randint(1, 10) for i in range(5))
print("由随机数生成的元组对象: ", tuple(random_num))
resultado de la operación: