2012-05-22 8 views
40

Tôi biết rằng năng suất biến một hàm thành một trình tạo, nhưng giá trị trả về của biểu thức lợi nhuận là gì? Ví dụ:Kết quả của biểu thức năng suất trong Python là gì?

def whizbang(): 
    for i in range(10): 
     x = yield i 

Giá trị của biến x khi chức năng này thực thi?

Tôi đã đọc tài liệu Python: http://docs.python.org/reference/simple_stmts.html#grammar-token-yield_stmt và dường như không đề cập đến giá trị của biểu thức lợi nhuận.

+0

Trong tất nhiên, kết quả thử nghiệm là nó luôn luôn trả về "Không" nhưng tôi chỉ muốn xác nhận điều này. – slacy

+2

Điểm liên kết của bạn trỏ đến tài liệu về 'yield' như một câu lệnh, nhưng bạn đang sử dụng biểu thức [' yield'] (http://docs.python.org/reference/expressions.html#yield-expressions) trong ví dụ mã. –

Trả lời

51

Bạn cũng có thể send giá trị cho máy phát. Nếu không có giá trị nào được gửi thì xNone, nếu không thì x sẽ nhận giá trị đã gửi. Dưới đây là một số thông tin: http://docs.python.org/whatsnew/2.5.html#pep-342-new-generator-features

>>> def whizbang(): 
     for i in range(10): 
      x = yield i 
      print 'got sent:', x 


>>> i = whizbang() 
>>> next(i) 
0 
>>> next(i) 
got sent: None 
1 
>>> i.send("hi") 
got sent: hi 
2 
+3

Chà. Tại sao điều này không được đề cập trong tài liệu cho lợi nhuận là hoàn toàn vượt ra ngoài tôi. Tôi gửi lỗi tài liệu ở đâu? – slacy

+0

@slacy Không chắc chắn về cả hai. – jamylak

+1

@slacy, huh? Nó được đề cập trong tài liệu cho [yield] (http://docs.python.org/reference/expressions.html#generator.send). – senderle

-4

Mã này sẽ tạo ra một số lượng

def test(): 
    for i in range(10): 
     x = yield i 

t = test() 
for i in test(): 
    print i 
+0

Bạn có thể giải thích thêm câu trả lời của mình không thêm một chút mô tả về giải pháp bạn cung cấp? – abarisone

-3

Dưới đây là một ví dụ về sản lượng để cung cấp cho sản lượng đệm từ nói một cahce lớn

#Yeild 

def a_big_cache(): 
    mystr= [] 
    for i in xrange(100): 
     mystr.append("{}".format(i)) 
    return mystr 

my_fat_cache = a_big_cache() 

def get_in_chunks(next_chunk_size): 
    output =[] 
    counter = 0 
    for element in my_fat_cache: 
     counter += 1 
     output.append(element) 
     if counter == next_chunk_size: 
      counter = next_chunk_size 
      next_chunk_size+= next_chunk_size 
      yield output 
      del output[:] 

r = get_in_chunks(10) 
print next(r) 
print next(r) 

Output là

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

['10', '11', '12',> '13', '14', '15', '16', '17', '18', '19']

+1

Bị bỏ qua vì nó thậm chí không tiếp cận chủ đề của câu hỏi mà là kết quả của một tuyên bố lợi nhuận. – tleb