Basic question

Discussion in 'Python' started by Cesar G. Miguel, May 12, 2007.

  1. 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
     
    Cesar G. Miguel, May 12, 2007
    #1
    1. Advertising

  2. Cesar G. Miguel

    Dmitry Dzhus Guest


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


    You might be not truly catching the idea of Python `for` statements
    sequence nature. It seems that <http://docs.python.org/ref/for.html>
    will make things quite clear.

    > 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.

    --
    Happy Hacking.

    Dmitry "Sphinx" Dzhus
    http://sphinx.net.ru
     
    Dmitry Dzhus, May 12, 2007
    #2
    1. Advertising

  3. Cesar G. Miguel wrote:

    > 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.
     
    Karlo Lozovina, May 12, 2007
    #3
  4. On May 12, 5:18 pm, "Cesar G. Miguel" <> wrote:
    > 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 :)

    --
    Arnaud
     
    Arnaud Delobelle, May 12, 2007
    #4
  5. Cesar G. Miguel

    Gary Herron Guest

    Cesar G. Miguel wrote:
    > 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.
     
    Gary Herron, May 12, 2007
    #5
  6. Cesar G. Miguel

    Basilisk96 Guest

    On May 12, 12:18 pm, "Cesar G. Miguel" <> wrote:
    > 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:

    >>> for j in range(0,10,2):

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

    would be a simple result.

    Cheers,
    -Basilisk96
     
    Basilisk96, May 12, 2007
    #6
  7. On 12 May 2007 09:18:06 -0700, "Cesar G. Miguel" <>
    declaimed the following in comp.lang.python:

    >
    > 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

    HTTP://wlfraed.home.netcom.com/
    (Bestiaria Support Staff: )
    HTTP://www.bestiaria.com/
     
    Dennis Lee Bieber, May 12, 2007
    #7
  8. On May 12, 2:45 pm, Basilisk96 <> wrote:
    > On May 12, 12:18 pm, "Cesar G. Miguel" <> wrote:
    >
    >
    >
    > > 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:
    >
    > >>> for j in range(0,10,2):

    >
    > ... 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
    -------------------------------------

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

    Thanks for all suggestions!
     
    Cesar G. Miguel, May 12, 2007
    #8
  9. Cesar G. Miguel wrote:

    > -------------------------------------
    > 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.
     
    Karlo Lozovina, May 12, 2007
    #9
  10. On May 12, 3:09 pm, Karlo Lozovina <_karlo_@_mosor.net> wrote:
    > Cesar G. Miguel wrote:
    > > -------------------------------------
    > > 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.


    Great! Now it looks better :)
     
    Cesar G. Miguel, May 12, 2007
    #10
  11. Cesar G. Miguel

    Dmitry Dzhus Guest


    > 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]
    --
    Happy Hacking.

    Dmitry "Sphinx" Dzhus
    http://sphinx.net.ru
     
    Dmitry Dzhus, May 12, 2007
    #11
  12. On 2007-05-12, Cesar G. Miguel <> wrote:

    > 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'


    >>> [float(w) for w in str.split(',')]


    [53.0, 20.0, 4.0, 2.0]

    >>> map(float,str.split(','))


    [53.0, 20.0, 4.0, 2.0]

    --
    Grant Edwards grante Yow! I want you to
    at MEMORIZE the collected
    visi.com poems of EDNA ST VINCENT
    MILLAY... BACKWARDS!!
     
    Grant Edwards, May 12, 2007
    #12
  13. On 2007-05-12, Dmitry Dzhus <> wrote:

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


    There's no need for the lambda.

    map(float,str.split(','))

    Does exactly the same thing.

    --
    Grant Edwards grante Yow! I feel like I am
    at sharing a "CORN-DOG" with
    visi.com NIKITA KHRUSCHEV...
     
    Grant Edwards, May 12, 2007
    #13
  14. On May 12, 3:40 pm, Dmitry Dzhus <> wrote:
    > > 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]
    > --
    > Happy Hacking.
    >
    > Dmitry "Sphinx" Dzhushttp://sphinx.net.ru


    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(',')])
    -------------------

    Thank you for all suggestions!
     
    Cesar G. Miguel, May 12, 2007
    #14
  15. "Cesar G. Miguel" <> writes:

    > 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
    >


    --
    Kirk Job Sluder
     
    Kirk Job Sluder, May 12, 2007
    #15
  16. Cesar G. Miguel <> wrote:

    > On May 12, 3:40 pm, Dmitry Dzhus <> wrote:
    > > > 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]
    > > --
    > > Happy Hacking.
    > >
    > > Dmitry "Sphinx" Dzhushttp://sphinx.net.ru

    >
    > 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
     
    Alex Martelli, May 13, 2007
    #16
  17. Cesar G. Miguel

    sturlamolden Guest

    On May 12, 6:18 pm, "Cesar G. Miguel" <> wrote:

    > 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...
     
    sturlamolden, May 13, 2007
    #17
  18. Cesar G. Miguel

    Paddy Guest

    Off Topic: Is the use of supererogatory supererogatory?

    On May 13, 12:13 am, (Alex Martelli) wrote:

    > 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
     
    Paddy, May 13, 2007
    #18
  19. Re: Off Topic: Is the use of supererogatory supererogatory?

    Paddy <> wrote:

    > On May 13, 12:13 am, (Alex Martelli) wrote:
    >
    > > 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,


    Kind of, yes, cfr <http://www.bartleby.com/61/60/S0896000.html> .

    > 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",
    <http://en.wikipedia.org/wiki/You_Ain't_Gonna_Need_It>).

    > Supererogatory, my word of the day.


    Glad you liked it!-)


    Alex
     
    Alex Martelli, May 13, 2007
    #19
  20. On May 12, 8:13 pm, (Alex Martelli) wrote:
    > Cesar G. Miguel <> wrote:
    >
    > > On May 12, 3:40 pm, Dmitry Dzhus <> wrote:
    > > > > 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]
    > > > --
    > > > Happy Hacking.

    >
    > > > Dmitry "Sphinx" Dzhushttp://sphinx.net.ru

    >
    > > 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


    Yes, 'str' is unnecessary. I just forgot to remove it from the code.
     
    Cesar G. Miguel, May 13, 2007
    #20
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Stefan Duenser

    Basic shifting question

    Stefan Duenser, Dec 7, 2004, in forum: VHDL
    Replies:
    4
    Views:
    444
    Stefan Duenser
    Dec 8, 2004
  2. Replies:
    1
    Views:
    584
    Eric Smith
    Jul 8, 2005
  3. Engineer
    Replies:
    6
    Views:
    636
    Jeremy Bowers
    May 1, 2005
  4. Replies:
    0
    Views:
    446
  5. Ark Khasin

    A basic question question about volatile use

    Ark Khasin, Jul 31, 2008, in forum: C Programming
    Replies:
    12
    Views:
    361
    Ark Khasin
    Jul 31, 2008
Loading...

Share This Page