endlos Generator

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Ausgangspunkt: ein String soll als Laufschrift auf einen LCD-Display angezeigt werden, der String ist aber länger als die Zeichenanzahl des Displays. Eine fertige Funktion zum Scrollen von Text gibt es nicht, also selber machen.

Dazu habe ich den folgenden Generator, der endlos einen Slice aus einem String liefert (Code ist Python 2.7):

Code: Alles auswählen

from time import sleep

def text_slice_yielder(text, length):
    text_length = len(text)
    diff = text_length - length
    counter = -1
    while True:
        if counter <= diff+1:
            counter = counter + 1
            yield text[counter:text_length-length+counter]
        else:
            counter = -1

my_text = 'ABCDEFGHIJ'
slice_length = 6
my_slice = text_slice_yielder(my_text, slice_length)

while True:
    print(my_slice.next())
    sleep(1)
Das funktioniert auch - nur bin ich nicht sicher, ob das auch nicht eleganter / schöner / kürzer geht. Generatoren sind nicht das, was ich schon oft benutzt hätte...

Gruß, noisefloor
BlackJack

@noisefloor: Insbesondere die letzte Schleife hätte man als ``for``-Schleife schreiben können. Das Ding ist doch „iterable“. Mein Ansatz:

Code: Alles auswählen

from time import sleep


def iter_slices(text, slice_length):
    length = len(text)
    text *= 2
    while True:
        for i in xrange(length):
            yield text[i:i + length]


def main():
    for text in iter_slices('ABCDEFGHIJ', 6):
        print(text)
        sleep(0.25)


if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür eignet sich eine deque:

Code: Alles auswählen

from collections import deque
from itertools import islice

def iter_slices(text, slice_length):
    text = deque(text)
    while True:
        yield ''.join(islice(text, slice_length))
        text.rotate(-1)
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Siriuis: raffiniert... Bzw. hier zahlt es sich aus, wenn man die Klassen und deren Methoden der itertools und collections kennt.

Gruß, noisefloor
Antworten