The expression inside [] creates a generator. Simply put, a generator is an object, that generates values based on its definition. The only thing it knows is how to create the next value and if it needs to stop. Because of this you first have to exhaust all the values in generator and store them somewhere, which is a list in this case. List has a specified number of items inside it, and thus you can determine its length, unlike a generator.
Similar result could be achieved by counting the letters, that satisfy the if condition:
def counts(txt):
count = 0
for letter in txt.lower():
if letter in "aeiou":
count += 1
return count
More on generators: Understanding generators in Python