2015-11-26 73 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