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