15.函数对象和闭包

15.函数对象和闭包

小蛙有话说环节

与诸君共勉,愿诸君明天依旧光芒万丈。好记性不如烂笔头,让我们一起努力。小蛙今天也是收获满满!!!
小声bb环节:我说的很小声你们应该听不见(你们要是不学习,本蛙可就要超过你们了)

1.函数对象

函数是第一类对象

函数对象精髓:函数可以当变量去用

函数对象指的是函数可以被当作‘数据’来处理,具体可以分为四个方面的使用,如下

1.1. 函数可以被引用

def add(x,y):
     return x+y
 
func=add
print(func(1,2))

1.2. 函数可以作为容器类型的元素

def func():
    print('from func')
l = [func, ]
l[0]()  # from func

dic = {'function': func, }
dic['function']()  # from func

1.3. 函数可以作为参数传入另外一个函数

def func():
    print('from func')

def foo(x):
    # print(x)  # <function func at 0x0000025B34F47310>
    x()  # from func
foo(func)

1.4. 函数的返回值可以是一个函数

def func():
    print('from func')
def foo(x):
    return x

res = foo(func)
print(res)   # <function func at 0x000001D072BE7310>
res()   # from func

1.5. 函数对象实例

计算圆的面积和周长

from math import pi


def circle(radius, mode=0):
    def perimeter(radius):
        return 2 * pi * radius

    def area(radius):
        return pi * (radius ** 2)
    if mode == 0:
        return perimeter(radius)
    if mode == 1:
        return area(radius)


print(circle(20, 1))

登录小程序,1.2. 的实际应用

def login():
    print('登录')


def register():
    print('注册')


def withdrawl():
    print('提现')


def transfer():
    print('转账')


func_dic = {'1': ['登录', login],
            '2': ['注册', register],
            '3': ['提现', withdrawl],
            '4': ['转账', transfer]}

while True:
    print('0  退出')
    for i in func_dic:
        print('%s  %s' % (i, func_dic[i][0]))
    choice = input('请输入操作编号:').strip()
    if choice in func_dic:
        func_dic[choice][1]()
    elif choice == '0':
        break
    else:
        print('请输入正确操作!!!')

2. 闭包函数

2.1. 闭与包

基于函数对象的概念,可以将函数返回到任意位置去调用,但作用域的关系是在定义完函数时就已经被确定了,与函数的调用位置无关

闭包函数 = 名称空间与作用域+函数嵌套+函数对象

核心点:名字的查找关系是以函数定义阶段为准

2.2. 什么是闭包

“闭”函数指的该函数是内嵌函数

“包”函数指的该函数包含外层函数作用域名字的引用,内部函数引用了一个外层函数的名字

2.3. 闭包函数使用

1.闭包函数:名称空间与作用域+函数嵌套

def f1():
    x = 3333
    def f2():
        print(x)
    f2()
f1()  # 3333

2.闭包函数:函数对象

def f1():
    x = 3333
    def f2():
        print('这是函数f2')
    return f2()

2.4. 为何要有闭包函数(闭包函数的应用)

闭包函数本质就是函数传参的一种方式

函数有两种传参的方式

方式一:直接把函数体需要的参数定义成形参

def f2(x):
    print(x)
f2(22)

方式二:闭包传参

def f1():
    x = 33
    def f2():
        print(x)
    return f2
x = f1()
print(x)

3. 函数嵌套

函数嵌套分为两种:函数嵌套调用, 函数嵌套定义

3.1函数的嵌套调用

在调用一个函数的过程中,该函数内部又掉用了其他函数称为函数的嵌套调用

def bar():
    print('from bar')


def foo():
    print('from foo')
    bar()

3.2函数嵌套定义

在函数内部有定义了其他函数(函数定义的函数,函数最外层调用不到嵌套的函数)称为函数嵌套定义

def foo():
    def bar():
        print('from bar')

练习

比较大小:

def add(x, y):
    if x > y:
        return x
    else:
        return y


def max(a, b, c, d):
    res1 = add(a, b)
    res2 = add(res1, c)
    res3 = add(res2, d)
    print(res3)


max(111, 556, 5, 41)  # 556

结束收工环节

声明:蛙脸没了啊,兄弟萌
兄弟们,塞不塞,6不6,就是这么简单,就是这么快乐,今天小蛙好细啊。愿诸君能在代码的世界里自由的翱翔。
内容有点多,一定要好好吸收。
喜欢的话,一定要去看本蛙其他作品哦,不喜欢的话,锤你。
本蛙要去拉啦啦,嗝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值