2012-07-12 256 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