zoukankan      html  css  js  c++  java
  • 返回函数

    闭包:
    在函数A中又定义了函数B,并且,内部函数B可以引用外部函数A的参数和局部变量,当A返回函数B时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

    利用闭包返回一个计数器函数,每次调用它返回递增整数:

    第一种方法:

    # -*- coding: utf-8 -*-
    
    def createCounter():
        n=0
        def counter():
            nonlocal n              #必须加nonlocal
            n=n+1
            return n
        return counter
    
    # 测试:
    counterA = createCounter()
    print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
    counterB = createCounter()
    if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
        print('测试通过!')
    else:
        print('测试失败!'
    

    总结:

    这段代码如果不加nonlocal,会报错,这是因为对于createCounter函数,n是局部变量,对于counter函数,n是非全局的外部变量。当在counter中对n进行修改时,会将n视为counter的局部变量,屏蔽掉createCounter中对n的定义;如果仅仅在counter中对n进行读取,则不会出现这个错误。

    而写成列表则不会报错了, 改变列表L中第一个元素的值,但并没有改变列表L的内存地址。

    第二种方法:

    def createCounter():
        L=[0]               # 列表L的内存地址在初次调用时已经给定,且L[0]即第一个元素指向整数0
        def counter():      
            L[0]+=1    #改变列表L中第一个元素的值,但并没有改变列表L的内存地址
            return L[0]
        return counter
    

      

     

  • 相关阅读:
    ASP获取客户端硬件信息(CPU、硬盘、主板、mac地址等)
    Java(多态)动手动脑
    每周进度条(第二周)
    Java(异常处理)动手动脑
    软件工程概论课后作业1
    mysqlmmm官方安装指南翻译
    Mysql 字符集的修改步骤
    Amoeba搞定mysql主从读写分离
    邮件系统postfix安装和设置
    mysqlmmm实现mysql高可用
  • 原文地址:https://www.cnblogs.com/zuxing/p/8971082.html
Copyright © 2011-2022 走看看