Seite 1 von 1

Was ist hier falsch?

Verfasst: Freitag 14. Oktober 2011, 11:43
von mimuel
Hi,

zweierpotenzen = [math.pow(2, 2), math.pow(2, 3)]

zahlen = [range(0, 9)]
zweierpotenzen = [math.pow(2, zahlen)]

Ich möchte alle 2er Potenzen von 0-9 ermitteln.
Zeile 1 tut's.
In Zeile 3 bekomme ich: TypeError: a float is required

Was ist da falsch?
Wie geht's richtig?

Danke

Re: Was ist hier falsch?

Verfasst: Freitag 14. Oktober 2011, 11:50
von Hyperion
Hallo,

Bitte benutze die Python-Code-Tags für Python Code. Damit bleibt die Einrückung erhalten und es gibt noch hübsches Synatx-Highlighting.

Zu Deiner Frage: Was erwartet denn `math.pow` als zweiten Parameter? Und was übergibst Du der Funktion?

Benutzt Du Python3? Wenn nein, liefert Dir die Zuweisung von `zahlen` nicht das, was Du willst ;-) Ich würde aber auch eher `list` nutzen, anstatt der Kurzform.

Noch ein Hinweis: Du suchst `map`.

Re: Was ist hier falsch?

Verfasst: Freitag 14. Oktober 2011, 11:54
von cofi
Hyperion hat geschrieben:Noch ein Hinweis: Du suchst `map`.
Oder eine `for`-Schleife. Man muss doch nicht gleich mit grossem Kaliber schiessen ;)

Re: Was ist hier falsch?

Verfasst: Freitag 14. Oktober 2011, 11:56
von Hyperion
cofi hat geschrieben:
Hyperion hat geschrieben:Noch ein Hinweis: Du suchst `map`.
Oder eine `for`-Schleife. Man muss doch nicht gleich mit grossem Kaliber schiessen ;)
Naja, ob hier eine List-Comprehension leichter zu verstehen ist? ;-)

Re: Was ist hier falsch?

Verfasst: Freitag 14. Oktober 2011, 11:57
von snafu
Falsch ist, dass du anscheinend glaubst, man erhält die Rückgabe von `range()` als Liste, sobald man eckige Klammern drumherum setzt. Das stimmt aber nicht. Was du in dem Fall eigentlich willst, bekommst du mittels `list(range(0,9))`. Aber auch diese Umwandlung benötigst du nicht, da die Rückgabe von `range()` bereits in einem "listenartigen" Format vorliegt (kommt auch drauf an, ob du Python 2 oder 3 benutzt) und du sie eigentlich nur richtig verwenden musst.

Und damit komme ich zu deinem zweiten Fehler: Python-Funktionen erkennen nicht auf magische Weise, dass sie sich auf die einzelnen Elemente einer Liste anwenden sollen. Wie ja auch die Fehlermeldung besagt, wird etwas vom Typ `float` erwartet - also eine Zahl und keine Liste. Das Ziel ist es also nun, in einer Schleife die `pow()` Funktion immer wieder aufzurufen, wobei sich das übergebene Argument (also die Zahl) entsprechend ändert.

Ist das irgendwas für die Schule? Hatte ihr `for`-Schleifen schon bzw sagt dir das was?

Re: Was ist hier falsch?

Verfasst: Freitag 14. Oktober 2011, 12:18
von Hyperion
Da war ich wohl zu voreilig; nur mit `map` kommt man da nicht weiter. Da braucht man dann noch `functools.partial` :oops: Also doch eher per List-Comprehension lösbar für einen Anfänger.

Re: Was ist hier falsch?

Verfasst: Freitag 14. Oktober 2011, 12:30
von derdon
Hyperion hat geschrieben:Da war ich wohl zu voreilig; nur mit `map` kommt man da nicht weiter. Da braucht man dann noch `functools.partial` :oops:
Oder lambda. Aber dann finde ich eine LC auch schöner.

Re: Was ist hier falsch?

Verfasst: Samstag 15. Oktober 2011, 00:04
von hendrikS
Hyperion hat geschrieben:Da war ich wohl zu voreilig; nur mit `map` kommt man da nicht weiter. Da braucht man dann noch `functools.partial` :oops: Also doch eher per List-Comprehension lösbar für einen Anfänger.
Es geht auch mit map.

Code: Alles auswählen

map(pow,[2]*10,range(10))

Re: Was ist hier falsch?

Verfasst: Samstag 15. Oktober 2011, 00:11
von Hyperion
hendrikS hat geschrieben: Es geht auch mit map.

Code: Alles auswählen

map(pow,[2]*10,range(10))
Aber das ist nun nicht wirklich schön ;-)

Re: Was ist hier falsch?

Verfasst: Samstag 15. Oktober 2011, 01:28
von BlackJack
@Hyperion: So schöner? :-)

Code: Alles auswählen

map(pow, itertools.repeat(2, 10), xrange(10))

Re: Was ist hier falsch?

Verfasst: Samstag 15. Oktober 2011, 10:29
von Hyperion
BlackJack hat geschrieben:@Hyperion: So schöner? :-)

Code: Alles auswählen

map(pow, itertools.repeat(2, 10), xrange(10))
Japp, find ich schon :D

Bei gleicher Basis natürlich umständlich, aber ich biete noch das an:

Code: Alles auswählen

list(starmap(pow, izip(repeat(2, 10), xrange(10))))

Re: Was ist hier falsch?

Verfasst: Samstag 15. Oktober 2011, 11:21
von BlackJack
@Hyperion: Also das wäre mir zu umständlich die Argumente erst mit `izip()` in ein Tupel zu packen, damit sie bei `starmap()` dann wieder ausgepackt werden um die Funktion aufzurufen. Wenn man möglichst lange bei Generatoren bleiben möchte, kann man `map()` auch einfach durch `imap()` ersetzen. Dann kann man sich bei `repeat()` sogar die Anzahl der Wiederholungen sparen, weil das aufhört wenn einer der Eingabeiteratoren am Ende ist.

Code: Alles auswählen

list(imap(pow, repeat(2), xrange(10)))