Python 3 - Fibonacci Implementation
I don't see why you need to special case n == 0. The 

def fib(....):
    for _ in range(n):
        f0, f1 = f1, f0 + f1
    return f0


seems cleaner, even though it does one extra addition.
The Fibonacci are well defined in the negative domain as well. For example, \$F_{-1}\$ can be derived from the same recurrence (\$F_1 = F_0 + F_{-1}\$), etc, so handling negative n in this particular problem is a bit trickier.
Performance wise, yes it is possible to compute the nth number in \$O(\log{n})\$ time, either by matrix exponentiation, or by exploiting the

\$F_{2n-1}=F_{n}^{2}+F_{n-1}^{2}\\F_{2n}=(F_{n-1}+F_{n+1})F_{n}\$

identities.