Seite 1 von 1

endlos Generator

Verfasst: Samstag 19. Dezember 2015, 19:30
von noisefloor
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

Re: endlos Generator

Verfasst: Samstag 19. Dezember 2015, 19:53
von 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()

Re: endlos Generator

Verfasst: Samstag 19. Dezember 2015, 22:36
von Sirius3
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)

Re: endlos Generator

Verfasst: Sonntag 20. Dezember 2015, 15:30
von noisefloor
Hallo,

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

Gruß, noisefloor