如何编写一个函数,在重复调用时保持返回最大值

时间:2016-12-09 04:22:21

标签: python python-2.7

我正在学习Python并在本书中练习一些问题。

问题要求我写一个保持最大值的函数。

函数(foo)的工作方式如下:

  • 如果调用foo(1)然后打印1

  • 致电foo(5)print 5

  • 致电foo(3)print 5

  • 致电foo(10)print 10

  • 致电foo(8)print 10

我不知道这个问题的关键点是什么。

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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

答案 2 :(得分: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

我使用了所谓的闭包,如果你感兴趣,你可以学习函数式编程。它有点牵扯,但使你的代码简洁。