Тут физы с базами перепутаны :)
По замыслу это работает так:
Заходит число 3
[3 - math.ceil((3 % 3) / 2) * 2 - math.ceil((3 % 5) / 4)]
Вначале считается вот эта часть math.ceil((3 % 3) / 2) * 2
3 % 3 = 0
0 / 2 = 0
0 * 2 = 0
Далее считаем math.ceil((3 % 5) / 4):
3 % 5 = 3
ceil от 3/4 = 1
Соответственно получаем:
3 - 0 - 1 = 2
И возвращаем [str(i), 'fizz', 'buzz', 'fizzbuzz'][2]
Допустим зайдёт число 4:
math.ceil((4 % 3) / 2) * 2
4 % 3 = 1
1 / 2 = 0.5 => ceil(0.5) = 1
1 * 2 =
2
math.ceil((4 % 5) / 4)
4 % 5 = 4
4 / 4 =
1
3 - 2 - 1 =
0
Вернёт [str(i), 'fizz', 'buzz', 'fizzbuzz'][0]
Кстати в 3-ем питоне всё прекрасно работает, т.к. ceil возвращает int.
P.S.: Я, когда развлекался, решил вот таким способом:
fizzbuzz = lambda x: "Fizz Buzz" if x % 5 == 0 and x % 3 == 0 else "Fizz" if x % 3 == 0 else "Buzz" if x % 5 == 0 else x
for i in range(1,101):
fizzbuzz(i)