• 函数小知识点(文档字符串,闭包等)


    1 文档字符串(Documentation Strings)

        一般被称为docstring,一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解。令人惊叹的是,当程序实际运行时,我们甚至可以通过一个函数来获取文档!
        Python 的  help()  函数,它所做的便是获取函数的  __doc__  属性并以一种整洁的方式将其呈现给你。
    def print_max(x, y):
    
        '''Prints the maximum of two numbers.打印两个数值中的最大数。
    
     The two values must be integers.这两个数都应该是整数'''     #该函数的文档字符串
        # 如果可能,将其转换至整数类型
        x = int(x)  
        y = int(y)
        if x > y:
            print(x, 'is maximum')
        else:
            print(y, 'is maximum')
    
    
    print_max(3, 5)
    print(print_max.__doc__)    #通过使用函数的  __doc__  属性(属于函数的名称)来获取函数  print_max  的文档字符串属性。只消记住                                                                                                            Python 将所有东西都视为一个对象,这其中自然包括函数。
    
    ---5 is maximum
    ---Prints the maximum of two numbers.打印两个数值中的最大数。
    
    ---The two values must be integers.这两个数都应该是整数

    2 函数名的使用方法

    (这玩意儿其实就是一个内存地址,可以当作变量来使用)

    2.1 可以被当做值或变量引用

    def func():
        print(111)
    
    
    print(func)         # <function func at 0x00000218A911AB70> --函数在内存中的地址
    f = func             # 将其传给变量f
    print(f)                 # <function func at 0x00000279A5A6AB70>
    f()                        # 111

     2.2 函数可以被当做容器类型的元素存储 

    # 将其当做容器存储在列表中
    def func1():
        print('func1')
    
    
    def func2():
        print('func2')
    
    
    def func3():
        print('func3')
    
    
    lis = [func1, func2, func3]
    lis[0]()        # func1
    lis[1]()       # func2
    lis[2]()       # func3

    2.3 可以当做函数的参数和返回值

    #当做参数和返回值
    def func1():
        print('func1')
    
    
    def func(argv):
        argv()
        return argv  # func1作为返回值
    
    
    f = func(func1)  # func1作为参数
    f()
    # 输出
    func1
    func1

    3 闭包

    闭包: 

      在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

      内层函数,对外层函数(非全局)的变量的引用
    # 闭包函数的基本用法
    def func():
        name = 'eva'
    
        def inner():
            print(name)
    
        return inner
    
    
    f = func()       #这里不好理解,改用fun()()应该好接受一点,调用函数里面的内嵌函数
    f()              # eva

    闭包函数的意义及应用领域:

       闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

      应用领域:延迟计算(原来我们是传参,现在我们是包起来)

    用法:

    def multipliers():
        return [lambda x : i*x for i in range(4)]
    
    print [m(2) for m in multipliers()] 
    
    output:
    # [6, 6, 6, 6]

    如何输出[0,2,4,6]呢?

    def multipliers():
        # 添加了一个默认参数i=i
        return [lambda x, i=i: i*x for i in range(4)]
    
    print [m(2) for m in multipliers()] 
    
    output:
    # [0, 2, 4, 6]

     这里的multipliers就是一个闭包函数。Python的延迟绑定其实就是只有当运行嵌套函数的时候,才会引用外部变量i,不运行的时候,并不是会去找i的值,这个就是第一个函数,为什么输出的结果是[6,6,6,6]的原因。

    闭包在开发中的实际作用:

      帮助开发者维护一个“私密”空间,用于为以后执行提供数据。

    def f1(a1,a2):
        def inner():
            ret = a1 + a3 
            return ret 
        return inner
        
    n1 = f1('安安','张三') # 内存 a1=安安,a2=张三
    n2 = f1('马哥','小鲜肉') # 内存 a1=马哥,a2=小鲜肉
    n3 = f1('渣渣辉','小李子') # 内存 a1=渣渣辉,a2=小李子
    n1()      

    3.1 检测闭包函数的公共属性:__closure__

    # 闭包函数
    # 输出结果如果有 cell 就是闭包函数
    def wrapper():
        name = '是闭包'
        def inner():
            print(name)  # 是闭包
    
        inner()
        print(inner.__closure__)        # (<cell at 0x000001945CE07588: str object at 0x000001945CE06B70>,)
    
    
    wrapper()
    
    
    
    # 非闭包函数
    # 输出结果如果是 None 就不是闭包函数
    name = '不是闭包'
    def wrapper():
        def inner():
            print(name)  # 不是闭包
    
        inner()
        print(inner.__closure__)  # None
    
    
    wrapper()

    3.2 带有参数的闭包函数

    #带有参数的闭包函数
    def wrapper(a):     #a是外部传入的参数
        b = 10
        def inner():
            #在内函数inner中 用到了外函数的临时变量b
            print(a + b)        #20
        inner()    #对inner函数进行调用,这步必不可少
    
    wrapper(10)
  • 相关阅读:
    一步一步理解XMLDOM(一)
    按轨迹周期运动
    Python中’__main__’模块的作用
    多进程IPC与Python支持
    Eclipse启动多个Android模拟器
    解决Android平台移植ffmpeg的一揽子问题
    开源项目 GitHub地址
    使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
    Android中ScrollView消除阴影的办法
    如果项目为android library怎么运行
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/8457453.html
Copyright © 2020-2023  润新知