import functools
def abstract(*args, **kwargs):
compare = kwargs.get('compare', lambda x,y: x > y)
key = kwargs.get('key', lambda x: x)
values = iter(args[0]) if len(args) == 1 else iter(args)
result = next(values)
for i in values:
if compare(key(i), key(result)):
result = i
return result
max = functools.partial(abstract, compare=lambda x,y: x > y)
min = functools.partial(abstract, compare=lambda x,y: x < y)
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert max(3, 2) == 3, "Simple case max"
assert min(3, 2) == 2, "Simple case min"
assert max([1, 2, 0, 3, 4]) == 4, "From a list"
assert min("hello") == "e", "From string"
assert max(2.2, 5.6, 5.9, key=int) == 5.6, "Two maximal items"
assert min([[1, 2], [3, 4], [9, 0]], key=lambda x: x[1]) == [9, 0], "lambda key"
https://www.checkio.org/mission/min-max/