我试图创建一个函数,该函数将数字列表或整数的平均值作为变量。到目前为止,我有:
def average(*args):
if type(args) is list:
for x in args:
print sum(x) / float(len(x))
else:
for x in args:
args = list(args)
print sum(x) / float(len(x))
当我输入一个列表时,比如
average([1, 3, 5, 2])
效果很好。但是当我进入
时average(1, 3, 5, 2)
它给出" TypeError:' int'对象不可迭代"。 我已经检查了其他问题,但没有一个解决方案似乎有用。我试图检查它是否是带有type()和isinstance()的列表,但每当我让其中一个工作时,另一个就会抛出错误。
答案 0 :(得分:3)
args是一个元组,所以检查args[0]
是否是args[0]
内容的总和列表,如果只是在sum args中传递整数:
def average(*args):
if isinstance(args[0],list):
print(sum(args[0]) / float(len(args[0])))
else:
print (sum(args) / float(len(args)))
In [2]: average(1, 3, 5, 2)
2.75
In [3]: average([1, 3, 5, 2])
2.75
如果您想接受元组,请使用collections.Iterable
:
from collections import Iterable
def average(*args):
if isinstance(args[0],Iterable):
print(sum(args[0]) / float(len(args[0])))
else:
print (sum(args) / float(len(args)))
In [5]: average([1, 3, 5, 2])
2.75
In [6]: average(1, 3, 5, 2)
2.75
In [7]: average((1, 3, 5, 2))
2.75
答案 1 :(得分:1)
x上的第二个print sum(x) / float(len(x))
调用len()
,这是一个整数。
我认为你的意思是:
else:
print sum(args) / float(len(args))
答案 2 :(得分:1)
def average(*args):
if type(args) is tuple:
r = 0
for x in args:
for y in x:
r += y
print r / float(len(x))
else:
print sum(args) / float(len(args))
average([2, 3, 8, 1, 9])
答案 3 :(得分:0)
代码中的if部分即if type(args) is list:
永远不会被执行。因为,每当使用*args
将非关键字参数传递给函数时,作为args
接收的值始终是元组。因此type(args) is list
始终为False
。需要做的是迭代通过*args
传递的参数并检查参数的类型,如果它是列表,那么你已经传递了一个列表i.e. average([1,3,5,7])
否则当传递整数时它将是整数{{ 1}}。所以下面的代码将起作用: -
i.e. average(1,3,5,7)
这里将为您提供两种输入类型的输出: -
def average(*args):
for x in args:
if type(x) == list:
# List is passed
return sum(x) / float(len(x))
# Assuming inputs passed restricted to list and numbers
# Numbers are passed as argument
return sum(args) / float(len(args))