2013-05-31 43 views
21

Chúng ta không thể mang lại nhiều hơn một giá trị trong các chức năng của trình tạo python?Lợi nhuận nhiều giá trị

Ví dụ,

In [677]: def gen(): 
    .....:  for i in range(5): 
    .....:   yield i, i+1 
    .....:   

In [680]: k1, k2 = gen() 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-680-b21f6543a7e9> in <module>() 
----> 1 k1, k2 = a() 

ValueError: too many values to unpack 

này hoạt động như sau:

In [678]: b = a() 

In [679]: list(b) 
Out[679]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

kết quả tương tự ngay cả khi tôi làm điều này:

In [692]: def a(): 
    for i in range(5): 
     yield i 
     yield i+1 

Cảm ơn.

Trả lời

24

gen() lợi nhuận một máy phát điện (một mục duy nhất - vì vậy nó không thể được giải nén như hai), nó cần phải được tiến đầu tiên để có được những giá trị ...

g = gen() 
a, b = next(g) 

Nó hoạt động với list bởi vì ngầm sử dụng máy phát điện.

Chúng ta có thể tiếp tục tạo bộ tạo này không? Một cái gì đó như thế này:

g = gen(); 
def yield_g(): 
    yield g.next(); 
    k1,k2 = yield_g(); 

và do đó sẽ cung cấp cho list(k1)[0,1,2,3,4]list(k2) sẽ cung cấp cho [1,2,3,4,5].

Giữ máy phát điện hiện tại của bạn, và sử dụng izip (hoặc zip):

from itertools import izip 
k1, k2 = izip(*gen()) 
12

Chức năng của bạn gen trả về một máy phát điện và không có giá trị như bạn có thể mong đợi phán xét từ ví dụ bạn đưa ra. Nếu bạn lặp qua máy phát, các cặp giá trị sẽ được sinh lợi:

In [2]: def gen(): 
    ...:  for i in range(5): 
    ...:   yield i, i+1 
    ...:   

In [3]: for k1, k2 in gen(): 
    ...:  print k1, k2 
    ...:  
0 1 
1 2 
2 3 
3 4 
4 5 
+0

Không phải vậy. Xem câu trả lời của Jon Clements. – Marcin

+2

Vâng, ví dụ của tôi là tương tự, trong đó nó tiến bộ các máy phát điện bằng cách sử dụng một 'for'-loop. Tôi đồng ý rằng câu trả lời của Jon là công phu hơn và có một lời giải thích tốt hơn về những gì đang xảy ra. Tuy nhiên, tôi vẫn không hiểu câu trả lời của tôi. –

+0

Chúng ta có thể tiếp tục tạo ra máy phát điện này không? Một cái gì đó như thế này 'g = gen(); def yield_g(): yield g.next(); k1, k2 = yield_g(); 'và do đó' danh sách (k1) 'sẽ cho' [0,1,2,3,4] 'và' danh sách (k2) '' [1,2,3,4,5 ] ' –

Các vấn đề liên quan