Basic question

C

Cesar G. Miguel

I've been studying python for 2 weeks now and got stucked in the
following problem:

for j in range(10):
print j
if(True):
j=j+2
print 'interno',j

What happens is that "j=j+2" inside IF does not change the loop
counter ("j") as it would in C or Java, for example.

Am I missing something?

[]'s
Cesar
 
D

Dmitry Dzhus

"j=j+2" inside IF does not change the loop
counter ("j")

You might be not truly catching the idea of Python `for` statements
The suite may assign to the variable(s) in the target list; this
does not affect the next item assigned to it.

In C you do not specify all the values the "looping" variable will be
assigned to, unlike (in the simplest case) you do in Python.
 
K

Karlo Lozovina

Cesar said:
for j in range(10):
print j
if(True):
j=j+2
print 'interno',j

What happens is that "j=j+2" inside IF does not change the loop
counter ("j") as it would in C or Java, for example.
Am I missing something?

If you want that kind of behaviour then use a `while` construct:

j = 0
while j < 5:
print j
if True:
j = j + 3
print '-- ', j

If you use a for loop, for each pass through the foor loop Python
assigns next item in sequence to the `j` variable.

HTH,
Karlo.
 
A

Arnaud Delobelle

I've been studying python for 2 weeks now and got stucked in the
following problem:

for j in range(10):
print j
if(True):
j=j+2
print 'interno',j

What happens is that "j=j+2" inside IF does not change the loop
counter ("j") as it would in C or Java, for example.

Am I missing something?

Yes you are :)

"for j in range(10):..." means:
1. Build a list [0,1,2,3,4,5,6,7,8,9]
2. For element in this list (0, then 1, then 2,...), set j to that
value then execute the code inside the loop body

To simulate "for(<initialisation>; <condition>; <increment>) <body>"
you have to use while in Python:

<initialisation>
while <condition>:
<body>
<increment>

Of course in most case it would not be the "pythonic" way of doing
it :)
 
G

Gary Herron

Cesar said:
I've been studying python for 2 weeks now and got stucked in the
following problem:

for j in range(10):
print j
if(True):
j=j+2
print 'interno',j

What happens is that "j=j+2" inside IF does not change the loop
counter ("j") as it would in C or Java, for example.

Am I missing something?

[]'s
Cesar
Nope. The loop counter will be assigned successively through the list of
integers produced by range(10). Inside the loop, if you change j, then
from that point on for that pass through the body, j will have that
value. But such an action will not change the fact that next pass
through the loop, j will be assigned the next value in the list.
 
B

Basilisk96

I've been studying python for 2 weeks now and got stucked in the
following problem:

for j in range(10):
print j
if(True):
j=j+2
print 'interno',j

What happens is that "j=j+2" inside IF does not change the loop
counter ("j") as it would in C or Java, for example.

Am I missing something?

[]'s
Cesar

What is your real intent here? This is how I understand it after
reading your post: you want to create a loop that steps by an
increment of 2. If that's the case, then:
.... print j
....
0
2
4
6
8

would be a simple result.

Cheers,
-Basilisk96
 
D

Dennis Lee Bieber

Am I missing something?
Python is not C or Java...

for x in range(10):

builds a list

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

so

for x in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:

Internally, Python keeps track of where it is in the list. The "x" you
see is what Python found at the "current position" in the list.

Changin "x" makes no changes to the list -- nor to the internal
position used by the "for".
--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 
C

Cesar G. Miguel

I've been studying python for 2 weeks now and got stucked in the
following problem:
for j in range(10):
print j
if(True):
j=j+2
print 'interno',j
What happens is that "j=j+2" inside IF does not change the loop
counter ("j") as it would in C or Java, for example.
Am I missing something?
[]'s
Cesar

What is your real intent here? This is how I understand it after
reading your post: you want to create a loop that steps by an
increment of 2. If that's the case, then:

... print j
...
0
2
4
6
8

would be a simple result.

Cheers,
-Basilisk96

Actually I'm trying to convert a string to a list of float numbers:
str = '53,20,4,2' to L = [53.0, 20.0, 4.0, 2.0]

As some of you suggested, using while it works:

-------------------------------------
L = []
file = ['5,1378,1,9', '2,1,4,5']
str=''
for item in file:
j=0
while(j<len(item)):
while(item[j] != ','):
str+=item[j]
j=j+1
if(j>= len(item)): break

if(str != ''):
L.append(float(str))
str = ''

j=j+1

print L
 
K

Karlo Lozovina

Cesar said:
-------------------------------------
L = []
file = ['5,1378,1,9', '2,1,4,5']
str=''
for item in file:
j=0
while(j<len(item)):
while(item[j] != ','):
str+=item[j]
j=j+1
if(j>= len(item)): break

if(str != ''):
L.append(float(str))
str = ''

j=j+1

print L
But I'm not sure this is an elegant pythonic way of coding :)

Example:

In [21]: '5,1378,1,9'.split(',')
Out[21]: ['5', '1378', '1', '9']

So, instead of doing that while-based traversal and parsing of `item`,
just split it like above, and use a for loop on it. It's much more
elegant and pythonic.

HTH,
Karlo.
 
C

Cesar G. Miguel

Cesar said:
-------------------------------------
L = []
file = ['5,1378,1,9', '2,1,4,5']
str=''
for item in file:
j=0
while(j<len(item)):
while(item[j] != ','):
str+=item[j]
j=j+1
if(j>= len(item)): break
if(str != ''):
L.append(float(str))
str = ''

print L
But I'm not sure this is an elegant pythonic way of coding :)

Example:

In [21]: '5,1378,1,9'.split(',')
Out[21]: ['5', '1378', '1', '9']

So, instead of doing that while-based traversal and parsing of `item`,
just split it like above, and use a for loop on it. It's much more
elegant and pythonic.

HTH,
Karlo.

Great! Now it looks better :)
 
D

Dmitry Dzhus

Actually I'm trying to convert a string to a list of float numbers:
str = '53,20,4,2' to L = [53.0, 20.0, 4.0, 2.0]

str="53,20,4,2"
map(lambda s: float(s), str.split(','))

Last expression returns: [53.0, 20.0, 4.0, 2.0]
 
C

Cesar G. Miguel

Actually I'm trying to convert a string to a list of float numbers:
str = '53,20,4,2' to L = [53.0, 20.0, 4.0, 2.0]

str="53,20,4,2"
map(lambda s: float(s), str.split(','))

Last expression returns: [53.0, 20.0, 4.0, 2.0]

Nice!

The following also works using split and list comprehension (as
suggested in a brazilian python forum):

-------------------
L = []
file = ['5,1378,1,9', '2,1,4,5']
str=''
for item in file:
L.append([float(n) for n in item.split(',')])
 
K

Kirk Job Sluder

Cesar G. Miguel said:
I've been studying python for 2 weeks now and got stucked in the
following problem:

for j in range(10):
print j
if(True):
j=j+2
print 'interno',j

What happens is that "j=j+2" inside IF does not change the loop
counter ("j") as it would in C or Java, for example.

Granted this question has already been answered in parts, but I just
wanted to elaborate.

Although the python for/in loop is superficially similar to C and Java
for loops, they work in very different ways. Range creates a list
object that can create an iterator, and the for/in construct under the
hood sets j to the results of iterator.next(). The equivalent
completely untested java would be something like:

public ArrayList<Object> range(int n){
a = new ArrayList<Object>; //Java 1.5 addition I think.
for(int x=0,x<n,x++){
a.add(new Integer(x));
}
return a;
}


Iterator i = range(10).iterator();

Integer j;
while i.hasNext(){
j = i.next();
system.out.println(j.toString());
j = j + 2;
system.out.println("interno" + j.toString());
}

This probably has a bunch of bugs. I'm learning just enough java
these days to go with my jython.

1: Python range() returns a list object that can be expanded or
modified to contain arbitrary objects. In java 1.5 this would be one
of the List Collection objects with a checked type of
java.lang.Object. So the following is legal for a python list, but
would not be legal for a simple C++ or Java array.

newlist = range(10)
newlist[5] = "foo"
newlist[8] = open("filename",'r')

2: The for/in loop takes advantage of the object-oriented nature of
list objects to create an iterator for the list, and then calls
iterator.next() until the iterator runs out of objects. You can do
this in python as well:

i = iter(range(10))
while True:
try:
j = i.next()
print j
j = j + 2
print j
except StopIteration:
break

Python lists are not primitive arrays, so there is no need to
explicitly step through the array index by index. You can also use an
iterator on potentially infinite lists, streams, and generators.

Another advantage to for/in construction is that loop counters are
kept nicely separate from the temporary variable, making it more
difficult to accidentally short-circuit the loop. If you want a loop
with the potential for a short-circuit, you should probably use a
while loop:

j = 0
while j < 10:
if j == 5:
j = j + 2
else:
j = j + 1
print j

Am I missing something?

[]'s
Cesar
 
A

Alex Martelli

Cesar G. Miguel said:
Actually I'm trying to convert a string to a list of float numbers:
str = '53,20,4,2' to L = [53.0, 20.0, 4.0, 2.0]

str="53,20,4,2"
map(lambda s: float(s), str.split(','))

Last expression returns: [53.0, 20.0, 4.0, 2.0]

Nice!

As somebody else alredy pointed out, the lambda is supererogatory (to
say the least).

The following also works using split and list comprehension (as
suggested in a brazilian python forum):

-------------------
L = []
file = ['5,1378,1,9', '2,1,4,5']
str=''
for item in file:
L.append([float(n) for n in item.split(',')])

The assignment to str is useless (in fact potentially damaging because
you're hiding a built-in name).

L = [float(n) for item in file for n in item.split(',')]

is what I'd call Pythonic, personally (yes, the two for clauses need to
be in this order, that of their nesting).


Alex
 
S

sturlamolden

Am I missing something?

Python for loops iterates over the elements in a container. It is
similar to Java's "for each" loop.

for j in range(10):
print j
if(True):
j=j+2
print 'interno',j

Is equivalent to:

int[] range = {0,1,2,3,4,5,6,7,8,9};
for (int j : range) {
system.out.writeln(j);
if (true) {
j += 2;
system.out.writeln("iterno" + j);
}
}

If I remember Java correctly...
 
P

Paddy

As somebody else alredy pointed out, the lambda is supererogatory (to
say the least).

What a wonderful new word!
I did not know what supererogatory meant, and hoped it had nothing to
do with Eros :)
Answers.com gave me a meaning synonymous with superfluous, which
I think is what was meant here, but Chambers gave a wonderful
definition where they say it is from the RC Church practice of doing
more
devotions than are necessary so they can be 'banked' for distribution
to others (I suspect, that in the past it may have been for a fee or
a
favour).

Supererogatory, my word of the day.

- Paddy

P.S; http://www.chambersharrap.co.uk/cha...href.py/main?query=supererogatory+&title=21st
 
A

Alex Martelli

Paddy said:
What a wonderful new word!
I did not know what supererogatory meant, and hoped it had nothing to
do with Eros :)
Answers.com gave me a meaning synonymous with superfluous, which
I think is what was meant here,

Kind of said:
but Chambers gave a wonderful
definition where they say it is from the RC Church practice of doing
more
devotions than are necessary so they can be 'banked' for distribution
to others (I suspect, that in the past it may have been for a fee or
a favour).

"Doing more than necessary" may be wonderful in a devotional context,
but not necessarily in an engineering one (cfr also, for a slightly
different slant on "do just what's needed",
Supererogatory, my word of the day.

Glad you liked it!-)


Alex
 
C

Cesar G. Miguel

Cesar G. Miguel said:
Actually I'm trying to convert a string to a list of float numbers:
str = '53,20,4,2' to L = [53.0, 20.0, 4.0, 2.0]
str="53,20,4,2"
map(lambda s: float(s), str.split(','))
Last expression returns: [53.0, 20.0, 4.0, 2.0]

As somebody else alredy pointed out, the lambda is supererogatory (to
say the least).
The following also works using split and list comprehension (as
suggested in a brazilian python forum):
-------------------
L = []
file = ['5,1378,1,9', '2,1,4,5']
str=''
for item in file:
L.append([float(n) for n in item.split(',')])

The assignment to str is useless (in fact potentially damaging because
you're hiding a built-in name).

L = [float(n) for item in file for n in item.split(',')]

is what I'd call Pythonic, personally (yes, the two for clauses need to
be in this order, that of their nesting).

Alex

Yes, 'str' is unnecessary. I just forgot to remove it from the code.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top