首先,我是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
>>>
我无法弄明白,因为错误提供功能通常不需要序列。所以我不认为这是有道理的:)任何帮助表示赞赏..谢谢:)
答案 0 :(得分:11)
z
只是一个数字,但*
参数扩展语法要求您传入一个序列(如list
,tuple
或{{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)
语法*z
在z
上调用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)