Frage zur Return Anweisung ....

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.
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Frage zur Return Anweisung ....

Beitragvon derkai » Mittwoch 11. Juni 2008, 21:41

Hallo,

folgendes Script :
(aus einem meiner vielen Bücher die ich Frischling gerade lese)

Code: Alles auswählen

def fak(zahl) :
  ergebnis = 1
  for i in range(2, zahl+1) :
       ergebnis = ergbnis * 1
  return ergebnis

while true :
  eingabe =int(raw_input("geben sie eine zahl ein: "))
  print fak(eingabe)

___________
Was hier passiert ist mir im groben klar, aber ?
das Ergebnis des z.b. ersten Schleifendurchlaufs
wird im "Namen" Ergebnis referenziert.
damit wird dann der wert im Hauptprogramm
wieder verfügbar und zurückgegeben.

Wo wird denn das Ergebnis im Hauptprogramm aufgerufen ?
bzw angesprochen ?

Die Funktion fak wird aufgerufen und die über
raw input eingelesene Zahl an die Funktion übergeben.
Dort wird die Berechnung vorgenommen. ABER WO/ WOHER
stammt dann die Rückgabe ?

Gruß
Kai

Vorab vielen Dank
imac
20 Zoll
2,4 ghz
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Mittwoch 11. Juni 2008, 21:48

Wenn du deinen Code in Code-Tags setzt, wäre das ein echter Fortschritt.

Der Schleifenkörper ist so auch nicht richtig (wird so auch nicht in deinem Buch stehen); aber das findest du selbst heraus.

Der Rückgabewert wird beim Funktionsaufruf in der letzten Zeile an das Hauptprogramm zurückgeliefert und durch print direkt ausgegeben.

Du könntest ihn z.B. auch einer Variablen zuweisen, wenn du ihn weiter verwenden willst.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Frage zur Return Anweisung ....

Beitragvon Leonidas » Mittwoch 11. Juni 2008, 21:49

derkai hat geschrieben:Die Funktion fak wird aufgerufen und die über
raw input eingelesene Zahl an die Funktion übergeben.
Dort wird die Berechnung vorgenommen. ABER WO/ WOHER
stammt dann die Rückgabe ?

Aus der letzten Zeile von ``fak``.

Wenn du den Code in Tags setzen würdest, dann könnte man dir sogar noch eine Zeilenzahl sagen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Mittwoch 11. Juni 2008, 22:37

Ich denke mal es geht hier um die Fakultät ;) Ist aber vor allem nen schönes Beispiel für Rekursion(Funktion ruft sich selbst wieder auf) siehe:

Code: Alles auswählen

def factorial(number):
    """
        Calculates the factorial ( n * n-1 * ... * 1) of a given number.
    """
    if number < 0:          #factorial is only defined for non-negative numbers
        raise ValueError
    if number is 0:
        return 1
    else:
        return number * factorial(number-1)


Aber zurück zu deiner Frage:

Code: Alles auswählen

def fak(zahl) :
    ergebnis = 1
    for i in range(2, zahl+1) :
        ergebnis = ergebnis * 1
    return ergebnis


Ergebnis wird bei Aufruf der Funktion zurückgegeben, wie Leonidas und pütone schon sagten.
Und zwar an ``print'', das das dann ausgibt.
Zuletzt geändert von cofi am Donnerstag 12. Juni 2008, 11:45, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 11. Juni 2008, 23:25

Es heißt übrigens "factorial" und nicht "faculty" ;-)

Der Rekursionsanker geht noch besser:

Code: Alles auswählen

def factorial n:
    if n<0:
        raise ValueError
    elif n==0:
        return 1
   
    return n * factorial(n-1)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 11. Juni 2008, 23:36

Naja, bis auf dass die Signatur in Python eben ``def factorial(n)`` ist, also mit Klammern ;)

Sollte ich noch etwas zu PEP8 sagen?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 12. Juni 2008, 04:39

cofi hat geschrieben:Ich denke mal es geht hier um die Fakultät ;)

Code: Alles auswählen

def fak(zahl) :
    ergebnis = 1
    for i in range(2, zahl+1) :
        ergebnis = ergebnis * 1
    return ergebnis



Der Schleifenkörper ist immer noch falsch ... :wink:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Donnerstag 12. Juni 2008, 07:54

pütone hat geschrieben:Der Schleifenkörper ist immer noch falsch ... :wink:

Tipp:
De Vier Botze / 3 Laachduve hat geschrieben:Dreimol null es null
;-)
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Donnerstag 12. Juni 2008, 11:44

pütone hat geschrieben:
cofi hat geschrieben:Ich denke mal es geht hier um die Fakultät ;)

Code: Alles auswählen

def fak(zahl) :
    ergebnis = 1
    for i in range(2, zahl+1) :
        ergebnis = ergebnis * 1
    return ergebnis



Der Schleifenkörper ist immer noch falsch ... :wink:


ich hab das nur eingerückt und in code gesetzt, da ich das einfach umständlich finde das per schleife zu lösen, wenn Python doch Rekursion unterstützt :)

@EyDu hmmm richtig ... wie kam ich nur auf ``faculty''? Na wohl nur weils sich besser anhört :roll:
und danke für den Einwand, so passts auch besser mit der Definition der Fakultät ;)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 12. Juni 2008, 11:56

cofi hat geschrieben:ich hab das nur eingerückt und in code gesetzt, da ich das einfach umständlich finde das per schleife zu lösen, wenn Python doch Rekursion unterstützt :)

Das Problem mit Rekursion ist, dass Python von sich aus, Endrekursion nicht optimiert, d.h bei größeren Zahlen wirft der Interpreter eine Exception. Auch sind Funktionsaufrufe in Python recht teuer (von der Performance gesehen).

Klar, Fakultät ist normalerweise ein klassischer Fall für Rekursion.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Donnerstag 12. Juni 2008, 12:12

Von wegen Rekursion!

Code: Alles auswählen

from operator import mul

fak = lambda n: reduce(mul, xrange(2, n+1))


;)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Donnerstag 12. Juni 2008, 16:51

fak(0) == 1, übrigens. Das sollte schon drin sein.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Freitag 13. Juni 2008, 06:02

Aber ich hab grad nur Python2.4 zur Hand und das kann das inline if-else nicht :(

Extra für dich:

Code: Alles auswählen

def fak(n):
    if n > 0:
        return reduce(mul, xrange(1, n+1))
    elif n == 0:
        return 1
    else:
        raise TypeError("Only defined on positive integers")
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Samstag 14. Juni 2008, 12:05

Noch kürzer:

Code: Alles auswählen

def fak(n):
    if n >= 0:
        return reduce(mul, xrange(1, n+1), 1)
    else:
        raise TypeError("Only defined on positive integers")
MfG
HWK
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Samstag 14. Juni 2008, 18:56

Sehr gut. Nächste Aufgabe: Erweiterung auf n! = Γ(n+1) :D
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder