Funktionsaufruf

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
Gast

Samstag 22. Januar 2005, 17:39

Hallo,
da ich unter der suchfunktion nichts gefunden habe möchte ich meien Frage hier stellen:

ist es grundsätzlich so dass ich zuerst eine Funktion definieren muss und sie erst im Nachhinein aufrufen kann?

Also ich meine sowas funktioniert bei mir nie:

ausgabe("hallo")

def ausgabe(txt):
print txt

sondern es muss immer so sein:

def ausgabe(txt):
print txt

ausgabe("hallo")

KANN DAS wirklich so sein??? Springt er nicht automatisch zu der Funktion sobald sie aufgelistet ist?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 22. Januar 2005, 20:00

Hi Gast,

Code: Alles auswählen

ausgabe("hallo")

def ausgabe(txt):
    print txt 
woher soll der Pythoninterpreter wissen, wo da noch eine Funktion kommt, den Teil, wo die Funktion definiert ist, hat er noch nicht durchgearbeitet, also existiert sie nicht für ihn.

Code: Alles auswählen

print [_x for _x in globals().keys() if not _x.startswith("_")]

def f1():
    ausgabe()

print [_x for _x in globals().keys() if not _x.startswith("_")]

def ausgabe():
    print "Hallo"

print [_x for _x in globals().keys() if not _x.startswith("_")]

f1()
Das geht z.B. Da hier mit der Ausführung erst beim Aufruf von f1() gestartet wird. Du musst da zwischen Interpreterlauf und Ausführung unterscheiden. In Deinem Beispiel wird softort bei der Zeile ausgabe(txt) versucht das auch auszuführen, bei meinem Beispiel erst bei f1()


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Samstag 22. Januar 2005, 20:42

hi dookie,
danke für deine Hilfe...

da ich noch nicht so lange "im Geschäft" bin
verwirrt mich das ein wenig...

Zum Beispiel bei TCL/TK kann ich das ohne Probleme durchführen.
Und bei Java oder C funktioniert das doch auch? Oder bringe ich da als Anfänger etwas durcheinander?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 22. Januar 2005, 21:12

hmm bei java oder tcl weiss ich nicht, c bzw c++ wird compiliert, da geht das natürlich, da nach dem Compilieren ja alle Funktionen bekannt sind.
Python arbeitet quasi als Singlepassinterpreter, daher kann man ja auch so schön in der Pythonconsole Sachen ausprobieren. Hier kannst Du ja auch keine Funktion aufrufen, die du erst später definierst. Bei tcl wird es wohl auch so sein.
Bei richtigen Programmen, mit Modulen und Klassen, löst sich das Problem ähnlich wie bei meinem Beispiel.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 22. Januar 2005, 21:40

Derwegen ist es ja so praktisch eine main() zu machen, die kann irgendwo stehen, und in den letzten Scriptzeilen ein if __name__ == '__main__': main() zu schrieben. Das hat gleich mehrere Vorteile: es wird nur ausgeführt, wenn es nicht importiert wird, umgeht Probleme mit noch nicht existenten Funktionen, ist ordentlicher.

Kann man in Java eigentlich sowas machen:
var2 = var + 300
var = 0
Wenn nicht, dann ist das unkonsequent ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Sonntag 23. Januar 2005, 00:31

Danke, ein wenig klarer....das ganze...

@ leonidas...
du meinst einfach irgendwohin die main plazieren die zum beispiel alle meine funktionen aufruft die dann IRGENDWO stehen dürfen aber am SkriptEnde?

wär nett wenn dus nochmal präziser hinschreiben könntest...

if name_von_was == wasfürnMain?:
main()


Danke
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 23. Januar 2005, 14:15

Anonymous hat geschrieben:du meinst einfach irgendwohin die main plazieren die zum beispiel alle meine funktionen aufruft die dann IRGENDWO stehen dürfen aber am SkriptEnde?

wär nett wenn dus nochmal präziser hinschreiben könntest...

if name_von_was == wasfürnMain?:
main()
Also, etwas genauer: du definierst eine main() Funktion, die kann praktisch irgendwo in deiner Datei stehen. Du kannst sie auch irgendwie anders nennen, aber main() ist halt Konvention, aus Curly Braced Sprachen übernommen. In diese main() tust du alle Aufrufe, von Funktionen, die du magst.
Ganz Schluss der Datei müsst du diese main() aufrufen. Natürlich könntest du sie auch vorher aufrufen, aber dann würde der Interpreter gegebenfalls noch nicht alle Funktionen kennen, die kennt er erst wenn er durch alle Funktionen durch ist. Nun, wenn aber jemand auf die Idee kommt, dein Modul zu importieren wird main() ausgeführt, was vielleicht für ein importiertes Modul nicht gewünscht ist. Deswegen schreibt man

Code: Alles auswählen

if __name__ == '__main__':
    main()
am Schluss der Datei statt eines simplen main(). Somit wird main() nur ausgeführt, wenn du das Script per python script.py startest, nicht aber wenn du es per import script importierst.

Wenn du willst kann ich dir noch ein paar Beispielscripte schreiben, wenn du das was ich versucht habe zu erklären nicht recht verstehst, dann wird es vielleicht klarer.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Sonntag 23. Januar 2005, 15:31

HI Leonidas,
also erstmal sehr nett von dir mich nochmals darüber aufzuklären!
Das mit dem Aufrufen der Funktionen und dem Interpreter habe ich soweit verstanden...ist ja auch logisch irgendwo ;)
Was mich nur verwirrt hat war ob ich wirklich den Python - COde:

Code: Alles auswählen


if __name__ == '__main__': 
     main()
so eins zu eins übernehmen soll. Aber anscheinend schon. Nehme ich jetzt zumindest an ;)
Wenn du willst kann ich dir noch ein paar Beispielscripte schreiben, wenn du das was ich versucht habe zu erklären nicht recht verstehst, dann wird es vielleicht klarer.
Das ist sehr nett von dir! Wäre glaube ich ein wenig aufwand für dich.
Vielleicht versuch ichs einfach:

Code: Alles auswählen

def main():
   fun_1()
   fun_2()

def fun_1():
   print "Python"

def fun_2():
   print "Forum"

if __name__ == '__main__':
   main()

Habe ich das jetzt richtig verstanden???
Danke nochmals für deine Hilfe!

BIs denne ;)[/quote][/python]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 23. Januar 2005, 16:04

Ja, der Code ist so zu übernehmen. __name__ ist ja eine gültige Variable. Dein Beispiel ist gar nicht schlecht, genau sowas ist damit möglich.

Noch ein paar weitere:
nomain.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

def fun_1():
   print "Python"

def fun_2():
   print "Forum" 

print __name__
fun_1()
fun_2()
mainhook.py

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

def fun_1():
   print "Python"

def fun_2():
   print "Forum" 

print __name__
if __name__ == '__main__':
    fun_1()
    fun_2()
Wenn du sie direkt durch python nomain.py oder python mainhook.py aufrufst gibt es keinen Unterschied, aber versuche mal sie im Interpreter zu importieren:

Code: Alles auswählen

>>> import mainhook
mainhook
>>> import nomain
nomain
Python
Forum
>>> 
Wie du siehst, wird das in der if Schleife nur ausgeführt, wenn du das Programm aus der Shell startest.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Sonntag 23. Januar 2005, 17:52

ah jetza....ja
danke jetzt hab ich wieder was dazugelernt....

Cool danke!
Sehr nett von dir mir zu helfen.
Muss schon sagen. Das Forum ist echt klasse!

Bis zum nächsten Problem ;)
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 8. Februar 2005, 10:38

Dookie hat geschrieben:

Code: Alles auswählen

ausgabe("hallo")

def ausgabe(txt):
    print txt 
woher soll der Pythoninterpreter wissen, wo da noch eine Funktion kommt, den Teil, wo die Funktion definiert ist, hat er noch nicht durchgearbeitet, also existiert sie nicht für ihn.
Anzumerken ist aber, das z.B. bei JavaScript diese Problem nicht auftaucht... Dort kann man eine Funktion aufrufen, die erst später definiert ist. Vielleicht ist die Arbeitsreihenfolge dort anders...
Anfänglich bin ich darüber auch ein paar mal gestolpert... Aber man gewöhnt sich dran ;)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 8. Februar 2005, 11:32

jens hat geschrieben:Anzumerken ist aber, das z.B. bei JavaScript diese Problem nicht auftaucht... Dort kann man eine Funktion aufrufen, die erst später definiert ist. Vielleicht ist die Arbeitsreihenfolge dort anders...
Anfänglich bin ich darüber auch ein paar mal gestolpert... Aber man gewöhnt sich dran ;)
Coole Sache, ich bin bei einer kleinen DHTML Spielerei vor paar Tagen auf das gleiche gekommen (zumindest mit SpiderMonkey). Das liegt vermutlich daran, dass JavaScript einen Multiple Pass Interpreter hat. Das ist zwar langsamer, aber mit JavaScript macht man auch nicht Programme, bei denen es auf Geschwindigkeit ankommt. Was aber bei JavaScript ist: mag kann mit getObjectById nicht Objekte finden, wenn sie noch nicht erstellt, dh, in der Seite erst später vorkommen, finden. War lange Zeit mein Fehler.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten