我有一个应该从列表中包含切片返回元素的函数[A,B]。如果A,B都是已知的,那么这是一个没有脑子:
def my_slice(some_list, a, b):
return some_list[a:b+1]
但是,有时用户可能希望在该范围的元素并[a,final_index]或[0,B]或[0,final_index]。天真的你可能只是添加默认值的参数
def my_slice(some_list, a=0, b=-1):
return some_list[a:b+1]
但是,这将失败
>>> li = range(5)
>>> my_slice(li)
[]
因为这是一样的li[0:0]
这当然是一个空列表。
我可以
def my_slice(some_list, a=0, b=-1):
return some_list[a:] if b==-1 else some_list[a:b+1]
但我很好奇,如果有一些其他的方式。
你总是要测试参数b。我会做:
def my_slice(some_list, a=0, b=None):
return some_list[a:b+1] if b else some_list[a:]
怎么样
def my_slice(some_list, a=0, b=-1):
if some_list:
return some_list[a:b] + [some_list[b]]
else:
return some_list
我认为应该涵盖所有情况:
>>> my_slice([1,2,3,4])
[1, 2, 3, 4]
>>> my_slice([1,2,3,4], 1,2)
[2, 3]
>>> my_slice([1,2,3,4], 1,3)
[2, 3, 4]
>>> my_slice([1,2,3,4], b=1)
[1, 2]
>>> my_slice([1,2,3,4], a=2)
[3, 4]
>>> my_slice([])
[]
我不知道你想怎么处理扩展列表边界片 - 忽略它们或引发错误?
您可以使用None
包括最后的位置,但你需要检查你没有负的一步。
i=None
print("abcd"[-2:i])
将产生
cd