8
votes

There is a problem when i deal with print() function(Python 3).

When I'm looking for sum of a series I may use the following code pattern:

>>> sum(i for i in range(101))

But when I tend to check the series that I had made: (I choose print() and assume it will print out line by line)

>>> print(i for i in range(101))

It turns out become a generator object without value return. So I have to used list() for series checking. Is that a flaw in print function?

PS: The above written is an example to form a generator, not the simplest form for natural series but the bone structure for complex series. In order for convenience in series values checking, I am looking for a way to print out each value line by line.

2

2 Answers

14
votes

sum takes an iterable of things to add up, while print takes separate arguments to print. If you want to feed all the generator's items to print separately, use * notation:

print(*(i for i in range(1, 101)))

You don't actually need the generator in either case, though:

sum(range(1, 101))
print(*range(1, 101))

If you want them on separate lines, you're expecting the behavior of multiple individual calls to print, which means you're expecting the behavior of a regular loop:

for item in generator_or_range_or_whatever:
    print(item)

though you also have the option of specifying '\n' as an item separator:

print(*generator_or_range_or_whatever, sep='\n')
1
votes

This behavior isn't too much different than on python2.x:

Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> print (i*i for i in range(30))
<generator object <genexpr> at 0x10c034a50>

Generally speaking, if you want to actually know the items, a list might be easiest (it just requires the addition of a couple square brackets:

print [i*i for i in range(30)]

or on python3.x:

print([i*i for i in range(30)])