2012-07-12 139 views
3
import random 

#----------------------------------------------# 
def main(): 
    create_list_and_find_max_and_min(10) 
    the_smart_way() 
#----------------------------------------------# 
def create_list_and_find_max_and_min(n): 
    global my_array 
    my_array = [] 
    n = input("How many numbers do you want in your array?:") 
    for i in range(n): 
     my_array.append(random.randint(1,n)) 
    print "My array is:", my_array 
    #----------------------------------------------# 
    min = my_array[0] 
    for number in my_array: 
    if min > number: 
     min = number 
    print "The minimum value in the array is:", min 
    #----------------------------------------------# 
    max = my_array[0] 
    for number in my_array: 
     if max < number: 
     max = number 
    print "The maximum value in the array is:", max 
#----------------------------------------------# 
def the_smart_way(): 
    # "This one uses the built-in Python functions for min/max..." 
    min_my_array = min(my_array) 
    max_my_array = max(my_array) 
    return min_my_array, max_my_array 
#----------------------------------------------# 
if __name__ == '__main__': 
    main() 

我對使用Python相當陌生。我一般都聽說在編程時使用全局變量是一種不好的做法。所以有什麼替代方案可以讓我在這裏做什麼。哪個是從另一個函數內部使用變量「my_array」?謝謝!Python替代全局變量

+0

請編輯的問題*僅*如果你的信息添加或刪除無用的信息。如果您有任何問題,請在用戶的答案上發表評論。 – Blender 2012-07-13 00:09:38

+0

對不起,我試圖更新我的代碼來修復它,並指出我仍然得到一個錯誤..:/ – 2012-07-13 00:14:29

回答

8

是的,有兩種選擇。

首先,您可以傳遞值而不是使用全局變量。例如,create_list_and_find_max_and_min可以在本地創建一個數組並返回它,那麼您可以在到the_smart_way傳遞:

import random 

#----------------------------------------------# 
def main(): 
    my_array = create_list_and_find_max_and_min(10) 
    print the_smart_way(my_array) 
#----------------------------------------------# 
def create_list_and_find_max_and_min(n): 
    my_array = [] 
    n = input("How many numbers do you want in your array?:") 
    for i in range(n): 
     my_array.append(random.randint(1,n)) 
    print "My array is:", my_array 
    #----------------------------------------------# 
    min = my_array[0] 
    for number in my_array: 
     if min > number: 
      min = number 
    print "The minimum value in the array is:", min 
    #----------------------------------------------# 
    max = my_array[0] 
    for number in my_array: 
     if max < number: 
      max = number 
    print "The maximum value in the array is:", max 
    return my_array 
#----------------------------------------------# 
def the_smart_way(my_array): 
    # "This one uses the built-in Python functions for min/max..." 
    min_my_array = min(my_array) 
    max_my_array = max(my_array) 
    return min_my_array, max_my_array 
#----------------------------------------------# 
if __name__ == '__main__': 
    main() 

其次,你可以創建一個封裝了對數據操作的數據和函數的類:

import random 

#----------------------------------------------# 
class MyArrayClass(object): 
    def create_list_and_find_max_and_min(self, n): 
     self.my_array = [] 
     n = input("How many numbers do you want in your array?:") 
     for i in range(n): 
      self.my_array.append(random.randint(1,n)) 
     print "My array is:", self.my_array 
     #----------------------------------------------# 
     min = self.my_array[0] 
     for number in self.my_array: 
      if min > number: 
       min = number 
     print "The minimum value in the array is:", min 
     #----------------------------------------------# 
     max = self.my_array[0] 
     for number in self.my_array: 
      if max < number: 
       max = number 
     print "The maximum value in the array is:", max 
    #----------------------------------------------# 
    def the_smart_way(self): 
     # "This one uses the built-in Python functions for min/max..." 
     min_my_array = min(self.my_array) 
     max_my_array = max(self.my_array) 
     return min_my_array, max_my_array 
#----------------------------------------------# 
def main(): 
    my_array = MyArrayClass() 
    my_array.create_list_and_find_max_and_min(10) 
    print my_array.the_smart_way() 
#----------------------------------------------# 
if __name__ == '__main__': 
    main() 

你或許應該明白原因全局變量是不好的做法。

想象一下,你想創建兩個數組。有了全局變量,第二個將取代第一個,這將永遠消失。

create_list_and_fix_max_and_min(10) 
create_list_and_fix_max_and_min(20) 
# No way to operate on the original array! 

有了一個局部變量,可以存儲他們兩個:

my_array_1 = create_list_and_fix_max_and_min(10) 
my_array_2 = create_list_and_fix_max_and_min(20) 
the_smart_way(my_array_1) 

使用對象提供相同的利益;兩者之間的差異最終歸結爲操作是否屬於數據含義的一部分,或數據是否獨立,操作是否通用。 (或者,你有時,不管你多一個功能勢利或OO勢利......的)

+0

嗨,我收到一個錯誤,當我嘗試使用你的第一個方法,它說全球變量my_array未定義「第3行」。 – 2012-07-13 00:12:49

+0

我沒有發佈完整的代碼,因此#...位。我會編輯它以包括整個事情;給我一點時間。 – abarnert 2012-07-13 00:14:55

1

這裏是我會怎麼做:

import random 

#----------------------------------------------# 
def main(): 
    # note that input can be dangerous since it evaluates arbitrary code 
    n = int(raw_input("How many numbers do you want in your array?: ")) 
    my_list = [random.randint(1, n) for _ in range(n)] 
    find_max_and_min(my_list) 
    the_smart_way(my_list) 
#----------------------------------------------# 
def find_max_and_min(seq): 
    print "My array is:", seq 
    #----------------------------------------------# 
    min_num = seq[0] # Don't want to use same names as bultins here 
    for number in seq: 
     if number < min_num: 
      min_num = number 
    print "The minimum value in the array is:", min_num 
    #----------------------------------------------# 
    max_num = seq[0] 
    for number in seq: 
     if number > max_num: 
      max_num = number 
    print "The maximum value in the array is:", max_num 
#----------------------------------------------# 
def the_smart_way(seq): 
    # "This one uses the built-in Python functions for min/max..." 
    # No need for temp variables here 
    print min(seq), max(seq) 
#----------------------------------------------# 
if __name__ == '__main__': 
    main() 
+0

我專注於如何儘可能少地改變自己的代碼以避免混淆,但重構使得他的代碼總體上更加美觀。 (但請注意,他的the_smart_way返回最小值,最大值而不是打印它們。) – abarnert 2012-07-13 00:03:04

+0

@abarnert謝謝,我認爲它應該打印出來,但它並不重要。 – jamylak 2012-07-13 00:04:16

2

功能做的事情對象,然後返回結果。您希望保持功能簡單並在功能之外執行所有邏輯和處理。這將消除對全局變量的需求,並使您的代碼更加容易閱讀。

話雖這麼說,這裏是我怎麼會攻擊你的問題:

import random 

def random_list(n=None): 
    n = n or int(raw_input('How many numbers do you want in your list? '))  

    return [random.randint(1, n) for i in range(n)] 

if __name__ == '__main__': 
    my_list = random_list(10) 
    minimum, maximum = min(my_list), max(my_list) 

    print 'My list is ', my_list 
    print 'The minimum value in the list is ', minimum 
    print 'The maximum value in the list is ', maximum