Выполнение функции в зависимости от числа переданных аргументов
Написал функцию:
import math
def my_range(*args):
if len(args) == 3:
start = args[0]
stop = args[1]
step = args[2]
elif len(args) == 2:
start = args[0]
stop = args[1]
step = 1
elif len(args) == 1:
start = 0
stop = args[0]
step = 1
else:
raise TypeError()
k = start
result = []
while k < stop:
result.append(k**2)
k += step
return result
print(my_range(2,8,2))
print(my_range(2,8))
print(my_range(4))
Можно ли как-то более красиво и элегантно выполнять функцию в зависимости от того, сколько в неё аргументов передано?
Ответы (3 шт):
Автор решения: MaxU
→ Ссылка
можно так:
def my_range(start=0, stop=None, step=None):
if stop is None:
stop = start
start = 0
step = step or 1
...
Автор решения: frozencoast
→ Ссылка
Не уверен, что элегантнее, но точно короче
def my_range(*args):
if len(args) == 0:
raise TypeError()
start = args[0] if len(args) > 1 else 0
stop = args[0] if len(args) == 1 else args[1]
step = args[2] if len(args) > 2 else 1
k = start
result = []
while k < stop:
result.append(k**2)
k += step
return result
Автор решения: Mr. JS
→ Ссылка
Учитывая логику вашего кода, я вижу первоначальную ошибку с позиционированием аргумента stop. Стоит всего лишь поменять местами stop/start и задать значения аргументов функции по умолчанию, например:
def my_range(stop=1, start=0, step=1):
В этом случае никаких условий и проверок не нужно вообще, смотрите:
my_range(X, Y, Z) -> stop=X, start=Y, step=Z
my_range(X, Y) -> stop=X, start=Y, step=1
my_range(X) -> stop=X, start=0, step=1