Sry for the unclear formatting, this is the original code with correct format (copy from pycharm),
print('insert data into: ') data_insert_method = ['new collection', 'existing collection'] for index, elem in enumerate(data_insert_method): print(index, '-', elem) while 1: how_to_insert = input('Choose a method for inserting data: ') if how_to_insert: try: how_to_insert = int(how_to_insert) how_to_insert = data_insert_method[how_to_insert] break except ValueError: print('Please type in an integer corresponding to the data insert method') continue except IndexError: print('insert method index out of range') continue if how_to_insert == 'new collection': print('Set up collection name : ') db_name_setup = ['manual setup', 'return to main menu'] for index, elem in enumerate(db_name_setup): print(index, '-', elem) while 1: how_to_setup = input('Choose a method for setting up collection: ') if how_to_setup: try: how_to_setup = int(how_to_setup) how_to_setup = db_name_setup[how_to_setup] break except ValueError: print('Please type in an integer corresponding to the collection setup method') continue except IndexError: print('db name setup method index out of range') continue if how_to_setup == 'manual setup': print('Please type in collection name ') elif how_to_setup == 'return to main menu': print('return to main menu') On 24 September 2017 at 22:11, Cameron Simpson <c...@cskk.id.au> wrote: > On 24Sep2017 21:41, Daiyue Weng <daiyuew...@gmail.com> wrote: > >> Hi, I tried to make a menu using print statements in Python 3. The code is >> as follows, >> > > One thing, please try to preserve the code indenting in messages. What you > pasted is all hard against the left side of the screen. I've tried to > repair it. > > print('insert data into: ') >> data_insert_method = ['new collection', 'existing collection'] >> for index, elem in enumerate(data_insert_method): >> print(index, '-', elem) >> >> while 1: >> > > Remark: we tend to say "while True:", it reads more naturally. > > how_to_insert = input('Choose a method for inserting data: ') >> if how_to_insert: >> try: >> how_to_insert = int(how_to_insert) >> how_to_insert = data_insert_method[how_to_insert] >> break >> except ValueError: >> print('Please type in an integer corresponding to the data insert >> method') >> continue >> except IndexError: >> print('insert method index out of range') >> continue >> > > Another remark: it is better to keep try/except around as small a piece of > code as possible; I'd use two here, one for ValueError around the int() and > one for IndexError around the []. > > > if how_to_insert == 'new collection': >> print('Set up collection name : ') >> db_name_setup = ['manual setup', 'return to the main menu'] >> for index, elem in enumerate(db_name_setup): >> print(index, '-', elem) >> while 1: >> how_to_setup = input('Choose a method for setting up collection: ') >> if how_to_setup: >> try: >> how_to_setup = int(how_to_setup) >> how_to_setup = db_name_setup[how_to_setup] >> break >> except ValueError: >> print('Please type in an integer corresponding to the collection >> setup method') >> continue >> except IndexError: >> print('collection setup method index out of range') >> continue >> if how_to_setup == 'manual setup': >> print('Please type in collection name: ') >> elif how_to_setup == 'return to main menu': >> print('return to main menu') >> >> It is a 2-level menu, on the 2nd level menu 'new collection', there is an >> option - 'return to the main menu', I am wondering how to loop back to the >> 1st level menu, i.e. ['new collection', 'existing collection'], >> whenever 'return to the main menu' is selected. >> > > This is where the lack of indentation in your posted code bites; I've just > realised I've misread your logic because I misindented your code :-( Your > "while 1:" is just a loop around the input question, not around the menu > choices. > > I would go with a flag, and use it as your loop condition. Like this: > > running_inner_menu = True > while running_inner_menu: > > So something like this (untested): > > if how_to_insert == 'new collection': > running_inner_menu = True > while running_inner_menu: > print('Set up collection name : ') > db_name_setup = ['manual setup', 'return to the main menu'] > for index, elem in enumerate(db_name_setup): > print(index, '-', elem) > # obtain a valid choice > while 1: > how_to_setup = input('Choose a method for setting up collection: ') > if how_to_setup: > try: > how_to_setup = int(how_to_setup) > how_to_setup = db_name_setup[how_to_setup] > break > except ValueError: > print('Please type in an integer corresponding to the > collection setup thod') > continue > except IndexError: > print('collection setup method index out of range') > continue > if how_to_setup == 'manual setup': > print('Please type in collection name: ') > ... etc ... > elif how_to_setup == 'return to main menu': > print('return to main menu') > running_inner_menu = False > > All this depends a little on how your code was originally indented i.e. > exactly which portions of the code were within each while loop. I've > guessed at something reasonable, but can see that there's room for > different arrangements. > > But basicly, keep a state variable indicating that a loop should continue. > As a piece of terminology, a Boolean (True/False) state variable is often > called a flag. > > This has two advantages: > > It means you can turn it off anywhere and next time around the loop will > stop, whereas doing things directly with continue or break requires > "structural" control because they only jump out of the innermost loop, and > also they act right now, preventing other relevant stuff being done. > > Also it makes your code more readable and easier to reason able: a loop > which says "while running_inner_menu:" directly says that this loop > controls a repeating menu, and that you can get out by changing > "running_inner_menu". A bare "while 1:" or "while True:" requires the > reader to have to scan the code to figure out what is being controlled. > > Cheers, > Cameron Simpson <c...@cskk.id.au> (formerly c...@zip.com.au) > -- https://mail.python.org/mailman/listinfo/python-list