_ = yield i
yield _
Innanzitutto yield
s il valore fa riferimento i
, ad esempio 1
. Quindi restituisce il valore restituito dall'operazione yield
, che è None
. Lo fa su ogni iterazione del ciclo.
for i in x:
_ = yield i
Questo semplicemente yield
s il valore fa riferimento i
, ad esempio 1
, quindi procede alla successiva iterazione del ciclo, producendo 2
, quindi 3
.
differenza return
, la parola chiave yield
può essere utilizzato in un'espressione:
x = return 0 # SyntaxError
x = yield 0 # perfectly fine
Ora, quando l'interprete vede un yield
, genererà il valore indicato. Tuttavia, quando lo fa, tale operazione restituisce il valore None
, proprio come mylist.append(0)
o print('hello')
sarà return
il valore None
. Quando assegni quel risultato a un riferimento come _
, stai salvando quello None
.
Così, nel primo frammento, si sta producendo un oggetto, quindi si salva il "risultato" di quella yield
operazione, che è None
, e poi si yield
che None
. Nel secondo frammento, si produce un oggetto, quindi si salva il "risultato" di tale operazione yield
, ma si mai yield
che risulta, quindi None
non viene visualizzato nell'output.
Si noti che yield
non restituirà sempre None
- questo è solo ciò che è stato inviato al generatore con send()
. Dal momento che non era niente in questo caso, ottieni None
. Vedi this answer per ulteriori informazioni su send()
.
I Non sono esattamente sicuro del perché, ma l'unica domanda È probabile che appaia nell'elenco "Correlato" in qualsiasi domanda Python sia [la domanda 'yield'] (http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python), anche se la domanda in questione non ha nulla a che fare con 'yield'. Questa volta, tuttavia, è effettivamente correlato. – TigerhawkT3