[Tutor] Do loop in Python

Steven D'Aprano steve at pearwood.info
Tue Nov 29 14:00:45 CET 2011

```stm atoc wrote:
> I used it in order to improve the program....
>
> Here is the new version of the program:
>
> zvalues = [-200]  # starting value
> hvalues = [10]  # starting value
> increments = [1, 1, 1, 1, 1, 1, 1, 1]
> for N in increments:
>        h = hvalues[-1] - N
>        hvalues.append(h)
>        z = zvalues[-1] + h
>        zvalues.append(z)
>        height = arange((z)*dz,0,dz)
>        for z,when in enumerate(height):
>            nuh.append(0.001 * exp(-0.005*(z+200.0))*dz) #turbulence
> diffusivity m**2/s
>            nu.append(num + nuh[z])

I'm afraid I still don't know what the arange function is. Is that a function
you have written yourself? However, I can see that it doesn't actually get used!

You create an arange object, and call it "height".

height = arange((z)*dz,0,dz)

You should insert a print statement after this line to see what value height
is given, and check that it is what you expect it to be.

Presumably height is some sort of list or sequence of values, because you next
use it in a for-loop:

for z,when in enumerate(height):
...

So now we know that z takes on the values 0, 1, 2, 3, ... and when takes on
the values from height, whatever they are. But in the rest of your code, you
don't use when at all:

nuh.append(0.001 * exp(-0.005*(z+200.0))*dz)
nu.append(num + nuh[z])

No when, hence the values from height aren't actually used. Strange.

Also, what are dz and num? You use them both, but I can't see where they are
defined or what value they have. Likewise nuh and nu, although I can guess
they are probably lists because you append to them.

Because I don't know what values to use, and I don't know what arange is, I
can't run your code to see what it does. So I'm reduced to guessing.

If I take a wild stab in the dark that dz is a small number, say, 0.01, I can
see what values nuh gets:

py> from math import exp
py> dz = 0.01
py> nuh = []
py> for z in range(10):
...     nuh.append(0.001 * exp(-0.005*(z+200.0))*dz)
...
py> from pprint import pprint
py> pprint(nuh)
[3.6787944117144236e-06,
3.6604463480401533e-06,
3.6421897957152333e-06,
3.624024298324903e-06,
3.6059494017307832e-06,
3.587964654059516e-06,
3.5700696056914737e-06,
3.5522638092495153e-06,
3.5345468195878014e-06,
3.5169181937806692e-06]

Is that the sort of behaviour you expect for nuh?

Since the nuh values are changing, num+nuh[z] should also be changing, which
implies nu should be changing.

Unless num is so large that rounding error wipes out the nuh values.

--
Steven
```