在Python3.6中,有没有一种方法可以将列表输入到以*args作为参数的函数中?
目前,我正在使用Python3.6处理一个名为“函数计算培训”的代码战问题。这个问题的工作方式是,例如,如果调用了在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
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
操作符
函数出现问题:pythondict
是非惰性的
请注意,pythondict
并不懒惰。这意味着,当您按照您的方式定义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
。我不知道该内置项。