Seite 1 von 1

[noch nicht ganz gelöst] Wie funktioniert "return"

Verfasst: Mittwoch 22. November 2006, 13:02
von basti33
Hallo,

ich habe eine kleine, banale Frage zur Syntax. Man hört ja immer wieder, dass es unklug ist, globale Variablen zu verwenden und man stattdessen doch besser auf die Funktionalität von return zurückgreifen sollte. Meine Frage: angenommen, ich habe die Funktionen

Code: Alles auswählen

def rechne():
  global Ergebniss
  Ergebniss=5*9+3
def drucke():
  print Ergebniss
Ich weiß, dass man das auch so schreiben kann:

Code: Alles auswählen

def rechne():
  Ergebniss=5*9+3
  return Ergebniss
Aber wie "fange" ich das in der anderen Funktion auf?

Danke

Verfasst: Mittwoch 22. November 2006, 13:26
von Leonidas
mit

Code: Alles auswählen

def drucke():
    print rechne()

Verfasst: Mittwoch 22. November 2006, 13:28
von basti33
Danke!!
Und wenn ich jetzt mehrere Werte habe, die an die Funktion weitergegeben werden sollen, wie z.B. Ergebniss1 und Ergebniss2.

Verfasst: Mittwoch 22. November 2006, 13:47
von Blattlaus

Code: Alles auswählen

def funktion():
    return "Hallo","Welt"

a, b = funktion()
# a ist "Hallo"
# b ist "Welt"
Im Prinzip returned die Funktion dann eine Liste.

Verfasst: Mittwoch 22. November 2006, 13:47
von Leonidas
Aus meiner Sammlung seltsamer Programmierschnippsel:

Code: Alles auswählen

def recpow(number, power):
    if power == 0:
        return 1
    else:
        return recpow(number, power - 1) * number

print recpow(2, 1)
print recpow(2, 2)
print recpow(2, 3)
print recpow(2, 4)
Du siehst, die Funktion wird mit zwei Parametern aufgerufen: einmal der Zahl die potenziert werden soll und der zweite ist die Hoch-Zahl. Zurückgegeben wird dann der potenzierte Wert.

Verfasst: Mittwoch 22. November 2006, 13:52
von basti33
Danke!! Aber wieso ist das jetzt besser als globale Variablen?
Im Prinzip returned die Funktion dann eine Liste.
Ne, ein Tupel :P .

Verfasst: Mittwoch 22. November 2006, 14:10
von jens
globale Variablen sollte man immer vermeiden... Lieber die Werte hin und her schleppen ;)

Verfasst: Mittwoch 22. November 2006, 14:22
von Leonidas
basti33 hat geschrieben:Aber wieso ist das jetzt besser als globale Variablen?
Das ist mehr oder weniger eine Idee aus der funktionalen Programmierung: Eine Funktion soll sich mehr oder minder wie ihr mathematisches Gegenstück verhalten - d.h. bei gleichem Eingabewert soll immer das gleiche rauskommen und die Funktion sollte optimalerweise keine Seiteneffekte haben.

Wpfür das gut ist? Ein solches Programm ist wesentlich klarer und einfacher zu Debuggen.

Nehmen wir an, du hast zwei Rechenfunktionen, die beide die Variable Ergebnis verändern. Nun kann es sein, dass dein Programm mit mehreren Threads läuft, d.h. das mehrere Dinge glechzeitig ablaufen. Und stell dir nun vor, beide Funktionen werden zur gleiche nZeit aufgerufen - du hast dann ein Ergebnis, weiß aber nicht, ob es das Ergebnis der einen oder anderen Rechenfunktion ist. Blöd, oder?

Verfasst: Mittwoch 22. November 2006, 16:01
von basti33
Ganz auf globale Variablen zu verzichten ist aber nicht Möglich, oder? Wie kann ich es z.B. erreichen, dass dieses kleine Beispielskript ohne die global Anweisung in Z. 7 funktioniert?

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from Tkinter import *

def Fenster():
    global label, Knopf  # Das soll nicht sein
    root=Tk()
    label=Label(root, text='Beispieltext')
    Knopf=Button(root, text="Veränder' mich", command=Anders)
    label.pack()
    Knopf.pack()
    root.mainloop()
    
def Anders():
    label.config(fg='red')
    Knopf.config(fg='red')
    
Fenster()
Danke!

Verfasst: Mittwoch 22. November 2006, 16:18
von Leonidas
Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import Tkinter as tk

class TkWindow(object):
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(self.root, text='Beispieltext')
        self.knopf = tk.Button(self.root, text="Veränder' mich", command=self.anders)
        self.label.pack()
        self.knopf.pack()
   
    def anders(self):
        self.label.config(fg='red')
        self.knopf.config(fg='red')
   
tkw = TkWindow()
tkw.root.mainloop()

Verfasst: Mittwoch 22. November 2006, 16:20
von basti33
Okay, aber mal angenommen, ich habe mehrere Fenster, die von verschiedenen Funktionen verändert werden sollen?

Verfasst: Mittwoch 22. November 2006, 16:24
von Blattlaus
basti33 hat geschrieben:Okay, aber mal angenommen, ich habe mehrere Fenster, die von verschiedenen Funktionen verändert werden sollen?
Dann hast du mehrere Objekte und kannst die Methoden über objekt.anders() aufrufen.

Du solltest dir wirklich mal die Grundlagen der OOP anschauen.

Verfasst: Mittwoch 22. November 2006, 16:28
von Leonidas
Blattlaus hat geschrieben:Du solltest dir wirklich mal die Grundlagen der OOP anschauen.
Und mal über eine saubere Struktur von Programmen nachdenken. Wenn hier Anfänger Tkinter-Programme posten, muss ich mich meist an den Kopf fassen, weil das Programm so wirr ist, dass ich es erstmal komplett umschreiben müsste um es zu verstehen.

Verfasst: Samstag 25. November 2006, 21:32
von basti33
Blattlaus hat geschrieben:Dann hast du mehrere Objekte und kannst die Methoden über objekt.anders() aufrufen.
Auf die Gefahr hin, dass ich jetzt gesteinigt werde: könntest du mir vielleicht ein kleines Beispielskript zeigen?

Danke