2009-11-09 177 views

回答

26

C#的yield return相當於Python的yield,並且yield break僅僅是Python中的return

除了這些微小的差異之外,它們的目的基本相同。

+0

產量突破並不完全等同於Python的回報。如果你的函數除了yield break(Python中的返回值)之外什麼都不做,你將在Python中獲得一個空的Enumerator而None。 – 2011-06-18 09:01:19

+1

這是Python的一個小小的語法怪癖;你可以使用'return;產量「得到一個空的發電機。 – 2011-08-06 22:16:46

+0

Python中的'yield'也是可以從迭代站點接收值的表達式。 「收益回報」是一個陳述。 – Elazar 2017-08-29 20:48:32

6

最重要的區別是,蟒蛇產量爲您提供了一個迭代器,一旦完全重複該結束了。

但是,C#收益回報爲您提供了一個迭代器「工廠」,您可以將它傳遞並在代碼的多個位置使用它,而不必關心它之前是否「循環」過一次。

拿這個例子中的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); 
    } 
} 

這就給了你:在C#

0 
1 
2 
0 
1 
2