def problem

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
Komandant
User
Beiträge: 2
Registriert: Montag 24. März 2003, 14:53
Wohnort: nähe Hannover
Kontaktdaten:

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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

jaja, wenn man den ":" vergisst kommt man nicht auf die lösung, eigene Erfahrung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Komandant
User
Beiträge: 2
Registriert: Montag 24. März 2003, 14:53
Wohnort: nähe Hannover
Kontaktdaten:

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

Hmm, sehr gute bücher (auch online) gibt es bei O'reilly
Onlineversionen http://safari.oreilly.com/
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
Antworten