Velocity Reviews > yield expression

# yield expression

Ziliang Chen
Guest
Posts: n/a

 02-25-2013
Hi folks,
When I am trying to understand "yield" expression in Python2.6, I did the following coding. I have difficulty understanding why "val" will be "None" ?What's happening under the hood? It seems to me very time the counter resumes to execute, it will assign "count" to "val", so "val" should NOT be "None" all the time.

Thanks !

code snippet:
----
def counter(start_at=0):
count = start_at
while True:
val = (yield count)
if val is not None:
count = val
else:
print 'val is None'
count += 1

Oscar Benjamin
Guest
Posts: n/a

 02-25-2013
On 25 February 2013 00:39, Ziliang Chen <(E-Mail Removed)> wrote:
> Hi folks,
> When I am trying to understand "yield" expression in Python2.6, I did thefollowing coding. I have difficulty understanding why "val" will be "None"? What's happening under the hood? It seems to me very time the counter resumes to execute, it will assign "count" to "val", so "val" should NOT be "None" all the time.
>
> Thanks !
>
> code snippet:
> ----
> def counter(start_at=0):
> count = start_at
> while True:
> val = (yield count)
> if val is not None:
> count = val
> else:
> print 'val is None'
> count += 1

The value of the yield expression is usually None. yield only returns
a value if the caller of a generator function sends one with the send
method (this is not commonly used). The send method supplies a value
to return from the yield expression and then returns the value yielded
by the next yield expression. For example:

>>> g = counter()
>>> next(g) # Need to call next() once to suspend at the first yield call

0
>>> g.send('value for count') # Now we can send a value for yield to return

'value for count'

Oscar

Ziliang Chen
Guest
Posts: n/a

 02-25-2013
On Monday, February 25, 2013 8:51:28 AM UTC+8, Oscar Benjamin wrote:
> On 25 February 2013 00:39, Ziliang Chen wrote:
>
> > Hi folks,

>
> > When I am trying to understand "yield" expression in Python2.6, I did the following coding. I have difficulty understanding why "val" will be "None" ? What's happening under the hood? It seems to me very time the counter resumes to execute, it will assign "count" to "val", so "val" should NOT be"None" all the time.

>
> >

>
> > Thanks !

>
> >

>
> > code snippet:

>
> > ----

>
> > def counter(start_at=0):

>
> > count = start_at

>
> > while True:

>
> > val = (yield count)

>
> > if val is not None:

>
> > count = val

>
> > else:

>
> > print 'val is None'

>
> > count += 1

>
>
>
> The value of the yield expression is usually None. yield only returns
>
> a value if the caller of a generator function sends one with the send
>
> method (this is not commonly used). The send method supplies a value
>
> to return from the yield expression and then returns the value yielded
>
> by the next yield expression. For example:
>
>
>
> >>> g = counter()

>
> >>> next(g) # Need to call next() once to suspend at the first yield call

>
> 0
>
> >>> g.send('value for count') # Now we can send a value for yield to return

>
> 'value for count'
>
>
>
>
>
> Oscar

Thanks Oscar !
I am cleared. Only when "send" is used to feed "yield" a new value, the "yield" expression has none "None", otherwise, "yield" expression has "None" value.

Ziliang Chen
Guest
Posts: n/a

 02-25-2013
On Monday, February 25, 2013 8:51:28 AM UTC+8, Oscar Benjamin wrote:
> On 25 February 2013 00:39, Ziliang Chen wrote:
>
> > Hi folks,

>
> > When I am trying to understand "yield" expression in Python2.6, I did the following coding. I have difficulty understanding why "val" will be "None" ? What's happening under the hood? It seems to me very time the counter resumes to execute, it will assign "count" to "val", so "val" should NOT be"None" all the time.

>
> >

>
> > Thanks !

>
> >

>
> > code snippet:

>
> > ----

>
> > def counter(start_at=0):

>
> > count = start_at

>
> > while True:

>
> > val = (yield count)

>
> > if val is not None:

>
> > count = val

>
> > else:

>
> > print 'val is None'

>
> > count += 1

>
>
>
> The value of the yield expression is usually None. yield only returns
>
> a value if the caller of a generator function sends one with the send
>
> method (this is not commonly used). The send method supplies a value
>
> to return from the yield expression and then returns the value yielded
>
> by the next yield expression. For example:
>
>
>
> >>> g = counter()

>
> >>> next(g) # Need to call next() once to suspend at the first yield call

>
> 0
>
> >>> g.send('value for count') # Now we can send a value for yield to return

>
> 'value for count'
>
>
>
>
>
> Oscar

Thanks Oscar !
I am cleared. Only when "send" is used to feed "yield" a new value, the "yield" expression has none "None", otherwise, "yield" expression has "None" value.