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

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

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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:

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
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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

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

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

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

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

http://pythonic.pocoo.org/
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sagt, mal: selbst, wenn man "ergbnis" richtig schreiben würde, die ursprüngliche Funktion ist doch nur eine komplizierte Variante von

Code: Alles auswählen

def fak(n): return 1
Will sagen: Der Algorithmus ist falsch abgeschrieben.

Stefan
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@sma: Ja, genau!
birkenfeld hat geschrieben:Sehr gut. Nächste Aufgabe: Erweiterung auf n! = Γ(n+1) :D

Code: Alles auswählen

from scipy.special import gamma
def fac(n):
	return gamma(n + 1)
:wink:
MfG
HWK
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

audax hat geschrieben:Aber ich hab grad nur Python2.4 zur Hand und das kann das inline if-else nicht :(
Geht trotzdem :-)

Code: Alles auswählen

from operator import mul
fak = lambda n: (n == 0 and (1,) or reduce(mul, xrange(1, n + 1)))[0]
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das Tupel und [0] sind aber falsch da. :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Richtig. Fixed :-)

Code: Alles auswählen

from operator import mul
fak = lambda n: (n == 0 and (1,) or (reduce(mul, xrange(1, n + 1)),))[0]
TUFKAB – the user formerly known as blackbird
Antworten