我試圖通過在Jamis Buck中翻譯程序員迷宮中的代碼來教自己Python。這是一本很棒的書,但它是用Ruby編寫的,而且我在理解一些Ruby代碼時遇到困難。使用yield語句將Python循環迭代轉換爲Python
要理解這個問題,我已經包括了代碼庫的縮小版本
cell.rb
class Cell
attr_reader : row, :column
def initialize(row, column)
@row, @column = row, column
end
grid.rb
require 'cell'
class Grid
attr_reader :rows, :columns
def initialize(rows, columns)
@rows = rows
@columns = columns
@grid = prepare_grid
end
def prepare_grid
Array.new(rows) do |row|
Array.new(columns) do |column|
Cell.new(row, column)
end
end
end
到目前爲止好。以上所有內容都很容易理解並轉化爲Python。然後有以下兩個函數作爲Grid類的一部分。
def each_row
@grid.each do |row|
yield row
end
end
def each_cell
each_row do |row|
row.each do |cell|
yield cell if cell
end
end
end
這裏實際做的最後兩個函數是什麼?我發現了類似的here,這導致我認爲Python版本需要接受可選的lambda變量,測試它是否爲空,如果不是,則運行與該變量關聯的代碼。問題是我知道這些函數的意圖是一個迭代器,我不認爲添加lambda會有幫助。
StackOverflow上已經有一個類似的問題here,這讓我覺得答案是微不足道的,但是我不太瞭解Ruby能夠直觀答案或向Google詢問正確的問題。
我試圖理解代碼和它背後的意圖,以便我可以使它作爲一個寫得很好,結構良好的Python代碼塊。所以,謝謝你的回答。 –