Erstmal vorweg. Natürlich 'izip()' und nicht 'zip()'. Da hast recht
Naja, den Iterator anzupassen ist wohl eher nicht das Problem. Ich gehe davon aus das solch ein Teil für gewöhnlich in einer Funktion gekapselt ist, die dann halt einen Parameter hat.
Code: Alles auswählen
from itertools import izip
def foo(counts):
for coordinates in izip(xrange(1,counts), xrange(7,counts, 3)):
print coordinates,
Was mich aber generell immer noch stört sind halt die 2 'xrange()'
BlackJack hat geschrieben:Da müsste man dann aber sicherstellen, dass die Obergrenze des `xrange()` ausreicht.
Naja die Begründung ist nicht wirklich eine gütige. Natürlich sind 'xrange()' und 'range()' in ihrer möglichen Anzahl iterationen begrenzt. Das ist überall wo man beide genanten einsetzt. Trotzdem fängt man jetzt nicht an und benutzt jetzt über all stat...
...ein...
Code: Alles auswählen
from itertools import takewhile, count
for i in takewhile(lambda y: y < 50, ( i-1 for i in count(1)) ):
print i,
...

Zugegeben, die 'takewhile()' Variante ist in grunde nicht "endlich"
(wenn man es genau nimmt ist sie auch nicht unendlich bzw. was ist die obergrenze für eine Zahl in Python) und dadurch flexibler, dennoch fangen wir bestimmt nicht jetzt alle an und ersetzen unsere 'range()' durch diese Variante un shcon gar nicht wenn es um 50 Iterationen geht.
Und wie in diesen Fall, geht man auch in 90% alle anderen möglichen Anwendungen, nicht von einer hohen hohen iteration überhalb von 'short' und 'long' aus. Falls ja kann man immer noch Dookies 'longxrange()' nutzen
(Warum hat das noch keiner der Python Entwickler ins Python 2.5 hinzugefügt?
) oder aus deiner Version das Äquivalent basteln, das sogar kürzer als Dookies Version wäre.
Aber mal zu zu Thema zurück:
Was hällst du von dieser Variante Jack?:
Code: Alles auswählen
def f2():
field = Field(50,50)
cntr = 0
for i in xrange(7, 50, 3):
cntr += 1
field[(cntr, i)] = 'W'
Macht das gleiche wie deine Version mit dem Vorteil, das nicht erstmal mit 'for' über 'count()' itereiert und dessen mit 'takewhile()' darüber iteriert und dann mit 'for' über 'takewhile()' iteriert werden muss.
lg