python进阶(二)~~~函数进阶

函数进阶

1、递归函数:在函数体中调用自身;一定要设置退出的边界条件;

def func_add(i):
    if i==1:
        return i
    res=i+func_add(i-1)
    return res
print(func_add(3))

  print(sys.getrecursionlimit())  # 查看递归边界,超出时会报错

  sys.setrecursionlimit(1000)  # 手动设置递归边界

  递归函数存在大量的重复计算数据,使用缓存可以保留上次计算的结果,大大节省执行时间。

from functools import lru_cache

@lru_cache(maxsize=128,typed=False)
def func_add(i):
    if i<=2:
        return 1
    res=func_add(i-1)+func_add(i-2)
    return res
print(func_add(100))

2、纯函数

  函数的返回值只与函数内部参数有关,不受外部环境(如全局变量)影响;

       函数调用时不会产生副作用,例如改变外部环境(如全局变量,文件读写);

  相同的输入保证有相同的输出;

  常用的内置函数:map、filter、zip 

def func_map(n):
    return n*1000/3
res=map(func_map,[1,2,3,4]) #map(fun, li): 第一个参数为函数,第二个参数为可迭代对象;对可迭代对象中的每个元素当做参数传入fun函数中批量处理并返回
print(list(res))

#过滤器
def func_filter(n):
    return n>=5
res2=filter(func_filter,[1,2,3,4,6,7])
print(list(res2))

#聚合打包
title=['name','age','sex']
data=['musen','18','']
num=[1,2,3]
res3=zip(title,data)  
print(dict(res3))  # 整合为字典
res4=zip(title,data,num)  # 还可接收多个可迭代对象,整合,以最短长度为准

3、匿名函数

  匿名函数格式:  lambda 参数:表达式(返回值),匿名函数即用即销毁,不占用内存

  res2=filter(lambda n:n>5,li)  

  li2=[lambda i:i*9 for i in range(8)]

       print((lambda x,y:x+y)(3,5))

  print((lambda x,y='world':x+y)('hello'))

4、偏函数:固定参数,减少参数传递

from functools import partial

def func(a,b,c):
    print(a,b,c)

func(11,22,33)
func(11,44,55)
#有相同参数时可使用偏函数,固定
func11_cp = partial(func,11)
#再次调用时,即可减少参数传递
func11_cp(22,33)

 

posted @ 2020-02-03 16:08  青域  阅读(180)  评论(0编辑  收藏  举报