在Python3.6中,有没有一种方法可以将列表输入到以*args作为参数的函数中?

在Python3.6中,有没有一种方法可以将列表输入到以*args作为参数的函数中?,python,python-3.x,algorithm,data-structures,args,Python,Python 3.x,Algorithm,Data Structures,Args,目前,我正在使用Python3.6处理一个名为“函数计算培训”的代码战问题。这个问题的工作方式是,例如,如果调用了seven(times(five()),那么函数应该返回35。以下是我的代码片段: def nine(arr): # your code here if arr is None: return 9 return operator(arr[0], 9, arr[1]) def plus(num): # your code here ret

目前,我正在使用Python3.6处理一个名为“函数计算培训”的代码战问题。这个问题的工作方式是,例如,如果调用了
seven(times(five())
,那么函数应该返回35。以下是我的代码片段:

def nine(arr):  # your code here
    if arr is None:
        return 9
    return operator(arr[0], 9, arr[1])


def plus(num):  # your code here
    return ["+", num]


def operator(op, n1, n2):
    switcher = {
        "+": n1 + n2,
        "-": n1 - n2,
        "*": n1 * n2,
        "/": n1 / n2
    }

    return switcher.get(op, "Invalid")
完整代码在此链接上(带->顶部和不带->底部参数):

我这里的逻辑(最初)是使用
*args
作为参数,如果
args
None
,则函数将返回自己的值(
five()=>5
),然后将该值传递到一个“operator”函数中,该函数将返回自己的运算符列表(即+,-,/,*)然后把号码传进去。然后,在最外层的函数中,您将从“operator”函数传入数组,因为
args
不是
None
,您将获取
args
元组中的第一项(传入的“operator”函数返回的值),然后您将访问列出第一和第二个值的数组,其余的都是不言自明的

然而,当我试图运行这个程序时,我会得到超出元组范围的错误
索引(参考:Hastebin上的第95行)。结果,我切换到一个新的逻辑,在那里我将显式地将参数添加到。函数,但(显然)在运行时,出现了一个错误,即没有向函数传递任何参数(最里面的函数-->
five()
seven(times(five())

我想知道是否有任何方法可以修复我现有的代码,但任何替代解决方案都是非常受欢迎的


此外,这里还有一个指向kata的链接:

您可以为参数指定默认值。如果未传递任何参数,则将使用默认值。由于您检查了
None
,因此可以使用
None
作为默认值

defnine(arr=None):
如果arr为无:
返回9
其他:
返回运算符(arr[0],9,arr[1])
def 5(arr=无):
如果arr为无:
返回5
其他:
返回运算符(arr[0],5,arr[1])
def plus(num):#您的代码在这里
返回[“+”,num]
def操作员(op、n1、n2):
切换器={
“+”:n1+n2,
“-”:n1-n2,
“*”:n1*n2,
“/”:n1/n2
}
返回切换器get(op,“无效”)
打印(九加五)
# 14
操作符
函数出现问题:python
dict
是非惰性的 请注意,python
dict
并不懒惰。这意味着,当您按照您的方式定义
switcher
时,它会立即执行四个计算
n1+n2、n1-n2、n1*n2、n1/n2
。这是一个问题,特别是因为如果de>n2
0

一种解决方案是使用函数的dict而不是数字的dict:

def操作员(op、n1、n2): 切换器={ “+”:λx,y:x+y, “-”:λx,y:x-y, “*”:λx,y:x*y, “/”:λx,y:x/y, } 返回开关[op](n1,n2) 请注意,这四个函数已经在python模块
operator
中定义,它们被称为
add
sub
mul
floordiv
(或
truediv
)。例如,
operator.add(x,y)
x+y
的同义词。但是您可以编写一些有趣的东西,如
返回运算符。添加
,而不能用python编写
返回(+)

由于此模块已被称为
操作符
,您可能应该为
操作符
函数找到另一个名称

导入操作符
def九(arr=无):
如果arr为无:
返回9
其他:
返回执行操作(arr[0],9,arr[1])
def plus(num):#您的代码在这里
返回[“+”,num]
def执行操作(操作、n1、n2):
切换器={
“+”:operator.add,
“-”:operator.sub,
“*”:operator.mul,
“/”:operator.floordiv
}
返回开关[op](n1,n2)
打印(九加九)
# 18
另一种方法是:使
加上
返回一个函数
这是另一种方法,它不将操作存储为字符串和数字列表,也不需要额外的函数
operator
/
exec_op
来评估操作

我们将使
加上(y)
直接返回函数
?+y

def plus(y):
返回λx:x+y
def九(op=None):
如果op为无:
返回9
其他:
返回op(9)
打印(九加九)
# 18
我们可以通过使用函数而不是
None
作为
nine
的默认参数来进一步简化此过程:

identity=lambda x:x
def plus(y):
返回λx:x+y
def九(op=标识):
返回op(9)
打印(九加九)
# 18

我会为
id
使用一个不同的名称,你不应该对内置项进行阴影处理。@Jasmijn谢谢!我将其重命名为
identity
。我不知道该内置项。