Leeren Generator zurückgeben (forced).

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
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Sirius3 hat geschrieben:... Zeile 10 funktioniert bei CPython zufällig für kleine Zahlen, bei größeren aber schon nicht mehr.
Du meinst weil ab einer bestimmten Größe von "normalen" Ints nach PythonInts (die mit L hinten) gearbeitet wird.
Daran habe ich garnicht gedacht. Das muss ich mir allgemein merken als Best Practice... :oops:
Sirius3 hat geschrieben:Die Vergleiche in Zeile 10, 14 und 16 sind sowieso überflüssig, da die while-Schleife für diese Fälle 0 mal durchlaufen wird. Wenn Du den Defaultwert von step auf 1 setzt sind Zeile 8 und 9 auch unnötig.
Kannst du dazu vielleicht nochmal was sagen damit ich's besser verstehe? Mich wundert es ein bischen.
Sirius3 hat geschrieben:Warum machst Du überhaupt eine innere Funktion. Hättest Du yield auf der obersten Ebene, wäre das Leerer-Generator-Problem erst gar nicht aufgetreten
Richtig. Weil ich zuerst die obere Codehälfte geschrieben habe und mir dann "mittendrin" die Idee mit der Trennung der Funktionen kam (eine Generator-Funktion und eine die immer fertige Listen zurückgibt).

Und ja, dein Code ist deutlich besser. Ich hab mich schon gewundert, ob das sein kann, dass das range() so kompliziert ist und so viele versch. Fallunterscheidungen braucht, kann ja nicht sein...
...nur leider wars nicht so klar.

EDIT:
@BJ
Oh mann, hinterher denk ich immer, hättest dir das auch selber denken können. Das mit (...) statt iter(...).
Also bisher scheint wohl (_ for _ in []) die kürzeste(, leere) Generator-Expression zu sein, wenn das niemand nochmals unterbietet.

Ich muss mir echt ein eigenes Python Cheat-Sheet bauen, um all diese ganzen kleinen "basics" immer auf einen Blick zu haben. :!:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

akis.kapo hat geschrieben:Du meinst weil ab einer bestimmten Größe von "normalen" Ints nach PythonInts (die mit L hinten) gearbeitet wird.
Daran habe ich garnicht gedacht. Das muss ich mir allgemein merken als Best Practice... :oops:
Nee, das liegt an dem "is". is prüft auf Objektidentität und nicht auf Gleichheit. Da CPython kleine Zahlen bereits im Cache vorliegen hat und diese nicht immer neu erzeugt, funktioniert is nur zufällig für Zahlen von 0 bis 256. Danach liefert es False zurück. Wenn du auf Gleichheit testen willst, dann benutze ==.

Code: Alles auswählen

>>> for i, j in zip(range(250, 260), range(250, 260)):
...     print i, i is j
... 
250 True
251 True
252 True
253 True
254 True
255 True
256 True
257 False
258 False
259 False
Die genaue Anzahl der Zahlen im Cache ist natürlich fix und kann sich daher beliebig ändern.
Das Leben ist wie ein Tennisball.
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Ja, ich merke gerade, es hätte auch ein einfacher Copy & Paste Fehler von Zeile 8 gewesen sein.
Einfach Zeile 8 kopiert, None durch stop ersetzt, "is" stehengelassen, statt durch "==" ersetzt, ... schon ist's geschehen.
Antworten