2015-02-12 62 views
-1

我希望我的功能,如果用戶提供了無效的輸入使用遞歸再次運行,但我得到一個錯誤,當運行代碼:遞歸函數:類型錯誤:「海峽」對象不是可調用

> 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() 
+2

請勿爲該功能和用戶的輸入使用相同的名稱... – jonrsharpe 2015-02-12 00:01:41

+2

使用不同的局部變量名稱。它與函數名稱相沖突。另外,您可以使用'in'運算符來檢查輸入值 – karthikr 2015-02-12 00:03:10

回答

0

您創建了一個名爲triangle的字符串輸入,它也是函數的名稱。 小心!

1

由於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現在是一個海峽,不再以功能triangle()

這是一個參考一種很好的編碼習慣,可以在某種程度上代表它們包含的變量 - 在這種情況下是用戶響應;

變量名的微小變化,使您的工作方案:)

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() 

獎勵:

你可以讓你的if/else塊多用in簡單,特別是因爲你的反應總是相同(打印'是'並退出程序):

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

希望這有助於!

0

您將triangle分配給您的raw_input(),它將覆蓋您的函數聲明;因此,您致電'myinput'(),而不是triangle()。要解決這個問題,只需更改函數的名稱或raw_input()變量賦值。

相關問題