函数(2.0)
递归函数
递归虽然写法简单,但是运算速度较慢,有最大递归限制(1000次)
斐波那契数列
def fib(x):
if x ==1:
return 1
elif x==2:
return 1
else:
return fib(x-1)+fib(x-2)
print(fib(5),fib(9))
5 34
匿名函数
格式
lambda para1,para2,...,paran:expression using paras
###关键字'lambda' + 若干参数 + : +函数表达式(参数的相关运算操作)
f=lambda a,b='b',c='c': a+b+c ##参数定义与普通函数相同
print(f('1','2','3'))
print(f('a'))
123
abc
高阶函数
定义:
把一个函数名,以实参的形式,传递给这个函数的形参。
def add(a,b,func):
return func(a)+func(b)
print(add('2','5',int)) ##传入2个字符串,以及一个强制类型转换的函数(int)
7
filter函数
filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)。filter(function or None, sequence) -> list, tuple, or string:入参为函数和列表/元组/字符串,返回值为item列表/元组/字符串。 筛选
print (list(filter(lambda x:x%2,range(10))))
[1, 3, 5, 7, 9] ##匿名函数返回2的余数,偶数为False(余数为0) 故返回0-9的奇数
li1=[1,2,3,4,5,6,7,8,9]
li2=[1,3,6,8]
print(list(filter(lambda x:x not in li2,li1)))
[2, 4, 5, 7, 9] ##得到2个列表非重复的部分(类型li1-li2)
map函数
map(function, sequence) :对sequence中的item依次执行function(item),将执行结果function(item)组成一个List返回。 map(function, sequence[, sequence, …]) -> list:入参是为函数和列表/元组/字符串,返回值为function(item)列表。 映射
print(list(map(lambda x:x%2,range(10))))
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] ##将列表的所有元素做lambda操作
print(list(map(lambda x,y:x+y,range(1,5),range(100,104))))
[101, 103, 105, 107]
############高阶函数实现map####################
def f(f2,li):
rst=[]
for i in li:
rst.append(f2(i))
return rst
def f2(x):
return x*x-1
print(f(f2,[1,2,3,4,5,6,7,8]))
[0, 3, 8, 15, 24, 35, 48, 63]
注:map与filter都是先传入一个function(函数),再传入一个sequence(列表/元组/字符串),但是filter是返回sequence中满足function的元素(运算返回True),map是返回sequence各个元素经过function后的返回值
reduce函数
reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用。function接收的参数个数只能为2,先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给function,然后只返回一个结果。reduce(function, sequence[, initial]) -> value:入参是为函数和列表/元组/字符串和初始值,返回值为数值。
reduce用法:先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给fuction,最终返回一个结果值
print reduce(lambda x,y:x*y-4,range(4))
-40
#计算0到100的和(初始值0)
print reduce(lambda x,y:x+y, range(101))
5050
#计算0到100的和(初始值100)
print reduce(lambda x,y:x+y, range(101),100) 初始值为100
5150