Seite 1 von 1

Kleiner Fehler in einer einfachen Funktion

Verfasst: Mittwoch 12. Dezember 2007, 17:29
von pythonguy

Code: Alles auswählen

def f1(l):
    for i in range(0,len(l)):
        if l[i]%10 != l[i]:
            del(l[i])
            l.append(l[i]%10)
    return l
Die Funktion kriegt eine Liste und soll immer die letzte Ziffer in die neue Liste einfügen (Modulo 10). Leider komme ich nicht drauf, wo der Fehler in dieser Funktion steckt, es sollte eigentlich das machen, was ich will :? Kann mir jemand einen Tipp geben?

Re: Kleiner Fehler in einer einfachen Funktion

Verfasst: Mittwoch 12. Dezember 2007, 17:44
von keppla
pythonguy hat geschrieben:

Code: Alles auswählen

def f1(l):
    for i in range(0,len(l)):
        if l[i]%10 != l[i]:
            del(l[i])
            l.append(l[i]%10)
    return l
Die Funktion kriegt eine Liste und soll immer die letzte Ziffer in die neue Liste einfügen (Modulo 10). Leider komme ich nicht drauf, wo der Fehler in dieser Funktion steckt, es sollte eigentlich das machen, was ich will :? Kann mir jemand einen Tipp geben?
<pädagogik>Eigentlich erst, wenn du die Fehlermeldung mitangibst.</pädagogik>
Das Problem kommt daher, dass Python strict-typed ist.
l[n] gibt die keine Zahl, sondern einen String zurück (grausame variablen- und funktionsnamen, übrigens). Du must das erst per int() zu einer Zahl machen.

Verfasst: Mittwoch 12. Dezember 2007, 17:57
von Leonidas
Oh graus, was ist denn das für ein Code. Du kannst über eine Liste direkt iterieren, da spart man sich die Indexerei und der Code wird sofort einfacher verständlich.
Außerdem sehe ich in de Programm nur eine Liste und die modifizierst du während du drüber iterierst - sowas kann schnell in die Hose gehen. Lass es sein.

Code: Alles auswählen

def f1(l):
    first, last = l[:-1], l[-1]
    if last % 10 != last:
        first.append(last)
    return first

Re: Kleiner Fehler in einer einfachen Funktion

Verfasst: Mittwoch 12. Dezember 2007, 18:56
von pythonguy
keppla hat geschrieben:l[n] gibt die keine Zahl, sondern einen String zurück (grausame variablen- und funktionsnamen, übrigens).
Solche Namen bekommen wir als Informatiker jeden Tag vom Prof... :wink:

l ist ja eine Liste mit Pseudozufallszahlen als Int, also:

l=[3,2,4]
>>> isinstance(l[0],int)
True
Oh graus, was ist denn das für ein Code. Du kannst über eine Liste direkt iterieren, da spart man sich die Indexerei und der Code wird sofort einfacher verständlich.
Außerdem sehe ich in de Programm nur eine Liste und die modifizierst du während du drüber iterierst - sowas kann schnell in die Hose gehen. Lass es sein.
Danke für den Tip :-), allerdings suche ich auf den Fehler in dieser kleinen Funktion und eine Fehlermeldung gibt es auch nicht, lediglich die Ausgabe ist falsch und ich würde zugern wissen, was diese Funktion wirklich macht...

Re: Kleiner Fehler in einer einfachen Funktion

Verfasst: Mittwoch 12. Dezember 2007, 19:01
von Leonidas
pythonguy hat geschrieben:Danke für den Tip :-), allerdings suche ich auf den Fehler in dieser kleinen Funktion und eine Fehlermeldung gibt es auch nicht, lediglich die Ausgabe ist falsch und ich würde zugern wissen, was diese Funktion wirklich macht...
Naja, indirekt hast du die Frage selbst schon beantwortet - Quatsch. Bei einem solch kurzen Code ist es einfacher und vorteilhafter das neu zu implementieren, als nach seltsamen Fehlern zu fahnden.
Wenn du wissen willst was sie genau macht kannst du mit `pdb` und singlestepping die Funktion debuggen.

Verfasst: Mittwoch 12. Dezember 2007, 19:03
von pythonguy
Na gut, ich habe den Code so modifiziert:

Code: Alles auswählen

def f1(l):
    liste=l[:]
    for i in range(len(l)):
        if liste[i]%10 != liste[i]:
            liste[i]=liste[i]%10
    return liste
Das mit dem Iterieren direkt über eine Liste bekomme ich allerdings nicht hin, da ich

IndexError: list index out of range

bekomme...

Verfasst: Mittwoch 12. Dezember 2007, 19:17
von BlackJack
Ich sehe nicht wie Du bei *der* Funktion *den* Fehler bekommen kannst.

Der ``if``-Test ist überflüssig. Wenn Du sowieso die Modulo-Rechnung durchführend musst, verschwendet der Test nur Rechenzeit. Einfachste und direkteste Möglichkeit die Funktion zu schreiben:

Code: Alles auswählen

def f1(numbers):
    return [number % 10 for number in numbers]

Verfasst: Mittwoch 12. Dezember 2007, 19:22
von pythonguy
BlackJack hat geschrieben:Ich sehe nicht wie Du bei *der* Funktion *den* Fehler bekommen kannst.

Der ``if``-Test ist überflüssig. Wenn Du sowieso die Modulo-Rechnung durchführend musst, verschwendet der Test nur Rechenzeit. Einfachste und direkteste Möglichkeit die Funktion zu schreiben:

Code: Alles auswählen

def f1(numbers):
    return [number % 10 for number in numbers]
Du hast mich missverstanden: Wenn ich

for i in l:

schreibe, bekomme ich diesen Fehler ...

Verfasst: Mittwoch 12. Dezember 2007, 19:44
von CM
Ja, das ist kein Wunder. Schau Dir mal das Tutorial zum Thema Listen an. Kurz:

Code: Alles auswählen

>>> l = [1,2,3]
>>> for i in l:
...    print i, l[i]
... 
1 2
2 3
3
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range
>>> l[0]
1
>>> l[1]
2
>>> l[2]
3
Gruß,
Christian

edit: PS Wenn Du demnächst den *vollständigen* Traceback inkl. zugehörigem Code zeigst, vermeidest Du solche Mißverständnisse ;-) .