2012-05-22 12 views
40

Sé que el rendimiento convierte una función en un generador, pero ¿cuál es el valor de retorno de la expresión de rendimiento en sí? Por ejemplo:¿Cuál es el resultado de una expresión de rendimiento en Python?

def whizbang(): 
    for i in range(10): 
     x = yield i 

¿Cuál es el valor de la variable x ya que esta función se ejecuta?

He leído la documentación de Python: http://docs.python.org/reference/simple_stmts.html#grammar-token-yield_stmt y parece que no hay mención del valor de la expresión de rendimiento en sí.

+0

De Por supuesto, el resultado experimental es que siempre devuelve "Ninguno", pero solo quiero confirmarlo. – slacy

+2

Su enlace apunta a la documentación de 'yield' como una instrucción, pero está utilizando una [expresión' yield'] (http://docs.python.org/reference/expressions.html#yield-expressions) en el ejemplo código. –

Respuesta

51

También puede send valores para generadores. Si no se envía ningún valor, entonces x es None, de lo contrario x toma el valor enviado. Aquí hay alguna información: http://docs.python.org/whatsnew/2.5.html#pep-342-new-generator-features

>>> def whizbang(): 
     for i in range(10): 
      x = yield i 
      print 'got sent:', x 


>>> i = whizbang() 
>>> next(i) 
0 
>>> next(i) 
got sent: None 
1 
>>> i.send("hi") 
got sent: hi 
2 
+3

Wow. Por qué esto no se menciona en la documentación para el rendimiento me supera totalmente. ¿Dónde envío los errores del documento? – slacy

+0

@slacy No estoy seguro de los dos. – jamylak

+1

@slacy, ¿eh? Se menciona en la documentación de [rendimiento] (http://docs.python.org/reference/expressions.html#generator.send). – senderle

-4

Este código será enviado algunos datos

def test(): 
    for i in range(10): 
     x = yield i 

t = test() 
for i in test(): 
    print i 
+0

Podrías por favor elaborar más tu respuesta añadiendo un poco más de descripción sobre la solución que proporciona? – abarisone

-3

Aquí está un ejemplo de rendimiento para dar salida con buffer de decir una gran cahce

#Yeild 

def a_big_cache(): 
    mystr= [] 
    for i in xrange(100): 
     mystr.append("{}".format(i)) 
    return mystr 

my_fat_cache = a_big_cache() 

def get_in_chunks(next_chunk_size): 
    output =[] 
    counter = 0 
    for element in my_fat_cache: 
     counter += 1 
     output.append(element) 
     if counter == next_chunk_size: 
      counter = next_chunk_size 
      next_chunk_size+= next_chunk_size 
      yield output 
      del output[:] 

r = get_in_chunks(10) 
print next(r) 
print next(r) 

salida es

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

[ '10', '11', '12',> '13', '14', '15', '16', '17', '18', '19']

+1

Downvoted ya que ni siquiera se acerca al tema de la pregunta, que es el resultado de una declaración de rendimiento. – tleb

Cuestiones relacionadas