Alternativas de Python a las variables globales

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() 

Soy bastante nuevo en el uso de Python. En general, he escuchado que usar variables globales es una mala práctica al progtwigr. Entonces, ¿hay alternativas a lo que estoy tratando de hacer aquí? ¿Cuál es utilizar la variable “my_array” desde otra función? ¡Gracias!

Sí, hay dos alternativas.

Primero, puedes pasar los valores en lugar de usar globales. Por ejemplo, create_list_and_find_max_and_min puede crear la matriz localmente y devolverla, luego puede pasarla a 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() 

En segundo lugar, puede crear una clase que encapsule los datos y las funciones que operan en esos datos:

 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() 

Probablemente deberías entender las razones por las cuales las variables globales son una mala práctica.

Imagina que quieres crear dos matrices. Con las variables globales, la segunda reemplazará a la primera, que desaparecerá para siempre.

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

Con una variable local, puede almacenar ambos:

 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) 

Usar un objeto proporciona el mismo beneficio; la diferencia entre los dos finalmente se reduce a si las operaciones son parte del significado de los datos, o si los datos son independientes y las operaciones son genéricas. (O, a veces, si eres más un snob funcional o un snob OO ...)

Las funciones hacen cosas a los objetos y luego devuelven resultados. Desea mantener las funciones totalmente simples y realizar toda su lógica y procesamiento fuera de la función. Esto eliminará la necesidad de variables globales y hará que su código sea mucho más fácil de leer.

Dicho esto, aquí es cómo atacaría tu problema:

 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 

Aquí es cómo haría esto:

 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()