Ausführbar machen

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
ichwarneu
User
Beiträge: 1
Registriert: Dienstag 5. Oktober 2021, 09:42

Guten Tag zusammen,

ich habe nicht viel Ahnung davon.
Ich habe in der IDE "Thonny" einige Funktionen geschrieben. Beispiel anliegend.
Nun möchte ich das jemandem zukommen lassen und zwar so, dass er es ohne IDE ausführen kann. Ich arbeite in Linux Mint, sein OS kenne ich nicht.
Beispielcode wie folgt:

Code: Alles auswählen

def fibonacci(n, mod=0):
    if n == 0: return [0]
    liste = [0, 1]
    if mod != 0:
        for i in range(2, n+1):
            element = (liste[i-1] + liste[i-2]) % mod
            liste.append(element)
        return liste
    for i in range(2, n+1):
        element = liste[i-1] + liste[i-2]
        liste.append(element)
    return liste
    
Der Code selbst funktioniert.
Mein Bekannter sagte schon, ich solle

Code: Alles auswählen

if len(sys.argv) != 2:
    print("Usage: " + sys.argv[0] + " <number>")
else:
    print(aks(int(sys.argv[1])))
    
an das Ende setzen und import sys an den Anfang.
Das funktioniert auch.

Ich habe nur die Befürchtung dass es nicht mehr geht, wenn zwei Argumente eingeben werden. Ich habe einige Funktionen (wie oben) die ein Argument obligatorisch und eines optional haben, dann wiederum welche mit zwei obligatorischen und welche mit nur einem.

Könnt ihr mir auf die Sprünge helfen?

Vielen Dank an alle Helfer!
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst also Kommandozeilenargumente parsen, dafür gibt es argparse.
Oder falls es etwas exotisches sein soll, das 3rd-party Package click.
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichwarneu: Anmerkungen zum Quelltext: Als `mod`-Defaultwert würde ich keine 0 nehmen. Für optionale Argumente ist `None` der übliche Defaultwert.

Nach Style Guide for Python Code gehören Anweisungen in eigene Zeilen, also auch wenn ein ``if``-Zweig oder ein Schleifenkörper nur eine einzige Anweisung hat, sollte die in einer eigenen Zeile stehen.

Die Funktion enthält zweimal fast gleichen Code bei dem `mod` entscheidet welche der beiden Kopien ausgeführt wird. Das sollte man auf *eine* Schleife und den tatsächlichen Unterschied zwischen den beiden Kopien beschränken.

`liste` und `element` sind hier sehr/zu generische Name IMHO.

`i` braucht man nicht wirklich für den Zugriff. Ohne würde deutlicher was da passiert, weil dann direkt das dastehen würde was man meint, ohne das man sich noch über den Wert von `i` gedanken machen müsste, und dessen Zusammenhang mit der Länge der Liste, und das `range()` von 2 an starten muss.

Ich lande dann bei (ungetestet):

Code: Alles auswählen

def fibonacci(n, mod=None):
    if n == 0:
        return [0]

    numbers = [0, 1]
    for _ in range(n - 1):
        number = numbers[-1] + numbers[-2]
        numbers.append(number if mod is None else number % mod)
    return numbers
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten