problems with looping, i suppose

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • John Salerno

    problems with looping, i suppose

    Here's an exercise I was doing to guess a number from 1-100. Just for
    fun (ha ha) I decided to add some error checking too, and now when I run
    it, the DOS prompt flashes real quick and disappears. At first, I had
    just the top try/except block and not the second one, and that worked
    (as far as it would work), but after adding the second try/except, it
    has this problem. I'm sure it has something to do with the looping and
    the breaks/continues.

    I'd appreciate any help on this, and also any suggestions for programs
    that let you step through code to debug it (I'm used to Visual Studio).
    I have SPE installed at home, but not here at work so I can't try it
    right now. I assume it has a debugger.

    Thanks.
  • John Salerno

    #2
    Re: problems with looping, i suppose

    John Salerno wrote:[color=blue]
    > Here's an exercise I was doing[/color]

    This might help:

    import random

    number = random.choice(r ange(1, 100))
    tries = 0

    while True:
    try:
    guess = input('Enter a number between 1 and 100: ')
    break
    except NameError:
    print 'Invalid number\n'
    continue

    while True:
    tries += 1
    try:
    if guess == number:
    print 'Congratulation s! You got it in', tries, 'guess(es).'
    break
    elif guess < number:
    guess = input('Too low. Try again: ')
    elif guess > number:
    guess = input('Too high. Try again: ')
    except NameError:
    print 'Invalid number\n'
    continue

    raw_input()

    Comment

    • John Salerno

      #3
      Re: problems with looping, i suppose

      John Salerno wrote:[color=blue]
      > Here's an exercise I was doing to guess a number from 1-100.[/color]

      Here's another question that is related:

      while True:
      year = raw_input('Ente r year (or other character to quit): ')

      try:
      year = int(year)
      except NameError:
      break

      if (year % 4 == 0) and (year % 100 != 0 or year % 400 == 0):
      print year, 'is a leap year.\n'
      else:
      print year, 'is not a leap year.\n'

      raw_input()

      This works as expected, except that if you enter any character other
      than a number, the program just quits. Why doesn't it still execute the
      raw_input function and pause? I think this is what is happening in the
      other exercise too, but I don't know why. If you break out of the loop,
      should it still pause at raw_input?

      Comment

      • akameswaran@gmail.com

        #4
        Re: problems with looping, i suppose

        Just barely looked the code answer:
        check you scope on the second try block.

        if that doesn't work...
        I'll read it for real :)

        Try PyDev plugin with eclipse - it's served me fairly well, but I did
        come from Java - so I'm an eclipse fan already.

        Comment

        • John Salerno

          #5
          Re: problems with looping, i suppose

          akameswaran@gma il.com wrote:[color=blue]
          > Just barely looked the code answer:
          > check you scope on the second try block.
          >
          > if that doesn't work...
          > I'll read it for real :)
          >
          > Try PyDev plugin with eclipse - it's served me fairly well, but I did
          > come from Java - so I'm an eclipse fan already.
          >[/color]

          I think it has to do with the exception I'm using. For the leap year
          program, it should be ValueError. For the other one, its' a combination
          of that and the input function.

          Comment

          • John Salerno

            #6
            Re: problems with looping, i suppose

            John Salerno wrote:
            [color=blue]
            > I think it has to do with the exception I'm using. For the leap year
            > program, it should be ValueError. For the other one, its' a combination
            > of that and the input function.[/color]

            Hmm, turns out something was wrong with the indentation of the second
            while loop! Even though it looked correct, it created problems when I
            opened it in IDLE, so I just unindented the whole thing and reindented
            it manually, and now it works.

            Comment

            • akameswaran@gmail.com

              #7
              Re: problems with looping, i suppose

              Ok I felt a little bad for my quick answer, these just seem like
              homework problems.

              first problem - it's scope. (there are two scope errors in the sample)
              white space is meaningful. get consistent with tabs or spaces, or
              choose an editor that replaces tab press with space. It'll make life a
              lot easier. And make copy and paste from the group easier for people
              trying to help :)

              Second problem (leap year) , you are catching the wrong kind of
              exception in that problem, so it's bubbling out as an unhandled
              exception. Use IDLE as a starting point, it's not much - but it would
              quickly expose these kinds of proboems.
              Run your code using idle or the interactive and you will see what is
              going on.

              As a side issue. On the second problem - you did say you just want to
              quit in the event of non numeric input, so it's WAD. But the
              underlying exception generated is not a NameError. Try catching any
              error and printing it.

              Comment

              • akameswaran@gmail.com

                #8
                Re: problems with looping, i suppose

                Ha, you found it all before I could fire it up.
                The whitespace thing is very odd, and it took about a month before I
                was comfortable using it for scope.

                On the bright side, scope errors are a lot easier to find than you
                might think, once you get used to looking at py code.

                I thought, if your in the mood to pay for software, and on windows -
                wing IDE is used by many of my wrkmates. IT looks like garbage on
                linux (at least to my eyes) so I stick with eclipse, but Wing has a lot
                of fans.

                Comment

                • Gary

                  #9
                  Re: problems with looping, i suppose

                  John --
                  I looked at your exercise. As it appears in my browser, there appear
                  to be a couple of problems with the bottom "While" block.

                  0 Alignment problem with the "except" clause.
                  As I'm sure you've already discovered, Python is "whitespace
                  sensitive". If it looks like a block, it is; otherwise it isn't. The
                  "if" .. "elif" statements aren't "inside" ("to the right of") the
                  "try". Python will, I believe, interpret this as "try" with no
                  matching "except" or "finally" and will toss this as a syntax error --
                  and thus, I suspect, the flashing screen.

                  o logic error.
                  if "guess" == "number", program as written will print "congrats"
                  forever.

                  Assuming my "cut, copy, paste" works ok, try this: (hmm, the print
                  "congrats" line looks like it's broken into two lines when I preview
                  this. Please ignore -- it should all be on one line):

                  import random

                  number = random.choice(r ange(1, 100))
                  tries = 0

                  while True:
                  try:
                  guess = input('Enter a number between 1 and 100: ')
                  break
                  except NameError:
                  print 'Invalid number\n'
                  continue

                  while True:
                  tries += 1
                  try:
                  if guess < number:
                  guess = input('Too low. Try again: ')
                  elif guess > number:
                  guess = input('Too high. Try again: ')
                  else:
                  print 'Congratulation s! You got it in
                  ',tries,'guess( es).'
                  break

                  except NameError:
                  print 'Invalid number\n'
                  continue

                  raw_input()


                  I altered the "if" a bit -- just my own preference that an "if" always
                  have a matching "else".

                  If you're looking for something with an editor and a debugger -- try
                  "IDLE". If your installation is like mine, it's included. Look in
                  your Python directory under Lib/idelib for file "idle.pyw". (NB: At
                  the moment, I'm running a WinXP box and that's where it is here. My
                  poor old mind can't dredge up whether it's in the same relative place
                  in say, a Linux installation.) "IDLE" isn't perfect but it'll get you
                  started. (Also, FWIW, if you run this under "IDLE", you can omit the
                  trailing "raw_input( )")

                  hope this helps.

                  gary


                  John Salerno wrote:[color=blue]
                  > John Salerno wrote:[color=green]
                  > > Here's an exercise I was doing[/color]
                  >
                  > This might help:
                  >
                  > import random
                  >
                  > number = random.choice(r ange(1, 100))
                  > tries = 0
                  >
                  > while True:
                  > try:
                  > guess = input('Enter a number between 1 and 100: ')
                  > break
                  > except NameError:
                  > print 'Invalid number\n'
                  > continue
                  >
                  > while True:
                  > tries += 1
                  > try:
                  > if guess == number:
                  > print 'Congratulation s! You got it in', tries, 'guess(es).'
                  > break
                  > elif guess < number:
                  > guess = input('Too low. Try again: ')
                  > elif guess > number:
                  > guess = input('Too high. Try again: ')
                  > except NameError:
                  > print 'Invalid number\n'
                  > continue
                  >
                  > raw_input()[/color]

                  Comment

                  • John Salerno

                    #10
                    Re: problems with looping, i suppose

                    Gary wrote:
                    [color=blue]
                    > 0 Alignment problem with the "except" clause.
                    > As I'm sure you've already discovered, Python is "whitespace
                    > sensitive".[/color]

                    Wow, I'm really confused. As it turns out, whitespace *was* the problem,
                    but it looks no different now (as it works) than it did then (when it
                    didn't work). I don't know if my copy/paste worked properly for you
                    guys, but as I see it in my newsreader, everything looks right.
                    try/excepts are indented inside whiles, if/else are indented within
                    tries, and if lines are indented under the ifs.

                    I just don't see where the problem was. Maybe it was a result of my text
                    editor doing whatever it does to auto-indent, because originally I
                    didn't have the while loop, so after adding it I had to indent the other
                    stuff. But it never *looked* wrong, so I don't get it...

                    Does what I originally pasted in my message look incorrect? To me, it
                    all seems indented properly.

                    Comment

                    • Scott David Daniels

                      #11
                      Re: problems with looping, i suppose

                      John Salerno wrote:[color=blue]
                      > Here's another question that is related:
                      >
                      > while True:
                      > year = raw_input('Ente r year (or other character to quit): ')
                      > try:
                      > year = int(year)
                      > except NameError:
                      > break
                      > ...
                      > raw_input()
                      >
                      > This works as expected, except that if you enter any character other
                      > than a number, the program just quits. Why doesn't it still execute the
                      > raw_input function and pause?[/color]

                      Here's a clue:
                      try:
                      try:
                      x = int('abc')
                      except FloatingPointEr ror:
                      print 'never reached'
                      print 'This is not reached either'
                      except ValueError:
                      print 'proper exception'
                      raw_input('Paus e and reflect:')

                      --Scott David Daniels
                      scott.daniels@a cm.org

                      Comment

                      • John Salerno

                        #12
                        Re: problems with looping, i suppose

                        akameswaran@gma il.com wrote:[color=blue]
                        > Ok I felt a little bad for my quick answer, these just seem like
                        > homework problems.[/color]

                        NP. I appreciate your help. These are just little exercises I found
                        online, just to give me a reason to use Python. :)

                        Comment

                        • Sion Arrowsmith

                          #13
                          Re: problems with looping, i suppose

                          John Salerno <johnjsal@NOSPA Mgmail.com> wrote:[color=blue]
                          >Does what I originally pasted in my message look incorrect? To me, it
                          >all seems indented properly.[/color]

                          Yes. Somewhere or other you've got your tabstop set to 4, and python
                          treats literal tabs as being of equivalent indent to 8 spaces. As
                          does my newsreader, so the problem was obvious:

                          while True:
                          tries += 1
                          ^ This was a tab (my cut&paste has turned it back into spaces)
                          try:
                          ^ This was a tab too.
                          if guess == number:
                          ^^^^^^^^ This was eight spaces even before I cut&pasted.

                          --
                          \S -- siona@chiark.gr eenend.org.uk -- http://www.chaos.org.uk/~sion/
                          ___ | "Frankly I have no feelings towards penguins one way or the other"
                          \X/ | -- Arthur C. Clarke
                          her nu becomeþ se bera eadward ofdun hlæddre heafdes bæce bump bump bump

                          Comment

                          • John Salerno

                            #14
                            Re: problems with looping, i suppose

                            Sion Arrowsmith wrote:[color=blue]
                            > John Salerno <johnjsal@NOSPA Mgmail.com> wrote:[color=green]
                            >> Does what I originally pasted in my message look incorrect? To me, it
                            >> all seems indented properly.[/color]
                            >
                            > Yes. Somewhere or other you've got your tabstop set to 4, and python
                            > treats literal tabs as being of equivalent indent to 8 spaces. As
                            > does my newsreader, so the problem was obvious:
                            >
                            > while True:
                            > tries += 1
                            > ^ This was a tab (my cut&paste has turned it back into spaces)
                            > try:
                            > ^ This was a tab too.
                            > if guess == number:
                            > ^^^^^^^^ This was eight spaces even before I cut&pasted.
                            >[/color]

                            Ah, that makes sense now! Thanks!

                            Comment

                            • Lawrence D'Oliveiro

                              #15
                              Re: problems with looping, i suppose

                              In article <DvWVf.1835$No6 .41771@news.tuf ts.edu>,
                              John Salerno <johnjsal@NOSPA Mgmail.com> wrote:
                              [color=blue]
                              >... and now when I run
                              >it, the DOS prompt flashes real quick and disappears.[/color]

                              Does your DOS OS not have the equivalent of xterm, or KDE Konsole, or
                              such? Something that lets you execute more than just one command, so you
                              can see the results of the previous command before the window disappears?

                              Comment

                              Working...