2012-07-12 2 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"변수를 사용합니까? 감사!파이썬 대안 전역 변수

+0

는 질문을 수정하십시오 : 여기 말했다되고 그건

, 나는이 문제를 공격 할 방법이다. 귀하의 답변이있을 경우 사용자의 답변에 대한 의견을 게시하십시오. – Blender

+0

죄송합니다. 문제를 해결하기 위해 코드를 업데이트하려고 시도했지만 여전히 오류가 발생하고 있음을 지적합니다. :/ –

답변

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) 

같은 이점을 제공; 둘의 차이는 궁극적으로 작업이 데이터의 의미에 속하는지 또는 데이터가 단독으로 작동하는지 또는 작업이 일반적인지 여부에 달려 있습니다.

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

안녕하세요, 첫 번째 방법을 사용하여 시도 할 때 오류가 발생했습니다. 변수 my_array가 "행 3"으로 정의되지 않았습니다. –

+0

전체 코드를 게시하지 않았으므로 # ... 비트가됩니다. 모든 것을 포함하도록 편집합니다. 잠시만 기다려주세요. – abarnert

1

내가 이런 짓을 했을까 방법이다. 함수를 간단하게 유지하고 함수 외부에서 모든 논리 및 처리를 수행하려고합니다. 이렇게하면 전역 변수의 필요성이 제거되고 코드를 훨씬 쉽게 읽을 수 있습니다. 당신이 정보를 추가하거나 쓸모없는 정보를 제거하는 경우에만 * *

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 
+0

혼란을 피하기 위해 가능한 한 코드를 변경하는 방법에 중점을 두었지만 리팩터링을 사용하면 일반적으로 코드를 훨씬 더 멋지게 만들 수 있습니다. (하지만 그의 the_smart_way는 인쇄하는 것이 아니라 min, max를 반환합니다.) – abarnert

+0

@abarnert 감사합니다. 인쇄하기로되어 있다고 생각했지만별로 중요하지 않습니다. – jamylak

2

기능은 객체에 대한 작업을 수행 한 후 결과를 반환 (또는, 당신은 기능 속물 또는 OO 속물 ... 더있어 때로는 여부)

다음