2016-12-09 4 views
0

私はPythonを学んでいて、本の問題をいくつか練習しています。関数を書いて、繰り返し呼び出す際に最大値を返す方法

この問題は、最大値を維持する関数を書くように求めています。

関数(FOO)は以下のように動作:コールfooは(1)を印刷する場合

  • コールのfoo(5)印刷5

  • コールFOO(3 )print 5

  • call foo(10)print 10

  • call foo(8)print 10

この問題の重要な点はわかりません。

+1

このように考えると、初心者にとっては少し奇妙な問題に思えます。この問題が設定されている状況はありません。可能な解決策のヒントとして、関数はPythonのファーストクラスのオブジェクトであるため、属性(クラスなど)を持つことができます。しかし、この問題を解決するには他にもいくつかの方法があり、 "正しい"解決策はコンテキストに依存します。 – Evert

+0

質問にはグローバル変数について何か言及していますか? – AER

+0

私はこの問題がおそらくグローバル変数であると考えています – zero0o0o

答えて

0

あなたの質問はグローバル変数に関するものです。その関数のインスタンスに依存しない変数を作成するということです。この機能がいつ使用されているかを説明するために、インスタンス(この場合)が使用されます。変数をグローバルに設定すると、関数が呼び出された別の時間にかかわらず、変数がその値として保持されます。

このコードは、解決策になる:タスクを完了するために

glob_max = 0 #This variable needs to be set before the function 
    #(assuming you're just using natural numbers otherwise set a smaller number) 

def foo(numbr): 
    if numbr > glob_max: #This find if it is the max or not 
     glob_max = numbr #Sets the variable 
    global glob_max #Makes the variable global to remember it for other functions 
    print(glob_max) #Print the number as required 
+0

グローバルな機能は必要ありません。 Globalは関数本体の中で、その関数がグローバル変数を使用するように指示するために使用されます。 – tdelaney

+0

@tdelaneyもちろん、私の間違いは残念です。それに応じて答えを編集しました。 – AER

4

もう一つの方法は、(とはるかに正確な生産コードのカプセル化の面で)classesの代わりに、関数とグローバル変数を使用することです。

class MaxPositiveValue: 
    def __init__(self): 
     self.max_value = 0 

    def __call__(self, new_value): 
     ''' 
     This magic method will emulate function call 
     :param new_value: new value to compare 
     :return: max value 
     ''' 
     if new_value > self.max_value: 
      self.max_value = new_value 
     return self.max_value 

foo = MaxPositiveValue() 
print(foo(1)) # Will print "1" 
print(foo(5)) # Will print "5" 
print(foo(2)) # Will print "5" 
print(foo(10)) # Will print "10" 
print(foo(4.6)) # Will print "10" 
print(foo(12.8)) # Will print "12.8" 

そして、あなたが適切に正と負の両方の数値を比較したい場合は、次のコードを使用することができます:

class MaxValue: 
    def __init__(self): 
     self.max_value = None 

    def __call__(self, new_value): 
     ''' 
     This magic method will emulate function call 
     :param new_value: new value to compare 
     :return: max value 
     ''' 
     if (self.max_value is None) or (new_value > self.max_value): 
      self.max_value = new_value 
     return self.max_value 

foo = MaxValue() 
print(foo(-10.4)) # Will print "-10.4" 
print(foo(-30.1)) # Will print "-10.4" 
print(foo(1)) # Will print "1" 
print(foo(5.6)) # Will print "5.6" 
print(foo(2)) # Will print "5.6" 
print(foo(10)) # Will print "10" 
+0

いいですが、 '-math.inf'で' max_value'を初期化するのはどうですか? –

+0

実際に 'foo'を使う前にOPが' foo = MaxValue() 'を書かなければならない場合は、これが最善の答えだと思います。 –

+0

は負の値ではOKですが、 '-math.inf'は未定義です。正しい方法は 'float( ' - inf')'のようです。私は質問を編集しました。 –

0

数学では、関数に特定の入力が与えられても、常に同じ値が返されます。それは純粋な(言葉遣いで曖昧であることについて申し訳ありません)機能が果たすものです。それは、あなたの機能は、仕事が終わったときに使用したすべての情報を忘れることを意味します。この場合、あなたの関数は以前の最大値を記憶しておらず、問題を解決することはできません。そういうわけで、他の人々は、グローバル変数やクラスのようなやや複雑な解決策を提案しています。彼らは別の仕事をしますが、彼らはすべてを保つことについてです前の状態(または過去に何が起こったか)。私はあなたの目標を達成するためのもう一つの方法を提案します。これは今のところもっと難しく見えるかもしれませんが、後でこれを理解するでしょう。

# written in Python3, not Python2 
def function_factory(): 
    prev_max = None 
    def print_max(num): 
     nonlocal prev_max 
     # prev_max is None or smaller than num 
     if not (prev_max and prev_max > num): 
      prev_max = num 
     print(prev_max) 
    return print_max 

# make an instacne of print_max and bind that 
# new function to the name, my_func 
my_func = function_factory() 
my_func(3) # >> 3 
my_func(5) # >> 5 
my_func(3) # >> 5 

私は閉鎖と呼ばれるものを使用しました。関心がある場合は、関数型プログラミングを勉強することができます。それは少し複雑ですが、コードを簡潔にしています。

+1

で 'max_value'を初期化することができます。そこの字下げを修正したいかもしれません。 –

+0

@Sнаđошƒаӽありがとう –

+0

まだ形が整っていないようです。 –

関連する問題