zoukankan      html  css  js  c++  java
  • 函数对象、名称空间与作用域

    一、函数对象

    函数的名字就是函数对象,它在python中是第一类对象,函数名指向的是函数的内存地址。

    1.1 函数对象的作用:

    1、函数名可以被引用

    def bar():
    	print('from bar')
    f=bar
    f()
    

    2、函数名可以当作参数传入

    def bar():
    	print('from bar)
    def wrapper(func):  #func=bar
    	func()
    wrapper(bar)
    

    3、可以当函数的返回值

    def bar():
    	print('from bar')
    def foo(func):
    	return func
    #print(bar)
    f = foo(bar)    #      f ---> bar
    #print(f)
    f()
    

    4、函数名可以作为容器类型的元素

    def get():
    	print('from get')
    def put():
        print('from put')
    l = [get,put]
    #print(l)
    l[0]()
    

    1.2 函数对象的应用:

    可以优雅地取代if分支

    二、函数嵌套

    作用:让内层函数封闭起来,不让外部直接调用

    2.1 函数的嵌套调用:

    在函数内又调用其他函数,将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题

    def max1(x,y):
    	if x > y:
    		return x
    	else:
    		return y
    def max2(x,y,z):
    	res1 = max1(x,y)
    	res2 = max1(res1,z)
    	return res2
    print(max2(11,199,2))
    

    2.2 函数的嵌套定义:

    在函数内又定义了其他函数

    例1:
    def func1():
    	print('from func1')
    	def func2():
    		print('from func2')
    	func2()
    func1()
    
    例2:
    def f1():
        print('f1')
        def f2():
            print('f2')
            def f3():
                print('f3')
            f3()
        f2()
    f1()
    

    三、名称空间

    名称空间:存放名字与值绑定关系的地方,如果你想访问一个变量值,必须要先访问对应的名称空间

    名称空间的分类:

    内置名称空间:存放python解释器自带的名字。
    在启动python解释器时就生效,关闭就失效

    全局名称空间:文件级别(顶头写的名字)的名字。
    在执行文件时生效,在文件结束或者在文件执行期间被删除的就失效

    def func():  #func是全局的
    	pass
    
    if 10>3:    
    	y =333   #y 是全局的
    
    
    x = 1 
    def f1():
    	def f2():
    		print(x)
    	f2()
    f1()	
    

    局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部内存空间)。
    在调用当前函数时临时生效,函数体代码执行结束时失效。

    加载顺序:内置名称空间 -->>全局名称空间-->>局部名称空间
    名称空间的查找顺序:局部名称空间-->>全局名称空间-->>内置名称空间

    len = 'global'
    def f1():
        # len = 1
        def f2():
            # len = 2
            print(len)
        len = 1
        f2()
    f1()
    

    四、作用域

    作用域:名称空间发挥作用的范围

    作用域的分类:

    1、全局作用域:包含的是内置名称空间与全局名称空间的名字
    特点: 只要程序一直执行,永久存活,若程序结束,则销毁

    2、局部作用域:包含的是局部名称空间的名字
    特点:只能在函数内使用,调用函数时生效,调用结束失效

    补充:
    1、global:声明全局变量

    def index():
        global x  #声明X是全局变量
        x=2
        print(x)
    index()
    print(x)
    

    2、nonlocal:在局部名称空间声明局部变量,在局部修改外部(上层函数)的变量

    def index():
        x=1
        def func():
            nonlocal x
            x=2
    
        func()
        print(x)
    index()
    

    3、只有可变类型可在局部修改外部的值

    在这里插入图片描述

  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12143037.html
Copyright © 2011-2022 走看看