Verständnishilfe für meinen erzeugten Stack

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
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Guten morgen zusammen,

ich hab hier ein kleines Problem und find meinen Fehler leider nicht und bräuchte Unterstützung, der nachfolgende Quelltext ist nur ein Test für ein größeres Projekt, deswegen nicht auf Sinnigkeit achten, dass Programm an sich ist noch sehr "dumm".

Mein Problem ist folgendes, nach der Umwandlung von .py zu .exe verschluckt mir mein Programm die Funktion Output(name_value), alles davor wird richtig implementiert und ausgegeben. Leider versteh ich nicht warum es mir einfach aufhört ab der Stelle wo eben Output(...) aufgerufen wird, hat eventuell jemand eine Idee was mein Problem ist?

Code: Alles auswählen

class Stack: 
    def __init__(self): 
        self.elements = [] 
    
    def push(self, data): 
        self.elements.append(data) 
        return data 
    
    def pop(self): 
        return self.elements.pop() 
        
    def peek(self): 
        return self.elements[-1] 
        
    def is_empty(self): 
        return len(self.elements) == 0

# Testfunktion ob wirklich gespeichert wird oder eben nicht muss man Testen!!
def Test():
    # Rückgabewert als Boolsche Zahl
    zero_flag = stack.is_empty()
    # Ausgabe ob Stack True oder False ist!
    print(stack.is_empty(), "\n")
    
    # Vergleich der Boolschen Zahl
    if zero_flag == True:

        
        name_1 = int(input("Geben Sie eine Zahl ein[0]: "))
        name_2 = int(input("Geben Sie eine Zahl ein[1]: "))
        name_3 = int(input("Geben Sie eine Zahl ein[2]: "))
        name_4 = int(input("Geben Sie eine Zahl ein[3]: "))
        name_5 = int(input("Geben Sie eine Zahl ein[4]: "))

        stack.push(name_1)
        stack.push(name_2)
        stack.push(name_3)
        stack.push(name_4)
        stack.push(name_5)

        name_value = []
        # 0
        # obersteelemente wird zurückgegeben
        name = stack.peek()
        name_value.append(name)
        stack.pop()
        # 1
        name = stack.peek()
        name_value.append(name)
        stack.pop()
        # 2
        name = stack.peek()
        name_value.append(name)
        stack.pop()
        # 3 
        name = stack.peek()
        name_value.append(name)
        stack.pop()
        # 4
        name = stack.peek()
        name_value.append(name)
        stack.pop()

    elif zero_flag == False:
        print("Stack ist bereits beschrieben und gespeichert")

        print("Stackposition[0]: ", name_value[0])
        print("Stackposition[1]: ", name_value[1])
        print("Stackposition[2]: ", name_value[2])
        print("Stackposition[3]: ", name_value[3])
        print("Stackposition[4]: ", name_value[4])
        
    # Aufruf der Ausgabefunktion
    Output(name_value)

def Output(name_value):
        print("Stackposition[0]: ", name_value[0])
        print("Stackposition[1]: ", name_value[1])
        print("Stackposition[2]: ", name_value[2])
        print("Stackposition[3]: ", name_value[3])
        print("Stackposition[4]: ", name_value[4])

if __name__ == '__main__':
    #Aufruf der Klasse?
    stack = Stack()
    Test()
 
Bleibt gesund, viele Grüße
Martin
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Frage hat sich erledigt!

Jedoch hätte ich eine andere noch, kann mit Python einen "Dauer-OfflineSpeicher" implementieren?
Sprich ich beschreibe diesen einmal und mein Programm merkt sich die Daten die ich das letzte mal geschrieben habe?
Falls ja, wie würde man dies Realisieren, bin schon die ganze Zeit am überlegen und hin und her machen aber mir fällt leider nichts mehr ein, dachte durch die Stack Implementation würde mir das Problem behoben sein.

Vielen Dank für eine Antwort.
Vg,
Martin
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dazu gibt es verschiedenste Moeglichkeiten. Es ist aber immer explizit, es gibt kein (ausser mit stackless Python) Verfahren, quasi den Interpreter-Zustand als ganzes zu speichern.

Je nachdem was das fuer Daten sind, empfehlen sie die Module configparser, json oder pickle.
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Hallo _deets_,

ich möchte einmalig verschiedene Argumente einlesen und dann dauerhaft speichern "offline speichern", so dass ich bei wieder aufrufen des Programmes nicht wieder eine neue Abfrage kommt. Ich hab mir noch ein paar Gedanken dazu gemacht und hätte eventuell eine Datenbank angelegt und dort hätte ich dann die Daten gespeichert und wieder aufgerufen.
Falls es aber leichter gehen würde wäre ich dankbar, hab bisher noch nicht so viel mit Datenbanken gearbeitet.

Ich entwickle zur Zeit eine App, die eine .csv Datei sortiert und dann ausgibt, als Suchparameter sind eben die gespeicherten Argumente relevat da ich danach suche, diese sollen sich aber je nach Projekt ändern lassen. Quellcode funktioniert auch schon, aber eben mit der festen Paramentrierung.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, und nicht mal 4 und mal 8.
Man benutzt keine globalen Variablen. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen.
Die Stack-Klasse kann nichts, was eine Liste auch schon könnte.
Funktionen werden generell komplett klein geschrieben, wie Variablennamen auch.
Man vergleicht nicht explizit mit True oder False. Wenn die Bedingung im elif das genaue Gegenteil von der if-Bedingung ist, benutzt man else.
Im elif-Block ist `name_value` nicht definiert.
Statt immer 5mal den selben Code zu kopieren, würde man Schleifen benutzen.
Wenn Du eine Zahl eingegeben haben möchtest, warum nennst Du die Variable dann name?

Code: Alles auswählen

def test(numbers):
    zero_flag = not numbers
    print(zero_flag, "\n")
    
    # Vergleich der Boolschen Zahl
    if zero_flag:
        for index in range(5):
            value = int(input(f"Geben Sie eine Zahl ein[{index}]: "))
            numbers.append(value)

        name_values = []
        for _ in range(5):
            name = numbers[-1]
            name_values.append(name)
            numbers.pop()
        output(name_value)
    else:
        print("Stack ist bereits beschrieben und gespeichert")


def output(values):
    for index, value in enumerate(values[:5]):
        print(f"Stackposition[{index}]: {value}")


def main():
    stack = []
    test(stack)
 
if __name__ == '__main__':
    main()
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Hallo Sirius3,

das Programm war ein reines Testprogramm um einen "Stack" zu implementieren, jedoch hat das nicht so funktioniert wie ich es mir vorgestellt habe, deswegen hab ich auf keine Richtlinien geachtet, dies hab ich Eingangs auch geschrieben gehabt.

Ich steh eher vor einem anderem Problem, bei dem ich mir noch nicht sicher bin wie ich es löse. Deswegen die Anfrage mit dem Prototypen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dieses Argument, man wuerde Code nur zu Testzwecken nicht Konventionen entsprechend schreiben - woher kommt das? Menschen lernen Dinge, indem sie diese Dinge wiederholen, und Korrekturen einarbeiten. Wenn dein Stabhochsprungstrainer dir sagt, dass ein Pogo-Stick zum Stabhochsprung ungeeignet ist, sagst du ihm dann auch, dass du das nur jetzt im Training so machst, aber spaeter im Turnier geht's dann ploetzlich?
MartinJe
User
Beiträge: 19
Registriert: Montag 26. April 2021, 06:09

Ich entwickle zuerst ein Grundgerüst [man sollte nicht vergessen, dass jeder Entwickler eine andere Vorgehensweise/Struktur verfolgt, was einem eben leichter oder schwerer fällt wie auch immer], wenn ich dann damit zufrieden ["Funktionalität, Logik und Verständnis"] bin, ändere ich dieses auf das minmalste ab! Sprich, so wie es eben Sirius3 gemacht hat, aber da ich nicht zufrieden war, hab ich dies noch nicht getan, bevor wir uns daran noch weiter aufhängen welcher Stil nun schöner oder leichter ist, was nicht meine Fachliche Frage war!!

Mein "Prototyp" war als "Offline Speicher" angedacht, ich hatte damals nur was von Stack gelesen und war damit zufriedengestellt, jedoch hat es dann nicht so funktioniert wie ich es mir erhofft hatte und deswegen ja meine Anfrage im Forum ob es eben von Python einen direkten "Offline Speicher" gibt oder eben nicht.

Vielen Dank für die Vorschläge und Verbesserungshinweise.
Antworten