yield
en Ruby et yield
en Python sont deux choses très différentes.
En Ruby yield
exécute un bloc transmis en tant que paramètre à la fonction.
Ruby:
def three
yield
yield
yield
end
three { puts 'hello '} # runs block (prints "hello") three times
En Python yield
jette une valeur à partir d'un générateur (qui est une fonction qui utilise yield
) et arrête l'exécution de la fonction. Donc, c'est quelque chose de complètement différent, plus probablement vous voulez passer une fonction en paramètre à la fonction en Python.
Python:
def three(func):
func()
func()
func()
three(lambda: print('hello')) # runs function (prints "hello") three times
Générateurs Python
Le code ci-dessous (le code que vous avez fourni) est un générateur qui retourne None
trois fois:
def three():
yield
yield
yield
g = three() #=> <generator object three at 0x7fa3e31cb0a0>
next(g) #=> None
next(g) #=> None
next(g) #=> None
next(g) #=> StopIteration
La seule façon que je peux imaginer comment il pourrait être utilisé pour l'impression "Bonjour" trois fois - en l'utilisant comme un itérateur:
for _ in three():
print('Hello')
Ruby Analogie
Vous pouvez faire une chose semblable à Ruby en utilisant Enumerator.new
:
def three
Enumerator.new do |e|
e.yield # or e << nil
e.yield # or e << nil
e.yield # or e << nil
end
end
g = three
g.next #=> nil
g.next #=> nil
g.next #=> nil
g.next #=> StopIteration
three.each do
puts 'Hello'
end
Autre que l'ajout d'un argument? –
Notez que le mot-clé 'yield' dans Ruby a un comportement très différent du mot-clé' yield' dans Python. –
** Note aux réponses potentielles: ** Veuillez lire attentivement la question. L'OP cherche à traduire le code avec une sémantique spécifique de ruby à Python. Tandis que les réponses comme 'print ('Hello \ n' * 3)' sont techniquement correctes, elles manquent le point le plus important: Le comportement du mot-clé 'yield' dans Ruby vs Python. –