2015-11-26 78 views
2

這是一個相當奇怪/愚蠢的問題,所以如果有人作爲一個更好的標題名稱,請請求編輯。Python列表類型

我創建了一個函數,它返回列表中數字的乘積。 當測試該功能,我試圖列出,包括intergers和實數(浮點),如items = [1,2.0,3,4.0]

功能:

items = [1.0, 2, 3.0, 10, "a"] 

def mult1(items): 
    total = 1 
    for i in items: 
      total = total * i 
    return total 

print mult1(items) 

該功能與上面的項目是[1.0,2,3.0的作品,10 ]並且該特定列表的輸出是60.0。

我已經學習了標準ML,通常只有一個特定類型的列表(我確定有代碼在那裏,以某種方式使我的聲明不相關),所以想了解如果我進入會發生什麼一個字符串作爲列表項,我做了,並得到一個錯誤(我期望得到一個錯誤,因爲你不能用一個數字乘以一個字符串)。

不過,我收到了錯誤混淆了我:

TypeError: can't multiply sequence by non-int of type 'float'

這個錯誤我感到困惑。我知道一個字符串不能相乘,但是這是否也意味着列表中的所有項目都被認爲是一個浮點數,儘管有些看起來像整數?

我認爲這個錯誤應該表明它不能計算一個不是浮點數或不是整數的類型,但是對於我來說(可能是錯誤的),它似乎意味着它不能將列表乘以一個類型是不是一個整數,也不是類型浮動?

對我來說,這聽起來像每個元素有兩種類型,整數和浮點數。

+1

你可以顯示你寫的代碼產生這個錯誤嗎? – chown

+0

向我們展示功能正常功能可以正常工作 – pythad

+0

我將爲我的功能添加代碼 –

回答

3

由於您(可能是無意)將序列(list,str,tuple)乘以float,您會看到此錯誤。

>>> a = [1, 2] 
>>> a * 2 
[1, 2, 1, 2] 
>>> a * 2.0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't multiply sequence by non-int of type 'float' 
>>> 
2

你可以乘一個字符串,但只有一個int,你看,你正試圖通過一個浮動乘以一個字符串錯誤:

In [7]: "foo" * 2 
Out[7]: 'foofoo' 

In [8]: "foo" * 2.0 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-8-3128e6ce951c> in <module>() 
----> 1 "foo" * 2. 

TypeError: can't multiply sequence by non-int of type 'float' 

在您的特定情況下,你想乘a從列表由浮動:

[1.0, 2, 3.0, 10, "a"] 
        ^
        error 

共開出一個int,但是當你通過一個浮動乘以一個int你得到一個浮點數所以total = total * 1.0 -> 1.0

In [9]: 1 * 1.0 
Out[9]: 1.0 
+0

我的功能是雖然找到列表的產品,所以使用列表,如[1,「a,2,」b「]不起作用 –

+0

@ChrisMulheron,有沒有可能是一個浮動* a_str可以工作,將'1.23456 *「foo」'輸出什麼? –

+0

啊好吧,我現在明白了,所以一旦一個整數乘以一個浮點數,剩下的數字在列表中的項目也被視爲一個浮點數,即使它們看起來像一個整數嗎?還是python知道如果它是一個整數來將該整數轉換爲一個浮點數? –

2

發生此錯誤是因爲您實際上可以通過ints而非浮點數乘以某些非數字類型。所以,如果你product功能看起來像:

def product(l): 
    prod = l[0] 
    for x in l[1:]: 
     prod *= x 
    return prod 

和您的列表如下所示:l = ['this string',3,2.0]

那麼你的迭代將顯示如下內容:

>>> def product(l): 
    prod = l[0] 
    for x in l[1:]: 
     prod *= x 
     print(prod) 
    return prod 

>>> l = ['this string',3,2.0] 
>>> product(l) 
this stringthis stringthis string 
Traceback (most recent call last): 
    File "<pyshell#69>", line 1, in <module> 
    product(l) 
    File "<pyshell#67>", line 4, in product 
    prod *= x 
TypeError: can't multiply sequence by non-int of type 'float' 

注意,第一次迭代被允許因爲str*int是一個有效的表達式(因此list*inttup*int等),因此prod仍然有效,但是是STRING,而不是int或float。那麼當您嘗試執行str*float表達式時,將會發生TypeError