【问题标题】:Why doesn't my function work?为什么我的功能不起作用?
【发布时间】:2015-10-28 15:27:34
【问题描述】:

当我在 python-2.7 中编写此代码时,我收到一条反复运行的消息,有人能告诉我它有什么问题吗?

num = raw_input("enter your number : ")

def calc():
    if num == "1":
        print "ok"
    else:
        print "right"
    calc()

calc()  

它一遍又一遍地打印okright

那么如果我想在每次打印后回到初始状态(请求输入)怎么办?

【问题讨论】:

  • 你为什么大喊大叫?
  • 编辑使它更清晰。有人可以把它从搁置列表中删除吗?
  • 也许你想把num = raw_input("enter your number : ")放在函数里面。
  • @Flying_Banana 现在很清楚了,但似乎这个问题真的离题了。
  • 但就当前编辑而言,存在所需的行为(再次要求输入)、当前错误(一遍又一遍地打印而不要求输入)以及产生此错误的示例代码,所以它根据定义构成一个最小、完整和可验证的示例。

标签: python function python-2.7


【解决方案1】:

因为您在calc() 函数内再次调用calc(),所以它会重复自己,使其成为无限循环。

def calc():
    if num == "1":
        print "ok"
    else:
        print "right"
    calc()  # <-- Why is this here?

那么如果我想在每次打印后回到初始状态(请求输入)怎么办?

那么你需要在循环内再次请求输入:

def calc():
    num = raw_input("enter your number : ")
    if num == "1":
        print "ok"
    else:
        print "right"
    calc()

calc() 

【讨论】:

  • 虽然这在原则上是可行的,但实际上它会无限递归,每次都会向堆栈添加一个新的函数调用。虽然这需要一段时间,但这是一种浪费,当超过最大递归深度时,解释器会崩溃。
  • 我几乎同意你的看法,除了用gcc -O3 编译的代码将执行尾递归,所以没有区别:)
  • @Fyling_Banana 这是 python,而不是 C/++。 CPython 可以用-O3 编译,它执行的代码不是。另见stackoverflow.com/a/13592002/5349916。事实上,def foo(): foo() 足以测试这一点。
【解决方案2】:

如果你一遍又一遍地调用同一个函数,你迟早会遇到堆栈溢出。为了无限重复某些内容,请使用循环,例如forwhile

def calc():
  while True:
    num = raw_input("enter your number : ")
    if num == "1":
      print "ok"
    else:
      print "right"

calc()

您也绝对应该考虑添加一个退出循环的条件。比如检查输入是否为"q",然后执行break

  while True:
    num = raw_input("enter your number : ")
    if num == "q":
      break
    elif num == "1":
      print "ok"
    else:
      print "right"

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多