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?
Variablendeklaration
@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.
Du verwendest den Begriff „iterativ” falsch. Das hier hat nichts mit wiederholtem Ausführen von Code zu tun.
Ja.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?
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()
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.
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)
....
-
- 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
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
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()
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.
@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.
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.
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:Papp Nase hat geschrieben:Als ich die Funktion_YYYY unterhalb Funktion_XXXX geschoben hatte, klappte es.
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()
@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()
Die lokale Definition vor dem Aufruf finde ich sowieso besser.BlackJack hat geschrieben:Wobei sich bei dem Beispiel dann die Frage stellt wo der Wert `root` in der `beenden_prozess()`-Funktion her kommen soll.
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.