List comprehension is expressed as
L = [mapping-expression for element in source-list if filter-expression]
now, replace "for element in source-list" part with
for i in range(1, 100)
which iterates over a list of containing integers 1 to 99 returning one integer at a time.
"mapping-expression" here is
"Fizz"*(not i%3) + "Buzz"*(not i%5) or i
which uses the integer i returned from "for i in range(1, 100)"
when i is divisible by 3 or 5, i % 3 and i % 5 returns 0, any other integer retuned when i is not divisible.
(not i % 3) # return True when i is divisible by 3
(not i % 5) # returns False when i is not divisible by 5
when the booleans returned from (not i % 3) or (not i % 5) is multiplied with strings "Fizz" and "Buzz":
"Fizz" * True # returns "Fizz"
"Buzz" * False # returns ""
then the Strings returned above are concatenated
"Fizz" + ""
as a result "Fizz" is placed in the resulting list and this process goes on for each iteration, returning either "Fizz" or "Buzz" or sometimes times the integer i itself when both the string boolean multiplication returns a empty string "". since
"" + "" or i # returns i
The resulting list is something like [1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz' ......]
note : the optional "if filter-expression" is not used in the example.