Anfängerhilfe! Lambdafunktion, Listen und Typen

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
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

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
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

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)
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

Leider hilft es hier nicht :(
TypeError: int() argument must be a string or a number
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

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.
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.
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

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 :)
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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
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.
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

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!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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!
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
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

Ach, verdammt, habt Recht... Listenkomprehension, das war's...
Oke, ich probier dann mal weiter, danke!
Antworten