简体   繁体   中英

Difference between yield in Python and yield in C#

是什么区别yield关键字Python和yield关键字在C#中?

C#'s yield return is equivalent to Python's yield , and yield break is just return in Python.

Other than those minor differences, they have basically the same purpose.

这可能有助于您理解它: C#,Python和Ruby中的迭代器

The most important difference is that python yield gives you an iterator, once it is fully iterated that's over.

But C# yield return gives you an iterator " factory" , which you can pass it around and uses it in multiple places of your code without concerning whether it has been "looped" once before.

Take this example in python:

In [235]: def func1():
   .....:     for i in xrange(3):
   .....:         yield i
   .....:

In [236]: x1 = func1()

In [237]: for k in x1:
   .....:     print k
   .....:
0
1
2

In [238]: for k in x1:
   .....:     print k
   .....:

In [239]:

And in C#:

class Program
{
    static IEnumerable<int> Func1()
    {
        for (int i = 0; i < 3; i++)
            yield return i;
    }

    static void Main(string[] args)
    {
        var x1 = Func1();
        foreach (int k in x1) 
            Console.WriteLine(k);

        foreach (int k in x1)
            Console.WriteLine(k);
    }
}

That gives you:

0
1
2
0
1
2

An important distinction to note, in addition to other answers, is that yield in C# can't be used as an expression, only as a statement.

An example of yield expression usage in Python (example pasted from here ):

def echo(value=None):
  print "Execution starts when 'next()' is called for the first time."
  try:
    while True:
       try:
         value = (yield value)
       except GeneratorExit:
         # never catch GeneratorExit
         raise
       except Exception, e:
         value = e
     finally:
       print "Don't forget to clean up when 'close()' is called."

generator = echo(1)
print generator.next()
# Execution starts when 'next()' is called for the first time.
# prints 1

print generator.next()
# prints None

print generator.send(2)
# prints 2

generator.throw(TypeError, "spam")
# throws TypeError('spam',)

generator.close()
# prints "Don't forget to clean up when 'close()' is called."

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM