0

首先,我是 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
>>> 

我想不通,因为错误给出函数通常不需要序列。所以我认为这没有任何意义:) 任何帮助表示赞赏.. 谢谢 :)

4

3 回答 3

11

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

要么删除*(并使您的函数仅适用于单个参数),要么在函数签名中使用以*z创建z一个包含 0 个或多个捕获参数的元组:

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

在这里我重命名zargs以更好地体现其目的。

于 2013-10-29T13:56:24.923 回答
2

该语法*z调用参数解包on z。Whenz只是一个整数,没有定义迭代器行为,因此您会看到此错误。尝试:

>>> f(math.sqrt, math.cos, [5])
于 2013-10-29T13:56:53.943 回答
1

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

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

*当你想传入一个可迭代的对象时,你可以使用运算符,比如 alisttuple作为拆分的东西。因此,例如:

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

因此,对于任意函数,f

f(*a) = f(1,2,3,4,5)
于 2013-10-29T13:57:04.800 回答