递归函数:TypeError:'str'对象不可调用

时间:2015-02-12 00:00:17

标签: python recursion typeerror

如果用户提供无效输入,我希望我的函数再次使用递归运行,但是当代码运行时我收到错误:

> TypeError: 'str' object is not callable.

这是我的代码。

y = 'yes'
y1 ='Yes'
y2 = 'y'
y3 = 'Y' 

def triangle():
    triangle = raw_input('Is the triangle a 45-45-90 or a 30-60-90? ')
    if triangle == y:
        print 'yes'
    elif triangle == y1:
        print 'yes'
    elif triangle == y2:
        print 'yes'
    elif triangle == y3:
        print 'yes'
    else:
        print 'you must enter '+ y +' or ' + y1 + ' or ' + y + ' or ' + y3
        triangle()

3 个答案:

答案 0 :(得分:2)

由于Python是一种动态语言,因此您可以将变量类型从一个变量重新分配给另一个变量 - 在这种情况下,无意中重新分配。

当您使用相等的=符号设置变量时,您实际上不仅要分配值,还要分配推断类型。

这个小测试可以显示动态变化的变量类型:

i = 1 
type(i) ## int
i = "s" 
type(i) ## str

要了解有关动态特性以及变量赋值如何更改变量类型的更多信息,请参阅以下链接: http://www.python-course.eu/variables.php

这是流程

  1. 您的函数名称为triangle
  2. 立即在函数内部创建一个变量triangle,这是一个str
  3. 当您的else块执行时,它会出错,因为triangle现在是一个str而不再是对函数triangle()的引用
  4. 这是一个很好的编码实践,可以将变量命名为它们包含的内容 - 在这种情况下,用户响应;

    变量名称的微小变化使您的程序工作:)

    import math
    
    y = 'yes'
    y1 ='Yes'
    y2 = 'y'
    y3 = 'Y'
    
    def triangle():
        response = raw_input('Is the triangle a 45-45-90 or a 30-60-90? ')
        if response == y:
            print 'yes'
        elif response == y1:
            print 'yes'
        elif response == y2:
            print 'yes'
        elif response == y3:
            print 'yes'
        else:
            print 'you must enter '+ y +' or ' + y1 + ' or ' + y + ' or ' + y3
            triangle()
    
    if __name__ == "__main__":
        triangle()
    

    加成:

    您可以使用in使if / else块更简单,因为您的响应始终相同(打印'是'并退出程序):

    if response in (y, y1, y2, y3):
        print 'yes'
    

    希望这有帮助!

答案 1 :(得分:0)

您创建了一个名为triangle的字符串输入,它也是您的函数的名称。的小心!

答案 2 :(得分:0)

您已将triangle分配给raw_input(),这会覆盖您的功能声明;因此,您正在呼叫'myinput'(),而不是triangle()。要解决此问题,只需更改功能名称或raw_input()变量分配。