Ungewolltes Leerzeichen am Zeilenanfang

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
Raul1904
User
Beiträge: 2
Registriert: Samstag 26. Dezember 2020, 17:24

Hallo,

ich verstehe einfach nicht warum die Ausgabe ein Leerzeichen am Zeilenanfang einfügt und wie ich dies verhindern kann. Alles funktioniert wie gewollt nur das eine Leerzeichen vor jeder Zeile ist zu viel :| .

Code: Alles auswählen

n = int(input())

stamm = "Y"


if n < 1:
    print(" ")
    exit()


for i in range(0,n):
    for j in range(n-i):
        print(" ", end="")
    for k in range(2*i+1):
        if i % 2 == 0:
            print("*",end="")
        
        else:
            print("X",end="")
    print(" ")


print(" "*(n-1), stamm)
simplesimon
User
Beiträge: 11
Registriert: Samstag 3. Dezember 2016, 21:50

Durch for i in range(n-1) werden n-1 Leerzeichen erzeugt, weil die Zählung bei 0 beginnt.
Also range(0,n-1)

Code: Alles auswählen

n = int(input())
stamm = "Y"

if n < 1:
    print(" ")
    exit()

for i in range(n):
    for j in range(1,n-i):
        print(" ", end="")
    for k in range(2*i+1):
        if i % 2 == 0:
            print("*",end="")
        else:
            print("X",end="")
    print()

print(" "*(n-2), stamm)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Verwirrend ist auch das Leerzeichen am Zeilenende.
Da Du schon die Multiplikation von Strings kennst, sind die for-Schleifen überflüssig.

Code: Alles auswählen

n = int(input())

if n < 1:
    print()
else:
    for i in range(n):
        print(" " * (n-i-1), end="")
        if i % 2 == 0:
            print("*" * (2*i+1))
        else:
            print("X" * (2*i+1))
    print(" "*(n-2), "Y")
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Raul1904: Zum Thema unnötige Leerzeichen: statt ``print(" ")`` reicht einfach ``print()`` ohne Argument um eine neue Zeile zu beginnen. Das Leerzeichen welches Du da vorher ausgibst, sieht man ja überhaupt nicht, also braucht man das auch nicht auszugeben.

`exit()` gibt es so eigentlich gar nicht. Das müsste man explizit aus dem `sys`-Modul importieren. Das was Du da verwendest ist nicht dokumentiert und existiert nur weil es in der interaktiven Python-Shell verwendet wird. Da sollte man sich nicht drauf verlassen.

Es ist aber sowieso unsauber statt einen ordentlichen Programmfluss bis zum Ende zu schreiben, zu versuchen das Programm mit `sys.exit()` zu beenden. Faustregel: Wenn man nicht mindestens potentiell einen anderen Rückgabecode als 0 an den Aufrufer des Programms übermitteln möchte, ist `sys.exit()` das falsche Mittel.

Für Namen die man nur aus syntaktischen Gründen benötigt, aber die man nicht wirklich verwendet, wird per Konvention `_` verwendet. Das betrifft `j` und `k`.

Das man Zeichenketten mit ganzen Zahlen ”multiplizieren” kann weisst Du ja bereits. Warum dann also die beiden ``for``-Schleifen? Der Code für den oberen Baumteil sähe dann so aus:

Code: Alles auswählen

        for i in range(n):
            print(" " * (n - i - 1), end="")
            if i % 2 == 0:
                print("*" * (2 * i + 1), end="")
            else:
                print("X" * (2 * i + 1), end="")
            print()
Die Codewiederholung in den beiden Zweigen von dem ``if``/``else`` ist unschön, da hilft ein bedingter Ausdruck:

Code: Alles auswählen

        for i in range(n):
            print(" " * (n - i - 1), end="")
            print(("*" if i % 2 == 0 else "X") * (2 * i + 1), end="")
            print()
Das muss man jetzt aber nicht mehr auf drei `print()`-Aufrufe verteilen:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    n = int(input())

    if n < 1:
        print()
    else:
        for i in range(n):
            print(
                " " * (n - i - 1),
                ("*" if i % 2 == 0 else "X") * (2 * i + 1),
                sep="",
            )

        print(" " * (n - 1), "Y", sep="")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Raul1904
User
Beiträge: 2
Registriert: Samstag 26. Dezember 2020, 17:24

Vielen lieben Dank für eure Antworten. Ich bin noch ein Anfänger und habe mich demnach mit dem bisher von mir gelernten etwas durch die Aufgabenstellung "gewurschtelt". Eure Antworten zeigen mir, dass ich die Funktionen die ich verwende noch nicht vollständig verstanden habe und das versuche ich jetzt noch zu ändern. Vielen Dank für eure Tipps!

LG
Antworten