D. Hartley wrote:
> Rudy,
> I have the im.getpixel incrementing at every pixel by i (in a for loop
> for each pixel in wire.png), and I know incrementing the xy in the new
> one goes like this:
> 
> x + 1
> y + 1
> x - 1
> x - 1
> y - 1
> y - 1
> x + 1
> x + 1
> x + 1 ... etc
> 
> First the x and then the y is incremented by 1, then that 1 is made
> negative and the # of times += 1.  then, back around, then the 1 is
> made positive again, and so on.
> 
> But how can I increment a changing "to_coordinate" variable in this
> weird way each time while still only incrementing the
> "from_coordinate" by 1 in a for loop? I keep trying to set up my
> function and only being able to change one or the other at a time!

Denise,

You are essentially trying to iterate two sequences at the same time. One is 
the simple sequence 0, 
1, 2, 3, ...; the other is the more complex sequence of (x, y) pairs in the 
"to" coordinates.

There are a couple of good ways to do this in Python. Suppose you have a loop 
that calculates and 
uses successive values of (x, y) based on some state and the previous values of 
x and y:

x, y = initialX, initialY
state = initialState
while True:
   x, y, state = calculateXY(x, y, state)
   doSomething(x, y)

Now suppose doSomething() needs another argument from the sequence 0, 1, .... 
One option is to add 
the calculations for the new sequence to the loop:

x, y = initialX, initialY
i = initialI
state = initialState
while True:
   x, y, state = calculateXY(x, y, state)
   i = calculateI(i)
   doSomething(x, y, i)

What if i is actually coming from another sequence rather than being 
calculated? You can control 
iteration over a sequence by creating an explicit iterator and calling next() 
on it when you need a 
new element:

x, y = initialX, initialY
iIter = iter(iSequence)
state = initialState
while True:
   x, y, state = calculateXY(x, y, state)
   doSomething(x, y, iIter.next())

This works but it conflates three things - iteration over (x, y), iteration 
over iSequence, and 
proccessing of the triples (x, y, i). A nice way to break these apart is to 
create a generator 
function that yields (x, y) pairs:

def generateXY():
   x, y = initialX, initialY
   state = initialState
   while True:
     x, y, state = calculateXY(x, y, state)
     yield (x, y)

Notice this is almost identical to the original loop; the call to doSomething() 
has been replaced by 
a yield.

Calling generateXY creates a generator object which itself can be iterated. 
Now, with the help of 
zip(), you can easily iterate the (x, y) pairs and the iSequence elements 
together:

for (x, y), i in zip(generateXY(), iSequence):
   doSomething(x, y, i)

(Note the cool use of tuple unpacking too!)

Kent

_______________________________________________
Tutor maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to