*之后的sqrt()参数必须是一个序列

时间:2013-10-29 13:54:16

标签: python function parameters arguments typeerror

首先,我是python的新手,我实际上是在搜索我的问题,但实例很难理解。

这是我的作业;我需要一个函数,它接受两个函数作为参数,并返回两个函数的结果是否相同?基本上,它将给出TRUE为FALSE。

为此,我写道:

def f(x,y,z):
    k=x(*z)
    l=y(*z)
    return k == l

我为单个函数编写的previos代码正在工作但是当我为上述两个函数修改它时,它会产生如下错误:

import math
>>> f(math.sqrt,math.cos,5)

Traceback (most recent call last):
  File "<pyshell#56>", line 1, in <module>
    f(math.sqrt,math.cos,5)
  File "D:/Users/karabulut-ug/Desktop/yalanmakinesi.py", line 2, in f
    k=x(*z)
TypeError: sqrt() argument after * must be a sequence
>>> 

我无法弄明白,因为错误提供功能通常不需要序列。所以我不认为这是有道理的:)任何帮助表示赞赏..谢谢:)

3 个答案:

答案 0 :(得分:11)

z只是一个数字,但*参数扩展语法要求您传入一个序列(如listtuple或{{1} },例如)。

删除 str(并使您的函数仅适用于单个参数),或者在函数签名中使用*使*z为元组0个或更多被捕获的参数:

z

def f(x, y, z):
    k = x(z)
    l = y(z)
    return k == l

后者现在适用于具有多个参数的函数:

def f(x, y, *z):
    k = x(*z)
    l = y(*z)
    return k == l

如果您在签名中添加了f(math.pow, math.log, 10, 10) 参数,那么也可以处理关键字参数:

**kw

在此,我将def f(x, y, *args, **kwargs): k = x(*args, **kwargs) l = y(*args, **kwargs) return k == l 重命名为z,以更好地反映其目的。

答案 1 :(得分:2)

语法*zz上调用argument unpacking。当z只是一个整数时,没有定义迭代器行为,因此您会看到此错误。尝试:

>>> f(math.sqrt, math.cos, [5])

答案 2 :(得分:1)

您需要删除*。它用于拆包。所以:

def f(x,y,z):
    k=x(z)
    l=y(z)
    return k == l

如果要传递可迭代对象(如*list),则可以使用tuple运算符。所以,例如:

a = [1,2,3,4,5]

因此,对于任意函数,f

f(*a) = f(1,2,3,4,5)