Разница между выходом в Python и выходом в C # - PullRequest
25 голосов
/ 10 ноября 2009

В чем разница между ключевым словом yield в Python и ключевым словом yield в C #?

Ответы [ 4 ]

29 голосов
/ 10 ноября 2009

C # yield return эквивалентно Python yield, а yield break просто return в Python.

Кроме этих незначительных различий, они в основном имеют ту же цель.

14 голосов
/ 10 ноября 2009

Это может помочь вам понять это: Итераторы в C #, Python и Ruby

12 голосов
/ 29 января 2016

Самым важным отличием является то, что Python yield дает вам итератор, как только он полностью повторяется, все кончено.

Но возврат C # дает вам итератор " factory" , который вы можете передать и использовать в нескольких местах кода, не заботясь о том, был ли он "зациклен" один раз. *

Возьмите этот пример в 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]:

А в 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);
    }
}

Это дает вам:

0
1
2
0
1
2
0 голосов
/ 21 августа 2018

Важное отличие, которое следует отметить, помимо других ответов, заключается в том, что yield в C # нельзя использовать как выражение, только как утверждение.

Пример использования выражения yield в Python (пример вставлен из здесь ):

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."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...