python--------函数式编程【匿名 、嵌套、高级(map、filter、reduce、zip、sorted)函数、闭包、装饰器、偏函数】

本文介绍了Python的函数式编程,包括高阶函数的概念,如map、filter、reduce和zip等,以及匿名函数lambda的使用。详细讲解了函数嵌套和闭包的原理,探讨了装饰器的实现和应用。同时,对比了普通函数与函数式编程的区别,并介绍了偏函数的概念和应用场景。
摘要由CSDN通过智能技术生成

函数式编程概述

  • 函数式编程: 函数式=编程语言定义的函数+数学意义的函数

优点:

  • 便于进行单元测试
  • 便于调试
  • 适合并行执行

特性

  • 不可变数据(不可变:不用变量保存状态,不修改变量)

非函数式:

a=1
def incr_test1():
    global a
    a+=1
    return a
print(incr_test1())

运行结果

2

函数式:

n=1
def incr_test2(n):
    return n+1
print(incr_test2(2))

运行结果

3
  • 第一类对象(函数即"变量")---------看下面高阶函数的条件
  • 尾调用优化(尾递归) 尾调用:在函数最后一步调用另外一个函数(最后一行不一定是函数的最后一步)

函数bar3foo3内为尾调用

def bar3(n):
    return n
def foo3():
    return bar3(3)

函数bar4bar5foo4内均为尾调用,二者在if判断条件不同的情况下都有可能作为函数的最后一步

def bar4(n):
    return n
def bar5(n):
    return n+1
def foo4(x):
    if type(x) is str:
        return bar4(x)
    elif type(x) is int:
        return bar5(x)

函数bar6foo5内为非尾调用

def bar6(n):
    return n
def foo5(x):
    y=bar6(x)
    return y

函数bar7foo6内非尾调用

def bar7(n):
    return n
def foo6(x):
    return bar7(x)+1

高阶函数

下面两个条件满足其中一个即可:

  • 函数可以接收另一个函数作为参数
def add(x,y,f):
    return f(x)+f(y)
print(add(-5,6,abs)) #f=abs abs()求绝对值

运行结果

11
  • 返回值可以是函数名
def bar1():
    print('from bar1')
def foo1():
    print('from foo')
    return bar1
m=foo1() #n=bar1
m()

运行结果

from foo
from bar1
def hanle():
    print('from hanle')
    return hanle
h=hanle()
h()

运行结果

from hanle
from hanle

这个就不是高阶函数

def foo(n):
    print(n)
def bar(name):
    print('i am name is %s'%name)
foo(bar('alex')) #bar函数没有返回值,返回值不是函数名

运行结果

i am name is alex
None

匿名函数

lambda 参数列表:函数返回值表达式语句

  • 关键字lambda表示匿名函数
  • 冒号前表示参数,冒号后表示返回值
def func(x):
    return x+1
res=func(10)
print(res)

#相当于
res=lambda x:x+1
print(res(10))   #记得带参数

运行结果

11
11
res=lambda x:x+'_ab'
print(res('alex'))

运行结果

alex_ab

lambda表达式序列

  • 可以将lambda表达式作为序列(如列表、元组或字典等)元素,从而实现挑战表的功能,也就是函数的列表

序列=[(lambda 表达式1),(lambda 表达式2), …]

调用序列中lambda表达式的方法

序列[索引](lambda 表达式的参数列表)

定义一个lambda表达式序列,第一个元素用于计算参数的平方,第二个元素用于计算参数的立方,第三个元素用于计算参数的四次方

arr=[(lambda x:x**2),(lambda x:x**3),(lambda x:x**4)]
print(arr[0](2),arr[1](2),arr[2](2))

运行结果

4 8 16

lambda表达式作为函数的返回值

def math(o):
    if(o==1):
        return lambda x,y:x+y
    if(o==2):
        return lambda x,y:x-y
    if(o==3):
        return lambda x,y:x*y
    if(o==4):
        return lambda x,y:x/y
action=math(1) #返回加法lambda表达式
print('10+2=',action(10,2))
action=math(2) #返回减法lambda表达式
print('10-2=',action(10,2))
action=math(3) #返回乘法lambda表达式
print('10*2=',action(10,2))
action=math(4) #返回除法lambda表达式
print('10/2=',action
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值