2016-02-25 18 views
5

Trong Ruby, từ khóa lợi nhuận được sử dụng để mang lại cho các bao đóng cho các khối thực thi.Năng suất của Python và sản lượng của Ruby

Từ khóa này khác nhau như thế nào trong ngôn ngữ Python?

+3

Tôi muốn trả lời nhưng tôi suy nghĩ [this] (http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python) bao gồm nó – Alex

Trả lời

8

Trong ruby ​​, sản lượng là lối tắt được sử dụng để gọi hàm ẩn danh. Ruby có một cú pháp đặc biệt để truyền hàm ẩn danh cho một phương thức; cú pháp được gọi là block. Bởi vì chức năng không có tên, bạn sử dụng tên mang để gọi hàm:

def do_stuff(val) 
    puts "Started executing do_stuff" 
    yield(val+3) 
    yield(val+4) 
    puts "Finshed executing do_stuff" 
end 

do_stuff(10) {|x| puts x+3} #<= This is a block, which is an anonymous function 
          #that is passed as an additional argument to the 
          #method do_stuff 

--output:-- 
Started executing do_stuff 
16 
17 
Finshed executing do_stuff 

Trong python, khi bạn nhìn thấy năng suất bên trong định nghĩa hàm, đó có nghĩa là chức năng là một generator. Một máy phát điện là một loại đặc biệt của chức năng có thể được dừng lại giữa thực hiện và khởi động lại. Dưới đây là một ví dụ:

def do_stuff(val): 
    print("Started execution of do_stuff()") 

    yield val + 3 
    print("Line after 'yield val + 3'") 
    yield val + 4 
    print("Line after 'yield val + 4'") 

    print("Finished executing do_stuff()") 


my_gen = do_stuff(10) 

val = next(my_gen)  
print("--received {} from generator".format(val)) 

đầu ra:

Started execution of do_stuff() 
--received 13 from generator 

Nhiều mã:

val = next(my_gen)  
print("--received {} from generator".format(val)) 

đầu ra:

Từ kết quả, bạn có thể thấy rằng yield gây ra kết quả được trả lại d; sau đó thực hiện ngay lập tức bị tạm dừng. Khi bạn gọi next() một lần nữa trên máy phát, thực hiện tiếp tục cho đến khi câu lệnh yield tiếp theo được gặp phải, nó trả về một giá trị, sau đó thực hiện tạm dừng một lần nữa.

+3

Về cơ bản, từ khóa 'yield' của Python tương đương với số đếm của Ruby: : Yielder # yield'. –

+0

Cảm ơn bạn! Tôi không biết về Enumerator :: Yielder class !! – noname

+0

Để biết thêm chi tiết về «Enumerator :: Yielder' và' Enumerator :: Generator', tôi đề nghị: http://patshaughnessy.net/2013/4/3/ruby-2-0-works-hard-so-you- có thể lười biếng –

1

Trong Ruby, sản lượng được sử dụng để thoát điều khiển chặn (như chức năng ẩn danh) để thực hiện các lệnh của khối và sau đó trả về nơi khối được gọi.

Với yield args bạn có thể vượt qua đối số cho các khối, và cũng với lvar = yield bạn có thể nhận được bất cứ điều gì trở lại và ràng buộc nó vào lvar sau khi kiểm soát ra khỏi khối. Đó là một thiết kế tính năng tổng quát và nhất quán trong Ruby. Và tất nhiên, bạn có thể áp dụng ý tưởng này để lặp qua bộ sưu tập.

Trong khi bằng Python, hầu hết mọi người sử dụng năng suất để tạo điều kiện truy cập hiệu quả các hạng mục trên bộ sưu tập phần nào, họ tập trung vào lặp một lần và tạo ra khi đang bay một lần được gọi ý tưởng, đó là việc sử dụng chính của năng suất bằng Python.

FYI, Nó không hoàn toàn là một tính năng phân biệt giữa Python và Ruby trên sản lượng, ít nhất là trên đường sử dụng nó. (Rõ ràng chúng được thực hiện khác nhau, như đối với python, sản lượng tạo một trình tạo, sẽ không chạy bất kỳ mã nào trừ khi bắt đầu lặp lại). Ví dụ, cách sản lượng được sử dụng trong ngữ cảnh python khá giống với Ruby.

from contextlib import contextmanager 
@contextmanager 
def openfile(name, mode): 
    f= open(name, mode) 
    yield f 
    f.close() 

with openfile('log.txt', 'r') as handle: 
    for line in handle: 
     print line 

đây, năng suất qua tập tin xử lý để với, và thực hiện với-báo cáo chính xác lần và sau đó phục hồi trở lại vào tập tin tuyên bố gần

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