2013-10-29 36 views
0

首先,我对python超级新,而且我实际上在寻找我的问题,但是这些例子很难理解。*之后的sqrt()参数必须是一个序列

这是我的家庭作业;我需要一个函数,它将两个函数作为参数,并在两个函数的结果相同或不相同时返回?基本上,它会给出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 
>>> 

我无法弄清楚,因为错误授予功能通常不会产生序列。所以,我不认为它使一个感觉:)任何帮助表示赞赏..谢谢:)

+1

你觉得什么图示操作'*在这种情况下'呢? – rlms

回答

11

z只是一个数字,但*参数扩展语法要求您按顺序传递(如listtuple或例如str)。

要么删除*(并让某一个参数的函数的工作),或使用*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以更好地反映其目的。

2

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

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

您需要删除*。它用于开箱。所以:

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

您使用*运营商如果要在一个迭代的对象传递,像listtuple的东西多数民众赞成分手了。因此,举例来说:

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

因此,对于任意函数,f

f(*a) = f(1,2,3,4,5) 
相关问题