9
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」を使用するのはどれですか?ありがとう!

4

3 に答える 3

15

はい、2 つの選択肢があります。

まず、グローバルを使用する代わりに値を渡すことができます。たとえば、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()

おそらく、グローバル変数が悪い習慣である理由を理解する必要があります。

2 つの配列を作成するとします。グローバル変数を使用すると、2 番目の変数が最初の変数に置き換わり、永久に失われます。

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)

オブジェクトを使用すると、同じ利点が得られます。この 2 つの違いは、最終的には、操作がデータの意味の一部なのか、それともデータが独立していて操作が一般的なものなのかによって決まります。(あるいは、あなたがより機能的な俗物であるか、オブジェクト指向の俗物であるかに関係なく...)

于 2012-07-12T23:49:27.143 に答える
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
于 2012-07-13T00:05:05.310 に答える
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()
于 2012-07-12T23:57:24.143 に答える