递归函数
递归函数:在函数调用函数自身,我们把这样的函数叫做递归函数
递归边界:退出递归的终止条件
1 # 递归实现阶乘 2 def fun(num): 3 if num == 1 or num == 0: 4 return 1 5 else: 6 return num * fun(num - 1)
纯函数
1、概念:
一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数就叫纯函数。
2、纯函数的3个原则
- 变量都只在函数作用域内获取,作为函数的参数传入
- 不会产生副作用(slde effects)不会改变被传入的数据或者其他数据(全局变量)
- 不管在什么时候调用,传入的参数相同,返回的结果就一定是一样的
3、函数的副作用
副作用是指函数被调用,完成了函数既定的计算任务,但同时因为访问了外部数据,尤其是因为对外部数据进行了写操作,从而一定程度的改变了系统环境
案列说明:
# 函数fun1返回的结果为两个参数相加的结果 def fun1(a, b): return a + b
python中的内置函数
常用的内置函数
- map函数:会根据提供的函数对指定序列做映射
1 # map将可迭代对象中的数据迭代出来,一个一个传到函数中调用,将返回结果放到新的对象中 2 def fun(n): 3 return n * 2 4 li = [1,3,12,4,34] 5 res = map(fun, li) 6 print(list(res)) # 结果 >>>[2,6,24,8,68]
- filter函数:函数用于过滤序列
1 # filter 过滤函数 第一参数是函数,第二参数是可迭代对象 2 def fun(n): 3 return n < 10 4 li = [1,3,12,4,532,34] 5 res = filter(fun, li) 6 print(list(res)) # 结果 >>>[1,3,4]
- zip函数:函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元祖
1 res = zip([1,2,3],[11,22,33,44],[111,222,333]) 2 print(list(res)) 3 # 结果 >>>[(1,11,111),(2,22,222),(3,33,333)]
匿名函数
python中有一种特殊的函数,不需要使用def去定义,也不用给函数起名字。用过lambda表达式来定义,这种函数叫匿名函数
1 # 匿名函数格式 2 lambda 参数 : 表达式 (返回值) 3 4 # 普通函数 5 def fun1(a): 6 return a * 2 7 8 # 匿名函数适用场景 简单的函数定义(只有一个表达式) 9 res = (lambda a , b : a + b)(1,2) # 结果 >>>3 10 11 li = [1,2,122,322,11,4,6] 12 res2 = filter(lambda x:x<10,li) 13 print(list(res2)) # 结果 >>>[1,2,4,6]
偏函数
作用:当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
1 # 导入模块 2 from functools import partial 3 4 li1 = [1,2,6,7,32] 5 li2 = [1,2,55,323,12] 6 li3 = [1,3,5,213,532] 7 8 # 通过传入不同的过滤条件去过滤出来我们需要的数据 9 # 获取数据中大于5的数据 10 filter2 = partial(filter, lambda x:x>5) 11 res1 = filter2(li1) 12 res2 = filter2(li2) 13 print(list(res)) # 结果 >>>[6, 7, 32] 14 print(list(res2)) # 结果 >>>[55, 323, 12]