2016-03-07 84 views
1

我正在做一個關於棋盤遊戲戰艦的項目。因爲0,1,2,3 ...是1,2,3,4 ...(我不知道該怎麼稱呼它),我需要變量row和column比它們小1,即:我可以將這兩個賦值語句放在輔助函數中嗎?

row -= 1 
column -= 1 

我需要在一堆的功能,利用這一點,所以我認爲這將是整潔,如果我只是每次有一個輔助函數來代替。我已經試過這兩種方法:

row, column = row -= 1, column -= 1 

然而,這給了我在column -= 1語法錯誤。

我也試過:

def decimal_helper(row, column): 
    row -= 1 
    column -= 1 
    return row, column 

然而,這只是返回一個元組,而我需要的兩個變量單獨返回。

+0

我可以破譯的唯一形式是,我認爲你正在尋找這樣做:'a,b = decimal_helper(row,column)'。如果您從方法中返回多個項目,它將按預期方式返回。你需要相應地解壓。除此之外,我不知道你在問什麼。 – idjaw

+2

你可以做'行,列=行 - 1,列 - 1',但爲什麼不堅持你有什麼? – jonrsharpe

+0

*所有*函數只返回一個值;嘗試調用者如何訪問兩個返回值,而無論如何都沒有看起來像tuple解包的東西。 – chepner

回答

2
def decimal_helper(row, column): 
    return row - 1, column -1 

# unpack the tuple back into two variables 
row, column = decimal_helper(row, column) 

你也可以去一個更優雅的方式,並使用一個線爲@jonrsharpe建議:

row, column = row - 1, column - 1 
+0

在這種情況下,您不妨'返回行 - 1,列 - 1' – jonrsharpe

+0

謝謝@jonrsharpe。 – Forge

0

我覺得這是更優雅。這樣,您就封裝「軍轉民」的邏輯並不需要複製它在你的代碼:

class DecimalHelper: 

    def __init__(self, row, column): 
     self.row = row 
     self.column = column 

     self.rowIndex = row - 1 
     self.colIndex = column - 1 


row = 3 
column = 4 

dc = DecimalHelper(row, column) 

print dc.rowIndex 
print dc.colIndex 

而且還有一個更優雅的方式,使用類屬性(學分this後):

class ClassPropertyDescriptor(object): 

    def __init__(self, fget, fset=None): 
     self.fget = fget 
     self.fset = fset 

    def __get__(self, obj, klass=None): 
     if klass is None: 
      klass = type(obj) 
     return self.fget.__get__(obj, klass)() 

    def __set__(self, obj, value): 
     if not self.fset: 
      raise AttributeError("can't set attribute") 
     type_ = type(obj) 
     return self.fset.__get__(obj, type_)(value) 

    def setter(self, func): 
     if not isinstance(func, (classmethod, staticmethod)): 
      func = classmethod(func) 
     self.fset = func 
     return self  

def classproperty(func): 
    if not isinstance(func, (classmethod, staticmethod)): 
     func = classmethod(func) 

    return ClassPropertyDescriptor(func) 

class DecimalHelper: 

    def __init__(self, row, column): 
     self.row = row 
     self.column = column 

    @classproperty 
    def rowIndex(cls): 
     return row - 1 

    @classproperty 
    def colIndex(cls): 
     return column - 1 

row = 3 
column = 4 

dc = DecimalHelper(row, column) 

print dc.rowIndex 
print dc.colIndex 
相關問題