Was ist hier falsch?

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
mimuel
User
Beiträge: 19
Registriert: Montag 8. November 2010, 08:03

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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`.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hyperion hat geschrieben:Noch ein Hinweis: Du suchst `map`.
Oder eine `for`-Schleife. Man muss doch nicht gleich mit grossem Kaliber schiessen ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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? ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: So schöner? :-)

Code: Alles auswählen

map(pow, itertools.repeat(2, 10), xrange(10))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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))))
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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)))
Antworten