Hi Animesh,
Unfortunately the list server/email has removed the formatting from your sample, but no matter...


On 24/07/19 5:06 AM, Animesh Bhadra wrote:
# This code creates a generator and not a tuple comprehensions.
my_square =(num *num fornum inrange(11))
print(my_square) # <generator object <genexpr> at 0x7f3c838c0ca8>
# We can iterate over the square generator like this.
try:
whileTrue:
print(next(my_square)) # Prints the value 0,1,4....
exceptStopIterationasSI:
print("Stop Iteration")
# Another iteration
forx inmy_square:
print(x) # This prints nothing.
Does the generator exhausts its values when we run the iterator once?

Yes, it involves a "lazy" approach - the value is not calculated until the next() requests it. Whereas, a list comprehension calculates all its values at one time (and requires the storage space to hold them).

https://docs.python.org/3/reference/datamodel.html?highlight=generator - notice that there is a yield and a next facility, but when it terminates StopIteration is raised. There is no 'start again' command!


The Python docs are informative:
https://docs.python.org/3/reference/expressions.html?highlight=generator
https://docs.python.org/3/tutorial/classes.html?highlight=generator#generators


If you have an actual reason for running through a generator expression more than once, then consider return-ing it from a function/class (which will then be directly accessible to the for-loop/next method).


Lastly any specific reason for not having a tuple comprehensions?
Have checked this link, but could not understood the reason?
https://stackoverflow.com/questions/16940293/why-is-there-no-tuple-comprehension-in-python

I don't know.

Have you understood the differences between lists and tuples - specifically "mutability" and "immutability"?

Let's take a list comprehension. If you 'unwind it', can you reproduce it as a multi-line for-loop? Yes, but before the loop the 'target' list must be defined/declared to be a list; and within the loop the list is appended with the 'generated' values.

Ok? (sorry, don't know if this will be new to you, or not)

Now, instead of a list, try using a tuple? How do you append() to a tuple?


Yes, many people have confused generator expressions - surrounded/"delimited" by parentheses, ie ( and ), with tuples.
However, try this little demonstration:

a, b = 1, 2
a
1
b
2
a, b = ( 1, 2 )
a
1
b
2
( a, b ) = ( 1, 2 )
a
1
b
2
type( a )
<class 'int'>
type( ( 1, 2 ) )
<class 'tuple'>

The principle here is known as "tuple unpacking". The two constants (right-hand side) are arranged as a tuple, as are the two variables (a and b/left-hand side), regardless of the presence/absence of the parentheses!

https://treyhunner.com/2018/03/tuple-unpacking-improves-python-code-readability/


Clarifying the difference/similarity in appearance between a generator expression and a tuple, it might help to think that it is the comma(s) which make it a tuple!


--
Regards =dn
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to