Como a saída tem 6 valores, o range tem que ter um intervalo para 6 repetições. Dado que o valor b do range não é incluído fica -4 e 2, pois de -4 até 1 tem 6 valores, e o 2 não incluído.
O ** eu não sabia, mas pelo jeito é potência. Então passando 2 como c, ele vai calcular -4^2 = 16, -3^2 = 9, -2^2 = 4 ....
Para os que não são familiarizados com a linguagem e ficaram perdidos igual eu.
O valor de "k" será defino no próprio "for" usando o "range"
a defnição de Range: The function returns a sequence of numbers, starting from 0 by default, and increments by 1 (by default), and stops before a specified number.
Então vai do primeiro número em incrementos de "1 em 1" (por padrão) e para ANTES do segundo número especificado.
Logo, temos:
---------------
def F(a, b, c):
for k in range(a,b):
print k ** c
--------------
def F(-4, 2, 2):
for k in range(-4,2): **Reparem que lood rodará 6 vezes (-4,-3,-2,-1,0,1)
----------------
print -4 ** 2
16
----------------
print -3 ** 2
9
E por ai vai. Sei que é óbvio para quem manja da linguagem mas para os desavisados igual eu fica a explicação