函数式编程是指用一系列函数解决问题
好处:用每一个函数完成每一个细小的功能,一系列函数任意组合可以解决大问题
函数仅仅接收输入并产生输出,不包含任何能影响输出的内部状态python
当一个函数的输入实参必定,结果也必须必定的函数为可重入函数
例子:编程
#可重入函数 def myadd(x,y): return x+y #不可重入函数 s = 0 def myadd2(x,y): global s s+= x+y return s
什么是高阶函数闭包
知足下列条件中个任意一个的函数就是高阶函数app
条件一:函数接收一个或多个函数中用参数传入函数式编程
条件二:函数返回一个函数函数
map(func,*iterable)测试
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并经过把函数 f 依次做用在 list 的每一个元素上,获得一个新的 list 并返回code
例子:对象
对于list[1,2,3,4,5,6,7,8,9]排序
若是但愿把list的每一个元素都作平方,就能够用map()函数
所以,咱们只须要传入函数f(x)==x*x,就能够利用mnap()函数完成这个计算
def f(x): return x*x print(map(f,[1,2,3,4,5,6,7,8,9])) 输出结果: [1.4.9.10.25.36.49.64.81] 注意:map函数是不改变原有的list的,而是生成一个新的list
map()函数是python内置的高阶函数,对传入的list的每个元素进行映射,返回一个新的映射以后的list
python3中,map函数返回的是一个map对象,须要list(map(fun,itor))来将映射以后的map对象转换成列表
map(func, *iterable) 返回一个可迭代对象,此可迭代
对象用函数 func对可迭代对象iterable中的每个
元素做用参数计算后得一结果,当最短的一个可迭代对
象再也不提供数据时可迭代对象生成数据结束
def mypower2(x, y): return x ** y for x in map(mypower2,[1,2,3,4],[4,3,2,1]): print(x) # 看懂下面程序在作什么: for x in map(pow, [1,2,3,4], [4,3,2,1], range(5, 10)): print(x)
filter(function,iterable)返回一个可迭代对象
此可迭代对象将iterable提供的数据用函数function进行筛选
function将对iterable中的每一个元素求值
返回False将此数据丢弃,返回True则保留
示例:
def isood(x): return x % 2 == 1
打印0~10之间的全部奇数
for x in filter(isood,range(11)): print(X) for x in filter(lambda x:x%2,range(11)): print(X) L = [x for x in filter(isood,range(11))]
做用:
将原可迭代对象提供的数据进行排序,生成排序后的列表
格式说明:
sorted(iterable,key=None,reverse=False)
返回一个新的包含全部可迭代对象中数据的列表,新的列表是排序过的列表
参数说明:
示例:
L = [5,-2,-4,0,3,1] L2 = sorted(L) k3 = sorted(L,keys=abs) names= ['Tom','Jerry','Spike','Tyke'] sorted(names) sorted(names,key=len,reverse=True)
什么叫递归函数?
函数直接或者间接的调用自身
示例:
#函数直接调用自身 def f(): f()#调用本身 #函数间接调用自身 def fa(): fb() def fb(): fa() fa()
递归说明:
递归必定要充值递归的成熟,当符合某一条件时要终止递归调用,几乎全部的递归都能用while循环来代替
优势:递归能够把问题简单化,让思路清晰,代码简洁
缺点:递归因系统环境影响大,当递归深度太大时,能够获得不可预知的结果
递归函数的执行分为两个阶段
递推阶段:调用进入函数内部
回归阶段:返回结果,获得最终结果
什么是闭包?
闭包必须知足三个条件
注意:
因为闭包会使函数中的变量都保存在内存中,计算机的内存消耗比较大,因此不能滥用闭包
示例
# 此示例示意闭包的定义及调用 def make_power(y): def fn(x): # fn绑定一个闭包函数 return x ** y return fn pow2 = make_power(2) # pow2绑定一个闭包函数 print("5的平方是:", pow2(5)) pow3 = make_power(3) print("6的立方是:", pow3(6)) fp = make_power(100) fp = make_power(10000)
闭包测试题:
试看下列程序的执行结果是什么?
def get_funs(n): L = [] for i in range(n): L.append(lambda x: x * i) return L funs = get_funs(4) print(funs[0](10)) # 30 print(funs[1](10)) # 30 print(funs[2](10)) # 30 print(funs[3](10)) # 30