Comprensión de Python y deducción del generador (simplifique el código, adecuado para crear o controlar secuencias regulares)

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:
Inserte la descripción de la imagen aquí


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:
Inserte la descripción de la imagen aquí


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:
Inserte la descripción de la imagen aquí


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:
Inserte la descripción de la imagen aquí


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:
Inserte la descripción de la imagen aquí


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:
Inserte la descripción de la imagen aquí

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:
Inserte la descripción de la imagen aquí


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:
Inserte la descripción de la imagen aquí


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:
Inserte la descripción de la imagen aquí

从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组或者列表,
而是一个生成器对象,这一点和列表推导式是不同的。要使用该对象生成器,可以将
其转换为元组或者列表。其中,转换为元组需要使用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:
Inserte la descripción de la imagen aquí


Supongo que te gusta

Origin blog.csdn.net/I_r_o_n_M_a_n/article/details/115206895
Recomendado
Clasificación