问题描述
我想重写一段代码,以使其更有效。我正在使用Python工作,并且没有像Java那样的switch-break语句,但是我觉得类似的结构也可以工作。我正在谈论的代码片段是:
def update(arm,array1,array2,array3,array4,array5):
# If the array is empty,add a zero
if not array1:
array1.append(0)
if not array2:
array2.append(0)
if not array3:
array3.append(0)
if not array4:
array4.append(0)
if not array5:
array5.append(0)
总的来说,有什么好方法可以避免在Python中编写一系列的if语句,同时还要检查并检查每个数组中的该特定函数?
解决方法
您可以使用*args
更改函数以接受任意数量的数组,然后使用for
循环:
def update(arm,*arrays):
for index,array in enumerate(arrays):
if not array:
array.append(0)
if arm != index:
array.append(array[-1])
不仅缩短了时间,而且还可以处理传递给update
的任意数量的数组,因此update(arm,array1)
,update(arm,array1,array2)
等中的任何一个都可以工作。
如果由于某种原因您无法更改函数的签名,则仍然可以使用循环,但是必须对循环进行迭代的数组进行硬编码。
def update(arm,array2,array3,array4,array5,array6,array7,array8,array9,array10):
for index,array in enumerate(array1,array10):
if not array:
array.append(0)
if arm != index:
array.append(array[-1])
,
您可以为任何希望为空列表分配零元素的函数定义装饰器。这将允许您在不更改函数内部的任何内容的情况下添加初始化。
def noEmptyLists(func):
def decorated(*args,**kwargs):
for a in (*args,*kwargs.values()):
if isinstance(a,list) and not a:
a.append(0)
return func(*args,**kwargs)
return decorated
@noEmptyLists
def update(arm,array5):
print(arm,array5)
update(1,[],[])
# 1 [0] [0] [0] [0] [0]