Seite 1 von 1

Ungewolltes Leerzeichen am Zeilenanfang

Verfasst: Samstag 26. Dezember 2020, 17:40
von Raul1904
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)

Re: Ungewolltes Leerzeichen am Zeilenanfang

Verfasst: Samstag 26. Dezember 2020, 22:55
von simplesimon
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)

Re: Ungewolltes Leerzeichen am Zeilenanfang

Verfasst: Samstag 26. Dezember 2020, 23:32
von Sirius3
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")

Re: Ungewolltes Leerzeichen am Zeilenanfang

Verfasst: Samstag 26. Dezember 2020, 23:41
von __blackjack__
@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()

Re: Ungewolltes Leerzeichen am Zeilenanfang

Verfasst: Sonntag 27. Dezember 2020, 15:00
von Raul1904
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