Variablendeklaration

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
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Hallo!

Beim Programmieren müssen einzelne Funktionen nacheinander geschrieben werden - also wenn Funktion 2 Funktion 1 aufruft und Funktion 3 Funktion 2, dann müssen sie in der Reihenfolge stehen:

def func1... ():
tu was
def func2... ():
tu was
def func3... ():
tu was

In c/c++ besteht die Möglichkeit, Funktionen vorher zu deklarieren, damit sie schon bekannt sind, aber noch nicht mit Quellcode gefüllt sein müssen, sondern dies zu einem späteren Zeitpunkt geschehen kann und die main()-Funktion sogar an den Anfang des Programms geschrieben werden kann.

Gibt es diese Möglichkeit in Python auch?
Zuletzt geändert von Papp Nase am Donnerstag 10. Juli 2014, 10:08, insgesamt 1-mal geändert.
BlackJack

@Papp Nase: Das Problem was Du beschreibst gibt es in Python gar nicht. Funktionen müssen definiert sein bevor sie im laufenden Programm aufgerufen werden. Das kann man ganz offensichtlich nicht umgehen denn was sollte beim Aufruf einer undefinierten Funktion passieren?

Du verwendest den Begriff „iterativ” falsch. Das hier hat nichts mit wiederholtem Ausführen von Code zu tun.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Papp Nase hat geschrieben:und die main()-Funktion sogar an den Anfang des Programms geschrieben werden kann.

Gibt es diese Möglichkeit in Python auch?
Ja.
Ich empfehle den experimentellen Ansatz, probier es aus:

Code: Alles auswählen

def main():
    f1()
    f2()
    f3() # <---- Ueberraschung

def f1():
    print "f1 tut was"

def f2():
    print "f2 tut was"

if __name__=="__main__":
    main()
a fool with a tool is still a fool, www.magben.de, YouTube
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Vielen Dank für die Antworten.

Ich habe die Frage nicht ohne Grund gestellt, denn ich bekam eine Fehlermeldung, dass eine Funktion_XXX noch nicht bekannt sei, weil sie unterhalb von Funktion_YYYY stand. Als ich die Funktion_YYYY unterhalb Funktion_XXXX geschoben hatte, klappte es.

Code: Alles auswählen

    ...
   def beenden_prozess():
        root.quit()

    beenden_button=tkinter.Button (root,
                                   text="Beenden",
                                   command=beenden_prozess  <<< hier kam die Fehlermeldung, vorher stand def beenden_prozess(): xxx unterhalb und da ging es nicht
    )
    beenden_button.pack(in_=beenden_button_frame)
    ....


TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

das kann eigentlich nicht sein
es ist egal wo deine Funktion steht, hauptsache es gibt sie

Code: Alles auswählen

def main():
    f1()
    f2()

def f2():
    print "f1 tut was"

def f1():
    f2()
if __name__=="__main__":
    main()
das würde genauso funktionieren

egal wo die Funktion steht beim Aufruf wird an die Stelle gesprungen wo sie definiert ist

das es jetzt funktioniert muss einen andern Grund haben
Zuletzt geändert von TryToLearn am Donnerstag 10. Juli 2014, 10:34, insgesamt 1-mal geändert.
BlackJack

@Papp Nase: Das ist aber auch etwas anderes als Du im Eingangsbeitrag beschrieben hast. Du hast hier keine zwei Funktionsdefinitionen deren Reihenfolge Du veränderst, sondern hier versuchst Du ganz konkret einen Wert zu verwenden der noch nicht definiert ist. Und das *kann* nicht funktionieren. Denn was sollte Python denn an der Stelle als Wert übergeben? Irgendwie ein Objekt automagisch erfinden? Und dann was weiter? Einen Thread starten der den weiteren Code ausführt und an der Stelle wo der nicht definierte Wert verwendet wurde warten bis der in dem anderen Thread definiert wird? Und was dann? An welcher Stelle oder welchen Stellen soll der Code dann weiter laufen? Das wäre alles ziemlich kompliziert, falls das überhaupt sinnvoll machbar wäre.

Falls die `beenden_prozess()` tatsächlich *so* aussieht ist sie überflüssig, denn dann hätte man auch einfach `root.quit` übergeben können.

Warum ist das übergeordnete Widget vom `Button` `root` aber es wird dann in `beenden_button_frame` ge`pack()`t? Das `in_`-Argument von `pack()` habe ich noch nie benötigt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Papp Nase hat geschrieben:Als ich die Funktion_YYYY unterhalb Funktion_XXXX geschoben hatte, klappte es.
Weil Du beenden_prozess lokal in der aufrufenden Funktion definiert hast. Wenn Du beenden_prozess auf der gleichen Ebene wie die aufrufende Funktion definierst, dann kann beenden_prozess auch dahinter stehen:

Code: Alles auswählen

def f_x():
    ...
    beenden_button=tkinter.Button (root,
                                   text="Beenden",
                                   command=beenden_prozess)
    beenden_button.pack(in_=beenden_button_frame)
    ...
     
def beenden_prozess():
    root.quit() 
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

@MagBen: Wobei sich bei dem Beispiel dann die Frage stellt wo der Wert `root` in der `beenden_prozess()`-Funktion her kommen soll. Wenn man kein Closure verwendet, muss man die Variablen aus der Umgebung explizit übergeben, also zum Beispiel mit `functools.partial()` arbeiten.

Code: Alles auswählen

import tkinter as tk
from functools import partial

# ...

    beenden_button = tk.Button(
        beenden_button_frame,
        text='Beenden',
        command=partial(beenden_prozess, root)
    )
    beenden_button.pack()

# ...

def beenden_prozess(root):
    root.quit()
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

BlackJack hat geschrieben:Wobei sich bei dem Beispiel dann die Frage stellt wo der Wert `root` in der `beenden_prozess()`-Funktion her kommen soll.
Die lokale Definition vor dem Aufruf finde ich sowieso besser.
Mir ging es darum die Voodoo-Programmierung (es geht nicht, dann habe ich ein paar Zeilen verschoben und es geht, keine Ahnung warum) zu erklären.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten