Быстрый ответ
Этот вопрос возник, когда я впервые начал изучать Python, и я думаю, что стоит документировать этот метод здесь. Только одна проверка используется для имитации исходного поведения.
def list_range(start, stop=None, step=1):
if stop is None:
start, stop = 0, start
return list(range(start, stop, step))
Я думаю, что это решение немного более элегантно, чем использование всех аргументов ключевых слов или *args
.
Объяснение
Используйте Стража
Ключом к получению этого права является использование сторожевого объекта, чтобы определить, получаете ли вы второй аргумент, и если нет, предоставить значение по умолчанию для первого аргумента при перемещении первого аргумента во второй.
None
, будучи нулевым значением Python, является хорошим передовым примером, и идиоматический способ проверить это с ключевым словом is
, так как это одиночный код.
Пример с правильной строкой документации с объявлением подписи / API
def list_range(start, stop=None, step=1):
'''
list_range(stop)
list_range(start, stop, step)
return list of integers from start (default 0) to stop,
incrementing by step (default 1).
'''
if stop is None:
start, stop = 0, start
return list(range(start, stop, step))
Демонстрация
>>> list_range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list_range(5, 10)
[5, 6, 7, 8, 9]
>>> list_range(2, 10, 2)
[2, 4, 6, 8]
И возникает ошибка, если не приводятся аргументы, в отличие от решения с ключевыми словами здесь.
Протест
Кстати, я надеюсь, что читатель рассматривает это только с теоретической точки зрения, я не верю, что эта функция заслуживает обслуживания, если только она не используется в центральном каноническом месте для обеспечения кросс-совместимости кода между Python 2 и 3. В Python довольно просто материализовать диапазон в список с помощью встроенных функций:
Python 3.3.1 (default, Sep 25 2013, 19:29:01)
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]