Leerzeichen nach PEP 8 - stimmt das wirklich so?

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
Tobivan
User
Beiträge: 2
Registriert: Montag 6. Januar 2025, 09:43

Hallo,
als Einsteiger in Python3 habe ich zunächst ein paar der klassischen Seiten gelesen, u.a. auch das "Style Guide PEP 8". Trotzdem bin ich verwirrt, weil das einfach so seltsam ausschaut:

Code: Alles auswählen

print("Gib deine unterste Zahl ein: ", end="")
numberlow = int(input())
print("Also ist " + str(numberlow) + " deine unterste Zahl.")
print("Gib deine oberste Zahl ein: ", end="")
numberhigh = int(input())
print("Also ist " + str(numberhigh) + " deine oberste Zahl.")
print("In welchem Abstand sollen die Zahlen aufgezählt werden? ", end="")
intervall = int(input())
for output in range(numberlow, numberhigh+1, intervall):
    print(output, end=" ")
Konkret:
- Zeilenende mit end="" Darf/Muss ein benötigtes Leerzeichen in den Text davor oder darf/muss das Leerzeichen in die end-Klammer, also end=" "
- Verkettung: kommt tatsächlich vor und nach dem + Zeichen ein Leerzeichen?
- Muss in der "for"-Klammer das numberhigh+1 mit oder ohne Leerzeichen stehen, also numberhigh + 1

Vielen Dank für Starthilfe!
Benutzeravatar
kbr
User
Beiträge: 1501
Registriert: Mittwoch 15. Oktober 2008, 09:27

Was im "Style Guide PEP 8" steht gilt.

Dein Bespielcode ist allerdings recht umständlich. Besser ist der folgende Einstieg:

Code: Alles auswählen

lower = int(input("Gib deine unterste Zahl ein: "))
print(f"Also ist {lower} deine unterste Zahl.")
Du kannst print() auch ohne das Argument "end" aufrufen. Dann wird standardmäßig nach der Ausgabe noch ein Zeilenvorschub ausgelöst. Möchtest du das ändern, so kannst du das mit "end" anpassen.
nezzcarth
User
Beiträge: 1733
Registriert: Samstag 16. April 2011, 12:47

Es ist gut, PEP8 gelesen zu haben und im Wesentlichen zu befolgen. In der Praxis verwende ich – und ich glaube auch viele andere – aber eh einen Formatter wie black oder ruff, der sich um die Details kümmert und ein einheitliches Erscheinungsbild sicherstellt. PEP8 lässt teilweise Spielräume zu und ein Formatter sorgt dafür, dass in den Fällen immer gleich verfahren wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tobivan: Zum ersten konkreten Punkt sagt PEP8 nichts. Ich würde da wie von kbr vorgschlagen kein eigenes `print()` verwenden, sondern die Eingabeaufforderung dem `input()` übergeben.

Ob Verkettung oder Addition von Zahlen: um binäre Operatoren tatsächlich Leerzeichen. Das erhöht die Lesbarkeit. Man übersieht die Grenzen zwischen den Operanden und dem Operator dann nicht so leicht. Insbesondere in Situationen wo man keine Syntaxhervorhebung hat.

Die Verkettung würde man in Python so aber sowieso nicht schreiben. ``+`` und `str()` ist eher BASIC. In Python verwendet man f-Zeichenkettenliterale oder die `format()`-Methode um Werte in Zeichenketten hinein zu formatieren.

Sonstige Anmerkungen: Bei Namen kommen zwischen Worte in einem Namen Unterstriche. OhnekanndasgenausoschwerlesbarwerdenwieTextohneLeerzeichen.

Falls man nicht Yoda ist, sollte man die Worte auch in der korrekten Reihenfolge in den Namen stecken. 😎

Die Eingabe von unterer und oberer Zahl ist ja bis auf die Texte identisch — da könnte man eine Funktion für schreiben.

Nach der Schleife fehlt noch ein `print()` falls man die nächste Ausgabe nicht in der gleichen Zeile wie die letzte ausgegebene Zahl haben möchte.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3


def ask_for_number(description):
    number = int(input(f"Gib deine {description} Zahl ein: "))
    print(f"Also ist {number} deine {description} Zahl.")
    return number


def main():
    lowest_number = ask_for_number("unterste")
    highest_number = ask_for_number("oberste")
    interval = int(
        input("In welchem Abstand sollen die Zahlen aufgezählt werden? ")
    )
    for number in range(lowest_number, highest_number + 1, interval):
        print(number, end=" ")
    print()


if __name__ == "__main__":
    main()
Nächste Schritte: Absichern gegen Fehleingaben, damit das Programm nicht mit einer Ausnahme aussteigt, wenn der Benutzer etwas eingibt, dass sich nicht in eine ganze Zahl umwandeln lässt.

Und dann die Formatierung der Ausgabe, so dass Zahlen nicht mittendrin umgebrochen werden. In der Standardbibliothek gibt es beispielsweise das Modul `textwrap`, falls man sich das nicht selber programmieren will.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Tobivan
User
Beiträge: 2
Registriert: Montag 6. Januar 2025, 09:43

Vielen Dank für die zahlreichen Antworten, damit kann ich gut weitermachen.
Antworten