在使用函数的时候,如果能合理的使用一些技巧,对于代码的阅读性以及程序的结构都是很有帮助的。常用的技巧有递归函数、高阶函数等。
递归函数的定义就是在函数的内部调用自身,这样的函数就称为递归函数。其实递归是一种思想,将一个复杂问题分为很多步,上一步的输出结果会作为下一步的输入。例如:求解1*2*3*...*n
def get_n(n):
if n==1:
return 1
return n*get_n(n-1)
运用这个思想就能够求等比数列的乘积了。 我们从函数定义也可以看出,递归函数是一层一层的函数不断的嵌套实现的,同时我们也知道在调用函数的时候会将正在运行的地址和数据存在栈中,如果递归的层数很多,就容易导致栈溢出,最终使得程序运行错误,所以要谨慎使用递归函数。
高阶函数这种称谓比较难理解,通俗的说就是让函数的参数能够接受别的函数,也就是说函数也是变量的一种表现形式,也就是说,函数名本质上是指向函数的变量。知道了这些我们就可以这样去定义一个函数了:
def get_mul(x,y):
return x*y
def get_add(x,y,func):
return x+y+func(x,y)
a = get_add(2,3,get_mul)
print(a)
python中内置了几个比较实用的高阶函数,这里不得不提。 - 2.1 map()
map()函数接收两个参数:一个函数,一个可迭代的对象(list,字符串等),map函数的功能就是把这个函数分别应用到可迭代对象上并返回一个新的可迭代对象。
def get_add(x,y=10):
return x+y
a = map(get_add, [1,2,3,4,5])
print(a) #a 是对象的地址
b = list(a) # 将对象转换为list
print(b)
filter函数用于过滤可迭代对象(list等),过滤的原则是根据传入的函数应用到传入的可迭代对象的元素上,根据返回值来决定该元素是否删除,如果返回值为True,则保留;同样,返回值为False则删除该元素。
def is_zero(x):
if x == 0:
return False
else:
return True
a = filter(is_zero, [1,2,0,4,0])
print(a)
b = list(a)
print(b)
在函数嵌套的过程中,也就是在函数中还声明了函数,函数名可以作为内层函数的返回结果直接使用。
def get_add(x,y):
def get_mal():
return x*5
return get_mal()+y
a = get_add(5,10)
print(a)
这种用法也充分说明了函数名是指向函数的变量。