expresión de rendimiento en forma de pitón programación funcional detallados de aprendizaje

prefacio

El rendimiento de la palabra Inglés que significa la producción, nuevos en el tiempo de Python estaba muy confundido, no se ha de averiguar el uso de rendimiento. Recientemente re-aprender el siguiente, así terminando el artículo siguiente, se aprende por sí mismos y de su referencia, el siguiente no hablaba mucho decir, a echar un vistazo a la introducción detallada.

Primer vistazo a un ejemplo

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
 
g = foo()
next(g)

En el ejemplo anterior, por la palabra clave de rendimiento tiene la función foo, por lo resultado foo () la función g de ejecución es un generador, a continuación, puede utilizar la siguiente (g) o g. Siguiente () realiza método, el generador de disparos

Los resultados de la implementación de

starting...

Cuando se utiliza el siguiente disparo (g) la ejecución del generador, el programa ejecutado en el orden normal de la parte superior hacia abajo, rendimiento encontrado, el programa será suspendido
, y los valores de rendimiento se devuelven contacto posterior

Imprimir siguiente (g) de los resultados

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
 
g = foo()
print(next(g))

resultados de la ejecución del programa

starting...
None

En el ejemplo anterior, realizar un método siguiente (g), las pausas del programa en el rendimiento de esa línea, a continuación, llamar a la siguiente (g) de nuevo, el programa continuará funcionando abajo de la línea de la declaración de rendimiento

Modificar el código anterior, llamando varias veces más que el siguiente método, y devuelve el método de imprimir el siguiente resultado

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))

Los resultados anteriores de la aplicación de este código es

starting...
None
********************
res: None
None

Podemos ver, el programa se está ejecutando paso a paso conjeturas, pero el programa anterior también tiene un inconveniente muy significativo: es el código anterior no tiene ninguna importancia práctica: el valor de la res es siempre Ninguno

En el desarrollo real, el propósito del formulario es el rendimiento de expresión puede obtener un valor de rendimiento y el rendimiento de este valor se asigna a una variable, por lo que tienen significado real

Cómo debe operar con el fin de asignar un valor a una variable res que? ? Es generador de llamadas propio método send

método de envío desencadena un generador de realizar, mientras que también pasar parámetros para producir el método de envío
para modificar el código de seguridad

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
next(g)
print(g.send(5))

Resultados de la aplicación de:

starting...
res: 5
None

Para analizar la ejecución del código anterior:

  1.程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g.
  2.直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环
  3.程序遇到yield关键字,程序暂停,此时next(g)语句执行完成
  4.程序执行g.send(5),程序会从yield关键字那一行继续向下运行,send会把5这个值传递给yield
  5.yield接收到send方法传递过来的值,然后由yield赋值给res变量
  6.由于send方法中包含next()方法,所以程序会继续向下运行执行print方法,然后再次进入while循环
  7.程序执行再次遇到yield关键字,yield会返回后面的值,由于yield后面没有接任何参数,所以yield会返回None,程序再次暂停,直到再次调用next方法或send方法

Modificar el código, llame a las varias veces método de envío

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
next(g)
print(g.send(5))
print("*"*20)
print(g.send(10))
print("#"*20)
print(g.send(15))

La ejecución de un programa, los siguientes resultados

starting...
res: 5
None
********************
res: 10
None
####################
res: 15
None

Se puede ver como el proceso de ejecución del código anterior realiza la misma operación anterior análisis

En el ejemplo anterior, si la llamada para enviar método, el paso de parámetros en Ninguno, los resultados obtenidos serán como él? ?

A partir del análisis anterior, es posible saber:

Si el g.send()método de transmisión de los parámetros de rendimiento de palabras clave es None, entonces el valor de rendimiento se pasa a la variable clave para ser Ninguno res
Para este último no tomar cualquier valor rendiría, el valor por defecto también se devuelve a ninguno de rendimiento, por lo que el resultado de la ejecución del programa será una Ninguno de dos
modificar el código para verificar la conjetura anterior

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
next(g)
print("#"*20)
print(g.send(None))

Ver los resultados del programa

starting...
####################
res: None
None

Como puede verse en el resultado de la ejecución del programa, si el método de una llamada para enviar productor, parámetros pasados ​​como Ninguno, el resultado será dos programas ejecutados Ninguno

Utilice el formulario para lograr sistema Linux rendimiento de expresión comando "grep raíz -rl / etc"

Código es el siguiente:

import os
def init(func):
 def wrapper(*args, **kwargs):
  g = func(*args, **kwargs)
  next(g)
  return g
 return wrapper
@init
def get_file_path(target):
 """
 get file abspath
 # 阶段一:递归找文件的绝对路径,把文件的完事路径发送给阶段二
 :param target:
 :return:
 """
 while True:
  start_path = yield
  g = os.walk(start_path)
  for parent_dir, _, files in g:
   for file in files:
    file_path = r"%s\%s" % (parent_dir, file)
    target.send(file_path)
@init
def opener(target):
 """
 get file obj
 # 阶段二:收到文件的完整路径,打开文件获取文件对象,把文件对象发送给阶段三
 :param target:
 :return:
 """
 while True:
  file_path = yield
  with open(file_path, encoding='utf-8') as f:
   target.send((file_path, f))
@init
def cat_file(target):
 """
 read file content
 # 阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
 :param target:
 :return:
 """
 while True:
  file_path, f = yield
  for line in f:
   file_content = target.send((file_path, line))
   if file_content:
    break
@init
def grep(target, pattern):
 """
 grep function
 # 阶段四:收到文件的一行内容,判断要查找的内容是否在这一行中,如果在,则把文件名发送给阶段五
 :param target:
 :param pattern:
 :return:
 """
 tag = False
 while True:
  file_path, line = yield tag
  tag = False
  if pattern in line:
   target.send(file_path)
   tag = True
@init
def printer():
 """
 print file name
 # 阶段五:收到文件名,打印结果
 :return:
 """
 while True:
  filename = yield
  print(filename)
path1 = "/root"   # 定义要搜索的路径
path2 = "/etc"   # 定义要搜索的路径
g = get_file_path(opener(cat_file(grep(printer(), "root"))))
print(g)
g.send(path1)
g.send(path2)

Recomendamos aprender Python hebilla qun: 774711191, vistazo a la forma de la tercera edad están aprendiendo! Desde guión básico pitón de desarrollo web para, reptiles, Django, minería de datos, etc. [PDF, el código fuente real], proyectos a los datos de combate basado en cero están terminando. Dado a cada socio pitón poco! Cada día, Daniel explicar la tecnología de sincronización de Python, para compartir algunas de las formas de aprender y necesidad de prestar atención a los pequeños detalles, haga clic en Unirse a los estudiantes de la recopilación de pitón
Resumen

Eso es todo por este artículo, espero que el contenido de este documento tiene un valor de referencia de aprendizaje para todo el mundo para aprender o trabajar

Publicado 44 artículos originales · ganado elogios 56 · Vistas a 60000 +

Supongo que te gusta

Origin blog.csdn.net/haoxun10/article/details/104908500
Recomendado
Clasificación