Python按变量切片,最后一个索引

Python按变量切片,最后一个索引,python,slice,Python,Slice,我有一个函数,它应该返回包含片[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

我有一个函数,它应该返回包含片[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]
但是我很好奇是否还有别的办法。

怎么样

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([])
[]

我不确定您希望如何处理扩展列表边界的切片-忽略它们或引发错误?

您必须始终测试参数b。我会:

def my_slice(some_list, a=0, b=None):

  return some_list[a:b+1] if b else some_list[a:]

您可以使用
None
包含最后一个位置,但您需要检查是否没有负步骤

i=None
print("abcd"[-2:i])
将屈服

cd

老实说,我真的没想到。