![](/img/trans.png)
[英]I'm having trouble Looping through a folder and writing into another folder
[英]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
錯誤情況。
一些觀察:
希望有幫助!
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
建議它是一個類而不是一個函數)。
您將name
和x
聲明為全局變量,然后再不使用它們。 全局變量幾乎總是一個壞主意,未使用的聲明只會使您的代碼混亂。
正如@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.