• Python之函数2 嵌套,作用域和闭包(Day12)


    一.函数对象

    1.函数是第一类对象,即函数可以当做数据传递

      1.1 可以被引用

      1.2 可以当做参数传递

      1.3 返回值可以是函数

      1.4 可以当做容器类型的元素

    二.函数的嵌套

    1.函数嵌套的调用:

    def f1():
        print('f1')
    
    def f2():
        a = 10
        f1()

    函数的嵌套,为了保护内部函数,确定内部函数只能在外部函数中被调用

    def animal():
        def tiger():
            print('bark')
        print('eat')
        tiger()
    # animal()

    2.函数名的本质

    def func():
        print('func')
    print(func)
         print(func)
         f = func
         print(f)
         f()
    View Code

    2.1 可以作为函数的参数

    def func():
          print('func')
    def func2(f):
          print(f)
          f()
          print('func2')

    2.2 可以作为函数的返回值

    def func():
        print('func')
    
    def func2(f):
        print('func2')
        return f
    
    fu = func2(func)

    三.命名空间和作用域

    3.1.命名空间:存放名字和值的地方

    3.2.命名空间可分为三种

      全局命名空间

      局部命名空间

      内置命名空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

    3.3三种命名空间的加载与取值顺序

       加载

      内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

      取值

      在局部调用:局部命名空间> 全局命名空间 > 内置命名空间

    x = 1
    def f(x):
        print(x)
    
    print(10
    View Code

       在全局调用:全局命名空间 > 内置命名空间

    x = 1
    def f(x):
        print(x)
    
    f(10)
    print(x)
    View Code

    作用域

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

      全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

      局部作用域:局部名称空间,只能在局部范围内生效

    作用域的说明

    *小范围的可以用大范围的
    *但是大范围的不能用小范围的
    *范围从大到小(图)
    *在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
    *如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
    *如果都没有,报错

    globals 和 locals方法

    print(globals())
    print(locals())
    在全局调用globals和locals
    def func():
        a = 12
        b = 20
        print(locals())
        print(globals())
    
    func()
    在局部调用globals和locals

    作用域链

    x = 1
    def heihei():
        def inner1():
            def inner2():
                   print(x)
            inner2()
        inner1()

    四.闭包

    内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数    即内部函数包含了对外部作用域中变量的引用

    def hei():
        x = 20
        def inner():
            print(x)  #局部的
        return inner
    闭包的常用形式

    本章小结

    命名空间:

      一共有三种命名空间从大范围到小范围的顺序:内置命名空间、全局命名空间、局部命名空间

    作用域(包括函数的作用域链):

    小范围的可以用大范围的
    但是大范围的不能用小范围的
    范围从大到小(图)

    
    
    在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
    如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
    如果都没有,报错

    函数的嵌套:

      嵌套调用

      嵌套定义:定义在内部的函数无法直接在全局被调用

    函数名的本质:

      就是一个变量,保存了函数所在的内存地址

    闭包:

      内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

    有一种能力,是持续不断的努力
  • 相关阅读:
    小组自评、互评及反馈
    "一个程序员的生命周期"读后感
    阅读《构建之法》第10-12章
    阅读《构建之法》第8,9,10章
    冒泡算法程序分析树的评论
    1014 C语言文法定义与C程序的推导过程
    0917 实验一词法分析程序
    0909 我与编译原理不得不说的秘密
    复利计算器4
    复利及单利计算
  • 原文地址:https://www.cnblogs.com/shaojiafeng/p/7240367.html
Copyright © 2020-2023  润新知