2013-02-25 155 views
1

是新來的Python OOP。請不要苛刻。這裏是我的代碼,它從列表中計算出運動員的最快時間並顯示它們。但在運行時,我得到這個錯誤:全局名稱在Python未定義

z= add.mylist.min() 
NameError: global name 'add' is not defined 

我的代碼:

class Athlete: 

    def add(self): 
     list=[] 
     mylist=[] 

     for i in range(2): 

      self.name = raw_input("Enter name: ") 
      self.fastest_time = input("time: ") 
      list.append(self.name) 
      mylist.append(self.fastest_time) 
     print "Names: ",list 
     print "Fastest times: ",mylist 

    def display(self): 
     z= add.mylist.min() 
     w= add.mylist.index(z) 
     print "Minimum time: ",z 
     print "Name of athelte with fastest time: ",list[w] 

x = Athlete() 
x.add() 
x.display() 

回答

3

您需要參考方法上的實例與self參數。此外,您add()方法需要回報mylist變量它產生,你不能引用方法的局部變量作爲屬性的方法:

def display(self): 
    mylist = self.add() 
    z = min(mylist) 
    w = mylist.index(z) 

def add(self): 
    list=[] 
    mylist=[] 

    for i in range(2): 

     self.name = raw_input("Enter name: ") 
     self.fastest_time = input("time: ") 
     list.append(self.name) 
     mylist.append(self.fastest_time) 
    print "Names: ",list 
    print "Fastest times: ",mylist 

    return mylist 

這就是self,作爲參考點在同一個對象上找到實例屬性和其他方法。

您可能希望將重命名爲list以避免影響內置類型。

+0

我想你的代碼,這是什麼讓: Z = self.add.mylist.min() AttributeError的:「功能」對象有沒有屬性「MYLIST」 – 2013-02-25 16:24:07

+0

在顯示方法中,我將如何根據列表中的最短時間列出最快的運動員。謝謝 – 2013-02-25 16:31:28

+0

現在得到: z = min(list) TypeError:'type'對象不可迭代 – 2013-02-25 16:36:34

1

的Martijn已經回答了你的問題,所以這裏有一些言論和代碼風格技巧:

  1. 新式的類從object
  2. 你既有運動員的名字和他們的時間推導,那些屬於一起作爲字典中的鍵值對,而不是兩個單獨的列表
  3. 不要使用類的方法裏面print語句,一類方法應該返回一個對象,你那麼可以打印
  4. 如果你有更多的日你想輸入時間的2名運動員?如果你做運動員的函數的參數個數,你可以添加一個可變數目athlethes的
  5. 給描述性的變量名(不mylist),不使用的內置函數的名稱(如list)作爲變量名
  6. 您希望在整個班級中使用的變量可以通過__init__方法初始化。
  7. 進行打印,使用format功能,而不是使用逗號
  8. 使用if __name__ == '__main__',使your Python file can act as either reusable modules or as standalone program

考慮到這些,我想你的代碼改寫爲這樣的:

from collections import defaultdict 

class Athlete(object): # see (1) 
    def __init__(self): # see (6) 
     self.athlete_times = defaultdict(str) # see (2) 

    def add_athletes_and_times(self, n): # see (4) 
     for i in range(n): 
      self.name = raw_input("Enter name: ") 
      self.fastest_time = input("time (in seconds): ") 
      self.athlete_times[self.fastest_time] = self.name 

    def get_fastest_time(self): 
     return min(self.athlete_times) # see (3) 

if __name__ == '__main__': # see (8) 
    x = Athlete() 
    x.add_athletes_and_times(2) 
    for fast_time in x.athlete_times: 
     print "The fastest time of athlete {0} is {1} seconds.".format(
         x.athlete_times[fast_time], fast_time) # see (7) 
    fastest_time = x.get_fastest_time() 
    print "The overall fastest time is: {0} seconds for athlete {1}.".format(
         fastest_time, x.athlete_times[fastest_time]) 
+0

'defaultdict'在這裏是不需要的,一個普通的python'dict'也可以。否則,好的工作清理代碼! – 2013-02-25 17:21:23

+0

Woww BIo..Great Help..Atleast我從你Ty學到了一些東西 – 2013-02-25 17:25:03