一些特殊函数
1.递归函数(recursion)
递归函数的定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数的优点:是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
递归函数的特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高(建议少用),递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
所以,递归调用的次数过多,会导致栈溢出。)
1 def fac(n): 2 multi=1 3 for i in range(1,n+1): 4 multi=multi*i 5 return multi 6 7 print(fac(5)) 8 9 10 def fac_new(n): 11 if n==1: 12 return 1 13 return n*fac_new(n-1) 14 15 print(fac_new(5)) 16 17 输出结果:120
1 # Fibonacci 返回第n项斐波那契数列的值(0,1,1 2 3 5 8 13 21 34...) 2 def fibo(n): 3 if n<=1: 4 return n 5 return fibo(n-1)+fibo(n-2) 6 7 print(fibo(8)) 8 输出结果:21
2.内置函数
重要的内置函数:
1. filter(function, sequence)
对sequence中的item依次执行function(item),将执行结果为True的item做成一个filter object的迭代器返回。可以看作是过滤函数。
1 str=['a','b','c','d'] 2 def fun1(n): 3 if n!='a': 4 return n 5 6 ret=filter(fun1,str) 7 8 print(type(ret)) #迭代器,占用内存空间很小,哆啦A梦 9 print(ret) #输出内存地址 10 print(list(ret)) #转换成列表输出 11 输出结果 12 <class 'filter'> 13 <filter object at 0x00B48710> 14 ['b', 'c', 'd']
2. map(function, sequence)
对sequence中的item依次执行function(item),将执行结果组成一个map object迭代器返回.
map也支持多个sequence,这就要求function也支持相应数量的参数输入
1 str=['a','b','c','d'] 2 def fun2(n): 3 return n+'hello' 4 5 ret=map(fun2,str) 6 7 print(type(ret)) 8 print(ret) 9 print(list(ret)) 10 11 12 输出结果: 13 <class 'map'> 14 <map object at 0x02988790> 15 ['ahello', 'bhello', 'chello', 'dhello']
注:map和filter的区别是:filter只起过滤的作用,map可以对func2的返回值做处理
3 reduce(function, sequence, starting_value)
对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用.
1 from functools import reduce 2 str=['a','b','c','d'] 3 def fun3(x,y): 4 return x+y 5 6 ret=reduce(fun3,range(1,10)) 7 8 print(type(ret)) 9 print(ret) 10 11 输出结果: 12 <class 'int'> 13 45
4 lambda
匿名函数的命名规则,用lamdba 关键字标识,冒号(:)左侧表示函数接收的参数(a,b) ,冒号(:)右侧表示函数的返回值(a+b)。
因为lamdba在创建时不需要命名,所以,叫匿名函数
1 #这是函数式编程的思想()我们通常是命令式编程思想) 2 3 from functools import reduce 4 print(reduce(lambda a,b:a*b,range(1,6))) 5 6 输出结果 7 120