2020_10_14_Decoradores, generadores y módulos

Decorador de ginseng

1. La función de un decorador de parámetros
Al agregar una función a una función, puede controlar operaciones específicas a través de parámetros (la operación no es fija)
2. Cómo escribir un decorador de parámetros
def nombre de la función 0 (lista de parámetros del decorador)
def nombre de la función 1 (func):
def nombre de función 2 (* args, ** kwargs):
resultado = func (* arges, ** kwargs)
nueva función
devolver resultado
devolver nombre de función 2
devolver nombre de función 1

def nombre de la función (lista de parámetros del
decorador ) decorador sin argumentos
devolver el nombre de la función del decorador sin argumentos

Uso del decorador de parámetros:
@function name0 (lista de argumentos del decorador)

Escriba un decorador para imprimir cualquier mensaje de solicitud especificado después de que finalice la función
def add_message (msg):
def test1 (func):
def new_func (* args, ** kwargs):
result = func (* args, ** kwargs)
print (msg)
return result
return new_func
return test1

@agregar mensaje('después’)
def func1(x, y):
print(x+y)

func1 (10, 20)

Ejercicio: escriba un decorador que resta el valor especificado del valor de retorno de la función original
@sub (10) @sub (30)
def sub (num):
def test (func):
def new_func (* args, ** kwargs ):
result = func (* args, ** kwargs)
if type (result) in (int, float, complex):
return result-num
return result
return new_func
return test

Iterador (iter)

1. El iterador es un tipo de datos de contenedor (secuencia).
Características: a. No se pueden ver todos los elementos al mismo tiempo (la impresión no puede ver los elementos dentro)
b. No se pueden contar el número
c. Al obtener elementos, solo se pueden tomar uno por uno Tome la parte superior de uno en uno), cada vez que obtenga un elemento, el elemento desaparecerá del iterador (si toma uno, perderá uno)

2. Crear un iterador
Hay dos formas de crear un iterador:
1) Convertir otras secuencias en un iterador a través del iter
2) Crear un generador
iter1 = iter ([10, 20, 30, 40])
print (iter1)
print (len (iter1)) # ¡Error!

iter2 = iter ('hola')
print (iter2)

3. Obtenga el elemento
No importa cómo obtenga el elemento en el iterador, el elemento correspondiente desaparecerá del iterador.
1) Tome un solo elemento
siguiente (iterador): obtenga los datos más altos del iterador (si el iterador es Está vacío, informará el error StopIteration)

2) Recorra la
variable for en el iterador:
pasar

print (siguiente (iter1)) # 10
print (siguiente (iter1)) # 20
siguiente (iter1)
print (siguiente (iter1)) # 40
print (siguiente (iter1)) # 报错! StopIteration

para x en iter2:
imprimir (x)

print (next (iter2)) # ¡Informar de un error! StopIteration

iter3 = iter ('python!')
list1 = list (iter3)
print (list1)
print (next (iter3)) # 报错! StopIteration

iter4 = iter ('python123')
siguiente (iter4)
para x en iter4:
print ('x:', x)

Generador

1. La esencia de los generadores son los iteradores (las características de los iteradores y la forma en que los generadores obtienen elementos son aplicables)

2. Cómo crear un generador
Puede crear un objeto generador
llamando a una función con la palabra clave yield (si hay rendimiento en la función llamada, el cuerpo de la función no se ejecutará y no se obtendrá el valor de retorno de la función)

def func1 ():
print ('======')
print ('++++++')
rendimiento
return 100

re = func1 ()
print (re) # <objeto generador func1 en 0x10d9380d0>

3. Cómo determinar la cantidad de datos generados por el generador
"" "
: Después de ejecutar la función correspondiente al generador, encontrará
el valor de los datos generados por yield () varias veces : Vea el rendimiento cada vez que encuentre ¿Cuáles son los datos detrás? Ningún dato es Ninguno

def func2 ():
rendimiento 100
rendimiento 'abc'
para x en el rango (3):
rendimiento x

gen1 = func2 ()
print (gen1)
print (list (gen1)) # [100, 'abc', 0, 1, 2]

def func3 (x):
rendimiento 10
si x & 1:
rendimiento 20
rendimiento 30
rendimiento 30

gen2 = func3 (5)
print (lista (gen2)) # [10, 20]

gen3 = func3 (4)
print (lista (gen3)) # [10]

4. Principio de generación de datos del generador. El
cuerpo de la función no se ejecutará cuando se llame a la función para crear el objeto generador, solo se ejecutará cuando se obtengan los elementos del generador.
La primera vez que obtenga el elemento, se ejecutará desde el principio del cuerpo de la función, y se detendrá cuando se ejecute el primer rendimiento, y los datos posteriores al rendimiento serán el elemento obtenido esta vez. Cada vez que obtenga un elemento, se ejecutará desde donde terminó la última vez, y la ejecución se detendrá hasta el próximo rendimiento. Si no se encuentra ningún rendimiento desde la posición actual hasta el final de la función, se informará un error StopIteration si es el siguiente.

def func4 ():
imprimir ('1')
rendimiento 100
impresiones ('2')
rendimiento 200
impresiones ('3')
rendimiento 300

gen4 = func4 ()
print (next (gen4))
para _ en rango (5):
print ('~~~~~~~~~~')

imprimir (siguiente (gen4))
imprimir (siguiente (gen4))
imprimir (siguiente (gen4)) # 报错! StopIteration

gen5 = func4 ()
gen6 = func4 ()
imprimir (siguiente (gen5)) # 100
imprimir (siguiente (gen5)) # 200
imprimir (siguiente (gen6)) # 100

def func5 ():
para x en el rango (5):
rendimiento x * 2

imprimir (siguiente (func5 ())) # 0
imprimir (siguiente (func5 ())) # 0

Ejercicio: escriba un generador que genere
ID de estudiante , que puede generar ID de estudiante de 001 a 999 en la materia especificada. Python student: python001 ~ python999
java student: java001 ~ java999

def create_num (subject: str):
para x en el rango (1, 1000):
yield f '{subject} {x: 0> 3}'
# yield subject + str (x) .zfill (3)

python_nums = create_num ('python')
print (next (python_nums))
print (next (python_nums))

java_num = create_num ('java')
print (siguiente (java_num))

Ejercicio: escriba un generador de números pares que pueda generar todos los números pares positivos
def números pares ():
num = 2
while True:
yield num
num + = 2

even_gen = even_numbers ()
para _ en el rango (100):
print (next (even_gen))
print ('=============')
para _ en el rango (50):
print (next ( even_gen))

4. Generativo: la derivación del generador

Convertir el tipo de comprensión de la lista [] en () es el tipo de deducción del generador que es la fórmula de producción

resultado = (x ** 2 para x en el rango (10))
imprimir (resultado) # <objeto generador en 0x1018bd5d0>
imprimir (siguiente (resultado))
imprimir (siguiente (resultado))
imprimir (siguiente (resultado))
para el elemento en resultado:
print (f'item: {item} ')

Módulo

1. Un archivo py en python es un módulo.
Puede usar el contenido en otro módulo (variables globales) en un módulo, pero necesita importar el módulo con anticipación

2. Importar módulo
1) importar el nombre del módulo
a. La importación puede usar todas las variables globales en el módulo especificado;
b. Usar variables en la forma de 'nombre de módulo. Variable'

2) desde el nombre del módulo, importe el nombre de la variable 1, el nombre de la variable 2, ...
a. Importe el módulo, puede utilizar las variables globales especificadas en el módulo;
b. Utilice la variable correspondiente directamente, sin añadir 'nombre del módulo'.

3) Importar el nombre del módulo como nuevo nombre
del módulo Cambie el nombre del módulo al importar el módulo, después de cambiar el nombre, debe usar el módulo importado a través del nuevo nombre del módulo

  1. de la variable de importación del nombre del módulo como un nuevo nombre de variable,…
    cambie el nombre de la variable especificada al importar el módulo

5) (Comprender) de la importación del nombre del módulo *
Importar todas las variables globales en el módulo

Método de importación 1: importar el nombre del módulo
importar test1
imprimir (test1.A)
test1.func1 ()
imprimir (test1.X)

Método de importación dos: desde el nombre del módulo, la variable de importación
desde test1 import A, func1
print (A)
func1 ()

Método de importación tres: cambiar el nombre del módulo de
importación test1 como ts1
test1 = 10
test2 = 200
para x en el rango (test1):
print (x)

Llame a func1
ts1.func1 ()
print (ts1.A)
print (ts1.X)

Método de importación 4: cambie el nombre de la variable
de test1 import func1 como ts_func1, A, X como ts_X

def func1 ():
print ('func1 en este módulo')

func1 ()
ts_func1 ()
imprimir (A, ts_X)

3. El principio de importación de módulos
No importa si es a través de la importación o desde la importación, al importar un módulo, el sistema
ejecutará automáticamente todos los códigos en el módulo importado

Nota: Al importar un módulo, tiene su propia función de verificación de duplicados (si el módulo importado se ha importado, no se volverá a importar)
desde test1 import A
print ('A:', A)

4. Evitar la importación Al
definir un módulo, puede utilizar la instrucción if'if name == " main " 'para evitar que el código especificado en el módulo sea importado por otros módulos. (El código en esta declaración if no será ejecutado por otros módulos, y el código no en esta declaración if será ejecutado por otros módulos)

Principio:
De forma predeterminada, hay un nombre de variable en cada archivo py para guardar el nombre del módulo del módulo actual.
Cuando un archivo py se ejecuta directamente, el __name__ en este archivo se convertirá automáticamente en " principal "

importar test2
print ('06: ', nombre )

Supongo que te gusta

Origin blog.csdn.net/xdhmanan/article/details/109088408
Recomendado
Clasificación