yield expression

Discussion in 'Python' started by Ziliang Chen, Feb 25, 2013.

  1. Ziliang Chen

    Ziliang Chen Guest

    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
    Ziliang Chen, Feb 25, 2013
    #1
    1. Advertising

  2. On 24/02/2013 7:36 PM, 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


    Perhaps it's becaoue (teild count) is a statement. Statements do not
    return a value.

    Colin W.
    >
    Colin J. Williams, Feb 26, 2013
    #2
    1. Advertising

  3. Ziliang Chen

    Ian Kelly Guest

    Ian Kelly, Feb 26, 2013
    #3
  4. Ziliang Chen

    Dave Angel Guest

    On 02/26/2013 11:34 AM, Colin J. Williams wrote:
    > On 24/02/2013 7:36 PM, 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

    >
    > Perhaps it's becaoue (teild count) is a statement. Statements do not
    > return a value.
    >
    > Colin W.
    >>

    >


    'yield count' is a yield_expression, not always a statement. If it were
    the first thing in a statement, it'd be a yield_stmt


    See the docs: http://docs.python.org/2/reference/simple_stmts.html

    assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)

    and http://docs.python.org/2/reference/expressions.html

    yield_atom ::= "(" yield_expression ")"
    yield_expression ::= "yield" [expression_list]

    The value produced by the yield expression is produced by a.send()
    method. This allows an approximation to coroutines.

    I believe this dual usage of yield started in Python 2.5


    --
    DaveA
    Dave Angel, Feb 26, 2013
    #4
  5. Ziliang Chen

    Vytas D. Guest

    Hi,

    You are using "yield" incorrectly. "yield" works like return, but it can
    return more than once from the same function. Functions that "yield"
    produce a so called "generator" object. This generator object gives you
    values every time you call it.

    The generator works very interesting way. It starts like normal function
    and goes until it finds "yield" and returns the value. The state of
    generator is saved - it is like it is put to sleep until you call it again.
    So the next time you call generator() it runs from the point it returned
    last time and will return you another value.

    Simple sample of making and using generator (prints forever, so just kill
    with CTRL+C).

    def counter(start_at=0):
    """Returns integer each time called"""

    count = start_at
    while True:
    yield count
    count += 1

    def main():
    generator = counter()

    while True:
    print(next(generator))


    if __name__ == '__main__':
    main()


    Hope helps.

    Vytas D.



    On Tue, Feb 26, 2013 at 4:34 PM, Colin J. Williams <> wrote:

    > On 24/02/2013 7:36 PM, 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
    >>

    >
    > Perhaps it's becaoue (teild count) is a statement. Statements do not
    > return a value.
    >
    > Colin W.
    >
    >>
    >>

    > --
    > http://mail.python.org/**mailman/listinfo/python-list<http://mail.python.org/mailman/listinfo/python-list>
    >
    Vytas D., Feb 26, 2013
    #5
  6. On 26/02/2013 12:07 PM, Vytas D. wrote:
    > Hi,
    >
    > You are using "yield" incorrectly. "yield" works like return, but it can
    > return more than once from the same function. Functions that "yield"
    > produce a so called "generator" object. This generator object gives you
    > values every time you call it.
    >
    > The generator works very interesting way. It starts like normal function
    > and goes until it finds "yield" and returns the value. The state of
    > generator is saved - it is like it is put to sleep until you call it
    > again. So the next time you call generator() it runs from the point it
    > returned last time and will return you another value.
    >
    > Simple sample of making and using generator (prints forever, so just
    > kill with CTRL+C).
    >
    > def counter(start_at=0):
    > """Returns integer each time called"""
    >
    > count = start_at
    > while True:
    > yield count
    > count += 1
    >
    > def main():
    > generator = counter()
    >
    > while True:
    > print(next(generator))
    >
    >
    > if __name__ == '__main__':
    > main()
    >
    >
    > Hope helps.
    >
    > Vytas D.
    >
    >
    >
    > On Tue, Feb 26, 2013 at 4:34 PM, Colin J. Williams <
    > <mailto:>> wrote:
    >
    > On 24/02/2013 7:36 PM, 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
    >
    >
    > Perhaps it's becaoue (teild count) is a statement. Statements do
    > not return a value.
    >
    > Colin W.
    >
    >
    >
    > --
    > http://mail.python.org/__mailman/listinfo/python-list
    > <http://mail.python.org/mailman/listinfo/python-list>
    >
    >

    Yes, it's very helpful. Thanks also to the other two responders.

    This brings us back to the OP question. Why not " val = (yield count)"?

    Colin W.
    Colin J. Williams, Feb 26, 2013
    #6
  7. On 26/02/2013 12:07 PM, Vytas D. wrote:
    > Hi,
    >
    > You are using "yield" incorrectly. "yield" works like return, but it can
    > return more than once from the same function. Functions that "yield"
    > produce a so called "generator" object. This generator object gives you
    > values every time you call it.
    >
    > The generator works very interesting way. It starts like normal function
    > and goes until it finds "yield" and returns the value. The state of
    > generator is saved - it is like it is put to sleep until you call it
    > again. So the next time you call generator() it runs from the point it
    > returned last time and will return you another value.
    >
    > Simple sample of making and using generator (prints forever, so just
    > kill with CTRL+C).
    >
    > def counter(start_at=0):
    > """Returns integer each time called"""
    >
    > count = start_at
    > while True:
    > yield count
    > count += 1
    >
    > def main():
    > generator = counter()
    >
    > while True:
    > print(next(generator))
    >
    >
    > if __name__ == '__main__':
    > main()
    >
    >
    > Hope helps.
    >
    > Vytas D.
    >
    >
    >
    > On Tue, Feb 26, 2013 at 4:34 PM, Colin J. Williams <
    > <mailto:>> wrote:
    >
    > On 24/02/2013 7:36 PM, 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
    >
    >
    > Perhaps it's becaoue (teild count) is a statement. Statements do
    > not return a value.
    >
    > Colin W.
    >
    >
    >
    > --
    > http://mail.python.org/__mailman/listinfo/python-list
    > <http://mail.python.org/mailman/listinfo/python-list>
    >
    >

    Yes, it's very helpful. Thanks also to the other two responders.

    This brings us back to the OP question. Why not " val = (yield count)"?

    Colin W.
    Colin J. Williams, Feb 26, 2013
    #7
  8. Ziliang Chen

    Dave Angel Guest

    On 02/26/2013 01:44 PM, Colin J. Williams wrote:
    > On 26/02/2013 12:07 PM, Vytas D. wrote:
    >> Hi,
    >>
    >> You are using "yield" incorrectly. "yield" works like return, but it can
    >> return more than once from the same function. Functions that "yield"
    >> produce a so called "generator" object. This generator object gives you
    >> values every time you call it.
    >>
    >> The generator works very interesting way. It starts like normal function
    >> and goes until it finds "yield" and returns the value. The state of
    >> generator is saved - it is like it is put to sleep until you call it
    >> again. So the next time you call generator() it runs from the point it
    >> returned last time and will return you another value.
    >>
    >> Simple sample of making and using generator (prints forever, so just
    >> kill with CTRL+C).
    >>
    >> def counter(start_at=0):
    >> """Returns integer each time called"""
    >>
    >> count = start_at
    >> while True:
    >> yield count
    >> count += 1
    >>
    >> def main():
    >> generator = counter()
    >>
    >> while True:
    >> print(next(generator))
    >>
    >>
    >> if __name__ == '__main__':
    >> main()
    >>
    >>
    >> Hope helps.
    >>
    >> Vytas D.
    >>
    >>
    >>
    >> On Tue, Feb 26, 2013 at 4:34 PM, Colin J. Williams <
    >> <mailto:>> wrote:
    >>
    >> On 24/02/2013 7:36 PM, 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
    >>
    >>
    >> Perhaps it's becaoue (teild count) is a statement. Statements do
    >> not return a value.
    >>
    >> Colin W.
    >>
    >>
    >>
    >> --
    >> http://mail.python.org/__mailman/listinfo/python-list
    >> <http://mail.python.org/mailman/listinfo/python-list>
    >>
    >>

    > Yes, it's very helpful. Thanks also to the other two responders.
    >
    > This brings us back to the OP question. Why not " val = (yield count)"?
    >
    > Colin W.
    >
    >


    Repeating a misconception doesn't make it any more true. yield is both
    an expression and a statement. Nothing wrong with the statement
    val = (yield count)

    although he apparently wasn't making any good use of the possible return
    value, since he observed it was always None. That's just because he
    didn't use the send method in the calling function.

    Most links I see on a web search explain only the expression form of
    yield, which is why i took a lot of time building the response I did
    earlier.


    --
    DaveA
    Dave Angel, Feb 27, 2013
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    1
    Views:
    314
    Gabriel Genellina
    Apr 22, 2008
  2. Markus
    Replies:
    1
    Views:
    185
    Mark Hubbart
    Sep 27, 2004
  3. Michael Edgar
    Replies:
    13
    Views:
    257
    Brian Candler
    Apr 21, 2011
  4. Ziliang Chen

    yield expression

    Ziliang Chen, Feb 25, 2013, in forum: Python
    Replies:
    3
    Views:
    111
    Ziliang Chen
    Feb 25, 2013
  5. Ziliang Chen

    yield expression

    Ziliang Chen, Feb 25, 2013, in forum: Python
    Replies:
    0
    Views:
    74
    Ziliang Chen
    Feb 25, 2013
Loading...

Share This Page