我一直试图创建一个简单的atm程序,我迷失了

时间:2013-11-29 05:03:06

标签: python-3.x

我需要帮助我正在创建的ATM python程序。我是Python新手,我担心我的编码太过分了,所以我必须从头开始。我试图通过def ():分隔这些部分,并且我一直收到错误。

Traceback (most recent call last):
  File "/Users/tonystrobach/Desktop/untitled3.py", line 44, in <module>
    deposit()
  File "/Users/tonystrobach/Desktop/untitled3.py", line 35, in deposit
    if (answer == "D") or (answer == "d"):
NameError: global name 'answer' is not defined

我一直在寻找并尽力掌握Python的概念。任何建议都会有所帮助。

这是我的代码:

该程序的目的是创建一个简单的ATM环境

由K. Strobach撰写11/22/13

def account():
    print ("Hello, welcome to Bank of Python!")
    print ("Please enter your account pin number")
    account = raw_input("Account pin number is 1234: ")
    account = (1234)

account()

def balance():
    print ("would you like to see your account balance?")
    see = raw_input("Enter Y or N: ")
    if (see == "Y") or (see == "y"):
        balance = int(0)
    print ("Current balance: $" + str(balance))

balance()

def transaction():
    print ("Would you like to make a transaction?")
    more = raw_input("Enter Y or N: ")

    if (more == "Y") or (more == "y"):
        print ("Would you like to make a deposit or withdraw? Or would you like to end this transaction?")
    answer = raw_input("Enter D for deposit; W for withdraw; E for end: ")

transaction()

def deposit():
    if (answer == "D") or (answer == "d"):
        print ("How much would you like to deposit?")
        deposit = input("Enter amount to deposit: ")
        deposit = int(deposit)

        currentbalance = deposit + balance
        print ("Deposited: $" + str(deposit))
        print ("Current Balance: $" + str(currentbalance))

deposit()

def withdraw():    
    if (answer == "W") or (answer == "w"):
        print ("How much would you like to withdrawl?")
        withdraw = input("Enter amount to withdraw: ")
        withdraw = int(withdraw)

        currentbalance = withdraw - balance
        print ("Withdrew: $" + str(withdraw))
        print ("Current Balance: $" + str(currentbalance))

withdraw()        

def end():
    if (answer == "E") or (answer == "e"):
        exit ("Thank you for Banking with Bank of Python, goodbye!")

    else:
        exit ("Thank you for Banking with Bank of Python, goodbye!")

end()

这是一堂课,但我并不担心,我只是想更好地了解如何使这项工作。

提前致谢。

3 个答案:

答案 0 :(得分:0)

这样简单,您可以将答案作为全局变量。不推荐,但是一个选项或者您可以通过键入将其传递给功能存款并将其称为使用存款(回答)
def deposit(answer):

如果您决定使用调用函数而不是只调用所有函数,无论它是什么让它使您的程序更加适合计算机。

最后一件事是你可能遇到一些问题,因为你有一个函数名称和一个int变量的平衡。

答案 1 :(得分:0)

您已在函数内声明answer。添加

answer  = 0

account()函数之上,无论你在哪里使用答案,都要添加

global answer

在那个功能中。因此,answer的范围仅限于特定功能,而不是功能之外。如果使用全局变量,则可以在任何函数中使用它。

答案 2 :(得分:0)

你提到这是关于学习的,我真的很尊重这一点,所以我将对你整体编写的代码提出一个完全不请自来的评论,试图指出我所看到的风格和实质性的改进一些。我相信你能得到更有能力的帮助,但我希望得到这样的反馈来自一个比我更远的人。已经指出了一个简短的答案,即你在该函数中引用它之前没有分配answer,但还有其他值得注意的事情。

为了保持简短答案的相关性,我还指出this关于范围如何适用于Python的良好答案。如果您只是想知道为什么answer无法正常工作,那应该可以解决问题。如果您想要一个非常繁琐的代码细分,请继续阅读:)

帐户

让我们先看看account。我只会说这一次,但你可以(尽管绝不是义务)print多行字符串。你可以通过多种方式实现这一目标:

print("This line\nwill print on\nthree lines!")

...打印

This line
will print on
three lines!

这里的关键是换行符\n。请注意,我说这是一个角色,而不是角色 s 。那将在某一天出现。

打印多行字符串的另一种方法是使用三引号使字符串成为多行:

print('''This line
will print on
three lines!''')

打印......好吧,和上面一样。人们并不热衷于这种方法,因为三重引号通常用于块注释和docstrings,但是没有法律可以反对它。

虽然我们在account,但我希望您考虑这对陈述的逻辑:

account = raw_input("Account pin number is 1234: ")
account = (1234)

这样做会提示用户输入一个密码,然后将其设置为(1234),无论如何。这可能是有意的 - 就像测试目的一样 - 但对我来说似乎很奇怪。我还不确定您是否正在尝试创建tuple(只需要一个尾随的逗号),但如果不是,那么您就是只是制作一个简单的整数,你可以说

account = 1234

这将消除意图的歧义。

我还提到raw_input是python 2.x函数,而在python 3k中你只需使用input。但是,您应该谨慎将用户提供的值转换为适当的类型:input返回string类型,无论用户输入什么。您可以通过调用int(input("some prompt"))快速将其转换为整数,但您可能希望捕获错误,例如,如果有人使用&#34响应该提示;我已经丢失并且对计算机不满意。&# 34;

平衡

当您询问用户是否想要查看其余额时,请将其设置为0!

balance = int(0)

对于在Python银行开展业务的人来说,没有必要,实际上有点令人沮丧。

这对您来说可能有点过于先进,但请考虑使用string formatting来打印余额。这是一个很好的方式来处理一个简单的功能中的小的可能性和结束。在这种情况下,您可以使用

之类的内容
print("Current balance: ${b:.2f}".format(b=balance))

交易

所以我不小心跳过了,看到你打算在以后的功能中使用answer。你提前思考,这很好,但是你在计算机之前思考,这很糟糕。在deposit范围内,answer尚不存在,因此当您询问它是=="D"时,它也不知道您在谈论什么。 应该抛出错误,您可以通过多种方式解决错误:

  1. 您可以将所有内容都放入transaction功能中(请不要这样做)
  2. 您可以分别将answer传递给 depositwithdraw,并让他们弄清楚他们每个人都想用它做什么(同样,没了)
  3. 你可以保持这种复杂程度,在if函数中运行来自depositwithdraw的{​​{1}}语句,然后调用其中的任何一个两场比赛(这听起来不错,让我们这样做)。
  4. 要采用选项3,您实际上会从每个函数中提取transaction语句,然后告诉每个函数运行相应的函数......以及它。像

    if

    当人们存钱时,您的if answer[0].lower()=="d": deposit() elif answer[0].lower()=="w": withdraw() else: print("I'm confused, this is not fun anymore.") 功能不会保留新余额。你提到这是一个简单的ATM程序,所以我试图限制我在评估这样的东西时所期望的功能范围,最终你可能比StackOverflow上的任何人都更清楚你的任务要求,但是想想如何保持新的平衡:)

    撤回

    与之前的所有内容相同

    漂亮确保deposit不参与辩论(换句话说,你不能在出路时留下分手信息)。只需exit你的再见,然后print静静地说。

    我还没有提出像函数参数或类(更不用说类属性或方法)这样的东西,其中任何一个都可以真正拓宽你的作业的范围和复杂性,但同时会让它更多有趣且有益的代码。你似乎在程序上思考,(在我看来)这对于掌握计算机如何通过事物进行操作是有益的。坚持下去;总有一天,你会回顾这段代码并思考如何对这些代码进行优化和抽象:P