@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()