2016-02-25 18 views
5

W języku Ruby słowo kluczowe yield jest używane do tworzenia zamknięć dla bloków wykonania.Python yield vs Ruby yield

Jak to słowo kluczowe różni się w języku Python?

+3

bym odpowiedzieć ale think [this] (http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python) obejmuje je – Alex

Odpowiedz

8

W rubinie, zysk jest skrótem używanym do wywoływania anonimowej funkcji. Ruby ma specjalną składnię do przekazywania anonimowej funkcji do metody; składnia jest znana jako block. Ponieważ funkcja nie ma nazwy, użyć nazwy otrzymując aby wywołać funkcję:

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 

W python, gdy widzisz wydajność wewnątrz definicji funkcji, co oznacza, że ​​funkcja jest generator. Generator to specjalny typ funkcji, który można zatrzymać w trakcie wykonywania i ponownie uruchomić. Oto przykład:

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)) 

wyjściowa:

Started execution of do_stuff() 
--received 13 from generator 

więcej Kod:

val = next(my_gen)  
print("--received {} from generator".format(val)) 

wyjściowa:

Z wyjścia, można zobaczyć, że yield powoduje Wynik jest powtórką re; wtedy wykonanie zostaje natychmiast wstrzymane. Po ponownym wywołaniu next() w generatorze, wykonywanie trwa do momentu napotkania następnej instrukcji yield, która zwraca wartość, a następnie wykonanie zatrzymuje się ponownie.

+3

Zasadniczo słowo kluczowe "yield" Pythona jest równoważne z 'Enumeratorem 'Ruby: : Yielder # yield'. –

+0

Dziękujemy! Nie wiedziałem o klasie Enumerator :: Yielder !! – noname

+0

Aby uzyskać więcej informacji na temat 'Enumerator :: Yielder' oraz' Enumerator :: Generator', polecam: http://patshaughnessy.net/2013/4/3/ruby-2-0-works-hard-so-you- może być leniwy –

1

W Rubim, plon jest używany do odbijania kontroli do bloku (podobnie jak funkcja anonimowa) w celu wykonania instrukcji bloku, a następnie powraca do miejsca, w którym blok został wywołany.

Z yield args można przekazywać argumenty do bloku, a także z lvar = yield można dostać cokolwiek powrócił i powiązać go z lvar po kontroli wyjście z bloku. Jest to bardzo ogólny i spójny projekt funkcji w Ruby. I oczywiście, możesz zastosować ten pomysł do iterowania nad kolekcjami.

Natomiast w Pythonie, przeważnie ludzie używają wydajność w celu ułatwienia skutecznego dostępu elementów nad nieco kolekcji, koncentrują się one na iteracyjne raz i wygenerować w locie raz miano pomysł, który jest głównym zastosowaniem wydajnością w języku Python.

FYI, nie jest to dość wyróżniająca się cecha między Pythonem i Rubinem na yield, przynajmniej na drodze do jej użycia. (Wygląda na to, że są one implementowane inaczej, ponieważ dla Pythona, plon tworzy generator, który nie uruchomi żadnego kodu, chyba że rozpocznie się iteracja). Na przykład sposób uzyskiwania uzyskują w Pythonie contextmanager jest całkiem taki sam w 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 

tutaj, wydajność wprost plik uchwyt do z i wykonać ze sprawozdaniami dokładnie raz a następnie wraca do pliku zamknąć komunikat

Powiązane problemy