python闭包的应用场景_python笔记23_闭包

主要内容:

小目标:理解闭包

主要内容:闭包原理,闭包应用

如果看完这篇文章,你还是弄不明白闭包;

你来找我,我保证不打你,我给你发100的大红包。

1. 闭包

闭包:函数内部定义函数,内部函数使用外部变量

闭包要点:

函数内部定义函数

内部函数引用外部变量

函数返回值为内置函数

闭包场景:代码封装复用,装饰器基础

2. 案例:将数字字符串转成N进制:

例如:定义两个函数实现10进制与16进制转换

基本代码实现:

def strToHex(s):

return int(s, 16)

def strToInt(s):

return int(s, 10)

print(strToHex('10'))

print(strToInt('20'))

结果:16,20

问题:如果字符串中,有空白字符,如何处理?

代码实现:

def strToHex(s):

s = s.strip()

return int(s, 16)

def strToInt(s):

s = s.strip()

return int(s, 10)

print(strToHex(' 10'))

print(strToInt('20 '))

结果:16.20

如果还有其他需求,我们需要改多次,换个思路。

3. 闭包实现

def strToN(n):

def func(s):

s = s.strip()

return int(s, n)

return func

strToInt = strToN(10)

strToHex = strToN(16)

print(strToInt(' 10 '))

print(strToInt(' 16 '))

分析:

1.strToN(n):返回内置函数func;

2.strToInt指向func函数;

3.内置函数func中的n是外部变量,为10,16等值;

4.strToInt调用就是对func调用

4 一个问题:func函数中的n?

n对于strToN是局部变量,当strToN调用结束后,理论上就会被释放;

n对于func是外部变量,strToInt指向func函数,所以func函数不会释放,n就被作为外部半两存储到了func中

来验证:

def strToN(n):

def func(s):

s = s.strip()

print('in func locals():',locals())

return int(s, n)

return func

strToInt = strToN(10)

strToHex = strToN(16)

print(strToInt(' 10 '))

结果:

in func locals(): {'s': '10', 'n': 10}

10

5. closure属性

函数有一个属性:closure,用于存放外置变量

def strToN(n):

def func(s):

s = s.strip()

#地址,16进制表示

print('id(n):0x%X'%id(n))

print('in func locals():',locals())

return int(s, n)

return func

strToInt = strToN(10)

print(strToInt(' 10 '))

print(strToInt.__closure__)

结果:

id(n):0x7FFE9CB6A2B0

in func locals(): {'s': '10', 'n': 10}

10

(,)

可以看到:id(n)与strToInt.closure相同:0x7FFE9CB6A2B0

总结:

闭包要点:

1.函数内部定义函数

2.函数返回值为函数

3.内置函数引用外部变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值