3 técnicas para simplificar las llamadas a funciones de Python

Prefacio

El texto y las imágenes de este artículo son de Internet y son únicamente con fines de aprendizaje y comunicación. No tienen ningún uso comercial. Si tiene alguna pregunta, comuníquese con nosotros para su procesamiento.

PD: Si necesita materiales de aprendizaje de Python, puede hacer clic en el enlace de abajo para obtenerlo usted mismo.

Materiales de aprendizaje gratuitos de Python y respuestas de comunicación grupal Haga clic para unirse


Supongamos que hay una función, esta función necesita recibir 4 parámetros y devolver la suma de estos 4 parámetros:

def sum_four(a, b, c, d):
  return a + b + c + d

Si necesita corregir los primeros tres parámetros y solo cambiar el valor del último parámetro, es posible que deba llamar esta vez:

>>> a, b, c = 1, 2, 3

>>> sum_four(a=a, b=b, c=c, d=1)
7

>>> sum_four(a=a, b=b, c=c, d=2)
8

>>> sum_four(a=a, b=b, c=c, d=3)
9

>>> sum_four(a=a, b=b, c=c, d=4)
10

Esto es realmente feo. Si usa la función Mapa, ¿puede simplificar el código?
La respuesta es sí, pero la función Mapa [generalmente] solo puede aceptar un solo elemento. Si lo usa con fuerza, informará este error:

list (map (sum_four, [(1, 2, 3, 4)]))
Traceback (última llamada más reciente):
Archivo "<stdin>", línea 1, en <module>
TypeError: sum_four () faltan 3 posicionales requeridos argumentos: 'b', 'c' y 'd'
怎么 解决?

Solución 1: itertools.starmap

Puede usar la función itertools starmap para reemplazar Map.
Es diferente de Map en que permite aceptar una tupla como argumento para sum_four.

>>> import itertools
>>> list(itertools.starmap(sum_four, [(1, 2, 3, 4)]))
[10]

Genial, en este caso, los problemas anteriores se pueden resolver usando la función de mapa de estrellas:

>>> import itertools

>>> ds = [1, 2, 3, 4]

>>> items = ((a, b, c, d) for d in ds)

>>> list(items)
 [(1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 2, 3, 4)]

>>> list(itertools.starmap(sum_four, items))
 [7, 8, 9, 10]

Tenga en cuenta que los elementos son un generador. Esto es para evitar un consumo excesivo de memoria debido a elementos excesivos. Prestar atención a estos detalles durante el desarrollo normal puede ayudarlo a abrir la brecha con los desarrolladores comunes.

Opción 2: functools.partial

La segunda solución es usar la función parcial para fijar los primeros tres parámetros.
Según la documentación, parcial "congelará" algunas partes de los parámetros de la función para generar una versión simplificada de la función.

Entonces, la solución al problema anterior es:

>>> import functools
>>> partial_sum_four = functools.partial(sum_four, a, b, c)
>>> partial_sum_four(3)
9
>>> # 这样就可以使用map函数了:
>>> list(map(partial_sum_four, ds))
[7, 8, 9, 10]

Solución 3: itertools.repeat ()

De hecho, la función Map puede pasar parámetros iterables, pero tiene una característica interesante: utiliza los elementos de cada objeto iterable como parámetros diferentes de la función pasada. Esto puede ser demasiado abstracto, echemos un vistazo a un ejemplo práctico:

>>> list(map(sum_four, [1,1,1,1], [2,2,2,2], [3,3,3,3], [1,2,3,4]))
 [7, 8, 9, 10]

Obviamente, cada vez que los elementos de subíndice correspondientes en diferentes matrices se pasan a la función para el cálculo.
De esta forma, podemos utilizar esta función para optimizar.

La función itertools.repeat () puede generar un iterador basado en los parámetros, que devuelve el objeto una y otra vez. Sin especificar el parámetro de tiempos, se ejecutará indefinidamente.

La función Mapa dejará de ejecutarse automáticamente después de que se repita el objeto iterable más corto.
Combinando estas dos características, surge la solución al problema anterior:

>>> import itertools
>>> list(map(sum_four, itertools.repeat(a), itertools.repeat(b), itertools.repeat(c), ds))
 [7, 8, 9, 10]

Este truco es muy inteligente, la desventaja es que no mucha gente puede entenderlo. Pero está bien, solo sepa algo del mundo de la informática, no es necesario que lo use.

Por ejemplo, estas soluciones en este artículo generalmente no se utilizan en el trabajo de la vida diaria, por lo que no necesita memorizar, pero necesita saber [existen tales problemas] y [existen estas soluciones], en caso de que encuentre similares Puede recordar este artículo y encontrar rápidamente una solución.

Supongo que te gusta

Origin blog.csdn.net/pythonxuexi123/article/details/112937636
Recomendado
Clasificación