程序运行一次后,代码的主要部分在继续之前循环一次,不确定为什么?

After the program runs once the main section of code loops itself once before proceeding and unsure why?

我刚刚想出了一个方法来利用 Python 列表来记住用户上次的菜单选择,但是在实施和 运行 它之后,在代码循环一次之后,我选择了一个菜单中的选项,它会自行循环一次,然后正常进行。

首先,我认为这可能与需要清除的 python 列表有关,但我尝试了 thislist.clear() 但没有成功。然后,我认为它与需要在代码的主要部分中使用的 number 输入变量有关,但是它没有用。不幸的是,我没有进一步的灵感,所以非常感谢您的帮助!

程序如下:

global thislist
thislist = [""]

def menu():  
    number = int(input("\nEnter option 1 or 2: ")) 
    return number

while True:
    try:  
        option_chosen = menu()
        if option_chosen == 1:
            balance()
    except: 
        break

显示:输入选项 1 或 2:1

def balance(): 
    while True: 
        try:
            selected_option_01 = int(input("\nEnter option 1 for view: "))
            if selected_option_01 == 1:
                view_bal = open("current_balance.txt", "r")
                print("\nBalance: " + view_bal.read())
                view_bal.close()
                thislist.append("balance")
                break
        except ValueError: 
            print("\n######      Not an option. Try again.      ######")
            continue
        finally: 
            add_trans()
        break

显示:输入选项 1 以查看:1

显示:余额:0

def add_trans(): 
    while True:
        try: 
            more_trans = int(input("Enter option 1 for menu or 2 for another transaction: "))
            if more_trans == 1:   
                menu()
            elif more_trans == 2:
                if "balance" in thislist:
                    balance()
                elif more_trans == 3: 
                    break                        
        except ValueError:
            print("######      Not an option. Try again.      ######")
            continue 
        break

显示:为菜单输入选项 1 或为另一笔交易输入选项 2:1

现在它循环回到代码的开头:

global thislist
thislist = [""]

def menu():  
        number = int(input("\nEnter option 1 or 2: ")) 
        return number
    
    while True:
        try:  
            option_chosen = menu()
            if option_chosen == 1:
                balance()
        except: 
            break

显示:输入选项 1 或 2:1

Displays: Enter option 1 or 2: 1 # 这部分在返回开始后打印两次

显示:输入选项 1 以查看:1

打印两次的提示来自不同的调用。第一个提示由 if more_trans == 1: 下的 menu() 发出,它要求输入,return 结果为空,对以后的函数调用不做任何操作。由于 while 循环在没有错误出现时不会中断,它会再次开始并且第二个提示来自 option_chosen = menu(),输入将用于重复过程。

虽然您已经进行了编辑以使示例更小以便于我们遵循,但我想对您的原始代码提出一些建议。

  1. 将变量作为函数参数传递,因此不需要全局变量。

  2. 不要将所有代码都放在 try 中,让它只处理会引发错误的部分。

  3. 可以直接用string校验,所以大部分try except都可以去掉

  4. 使用with打开文件,运行后会自动帮助您关闭文件。

  5. 可以使用单个文件保存帐户余额。

  6. 缺失条件:

    1. new_bal_entry没有值直接写,而new_bal_entry可能不是数字。
    2. 选项是 1、2 和 >3,== 3 怎么样?
    3. balance()选项2不追加thislist.
  7. balance()savings()几乎一样可以组合

  8. 如上所述,if more_trans == 1:下的menu()只是要求输入但之后什么都不做,你应该将你的menu()整合到主要部分。

下面的代码可能不是最好的,但应该会更好。

import random
def menu():
    while True:
        print("""
Which account would you like to access?

            1. Balance
            ----------
            2. Savings
            ----------""")
        account = input("\nEnter option: ")
        if account in ("1", "2"):
            access(account)
            break
        else:
            print("\n######      Not an option. Try again.      ######")

def access(account):
    with open("acc.txt", "r") as a:
        bals = a.readlines()
        bal = float(bals[int(account)-1].strip())
    while True:
        print("""
What would you like to do?

1. View
---------
2. Update
---------""")
        action = input("\nEnter option: ")
        if action == "1":
            print(f"\nBalance: {bal}")
            break
        elif action == "2":
            while True:
                try:
                    val = float(input("\nEnter amount: "))
                    break
                except ValueError:
                    print("Amount not correct.")
            with open("acc.txt", "w") as a:
                bals[int(account)-1] = f"{bal + val}\n"
                a.writelines(bals)
            break
        else:
            print("\n######      Not an option. Try again.      ######")
            continue
    add_trans(account)

def add_trans(account):
    while True:
        print("Would you like to do anything else?")
        print("""
            1. Menu
            ----------------------
            2. Another transaction
            ----------------------
            3. Quit
            ----------------------""")
        action = input("\n" + "Enter option: ")
        if action == "1":
            menu()
            break
        elif action == "2":
            access(account)
            break
        elif action == "3":
            print("\nTransaction ID:", random.randint(0,9999))
            break
        else:
            print("\n######      Not an option. Try again.      ######")

menu()

acc.txt:

0
0

测试运行:


Which account would you like to access?

            1. Balance
            ----------
            2. Savings
            ----------

Enter option: 1

What would you like to do?

1. View
---------
2. Update
---------

Enter option: 1

Balance: 0.0
Would you like to do anything else?

            1. Menu
            ----------------------
            2. Another transaction
            ----------------------
            3. Quit
            ----------------------

Enter option: 1

Which account would you like to access?

            1. Balance
            ----------
            2. Savings
            ----------

Enter option: 2

What would you like to do?

1. View
---------
2. Update
---------

Enter option: 2

Enter amount: 100
Would you like to do anything else?

            1. Menu
            ----------------------
            2. Another transaction
            ----------------------
            3. Quit
            ----------------------

Enter option: 3

Transaction ID: 8170

acc.txt 之后:

0
100.0