2009-06-15 65 views
26

函數應根據行名稱(本例中爲列2)選擇表中的行。它應該能夠將單個名稱或名稱列表作爲參數並正確處理它們。處理一個列表或單個整數作爲參數

這是我現在,但最好就不會有這種重複的代碼和像異常將被智能地用來選擇處理輸入參數的正確方法的東西:

def select_rows(to_select): 
    # For a list 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 
    # For a single integer 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() == to_select: 
      table.selectRow(row) 

回答

18

其實我同意上面的Andrew Hare,只是通過一個單一元素的列表。

但是,如果你真的必須接受一個非列表,那麼把它變成一個列表在那種情況下怎麼樣?

def select_rows(to_select): 
    if type(to_select) is not list: to_select = [ to_select ] 

    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

做「在」一單項目列表上的性能損失是不是可能是高:-) 但是,這並指出另一件事情,你可能要考慮,如果你的「to_select做'列表可能很長:考慮將其轉換爲集合,以便查找更高效。

def select_rows(to_select): 
    if type(to_select) is list: to_select = set(to_select) 
    elif type(to_select) is not set: to_select = set([to_select]) 

    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

-----ň

11

我會做只是這:

def select_rows(to_select): 
    # For a list 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

,並期望該參數將永遠是一個名單 - 即使它只是一個元素的列表。

記住:

這是比較容易請求原諒比許可。

+1

+1 ...更容易維護一組代碼來執行任務,並且更加pythonic;如果有人蔑視文檔,就讓它爆炸吧。如果真的需要一個接受單個整數作爲參數的函數,則創建另一個名爲「def select_row(to_select)」的函數,並將它作爲一個列表打包到'to_select',然後調用select_rows。 – 2009-06-16 00:12:53

14

你可以重新定義你的函數採取任何數量的參數,如:

def select_rows(*arguments): 
    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in arguments: 
      table.selectRow(row) 

那麼你可以傳遞這樣一個參數:

select_rows('abc') 

多個參數如下:

select_rows('abc', 'def') 

如果你已經有一個lis t:

items = ['abc', 'def'] 
select_rows(*items) 
+0

+1喜歡這種方法比安德魯黑爾更好...問題可能在於如果您需要將更多參數傳遞給同一個函數,而不僅僅是list/single參數。但是你可以在之前有這些,或者使用關鍵字參數,即** kwargs。 – Jaime 2009-06-16 01:58:47

+0

這個答案顯然更好。 +1自我記錄代碼。 * args乞求一個迭代。 – tortal 2016-08-19 06:27:27

3

我會跟夏基的版本一起去,但使用一些更鴨子類型:

def select_rows(to_select): 
    try: 
     len(to_select) 
    except TypeError: 
     to_select = [to_select] 

    for row in range(0, table.numRows()): 
     if _table.item(row, 1).text() in to_select: 
      table.selectRow(row) 

這與任何對象合作的好處支持in運算符。另外,以前的版本,如果給出一個元組或其他序列,只會將它包裝在一個列表中。缺點是使用異常處理有一些性能損失。

相關問題