我正在学习Python并在本书中练习一些问题。
问题要求我写一个保持最大值的函数。
函数(foo)的工作方式如下:
如果调用foo(1)然后打印1
致电foo(5)print 5
致电foo(3)print 5
致电foo(10)print 10
致电foo(8)print 10
我不知道这个问题的关键点是什么。
答案 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
我使用了所谓的闭包,如果你感兴趣,你可以学习函数式编程。它有点牵扯,但使你的代码简洁。