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`

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`
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`

Also doch eher per List-Comprehension lösbar für einen Anfänger.
Es geht auch mit map.
Re: Was ist hier falsch?
Verfasst: Samstag 15. Oktober 2011, 00:11
von Hyperion
hendrikS hat geschrieben:
Es geht auch mit map.
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?
Re: Was ist hier falsch?
Verfasst: Samstag 15. Oktober 2011, 10:29
von Hyperion
BlackJack hat geschrieben:@Hyperion: So schöner?
Japp, find ich schon
Bei gleicher Basis natürlich umständlich, aber ich biete noch das an:
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.