2012-12-10 85 views
2

我的整個代碼都在下面(不想錯過任何東西)。出於某種原因,我不斷收到一個錯誤,我無法將float轉換爲int?Python - 無法轉換爲int

import math 

def getRange(input): 
    if (1 <= input < 10): 
     return [1,1,9] 
    elif (10 <= input < 190): 
     return [2,10,99] 
    elif (190 <= input < 2890): 
     return [3,100,999] 
    elif (2890 <= input < 38890): 
     return [4,1000,9999] 
    elif (38890 <= input < 488890): 
     return [5,10000,99999] 
    elif (488890 <= input < 5888889): 
     return [6,100000,999999] 

def getDigit(input): 
    workingRange=getRange(input) 
    multi_digit_dec = ((input-workingRange[1])/workingRange[0])+workingRange[1] 
    multi_digit_float = math.floor((input-workingRange[1])/workingRange[0])+workingRange[1] 
    print multi_digit_float 
    multi_digit_int = input(multi_digit_float) 
    decimal_remainder = multi_digit_int - multi_digit_dec 
## digit_id = decimal_remainder * len(str(multi_digit_int)) 
## actual_digit = str(multi_digit_dec)[digit_id] 
## return actual_digit 


getDigit(100) 

我的錯誤是:上述更新

Traceback (most recent call last): 
    File "C:\Users\Samuel\Desktop\Python\concatenate string of variables and product values.py", line 29, in <module> 
    getDigit(100) 
    File "C:\Users\Samuel\Desktop\Python\concatenate string of variables and product values.py", line 22, in getDigit 
    multi_digit_int = int(multi_digit_float) 
TypeError: 'int' object is not callable 
>>> 

代碼,以反映輸入

+0

不要使用'int'作爲變量名,和你的代碼將正常工作。 –

+0

改變了這一點,但仍然沒有運氣。 –

+0

不可能,請發佈編輯後的代碼。 –

回答

6

問題是,您使用int作爲變量名稱,並且會影響built-in function。重命名變量。

一般來說,值得熟悉names of the built-in functions,以避免這類問題。

+0

我在整個代碼中做了這個改變,但它仍然返回相同的錯誤。 –

+1

@SamHeather:異常顯示代碼('int(multi_digit_float)'),你說不再出現在你的代碼中。有些事不太正確。 – NPE

+0

這就是我將float轉換爲int,而不是使用'int'作爲變量名稱。這就是爲什麼仍然存在。 –

4

稱爲int變量的變化,不要使用int變量名(函數getDigit)。

+0

解釋爲什麼它會導致功能變得不穩定可能會幫助OP – inspectorG4dget

+0

補充 - 謝謝總是忘記這些小東西,它們很難找到! –

+0

嗯 - 它沒有固定它? –

0

我想你想:

multi_digit_int = math.floor(multi_digit_float) 

另外,不要使用int作爲變量名。

+0

math.floor返回一個float不是嗎? –

0

您的更新代碼中的行multi_digit_int = input(multi_digit_float)的問題在於參數inputdef getDigit(input):中隱藏了內置的input()函數。由於您調用getDigit且參數爲100,函數input內部爲int實例,所以input(multi_digit_float)部分被解釋爲100(multi_digit_float),即int調用了某些內容。

1

在您的一堆elif語句中,如果您從測試開始,如果輸入數字小於1,則不需要檢查除第一個以外的範圍的下限。這將刪除elif中的一半。而且,對於像這樣的測試,使用循環更加緊湊。例如,以下代碼會生成下面顯示的輸出。

def getRange(k): 
    if k < 1: return None 
    e = 1 
    for d in [10, 190, 2890, 38890, 488890, 5888889]: 
     if k<d: 
      return [e, 10**(e-1), 10**e -1] 
     e += 1 
    return None 

for i in range(14): 
    print '{:8} {:20}'.format(i * 3**i, getRange(i * 3**i)), 
    if i&1: print 

輸出:

 0 None      3 [1, 1, 9]   
     18 [2, 10, 99]    81 [2, 10, 99]   
    324 [3, 100, 999]   1215 [3, 100, 999]  
    4374 [4, 1000, 9999]   15309 [4, 1000, 9999]  
    52488 [5, 10000, 99999]  177147 [5, 10000, 99999] 
    590490 [6, 100000, 999999] 1948617 [6, 100000, 999999] 
6377292 None     20726199 None