¡Organiza con cuidado! 9 uso compartido de casos prácticos 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


1. Organizar la entrada de cadenas

El problema de cotejar la entrada del usuario es extremadamente común en el proceso de programación. Normalmente, es suficiente convertir caracteres a minúsculas o mayúsculas, a veces puede usar el módulo de expresión regular "Regex" para lograr esto. Pero si el problema es complicado, puede haber una mejor manera de resolverlo:

user_input = "This\nstring has\tsome whitespaces...\r\n"

character_map = {
    ord('\n') : ' ',
    ord('\t') : ' ',
    ord('\r') : None
}
user_input.translate(character_map)  # This string has some whitespaces... 

En este ejemplo, puede ver que los caracteres de espacio "n" y "t" se han reemplazado con un solo espacio y que la "r" se ha eliminado. Este es solo un ejemplo muy simple, podemos ir un paso más allá y usar el paquete "unicodedata" para generar una tabla de reasignación grande, y usar la "combinación ()" en ella para generar y mapear

2. Rebanada de iterador (Slice)

Si el iterador se divide, se devolverá un "TypeError", lo que indica que el objeto generador no tiene subíndice, pero podemos usar una solución simple para resolver este problema:

import itertools  
s = itertools.islice(range(50), 10, 20)
for val in s:  
    ... 

Podemos usar "itertools.islice" para crear un objeto "islice", que es un iterador que puede generar los elementos que queremos. Pero debe tenerse en cuenta que esta operación utiliza todos los elementos del generador antes del segmento y todos los elementos del objeto "islice".

3. Omita el comienzo del iterable

A veces tienes que lidiar con archivos que comienzan con líneas no deseadas (como comentarios). "Itertools" ofrece una vez más una solución sencilla:

string_from_file = """  
// Author: ...  
// License: ...  
//  
// Date: ...  
Actual content... 
 """ 
import itertools  
for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("  
")):  
    print(line) 

Este código solo imprime el contenido después del comentario inicial. Este método es útil si solo queremos descartar la parte inicial del objeto iterable (en este ejemplo, la línea de comentario inicial), pero no sabemos cuánto tiempo dura esta parte.

4. Funciones que contienen solo argumentos de palabras clave (kwargs)

Cuando usamos las siguientes funciones, es útil crear una función que solo requiera argumentos de palabras clave como entrada para proporcionar una definición de función más clara:

def test(*, a, b):  
    pass  
test("value for a", "value for b") 
# TypeError: test() takes 0 positional arguments...  
test(a="value", b="value 2")  # Works... 

Como puede ver, agregar un " " antes del parámetro de palabra clave puede resolver este problema. Si ponemos algunos parámetros antes del parámetro " ", obviamente son parámetros posicionales.

5. Cree un objeto que admita la declaración "con".

Por ejemplo, todos sabemos cómo usar la instrucción "with" para abrir un archivo o adquirir un bloqueo, pero ¿podemos implementar nuestra propia expresión de contexto? Sí, podemos usar " entrar " y " salir " para implementar el protocolo de gestión de contexto:

class Connection:  
    def __init__(self):  
        ...  
    def __enter__(self):  
        # Initialize connection...  
    def __exit__(self, type, value, traceback):  
        # Close connection...  
with Connection() as c:  
    # __enter__() executes  
    ...  
    # conn.__exit__() executes 

Esta es la forma más común de implementar la gestión de contexto en Python, pero hay una forma más sencilla:

from contextlib import contextmanager  
@contextmanager  
def tag(name):  
    print(f"<{name}>")  
    yield  
    print(f"</{name}>")  
with tag("h1"):  
    print("This is Title.")

El código anterior utiliza el decorador administrador de contextmanager para implementar el protocolo de administración de contenido. Al ingresar al bloque with, se ha ejecutado la primera parte de la función tag (la parte antes del rendimiento), luego se ejecuta el bloque with y finalmente se ejecuta el resto de la función tag.

6. Utilice "ranuras" para ahorrar memoria

Si alguna vez ha escrito un programa que crea una gran cantidad de instancias de una determinada clase, es posible que haya notado que su programa de repente requiere mucha memoria. Eso es porque Python usa un diccionario para representar los atributos de una instancia de clase, lo que lo hace rápido, pero la eficiencia del uso de la memoria no es muy alta. Normalmente, este no es un problema grave. Sin embargo, si su programa se ve gravemente afectado por esto, también puede probar con " ranuras ":

class Person:  
    __slots__ = ["first_name", "last_name", "phone"]  
    def __init__(self, first_name, last_name, phone):  
        self.first_name = first_name  
        self.last_name = last_name  
        self.phone = phone 

Cuando definimos el atributo " slots ", Python no usa un diccionario para representar los atributos, pero usa una pequeña matriz de tamaño fijo, lo que reduce en gran medida la memoria requerida para cada instancia. También existen algunas desventajas al usar " ranuras ": no podemos declarar ninguna propiedad nueva, solo podemos usar las propiedades existentes en " ranuras ". Además, las clases con " ranuras " no pueden usar herencia múltiple.

7. Limitar el uso de "CPU" y memoria

Si no desea optimizar la memoria o el uso de la CPU del programa, pero desea limitarlo directamente a un cierto número, Python también tiene una biblioteca correspondiente que puede hacerlo:

import signal  
import resource  
import os  
# To Limit CPU time  
def time_exceeded(signo, frame):  
    print("CPU exceeded...")  
    raise SystemExit(1)  
def set_max_runtime(seconds):  
    # Install the signal handler and set a resource limit  
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)  
    resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))  
    signal.signal(signal.SIGXCPU, time_exceeded)  
# To limit memory usage  
def set_max_memory(size):  
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)  
    resource.setrlimit(resource.RLIMIT_AS, (size, hard)) 

Podemos ver que en el fragmento de código anterior, hay opciones para establecer el tiempo de ejecución máximo de la CPU y el límite máximo de uso de memoria. Al limitar el tiempo de ejecución de la CPU, primero obtenemos el límite suave y el límite estricto del recurso específico (RLIMIT_CPU), y luego usamos el número de segundos especificado por el parámetro y el límite estricto recuperado previamente para configurarlo. Finalmente, si el tiempo de ejecución de la CPU excede el límite, le indicaremos al sistema que salga. En términos de uso de memoria, recuperamos el límite suave y el límite estricto nuevamente, y usamos el "setrlimit" con el parámetro "tamaño" y el límite estricto recuperado previamente para establecerlo.

8. Controlar lo que se puede y no se puede importar

Algunos lenguajes tienen mecanismos muy obvios para exportar miembros (variables, métodos, interfaces) Por ejemplo, en Golang, solo se exportan los miembros que comienzan con una letra mayúscula. Sin embargo, en Python, todos los miembros se exportarán (a menos que usemos " todos "):

def foo():  
    pass  
def bar():  
    pass  
__all__ = ["bar"] 

En el código anterior, sabemos que solo se exporta la función "barra". Del mismo modo, podemos dejar " todo " vacío para que no se exporte nada. Al importar desde este módulo, se generará un "AttributeError".

9. Una forma sencilla de implementar operadores de comparación

Es tedioso implementar todos los operadores de comparación (como lt  ,  le  ,  gt  ,  ge ) para una clase  . ¿Hay una manera más fácil de hacer esto? En este momento, "functools.total_ordering" es una buena ayuda:

from functools import total_ordering  
@total_ordering  
class Number:  
    def __init__(self, value):  
        self.value = value  
    def __lt__(self, other):  
        return self.value < other.value  
    def __eq__(self, other):  
        return self.value == other.value  
print(Number(20) > Number(3))  
print(Number(1) < Number(5))  
print(Number(15) >= Number(15))  
print(Number(10) <= Number(2)) 

¿Cuál es el principio de funcionamiento aquí? Usamos el decorador "total_ordering" para simplificar el proceso de clasificación de instancias de clases. Solo necesitamos definir lt y eq , son el conjunto más pequeño de operaciones necesarias para implementar el resto de las operaciones (aquí también refleja el papel del decorador: llenar el vacío por nosotros).

10. Escribe al final

No todas las funciones mencionadas en este artículo son necesarias o útiles en la programación diaria de Python, pero algunas de ellas pueden resultar útiles de vez en cuando, y también pueden simplificar algunas tareas originalmente largas y molestas.

También se debe señalar que todas estas funciones son parte de la biblioteca estándar de Python.

En mi opinión, algunas de estas funciones no parecen ser como el contenido estándar incluido en la biblioteca estándar, así que cuando use Python para implementar algunas de las funciones mencionadas en este artículo, consulte primero la biblioteca estándar de Python. no puede encontrar lo que desea La función puede deberse simplemente a que no ha hecho todo lo posible para encontrarla (si no es así, también debe existir en algunas bibliotecas de terceros).

Supongo que te gusta

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