def count(iter):
return sum(1 for _ in iter)
Or better yet:
def count(iter):
try:
return len(iter)
except TypeError:
return sum(1 for _ in iter)
If it's not iterable, it will throw a TypeError.
Or, if you want to count something specific in the generator:
def count(iter, key=None):
if key:
if callable(key):
return sum(bool(key(x)) for x in iter)
return sum(x == key for x in iter)
try:
return len(iter)
except TypeError:
return sum(1 for _ in iter)