On Jun 3, 11:12 am, Fdama <fsd...@gmail.com> wrote: > I combined the int conversion and the input on the same line, rather than to > have two different statements. But got an error message: > > Traceback (most recent call last): > File "C:\Users\Faisal\Documents\python\pizza_slicer.py", line 23, in > <module> > start=int(input("\nStart: ")) > ValueError: invalid literal for int() with base 10: '' > > Could someone tell me why I got this error message?
When you were presented the 'Start' prompt, you hit Enter, which causes `input` to return an empty string. As it's passed directly into `int`, which requires a valid string-representing-a-number, you get the ValueError traceback, which shows you the failing input it received: '' This doesn't happen in your original code, because your condition `if start:` will fail on an empty string, and not try to turn it into an int. You don't want to wrap your `input` with an `int`. You want to test the return result from `input` to ensure it can be coerced: start = input("\nStart: ")) if start and start.isdigit(): start=int(start) ... else: start='' # set start to empty string so the while loop repeats Here we check that all of the characters in the string `start` are actually numbers before coercing. This is known as the "Look Before You Leap" (LBYL) approach. Another approach is to catch the ValueError exception: start = input("\nStart: ")) try: start = int(start) except ValueError: start = '' if start: .... This is known as "Easier to for Ask Forgiveness than Permission" (EAFP). They both have their advantages. try/excepts tends to be quicker if few exceptions are called, while an if/else will test every time, although at this point it's not something you need to overly concern yourself with. Go with whichever is easiest for you to understand & extend. -- http://mail.python.org/mailman/listinfo/python-list