你必须考虑到你只有的情况one元素:
def comma_separator(sequence):
if not sequence:
return ''
if len(sequence) == 1:
return sequence[0]
return '{} and {}'.format(', '.join(sequence[:-1]), sequence[-1])
注意bool(sequence) is True
是一种非常复杂的测试非空列表的方法;简单地使用if sequence:
就足够了if
语句寻找布尔值真值already.
可以说,使用序列以外的任何内容(可以索引并具有长度的内容)调用该函数应该只会导致异常。您通常不会测试此类函数中的类型。如果你did必须测试一种类型,使用isinstance(sequence, list)
至少允许子类。
我还会将传递空列表设为错误。你可以将该异常变成ValueError
:
def comma_separator(sequence):
if len(sequence) > 1:
return '{} and {}'.format(', '.join(sequence[:-1]), sequence[-1])
try:
return sequence[0]
except IndexError:
raise ValueError('Must pass in at least one element')
后者的演示:
>>> def comma_separator(sequence):
... if len(sequence) > 1:
... return '{} and {}'.format(', '.join(sequence[:-1]), sequence[-1])
... try:
... return sequence[0]
... except IndexError:
... raise ValueError('Must pass in at least one element')
...
>>> comma_separator(['foo', 'bar', 'baz'])
'foo, bar and baz'
>>> comma_separator(['foo', 'bar'])
'foo and bar'
>>> comma_separator(['foo'])
'foo'
>>> comma_separator([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in comma_separator
ValueError: Must pass in at least one element