Not that it really matters, but since he lamented that the second Python solution was "longer and less elegant", I'll point out that that algorithm can be written in a functional style that is both short and (IMO) somewhat elegant. However with reduce being removed as a built-in since Python 3, this is arguably not Pythonic.
from functools import reduce
squares = (x * x for x in range(10))
min_and_max = lambda current, x: [min(current[0], x), max(current[1], x)]
minimum, maximum = reduce(min_and_max, squares, [next(squares)]*2)
print(minimum)
print(maximum)