Seite 1 von 1
Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 09:34
von Papp Nase
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?
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 09:39
von 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.
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 10:01
von MagBen
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()
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 10:11
von Papp Nase
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)
....
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 10:33
von TryToLearn
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
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 10:34
von 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.
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 10:39
von MagBen
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()
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 10:44
von 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()
Re: Variablendeklaration
Verfasst: Donnerstag 10. Juli 2014, 10:59
von MagBen
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.