Reputation: 177
N = [1, 2, 3]
print(n for n in N)
Results:
<generator object <genexpr> at 0x000000000108E780>
Why didn't it print?:
1
2
3
However the code:
sum(n for n in N)
Will sum up all the number in N.
Could you please tell me why sum() worked but print() failed?
Upvotes: 7
Views: 19918
Reputation: 510
It's because you passed a generator to a function and that's what __repr__
method of this generator returns. If you want to print what it would generate, you can use:
print(*N, sep='\n') # * will unpack the generator
or
print('\n'.join(map(str, N)))
Note that once you retrieve the generator's output to print it, the generator is exhausted - trying to iterate over it again will produce no items.
Upvotes: 15
Reputation: 811
def genfun():
yield ‘A’
yield ‘B’
yield ‘C’
g=genfun()
print(next(g))= it will print 0th index .
print(next(g))= it will print 1st index.
print(next(g))= it will print 2nd index.
print(next(g))= it will print 3rd index But here in this case it will give Error as 3rd element is not there
So , prevent from this error we will use for loop as below .
for i in g :
print(i)
Upvotes: -1
Reputation: 191733
You are literally printing a generator object representation
If you want on one line, try printing a list
print([n for n in N])
Which is just print(N)
If you want a line separated string, print that
print("\n".join(map(str, N)))
Or write a regular loop and don't micro optimize the lines of code
Upvotes: 2
Reputation: 17946
If you don't want to cast it as a list, you can try:
print(*(n for n in N))
See: https://docs.python.org/3/tutorial/controlflow.html#tut-unpacking-arguments
Upvotes: 2