高阶函数、闭包

f用于{}的格式化,{}内是变量或函数的某个形参;%s这种格式化不行

def func():
    name='小明'
    print(f'good morning,{name}')
func()

def func(name):
    print(f'good morning,{name}')
func('小明')
****************************************分割线****************************************
高阶函数:参数为函数;闭包:返回值为函数;装饰器:返回值为函数的高阶函数

高阶函数:

from functools import reduce

def accumulate(start,end,handle,sign):
    t=map(handle,range(start,end+1))    #首参的函数体内若用了lambda,此处就要改为加()的v了
    return  reduce(lambda x,y:eval('%s%s%s' %(x,sign,y)),t)
#map的首参函数,其内的参数个数不定,同一列表中的各元素互不影响,返回一值;
# 而reduce的首参函数内必须是俩参,迭代处理二参列表中的各元素,返回一

def add(start,end,handle):
    return accumulate(start,end,handle,'+')

def product(start,end,handle):
    return accumulate(start,end,handle,'*')

def handle(n):
    return n**3

print(add(1,5,handle))
**********************分割线**********************
      变量在使用前要先有初始值,函数式变量亦同:在使用函数作参数时,表面上在上文要已有这个函数的定义,除非是跟在return的后面(其实在机器内依然是走在return的前面——因为在运行到函数内的return时,已先一步自上而下扫描过所有的def头了;在调用函数时是直接进入函数体内,不再重复扫描def头)

def abc(): #第1句
    return x #第4句

x='qwerty' #第2句

print(abc()) #第3句

#上述代码,若改为def abc(x)……print(abc('helloworld')),即函数头中的形参变量和函数体外的全局变量冲突,那么return x使用的是下文传来的实参helloworld,否则就只能退而求其次地选用函数体外的全局变量x。

若为def abc(y),那么return x迫于无奈也只能使用全局变量x——优先形参,找不到形参时方采用全局变量
****************************************分割线****************************************
闭包:

def count():
#x=i:x是匿名函数的形参,i是实参;不写=i,则报错lambda()缺少参数(实参)
    t=[lambda x=i:x*x for i in range(1,4)]    #生成3个传来了实参的函数体
    return t

x,y,z=count()
print(x(),y(),z(),sep=';')
*******************分割线*******************
def func():
    x,y=1,2
    return lambda m=x,n=y:m+n
#m=x,n=y:x和y是默认实参

print(func()()) #输出3
print(func()(3,7))  #输出10
*******************分割线*******************
def build(x, y):
    return lambda: x * x + y * y
#不加lambda,返回的是int;加了返回的则是function
print(build(2,3)())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值