Seite 1 von 1

def problem

Verfasst: Sonntag 14. September 2003, 22:26
von Komandant
Moin,
hab ein problem mit der def funktion in Python.
Wenn ich folgendes eingebe:

def fakultaet(self,n)


kommt immer nur:

SyntaxError: invalid syntax

meine frage ist jetzt, was daran (def fakultaet(self,n)) falsch ist?

Schöne grüsse Komandant

Verfasst: Montag 15. September 2003, 02:39
von Dookie
Hi Komandant,

wenn das so alleine steht ist es keine korrekte Syntax.
Ausserhalb einer Klasse brauchst Du kein self als ersten Parameter. Es fehlt dann nur noch der ":" am Ende und darunter die Kommandos welche die Funktion bilden.
Denke auch immer daran, daß Einrückungen mit zur Syntax gehören!!!
Hier mal der korrekte Code für eine Fakultätsfunktion:

Code: Alles auswählen

def fakultaet(n):
    result = n
    while n > 2:
        n = n - 1  
        result = result * n
    return result
Gruß

Dookie

Verfasst: Montag 15. September 2003, 02:51
von Dookie
Hier noch die Version für die Pythonfreaks ;)

Code: Alles auswählen

>>> fak = lambda n: ((n>1) and reduce(lambda a, b: a*b, xrange(2,n+1)) or n)
>>> fak(7)
5040
Dookie

Verfasst: Montag 15. September 2003, 11:12
von Leonidas
jaja, wenn man den ":" vergisst kommt man nicht auf die lösung, eigene Erfahrung.

Verfasst: Montag 15. September 2003, 14:23
von Komandant
Moin,
erstmal thx füt eure antworten.

und die beiden codes führen zum selben ergebnis?

ps: kennt einer ein gutes tutorial für python einsteiger?
Hab noch kein gutes gefunden, scheinen alle zu alt zu sein...

Schöne grüße Komandant

Verfasst: Montag 15. September 2003, 14:46
von Leonidas
Hmm, sehr gute bücher (auch online) gibt es bei O'reilly
Onlineversionen http://safari.oreilly.com/

Verfasst: Montag 15. September 2003, 18:02
von Dookie
Für Ein/Umsteiger finde ich http://www.way2python.de/ sehr gut.
Wenn Du noch keine Ahnung von Programmeiren hast, ist auch http://www.freenetpages.co.uk/hp/alan.g ... tintro.htm zu empfehlen. Auch wenn das 2. nicht auf die Spezialitäten von Python2.3 eingeht, So sind die Grundlagen für Python doch die selben.

Nochmal zurück zur Fakultätsfunktion. Nach dem Motto "Viele Wege führen nach Rom" gibts auch hier noch mehr Möglichkeiten. Wenn man die In der Mathematik verwendete Definition der Fakultät einer Zahl nimmt, "f(n) = n*f(n-1) für n > 1" kann man auch eine rekursive Funktion schreiben.

Code: Alles auswählen

def fak_recursive(n):
    if n > 2: #da 3*2*1 == 3*2
        return n * fak_recursive(n-1)               
    else:
        return n
ich habe mal ein kleines Beispielscript gemacht, das die verschiedenen Wege zur Fakultätsberechnung zeigt und die Ausführungsgeschwindigkeit testet.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
    Modul:          fak_test
    Description:    Teste
    Version:        V0.1
    Copyright:      2003 by Fritz Cizmarov (Dookie)
    Last modified:  15. Sep. 2003
    License:        Free
"""

from time import time
from sys import version_info

if version_info[:2] < (2,2):
    raise SystemError("need at least Version2.2 of Python"+str(version_info))

def fak_recursive(n):
    if n > 2:                                       
        return n * fak_recursive(n-1)               
    else:
        return n

def fak_iter_while(n):
    res = n
    while n > 2:
        n -= 1   # entspricht n = n - 1
        res *= n # ginge auch als res = res * n
    return res

def fak_iter_for(n):
    res = n
    for n in xrange(2,n):
        res *= n
    return res

fak_lambda = lambda n: reduce(lambda a, b: a*b, xrange(2,n),n)

num = 100000
msg = u"%s: %d Berechnungen brauchen %.2f sekunden"

def test(funktion_name, f):
    values = range(1,101)*(num/100)
    t_start = time()
    for val in values:
        tmp = f(val)
    t_end = time()
    print msg % (funktion_name, num, (t_end-t_start))

test("fak_recursive", fak_recursive)
test("fak_iter_while", fak_iter_while)
test("fak_iter_for", fak_iter_for)
test("fak_lambda", fak_lambda)
Gruß

Dookie