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

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
geroyx
User
Beiträge: 2
Registriert: Sonntag 10. November 2019, 16:33

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).
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Endet dann halt in einem ", ". Wenn das okay ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
geroyx
User
Beiträge: 2
Registriert: Sonntag 10. November 2019, 16:33

Das sind sehr schicke Umsetzungen, die mir gut weiterhelfen. Vielen Dank dafür!
Antworten