python - What Happens when a Generator Runs out of Values to Yield? -


to illustrate question, suppose have simple generator:

def firstn(n):     num = 0     while num < n:         yield num         num += 1  in firstn(10):     print 

this print digits 0 through 9. if have:

def firstn(n):     num = 0     while num < 5 < n:         yield num         num += 1  in firstn(10):     print 

(the change in while statement.) prints digits 0 through 4. once num >= 5, generator no longer yields values.

what i'm curious goes on under hood: used pythontutor step through code, , impression i'm under once while statement no longer true, function implicitly returns none, for loop somehow detects, , breaks. used next built-in inspect more closely:

>>> def firstn(n): ...     num = 0 ...     while num < 5 < n: ...         yield num ...         num += 1 ...  >>>  >>> mygen = firstn(100) >>> next(mygen) 0 >>> next(mygen) 1 >>> next(mygen) 2 >>> next(mygen) 3 >>> next(mygen) 4 >>> next(mygen) traceback (most recent call last):   file "<stdin>", line 1, in <module> stopiteration 

which supports theory. big question: how stopiteration work, , mean calling generator large value can equivalent calling smallest terminating value? in our example, for in firstn(5) , for in firstn(9999999999999) should equivalent, right?

this isn't mysterious. when generator runs out of values yield, raises stopiteration exception. need understand how for-loop works in python. essentially, equivalent following code:

iterator = iter(collection) while true:     try:         x = next(iterator)         #     except stopiteration e:         break 

the above equivalent to:

for x in collection:     # 

Comments

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -