Seite 1 von 1

Anfängerhilfe! Lambdafunktion, Listen und Typen

Verfasst: Donnerstag 19. April 2007, 10:24
von KoenigGunther
Hi!
Ich habe keine Ahnung ob das hier ins Forum passt, denn so wirklich gibts ja kein Anfängerfrageforum wenn ich das genau gesehen habe...

Nun denn, ich hoffe ihr nehmts mir nicht übel wenn ich hier frage:

Ich habe eine Funktion:

Code: Alles auswählen

    liste = [1,2,3,4,5,6]
    def lambdafunktion(lste):
        lambdafunktionierteliste = (lambda x: x*x) (lste)
        print lambdafunktionierteliste
        
    lambdafunktion(liste)
Naja, ich möchte ja wirklich nur die Quadrate bilden, aber wie teile ich mit dass das was in der Liste ist, wirklich ein Integer ist, oder wenigstens wie einer behandelt wird?
Irgendwie ja mit diesem %d, aber da stehe ich mir im Moment auf dem Fuß und komme nicht weiter.

Gruß
Christian

Verfasst: Donnerstag 19. April 2007, 10:44
von Zizibee
Ich bin auch recht neu hier, also kann es auch sein, dass ich jetzt blödsinn erzähle, aber wenn er bei mir Werte als str und nicht als int genommen hat, hat bei mir immer so was geholfen:

Code: Alles auswählen

u = int(x) * int(y)

Verfasst: Donnerstag 19. April 2007, 10:54
von KoenigGunther
Leider hilft es hier nicht :(
TypeError: int() argument must be a string or a number

Verfasst: Donnerstag 19. April 2007, 11:07
von Zizibee
Ich weiß nicht, ob dir das irgendwie weiterhilft, aber ich hab mal was versucht:

Code: Alles auswählen

liste = [1,2,3,4,5,6]
for i in range(len(liste)):
	liste[i] = liste[i] * liste[i]
	print liste[i]
Das funktioniert auch, ist aber halt ohne "lambda" oder Funktionen...
...oder ich hab dein Problem noch nicht so ganz verstanden.

Verfasst: Donnerstag 19. April 2007, 11:19
von BlackJack

Code: Alles auswählen

(lambda x: x*x) (lste)
Hier wird eine anonyme Funktion definiert, die *ein* Argument entgegennimmt und diese eine Argument mit sich selbst multipliziert. Wenn man eine Liste an diese Funktion übergibt, dann wird das `x` an diese Liste gebunden und versucht eine Liste mit sich selbst zu multiplizieren. Dat jeht nich:

Code: Alles auswählen

In [35]: x = [1, 2, 3]

In [36]: x * x
---------------------------------------------------------------------------
exceptions.TypeError          Traceback (most recent call last)

/home/new/<ipython console>

TypeError: can't multiply sequence by non-int
Aber warum so kompliziert, wo eine "list comprehension" doch so einfach ist:

Code: Alles auswählen

    liste = [1,2,3,4,5,6]
    def lambdafunktion(lste):
        print [x * x for x in lste]

    lambdafunktion(liste)
Alternativ hätte man die Lambda-Funktion auch mit `map()` auf die Liste anwenden können.

Verfasst: Donnerstag 19. April 2007, 11:22
von KoenigGunther
Tja, das ist es aber auch noch nicht ganz...
Es kann ja auch sein dass ich

Code: Alles auswählen

liste = [4,1,6,3,45,2,7]
habe, also unsortiert.
Da hilft ja range mit len nicht :(

Ums nochmal zu beschreiben:
Ich habe das Problem dass ich eine Lambdafunktion habe und in eine Liste abbilden will, leider werden die Integers in der Liste nicht als eben diese erkannt, weswegen ich mich frage wie ich es dem Interpreter beibiege dass sich in der Liste wahrhaftig Integerwerte befinden :)

Verfasst: Donnerstag 19. April 2007, 11:30
von BlackJack
Zizibee's ``range(len(…``-Lösung ist furchbar umständlich, aber wo ist das Problem? Ob die `liste` sortiert ist oder nicht macht keinen Unterschied.

Lies doch bitte nochmal meinen Beitrag. Deine Funktion musst Du auf die *Elemente* anwenden und nicht auf die Liste.

Ob das eine Lamda-Funktion oder ein anderes Aufrufbares Objekt ist, macht dabei auch keinen Unterschied.

Verfasst: Donnerstag 19. April 2007, 17:55
von CM
Hoi und willkommen im Forum,

also, so ganz das richtige Unterforum hast Du nicht getroffen! Mag jemand verschieben?
KoenigGunther hat geschrieben: Ich habe das Problem dass ich eine Lambdafunktion habe und in eine Liste abbilden will, leider werden die Integers in der Liste nicht als eben diese erkannt, weswegen ich mich frage wie ich es dem Interpreter beibiege dass sich in der Liste wahrhaftig Integerwerte befinden :)
In mir keimt der Verdacht, daß Du ein fundamentaleres Problem hast. Das wird auch schon durch die Fehlermeldung angedeutet. Magst Du uns mal Deine Pseudolambdafunktion zusammen mit dem Code, der sie aufruft zeigen? Ich bin sicher, man wird Dir schnell weiterhelfen können.

Gruß,
Christian

Verfasst: Donnerstag 19. April 2007, 18:21
von BlackJack
Lass einfach das Programmfragment aus dem ersten Beitrag laufen. Da siehst Du die Lambda-Funktion und das Fragment führt auch zu der Fehlermeldung. Warum das so ist, habe ich schon erklärt.

Mit dem fundamentalerem Problem magst Du aber recht haben. Es fehlen ein paar Grundlagen für das Verständnis, sonst würde man wohl kaum eine Lambda-Funktion so komisch einsetzen.

Verfasst: Freitag 20. April 2007, 10:02
von KoenigGunther
Hi!
Deinen Beitrag, BlackJack, habe ich noch gar nicht gesehen als ich das letzte mal geschrieben habe :)

Tja, mein Problem war wohl dass ich die Syntax noch nicht wirklich drauf habe, was aber auch ganz klar ist, da ich die Sprache gerade erst lerne...

Ich kenne das aus Haskell so dass wenn ich eine Lambdafunktion schreibe, wie die von mir gepostete, dass dann jedes Element x aus der Liste (bei mir lste) auf ein Element einer neuen Liste abgebildet wird (bei mir aufs Quadrat).

Beim Lernen neuer Sprachen tu ich mich immer recht schwer, da ich die Tutorials verstehe, das gelernte dann aber nicht anwende, weil ich zu unkreativ bei dem Ausdenken von eigenen Programmieraufgaben bin :D
Und ohne Übung wirds halt nicht besser - aber aller Anfang ist ja schwer...

So habe ich versucht alte Haskellaufgaben nachzuprogrammieren und habe mich da wohl zu stark an die Syntax von Haskell gehalten :)

Gibt es eigentlich einschlägige Seiten die Programmieraufgaben bereitstellen? :roll: Das wäre doch mal was!

Verfasst: Freitag 20. April 2007, 10:25
von EyDu
KoenigGunther hat geschrieben:Ich kenne das aus Haskell so dass wenn ich eine Lambdafunktion schreibe, wie die von mir gepostete, dass dann jedes Element x aus der Liste (bei mir lste) auf ein Element einer neuen Liste abgebildet wird (bei mir aufs Quadrat).
Das läuft bei Haskell auch nicht so. Da brauchst du auch "map" oder verwendest eine List-Comprehension!

Verfasst: Freitag 20. April 2007, 11:07
von BlackJack
Genau, auch Haskell kann keine Listen mit anderen Listen multiplizieren (solange man nicht definiert was das bedeuten soll):

Code: Alles auswählen

Prelude> let a = [1,2,3]
Prelude> (\x -> x*x) (a)

<interactive>:1:8:
    No instance for (Num [Integer])
      arising from use of `*' at <interactive>:1:8
    Probable fix: add an instance declaration for (Num [Integer])
    In a lambda abstraction: \ x -> x * x
    In the definition of `it': it = (\ x -> ...) (a)
Prelude> a * a

<interactive>:1:2:
    No instance for (Num [Integer])
      arising from use of `*' at <interactive>:1:2
    Probable fix: add an instance declaration for (Num [Integer])
    In the definition of `it': it = a * a

Verfasst: Freitag 20. April 2007, 11:50
von KoenigGunther
Ach, verdammt, habt Recht... Listenkomprehension, das war's...
Oke, ich probier dann mal weiter, danke!