改进将 ['abc'、'def'、'ghi'] 列表分隔为 ('abc'、['def'、'ghi']) 的功能?

Improve function of seperating lists of form ['abc', 'def', 'ghi'] into ('abc', ['def', 'ghi'])?

我有以下代码段将列表的第一个元素和其余元素分成两个变量:

test1 = [['p', '(q ∧ ¬(q))', '¬(p)'], ['p', '(¬(p) ∧ ¬(¬(p)))', '¬(p)']]
test2 = ['p', '(q ∧ ¬(q))', '¬(p)', 'q']

def seperate(data, index=None):
    if index == None:
        head = data[0]
        origin = data[1:]
    else:
        head = data[index][0]
        origin = data[index][1:]

    return (head, origin)

print(seperate(test1,0))
print(seperate(test2))
print(seperate(test1,1))

输出:

('p', ['(q ∧ ¬(q))', '¬(p)'])
('p', ['(q ∧ ¬(q))', '¬(p)', 'q'])
('p', ['(¬(p) ∧ ¬(¬(p)))', '¬(p)'])

这很好用。我的问题是功能的外观,例如通过 if else 语句。

原因在两个 if else 块中几乎完全相同。两个输入的尺寸略有不同。

我的问题是他们以这种方式优化代码的方法我只有一个分配 head = ... 和一个分配 origin = ...

您可以将其归结为:

def seperate(data, index=None):
    return(data[0], data[1:]) if index == None else (data[index][0], data[index][1:])

这是获得相同行为的更简洁的方法:

def seperate(data, index=None):
    list_to_split = data if index is None else data[index]
    return (list_to_split[0], list_to_split[1:])

SRP! KISS!

函数应该只做一件事,而不用担心同一件事的不同突变,尤其是当函数的调用者从中得到的好处很少时。对于来电者来说,这些有什么区别?

seperate(test1, 0)
seperate(test1[0])

基本没有。

该函数不应接受任何 index 参数,调用者只需确保传入 一个 列表而不是嵌套的列表列表。