Effective Python 读书笔记: 第15条: 了解如何在闭包里使用外围作用域中的变量

本文为《Effective Python》读书笔记,聚焦第15条,详细探讨了Python中闭包如何捕获并操作外围作用域的变量,揭示了闭包在函数式编程和内存管理中的独特作用。
摘要由CSDN通过智能技术生成
# -*- encoding: utf-8 -*-

import copy

'''
第15条: 了解如何在闭包里使用外围作用域中的变量

关键:
1 闭包
含义:定义在某个作用域中的函数,这种函数引用了该作用域的变量。
特点: 函数是可以作为参数传递给其他函数
元组比较规则: 先比较元组中下标为0的元素,然后比较下标为1的元素

2 解析引用的顺序
1) 当前函数的作用域
2) 任何外围作用域(当前函数的其他函数)
3) 包含当前代码的那个模块的作用域(全局作用域)
4) 内置作用域(也就是包含len或str等函数的作用域)

解释:
易错: 在闭包里面的赋值相当于重新定义了一个新的变量,而不是用闭包外面定义的同名变量
原因: 防止函数中的局部变量影响函数外面的变量,如果不这样做,
    函数内的局部变量复制都会影响外围模块的全局作用域
示例代码:
def sortPriorityNotInfluenceExternalScope(values, group):
    found = False
    def helper(value):
        if value in group:
            found = True
            return (0, value)
        return (1, value)
    values.sort(key=helper)
    print found
    return values

解决办法: 利用列表是可修改的,能从闭包内影响闭包外的变量
代码示例如下:
def sortPriorityInfluenceExternalScope(values, group):
    found = [False]
    def helper(value):
        if value in group:
            # 充分利用列表可修改的特点来实现闭包内影响闭包外变量
            found[0] = True
            return (0, value)
        return (1, value)
    values.sort(key=helper)
    print found[0]
    return values
    
3 总结
1) 作用域中的闭包可以引用作用域中的变量
2) 默认方式对闭包内变量赋值,不影响外围作用域
3) python3用 nonlocal影响外围作用域中的变量

参考:
Effectiv Python 编写高质量Python代码的59个有效方法

'''

def sortPriority(values, group):
    def helper(x):
        if x in group:
            return (0, x)
        return (1, x)
    values.sort(key=helper)
    return values

def sortPriorityNotInfluenceExternalScope(values, group):
    found = False
    def helper(value):
        if value in group:
            found = True
            return (0, value)
        return (1, value)
    values.sort(key=helper)
    print found
    return values


def sortPriorityInfluenceExternalScope(values, group):
    found = [False]
    def helper(value):
        if value in group:
            # 充分利用列表可修改的特点来实现闭包内影响闭包外变量
            found[0] = True
            return (0, value)
        return (1, value)
    values.sort(key=helper)
    print found[0]
    return values


# def sortPriorityInfluenceExternalScope(values, group):
#     found = False
#     def helper(value):
#         nonlocal found
#         if value in group:
#             return (0, value)
#         return (1, value)
#     values.sort(key=helper)
#     return values



def process():
    values = [8, 3, 1, 2, 5, 4, 7, 6]
    valuesCopy = copy.deepcopy(values)
    valuesCopy2 = copy.deepcopy(values)
    group = {2, 3, 5, 7}
    result = sortPriority(values, group)
    print result
    print valuesCopy
    print valuesCopy2
    # sortPriorityNotInfluenceExternalScope(valuesCopy, group)
    result = sortPriorityInfluenceExternalScope(valuesCopy2, group)
    print result

if __name__ == "__main__":
    process() 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值