print里的max改为mymax(m,n)
其实,函数装饰器还有更大程度的灵活性。刚刚说了,装饰器可以接受原函数任意类型和数量的参数,除此之外,它还可以接受自己定义的参数。
举个例子,比如要定义一个参数,来表示装饰器内部函数被执行的次数,那么就可以写成下面这种形式:
def foo(num):
def my_decorator(fn):
def bar(*args,**kwargs):
for i in range(num):
fn(*args,**kwargs)
return bar
return my_decorator
@foo(3)
def my_test(a):
print("==my_test函数==", a)
@foo(5)
def new_test(a,b):
print("==new_test函数==",a," ",b)
my_test(10)
new_test(6, 5)
运行结果为:
== my_test函数== 10
== my_test函数== 10
== my_test函数== 10
== new_test函数== 6 5
== new_test函数== 6 5
== new_test函数== 6 5
== new_test函数== 6 5
== new_test函数== 6 5
回答:
这里提供一个简单的例子,自定义了一个函数取两个数的最大值:
def max_number(num1, num2):
"""取两个数的最大值"""
if num1 >= num2:
return num1
else:
return num2
通过这个例子,我们可以发现,自定义一个函数的步骤:
因此,在自定义求取两个数最大值的函数中,需要明确该函数需要接收两个参数,同时我们可以根据函数的作用,规定参数为数字类型。然后,在函数内容中,我们可以通过if/else条件语句,比较两个数的大小,返回较大的那个数。这样,我们就可以自定义一个求取两个数最大值的函数了。
例如,以下代码就是一个自定义求取两个数最大值的函数:
def max_number(num1, num2):
"""
求取两个数的最大值。
参数:num1, num2 两个数字。
返回值:两个数字中的最大值。
"""
if num1 >= num2:
return num1
else:
return num2
如果需要使用该函数,调用方法如下:
max_num = max_number(5, 9)
print(max_num) # 输出结果为 9
如果需要比较更多的数字,我们可以使用可变参数的方式,定义一个函数接收任意数量的参数,并在函数内部遍历比较大小,返回最大值。
def max_number(*numbers):
"""
求取多个数字中的最大值。
参数:任意数量的数字。
返回值:多个数字中的最大值。
"""
max_num = float('-inf') # 首先将最大值设为负无穷
for num in numbers:
if num > max_num:
max_num = num
return max_num
如果需要求取最小值,只需要将初始值设为正无穷即可。
参考资料中第二部分讲到如何对列表中的数字进行排序,并找出丢失的数据。这里提供了一个函数 digital_computation()
实现了该功能。对于每个列表的排序和查找缺失数据,我们可以通过使用标准库 sorted()
(默认升序排序)或 sort()
(原地升序排序)来实现。
def compute_lost_value(numbers):
"""
排序后找出缺失的数。
参数:numbers 为数字列表。
返回值:排序后第一个丢失值。
"""
numbers.sort() # 对列表进行排序
for i in range(len(numbers) - 1):
if numbers[i+1] - numbers[i] != 1:
return numbers[i] + 1
return numbers[-1] + 1 # 如果没有丢失的数据,返回最大值加一
num_list = [1, 2, 3, 5, 6, 7]
num_list1 = [1, 2, 4, 5, 6, 7]
num_list2 = [1, 2, 3, 4, 6, 7]
print(compute_lost_value(num_list)) # 输出结果为 4
print(compute_lost_value(num_list1)) # 输出结果为 3
print(compute_lost_value(num_list2)) # 输出结果为 5
需要注意的是,该函数需要传递一个数字列表作为参数,并且默认从小到大排序。另外,如果列表中不存在丢失的数据,算法会返回最大值加一,这个需要根据情况进行判断和处理。