Как правильно размещать return?
def f(x):
    if x <= -2.: # здесь и дальше явный float предпочтителен
        return 1. - (x + 2.) * (x + 2.)
    elif x <= 2.: # выкинуть лишнее сравнение
        return -0.5 * x # унарный минус перед x - это отдельная операция, нафиг её
    return (x - 2.) * (x - 2.) + 1.
Все варианты приемлемы.