Reputation: 414
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.
Upvotes: 8
Views: 5568
Reputation: 309899
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)])
Upvotes: 1
Reputation: 280544
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')
Upvotes: 14