Seite 1 von 1

Sage: Ausgabe einer Folge (Collatz) im Display und als txt-Ausgabedatei

Verfasst: Sonntag 10. November 2019, 16:40
von geroyx
Hallo, das ist mein erster Beitrag hier.

Der Code ist:

Code: Alles auswählen

X = 19     # Startwert
N = 7      # Laufweite
def f(x, n):
    yield x
    for k in range(0, n):
        if x % 2 == 0:
            x = x / 2
        else:
            x = 3*x + 1
        yield x
print(", ".join(map(str, f(X, N))))
liefert eine kommagetrennte Liste der Folgenglieder im Display. Kann mir vll. jemand sagen, wie ich das parallel dazu als
-sinnvoll benannte-
zeilengetrennte txt-Ausgabedatei erhalte? Also etwa

Code: Alles auswählen

collatz19.txt
Schonmal Danke für die Mühen!

PS: Ach so, ganz wichtig, die txt-Ausgabe sollte zeilengetrennt sein (wie beim Default).

Re: Sage: Ausgabe einer Folge (Collatz) im Display und als txt-Ausgabedatei

Verfasst: Sonntag 10. November 2019, 17:39
von __blackjack__
@geroyx: Datei öffnen und mit `more_itertools.side_effect()` eine Funktion aufrufen lassen die die einzelnen Zeichenketten die das `map()` liefert, mit einem Zeilendende-Zeichen abgeschlossen in die Datei schreibt.

Die ”Laufweite” könnte man da auch noch aus der Generatorfunktion raus holen und die einfach endlos Zahlen generieren lassen. Wie viele man davon haben will, kann man sich dann mit `itertools.islice()` nehmen.

`f` ist ein extrem schlechter Name.

Re: Sage: Ausgabe einer Folge (Collatz) im Display und als txt-Ausgabedatei

Verfasst: Sonntag 10. November 2019, 19:27
von snafu
Man kann die Reihe auch einfach als Liste zwischenspeichern, sofern sie nicht übelst groß ist und dann zweimal print() anwenden:

Code: Alles auswählen

series = list(f(X, N))
print(*series, sep=', ')
with open(dateiname) as outfile:
    print(*series, sep='\n', file=outfile)

Re: Sage: Ausgabe einer Folge (Collatz) im Display und als txt-Ausgabedatei

Verfasst: Sonntag 10. November 2019, 19:51
von Sirius3
Warum nicht einfach in einer Schleife:

Code: Alles auswählen

with open(dateiname) as outfile:
    for number in f(X, N):
        print(number, end=', ')
        print(number, file=outfile)

Re: Sage: Ausgabe einer Folge (Collatz) im Display und als txt-Ausgabedatei

Verfasst: Sonntag 10. November 2019, 20:55
von __blackjack__
Endet dann halt in einem ", ". Wenn das okay ist.

Re: Sage: Ausgabe einer Folge (Collatz) im Display und als txt-Ausgabedatei

Verfasst: Dienstag 12. November 2019, 18:51
von geroyx
Das sind sehr schicke Umsetzungen, die mir gut weiterhelfen. Vielen Dank dafür!