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

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
basti33
User
Beiträge: 56
Registriert: Donnerstag 24. August 2006, 15:05

Mittwoch 22. November 2006, 13:02

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
Zuletzt geändert von basti33 am Mittwoch 22. November 2006, 16:09, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 22. November 2006, 13:26

mit

Code: Alles auswählen

def drucke():
    print rechne()
My god, it's full of CARs! | Leonidasvoice vs Modvoice
basti33
User
Beiträge: 56
Registriert: Donnerstag 24. August 2006, 15:05

Mittwoch 22. November 2006, 13:28

Danke!!
Und wenn ich jetzt mehrere Werte habe, die an die Funktion weitergegeben werden sollen, wie z.B. Ergebniss1 und Ergebniss2.
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Mittwoch 22. November 2006, 13:47

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.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 22. November 2006, 13:47

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
basti33
User
Beiträge: 56
Registriert: Donnerstag 24. August 2006, 15:05

Mittwoch 22. November 2006, 13:52

Danke!! Aber wieso ist das jetzt besser als globale Variablen?
Im Prinzip returned die Funktion dann eine Liste.
Ne, ein Tupel :P .
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 22. November 2006, 14:10

globale Variablen sollte man immer vermeiden... Lieber die Werte hin und her schleppen ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 22. November 2006, 14:22

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?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
basti33
User
Beiträge: 56
Registriert: Donnerstag 24. August 2006, 15:05

Mittwoch 22. November 2006, 16:01

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!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 22. November 2006, 16:18

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()
My god, it's full of CARs! | Leonidasvoice vs Modvoice
basti33
User
Beiträge: 56
Registriert: Donnerstag 24. August 2006, 15:05

Mittwoch 22. November 2006, 16:20

Okay, aber mal angenommen, ich habe mehrere Fenster, die von verschiedenen Funktionen verändert werden sollen?
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Mittwoch 22. November 2006, 16:24

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.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 22. November 2006, 16:28

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
basti33
User
Beiträge: 56
Registriert: Donnerstag 24. August 2006, 15:05

Samstag 25. November 2006, 21:32

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
Antworten