Difference between yield in Python and yield in C#

前端 未结 4 763
迷失自我
迷失自我 2021-02-05 03:14

What is the difference between yield keyword in Python and yield keyword in C#?

相关标签:
4条回答
  • 2021-02-05 03:29

    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
    
    0 讨论(0)
  • 2021-02-05 03:29

    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."
    
    0 讨论(0)
  • 2021-02-05 03:42

    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.

    0 讨论(0)
  • 2021-02-05 03:56

    This may help you understand it : Iterators in C#, Python, and Ruby

    0 讨论(0)
提交回复
热议问题