Как сделать, чтобы функция принимала произвольное число массивов?
Пытаюсь сделать через *args, но видимо что-то не понимаю
def bubble_sort(array: list or tuple or str, desc=False) -> list or tuple or str:
type_array_before_convert = type(array)
if isinstance(array, (str, tuple)):
array = list(array)
compare_function = MAPPING_DESC_WITH_FUNCTION_COMPARE[desc]
for i in range(len(array) - 1):
sorted_array = True
for j in range(len(array) - i - 1):
if compare_function(array[j], array[j + 1]):
sorted_array = False
array[j], array[j + 1] = array[j + 1], array[j]
if sorted_array:
break
return MAPPING_TYPE[type_array_before_convert](array)
Были разные попытки, но всегда получается, что если писать несколько аргументов, то сортировать будет только последний и сразу отваливается флаг desc.
Ответы (1 шт):
args как раз и позволяет принять произвольное кол-во неименованных позиционных аргументов. args всегда tuple.
def foo(*args):
print(type(args), len(args), args)
foo(1, 2, 3)
foo(*[1, 2, 3])
foo([1, 2, 3])
первые 2 вызова дадут одинаковый результат. второй вызов даст tuple в котором будет list
поэтому передать произвольное число списков можно просто передав произвольное число списков
def foo(*args):
print(type(args), len(args), args)
foo([1, 2, 3], [3, 2, 1])
получится tuple в котором будет 2 списка
про foo(*[1, 2, 3]), звездочка в данном случае производит распаковку списка перед передачей аргументов в функцию. к примеру если у нас есть функция которая принимает 3 аргумента и список состоящий из 3-х элементов, то так можно заполнить агрументы не прибегая к обращению по индексам.
def foo(arg1, arg2, arg3):
pass
foo(*[1, 2, 3])
ну и так как у текущего метода foo есть только обязательные позиционные аргументы, то в случае если передаваемый список будет меньше или больше, то мы получим ошибку. и это можно исправить если мы точно знаем что нам будут передавать список длиной более чем 3 или равной этой длине то достаточно добавить args
def foo(arg1, arg2, arg3, *_):
pass
foo(*[1, 2, 3])
foo(*[1, 2, 3, 4])
в конце я специально использовал _ как имя для переменной на выброс.
Что по поводу "если писать несколько аргументов, то сортировать будет только последний и сразу отваливается флаг desc"? Мне трудно вразумить код метода. Если условие if compare_function(array[j], array[j + 1]) не будет выполнено, то sorted_array не станет False, и тогда по окончании вложенного for закончится и внешний по break. Посмею предположить что условие для break на самом деле нужно для вложенного for. Ну а про desc должно стать понятно из прочитанного выше.