Форум сайта python.su
Привет всем!
Помогите реализовать собственную функцию max.
Главная для меня проблема, не могу как следует распаковать все аргументы принимаемые функцией для сравнения. Либо код растягивается на очень много строк, либо просто не дает возможность сравнивать аргументы между собой.
Тестил на примерах:
max(3, 2)
max(, , , )
max([, , ], key=lambda x: x)
max(x + 5 for x in range(6))
max(abs(i) for i in range(-10, 10))
max(filter(str.isalpha,“@v$e56r5CY{]”))
Огромная просьба наставить на путь истинный и лучше без готового решения.
Заранее спасибо!
Прикреплённый файлы: images.jpg (5,9 KБ)
Офлайн
вам нужно 3 вещи
def my_max(*a, **b):
hasattr(a[0], '__iter__')
if 'key' in b: key = b['key']
Офлайн
правильнее будет вам почитать про *args, **kwargs в питоне!
Там как раз детально расписан ваш случай.
Офлайн
Учись пока я жив:
# MAX >>> reduce(lambda x,y: x if x > y else y, [0,10,5,8,100,9]) 100 # MIN >>> reduce(lambda x,y: x if x < y else y, [0,10,5,8,100,9]) 0
Офлайн
так reduce вроде как-бы не рекомендуют использовать (читаемость портится и тд и тп и бла бла бла)
Офлайн
Vigi
так reduce вроде как-бы не рекомендуют использовать (читаемость портится и тд и тп и бла бла бла)
Офлайн
На счет *args, **kwargs это понятно, что надо использовать, а теперь с помощью terabayt понятно как отделить итерируемые аргументы от неитерируемых.
Но распаковка итерируемых объектов страдает, г…код какой-то получается.
Получаются списки разной глубины вложенности при следующих случаях:
max([, , ], key=lambda x: x)
max(, , , )
На счет использования reduce. Интересно конечно, но работает когда у тебя уже создан список (а вот с этим как раз и проблема). Но и тут возникнут трудности при обработке значений по передаваемому key.
Я честно говоря выбирал max значение с помощью сортировки списка.
Отредактировано DenLadon (Июнь 28, 2016 18:45:46)
Офлайн