In Ruby, la parola chiave yield viene utilizzata per cedere alle chiusure per i blocchi di esecuzione.Rendimento Python vs rendimento Ruby
In che modo questa parola chiave è diversa nel linguaggio Python?
In Ruby, la parola chiave yield viene utilizzata per cedere alle chiusure per i blocchi di esecuzione.Rendimento Python vs rendimento Ruby
In che modo questa parola chiave è diversa nel linguaggio Python?
Nel rubino, yield è un collegamento utilizzato per chiamare una funzione anonima. Ruby ha una sintassi speciale per passare una funzione anonima ad un metodo; la sintassi è nota come block
. Poiché la funzione non ha un nome, si utilizzerà il nome cedere per chiamare la funzione:
def do_stuff(val)
puts "Started executing do_stuff"
yield(val+3)
yield(val+4)
puts "Finshed executing do_stuff"
end
do_stuff(10) {|x| puts x+3} #<= This is a block, which is an anonymous function
#that is passed as an additional argument to the
#method do_stuff
--output:--
Started executing do_stuff
16
17
Finshed executing do_stuff
In Python, quando si vede il rendimento all'interno di una definizione di funzione, che significa che la funzione è un generator
. Un generatore è un tipo speciale di funzione che può essere fermato a metà esecuzione e riavviato. Ecco un esempio:
def do_stuff(val):
print("Started execution of do_stuff()")
yield val + 3
print("Line after 'yield val + 3'")
yield val + 4
print("Line after 'yield val + 4'")
print("Finished executing do_stuff()")
my_gen = do_stuff(10)
val = next(my_gen)
print("--received {} from generator".format(val))
uscita:
Started execution of do_stuff()
--received 13 from generator
Più codice:
val = next(my_gen)
print("--received {} from generator".format(val))
uscita:
Dall'output, si può vedere che yield
provoca un risultato essere di ritorno d; quindi l'esecuzione viene immediatamente interrotta. Quando si chiama di nuovo next() sul generatore, l'esecuzione continua fino a quando viene trovata la successiva dichiarazione di rendimento, che restituisce un valore, quindi l'esecuzione si interrompe nuovamente.
Fondamentalmente, la parola chiave 'yield' di Python è equivalente a' Enumerator di Ruby: : produttore di raccolti # yield'. –
Grazie! Non sapevo della classe Enumeratore :: Yielder !! – noname
Per ulteriori dettagli su 'Enumeratore :: Yielder' e' Enumeratore :: Generatore' raccomando: http://patshaughnessy.net/2013/4/3/ruby-2-0-works-hard-so-you- può-be-pigro –
In Ruby, resa viene utilizzato per rimbalzo controllo al blocco (come funzione anonima) per eseguire istruzioni del blocco e poi riprendersi a dove il blocco di chiamata.
Con yield args
è possibile passare degli argomenti al blocco, e anche con lvar = yield
si può ottenere tutto ciò che è tornato e associarlo al lvar dopo il controllo esce dal blocco. È un design di funzionalità molto generale e coerente in Ruby. E naturalmente, puoi applicare questa idea per iterare su raccolte.
Mentre in Python, per lo più persone utilizzano resa per facilitare l'accesso effettivo degli articoli sopra collezione un po ', si concentrano su iterare una volta e generare al volo una volta di essere chiamato idea, che è l'uso principale del resa in Python.
FYI, Non è proprio una caratteristica distinta tra Python e Ruby su resa, almeno sul modo di usarlo. (Apparentemente sono implementate in modo diverso, come per Python, yield crea un generatore, che non eseguirà alcun codice a meno che non inizi l'iterazione). Ad esempio, il modo in cui produce viene utilizzato in python contextmanager è lo stesso in Ruby.
from contextlib import contextmanager
@contextmanager
def openfile(name, mode):
f= open(name, mode)
yield f
f.close()
with openfile('log.txt', 'r') as handle:
for line in handle:
print line
qui, resa passaggio file di maniglia per con, ed eseguire con-dichiarazioni esattamente volta e poi riprendersi a file vicino dichiarazione
avrei risposta, ma think [this] (http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python) lo copre – Alex