簡體   English   中英

我在元組中循環遇到問題

[英]I'm having issues looping through a tuple

我正在編寫一個模擬銀行場景的程序。 它允許用戶(一旦登錄)顯示余額,取款和存款,並且最終將包含轉賬子例程。

我的問題是登錄子例程。 我無法讓我的代碼遍歷保存它們的元組中的兩個帳戶。 我可以登錄第一個帳戶並使用該帳戶執行所有代碼的功能,但是當我嘗試訪問第二個帳戶時,出現錯誤消息,提示我找不到該帳戶。 我非常確定這與我編寫循環的方式有關,但是我不知道該如何解決。

如果有人可以為我提供解決該錯誤的解決方案,那么我將不勝感激。 如果可能,該解決方案是否也可以堅持我的代碼的一般格式,而不是我必須創建新功能並更改LogOn函數的整個主體的格式?

這是代碼:

accounts=[
["Luke",'00001','1234',1337],
["Louis",'00002','4321',420],
]

name = ""       
x = []          

def LogOn():
    global name        
    global x
    print ("Welcome to the Bank of Bailey")
    accnum = raw_input("-please enter your account number-")        
    if len(accnum) != 5:              
        print("That number is not valid, please enter a valid number")
        LogOn()
    else:
        for x in range(0,len(accounts)):          
            if accnum in accounts[x][1]:            
                name = accounts[x][0]              
                print ("Account found")
                pin = raw_input("-please enter your pin-")         
                if pin in accounts[x]:          
                    print ("Pin found")
                    MainMenu()           
                else:           
                    print("Pin not found")
                    print("Please try again")
                    LogOn()         
                    break
            else:             
                print("Account not found")
                print("Please try again")
                LogOn()           

問題是:

if accnum in accounts[x][1]:
     do something
else:             
     print("Account not found")
     print("Please try again")
     LogOn()

else分支已經在第一次迭代中被調用(x = 0)! 您應該在while循環之后檢查是否找到了帳戶,否則請打印錯誤消息。

與其遞歸到LogOn() ,不如使用一個外部(endless-)while循環,它調用LogOn()更好。 然后在LogOn中return錯誤情況。

一些觀察:

  • 當x = 0時,else分支在第一次迭代時被調用。 您需要完成for循環,如果尚未找到該帳戶,則分支。
  • if帳戶[x]中的圖釘是一個安全漏洞,因為它允許人們使用其姓名或帳號作為圖釘!
  • “如果帳戶[1]中的帳戶”應為“如果帳戶==帳戶[1]”

希望有幫助!

    accounts=[
    ["Luke",'00001','1234',1337],
    ["Louis",'00002','4321',420],
    ]

    name = ""       
    x = []          

    def LogOn():
        global name        
        global x
        print ("Welcome to the Bank of Bailey")
        accnum = raw_input("-please enter your account number-")        
        if len(accnum) != 5:              
            print("That number is not valid, please enter a valid number")
            LogOn()
        else:
            found = False
            for account in accounts:
                if accnum == account[1]:
                    found = True
                    name = account[0]              
                    print ("Account found")
                    pin = raw_input("-please enter your pin-")         
                    if pin in account[2]:          
                        print ("Pin found")
                        MainMenu()
                    else:
                        print("Pin not found")
                        print("Please try again")
                        LogOn()  
                        break

            if not found:
                print("Account not found")
                print("Please try again")
                LogOn()   

我喜歡@TimSC的答案,但是我還會添加一些觀察結果:

  • LogOn不是一個好的函數名稱; 它應該是log_on以匹配PEP8命名約定LogOn建議它是一個類而不是一個函數)。

  • 您將namex聲明為全局變量,然后再不使用它們。 全局變量幾乎總是一個壞主意,未使用的聲明只會使您的代碼混亂。

  • 正如@CTX指出的那樣,您正在使用遞歸( LogOn調用LogOn調用MainMenu調用LogOn等),在這種情況下迭代會更有意義-您應該退出錯誤,而不是再次調用更深的級別。

  • 混合輸入/輸出代碼和操作代碼通常是一個錯誤的決定; 它使代碼的靈活性和可重用性降低,並且通常也更難以調試。 相反,您應該具有輸入/輸出函數,該函數使用所需的值來調用操作函數。

  • 分別為錯誤的帳號提供錯誤消息,錯誤的密碼是一個安全漏洞; 這使潛在的攻擊者更容易找到有效的帳號進行攻擊。

  • 在列表中查找內容相對較慢( O(n)即時間與列表中項目的數量成正比)。 改用dict( O(1)即恆定時間-快速哈希計算可讓您直接找到要查找的項目)。

這是一個幻想的版本; 可能會讓您想到的事情:

import sys

# version compatibility shim
if sys.hexversion < 0x3000000:
    inp = raw_input   # Python 2.x
else:
    inp = input       # Python 3.x

class Account:
    index = {}

    __slots__ = ("accnum", "pin", "name", "balance")

    @classmethod
    def log_in(cls, accnum, pin):
        key = (accnum, pin)
        acc = Account.index.get(key, None)
        if acc is None:
            raise ValueError("No such login (bad account# or PIN)")
        else:
            return acc

    def __init__(self, accnum, pin, name, balance):
        # save values
        self.accnum = accnum
        self.pin = pin
        self.name = name
        self.balance = balance
        # add self to account index
        key = (accnum, pin)
        Account.index[key] = self

# create accounts
Account('00001', '1234', "Luke",  1337)
Account('00002', '4321', "Louis",  420)

def main():
    while True:
        print("\nWelcome to the Bank of Bailey")
        accnum = inp("Please enter your account number: ").strip()
        pin    = inp("Please enter your PIN: ").strip()

        try:
            acc = Account.log_in(accnum, pin)
            print("\nYour account has a current balance of ${:0.2f}".format(acc.balance))
            print("Thank you for banking with us!")
        except ValueError as ve:
            print(ve)

if __name__ == "__main__":
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM