2016-04-24 8 views
-3

ich Generator in Python lerne, hier die Funktionen:Was aus diesen beiden Funktionen sind anders in Python mit schicken

import math 
def is_primes(number): 
    if number > 1: 
     if number == 2: 
      return True 
     if number % 2 == 0: 
      return False 
     for current in range(3, int(math.sqrt(number) + 1), 2): 
      if number % current == 0: 
       return False 
     return True 
    return False 


def get_primes1(number): 
    while True: 
     if is_primes(number): 
      yield number 
     number +=1 

def get_primes2(number): 
    while True: 
     if is_primes(number): 
      number=yield number 
     number +=1 

wenn die Funktion send mit:

a=get_primes1(2) 
b=get_primes2(2) 
a.send(None)#return 2 
b.send(None)#return 2 
a.send(1)#return 3,the parameter in send() looks useless. 
b.send(1)#return 1,normal 

wenn die „a verwendet. send (1) "und" b.send (1) "wiederholt a.send (1) den größeren Wert, aber b.send (1) gibt immer noch denselben Wert zurück. Warum gibt es einen Unterschied?

ich überprüfen die Bedeutung von Sendefunktion:

Fortsetzung der Ausführung und `` sendet ‚‘ einen Wert in die Generatorfunktion. Das Wertargument wird das Ergebnis der aktuellen Yieldexpression. Die send() -Methode gibt den nächsten vom Generator zurückgegebenen Wert zurück oder löst StopIteration aus, wenn der Generator beendet wird, ohne einen anderen Wert zu liefern. Wenn send() aufgerufen wird, um den Generator zu starten, muss er mit None als Argument aufgerufen werden, da es keinen Yield-Ausdruck gibt, der den Wert empfangen könnte.

+2

Hat Ihr Beispiel nicht genau zeigen, was Sie fragen? Die Sache, die anders ist, ist die Sache, die anders ist! * ".send" hat nur dann einen Effekt, wenn Sie das Ergebnis der "Ausbeute" zuweisen, wie Sie es in "get_primes2" tun. Wenn Sie ".send (None)" auswählen, wird es auf beide Arten ignoriert. – jonrsharpe

+0

ich denke, "send (x)" und x wird an die get_primes1() gesendet und wieder ergeben ... @ jonrsharpe –

+2

Es ist nicht klar, was Ihre Frage ist. – jonrsharpe

Antwort

2

Wie funktioniert die Sendefunktion im Generator?

def counter(): 
    total = 0 

    while True: 
     increment = yield total #If next() was called, 
           #increment is assigned None. 
           #If send() was called, 
           #increment is assigned send()'s argument. 

     if increment: 
      total += increment 
     else: 
      total += 1 


g = counter() 
print(next(g)) 
print(next(g)) 
print(g.send(3)) 
print(next(g)) 

--output:-- 
0 
1 
4 
5 

ein Wert der Ausbeute Ausdruck ist, wenn keine der Generator durch einen normalen next() Aufruf wieder aufgenommen wird.


send() Methode für Generator-Iteratoren, die den Generator wieder aufnimmt und "sendet" ein Wert, der das Ergebnis der aktuellen Ausbeute Expression wird. Die send() Methode gibt den den Generator

von ergab nächsten Wert anzeigen PEP 342

aber b.send (1) immer noch die gleiche value.why dorthin zurückkehren Unterschied?

Weil Sie number auf den Wert von send() 's Argument immer und immer wieder sind Zurücksetzen:

a: number = 2 
    number += 1 
    number += 1 

b: number = 2 
    number = 1 
    number += 1 
    number = 1 
    number += 1 
+0

Präzise ...Hier wird der Funktion nichts übergeben und sie wird als Callback verwendet. Nettes Beispiel @ 7stud. – Pouria

+0

Entschuldigen Sie die Störung! in Ihrem Beispiel (increment = yield total), bedeutet es, dass, wenn send aufgerufen wurde, die (yield total) das Argument von send() zurückgibt oder None zurückgibt (und dann increment = sends Argument)? –

+1

@DavidLee, Siehe den Kommentar im Code. – 7stud