2015-04-27 99 views
-1

我在做python在線課程。 約章「採取降」左2個例子:Python採取下降(練習)

def take(num, lyst): 
    rlist = [] 
    for i in range(0,num): 
     rlist.append(lyst[i]) 
    return rlist 

def drop(num, lyst): 
    rlist = [] 
    for i in range(num, len(lyst)): 
     rlist.append(lyst[i]) 
    return rlist 

names = ['Raymond','Cynthia','David','Jennifer','Clayton'] 
somenames = take(3,names) 
print(somenames) 
names = drop(3,names) 
print(names) 

作爲練習我不得不重寫代碼,以便將與負參數上班數字(-3)。

我想出了這個代碼:

def take(num,lyst): 
    rlist=[] 
    if num>0: 
     for i in range(0,num): 
      rlist.append(lyst[i]) 
    else: 
     for i in range(len(lyst)-abs(num),len(lyst)): 
      rlist.append(lyst[i]) 
    return rlist 

def drop(num,lyst): 
    rlist=[] 
    if num>0: 
     for i in range(num,len(lyst)): 
      rlist.append(lyst[i]) 
     return rlist 
    else: 
     for i in range(len(lyst)-abs(num),len(lyst)): 
      rlist.append(lyst[i]) 
     return rlist 

但我認爲它不夠有效,這將是更好的建議。 編輯:修改的功能也應該向後工作。例如:take(-3,名稱)將從最後3個

+0

那麼,'take(-3,names)'和'drop(-3,names)'的結果是什麼?你的代碼是否已經產生了正確的結果? –

+0

修改過的函數也應該向後工作。例如:take(-3,names)從上次開始將需要3個工作,但它正在尋找更好的代碼 – shotex

+2

*「我認爲它效率不夠高」 - - 基於什麼?是否有一些性能問題(內存?CPU?是否分析了它?)您能否擴展您的效率標準?如果這是你認爲可以改進的**工作代碼**,請考慮http://codereview.stackexchange.com,但我建議你閱讀並遵循[風格指南](http://www.python.org/) dev/peps/pep-0008 /)作爲第一個停靠港。 – jonrsharpe

回答

2

性能方面,你的代碼應該沒問題,因爲它在任何情況下只能通過列表一次。如果你正在尋找一個更清潔或更優雅的方式,我有兩個建議:

  • 使用列表內涵,而不是循環
  • take來定義的drop「負」的情況下,反之亦然

示例take

def take(num, lst): 
    if num > 0: 
     return [lst[i] for i in range(0, min(num, len(lst)))] 
    else: 
     return drop(max(len(lst) + num, 0), lst) 

逆,drop,留給讀者作爲練習至t他是讀者。