2016-04-29 12 views
2

Ich nedd einen Python-Generator, um die Höhe der Zeile in einer PDF-Datei zu erhalten. Um dies zu erreichen, habe ich einen Generator erstellt, der die Höhe der nächsten Zeile zurückgibt.Python Generator mit verschiedenen Next() Bedingungen

def height_generator(height): 
    while height > 0: 
     height -= 15 
     yield(height) 

Dies funktioniert soweit perfekt.

Aber ich brauche verschiedene Höhen. Zum Beispiel, wenn ich einen neuen Absatz in meiner Datei brauche, muss ich die Höhe um 20 statt um 15 reduzieren.

um das zu bekommen, möchte ich definieren, ob ich eine neue Zeile oder einen neuen Absatz will, wenn ich anrufe mein Generator.

ich treid etwas wie folgt aus:

def height_generator(height): 
    while height > 0: 
     def spacer(height, a): 
      if a == 1: 
       height -= 15 
       yield(height) 
      elif a ==2: 
       height -= 20 
       yield(height) 

aber es funktioniert nicht.

Antwort

4

Sie definieren eine Funktion in einer while Schleife, die nur unendlich Code Schleife macht.

Sie müssen send(a) an den Generator zu sagen, was zu tun ist. Zum Beispiel

def height_generator(height): 
    while height > 0: 
     a = yield height 
     if a == 1: 
      height -= 15 
     else: 
      height -= 20 

g = height_generator(100) 
g.next() 
print g.send(1) # 85 
print g.send(2) # 65 
print g.send(1) # 50 

yield ist nicht nur eine Art und Weise, dass ein Generatorwert an seinen Aufrufer erzeugt, kann aber auch Werte senden an den Generator verwendet werden. Das an send übergebene Argument ist der Wert des Ausdrucks yield height. Für weitere Details lesen Sie bitte PEP 255

+0

Das ist genau das, was ich wollte! Danke :). – Krasnars

0

Warum nicht etwas tun, wie dies ?:

def height_generator(height): 
    while height > 0: 
     a= yield height 
     if a == 'nl': 
      height -= 15 
     elif a == 'np': 
      height -= 20