每日10行代码104: 编写高质量python代码的方法15:了解如何在闭包里使用外围作用域中的变量

本条内容比较多,我分了两篇来写:
上一篇在这:https://editor.csdn.net/md/?articleId=112461408
上一篇内容主要是不能在内部函数中直接给外部函数的的变量附值,如果要附值可以用nolocal的方法。但是nolocal方法也有问题,由他产生的bug难以调试。一是,过度的用nolocal可能会在不必要的时候修改了外部变量;二是在外部定义变量的位置、nolocal定义位置、变量使用位置三者的跨度会很大,导致代码难以理解阅读。
所以nolocal的代码要保持简单,如果已经越来越复杂,那就应该用类来实现。比如 :

class Sorter(object):
	def __init__(self,group):
		self.group = group
		self.found = False

	def __call__(self,x):
		if x in self.group:
			self.found = True
			return(0,x)
		return(1,x)


numbers = [8,3,1,2,5,4,7,6]
group = {2,3,5,7}
sorter=Sorter(group)
numbers.sort(key=sorter)
print(sorter.found)

这段代码的倒数第二行比较难理解,不过如果知道了__call__的用法也就能理解了。

要点:

  1. 对于定义在作用域内的闭包来说,它可以引用这些作用域中的变量。
  2. 使用默认方式 对闭包的变量赋值,不会影响外围作用域中的同名变量。
  3. 在python3中,程序可以在闭包内用nolocal语句来修饰某个名称,使该闭包能够修改外围作用域中的同名变量。
  4. 除了那种比较简单的函数 ,尽量不要用nonlocal语句。

最后一点吐槽:闭包这个词难以理解 ,不知道最开始是谁翻译的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值