创建一个接受列表或整数作为参数的函数(Python)
我正在尝试创建一个函数,可以计算一组数字的平均值,或者直接计算几个整数的平均值。目前我有了:
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' object is not iterable”的错误。 我查看了其他问题,但没有一个解决方案能解决我的问题。我尝试用type()和isinstance()来检查它是否是一个列表,但每当我让其中一个方法有效时,另一个就会报错。
相关文章:
- 暂无相关问题
4 个回答
0
你代码中的这个部分 if type(args) is list:
是永远不会被执行的。因为每当你通过 *args
传递非关键字参数时,接收到的 args
总是一个元组(tuple)。所以 type(args) is list
这个判断永远会返回 False
。你需要做的是遍历通过 *args
传递的参数,检查每个参数的类型。如果参数是列表,那就说明你传递了一个列表,比如 average([1,3,5,7])
;如果传递的是整数,那就会是整数,比如 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))
这样你就可以对这两种输入类型都得到输出了 :-
>>> average([1,3,5,7])
4.0
>>> average(1,3,5,7)
4.0
1
第二个 print sum(x) / float(len(x))
这段代码在对 x 使用 len()
函数,而 x 是一个整数。
我想你想表达的意思是:
else:
print sum(args) / float(len(args))
1
在 repl.it 上的示例
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])
6
这里的args是一个元组,所以要检查一下args[0]
是不是一个列表。如果是列表,就把args[0]
里面的内容加起来。如果只是传入整数,那就直接把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