函数2

一、函数对象

1.1 第一类对象概念

  1. 可在运行期创建
  2. 可用作函数参数或返回值
  3. 可存入变量的实体

1.2 函数对象的四大功能

  1. 引用

    def func():
        pass
    
    f = func
    print(f)
    
    <function func at 0x000002765A812E18>
    
  2. 当做参数传给一个函数

    def func():
        print('abc')
    
    def foo(x):
        x()
    
    foo(func)
    
    abc
    
  3. 当做函数的返回值

    def func():
        pass
    
    def foo(x):
        return x
    
    res = foo(func)
    print(res)
    
    <function func at 0x0000028A692A2E18>
    
  4. 当做容器类型元素

    def func():
        print('abc')
    
    function_list = [func]
    function_list[0]()
    

二、名称空间和作用域

2.1名称空间

定义:内存中的储存变量名与变量间绑定关系的空间。

1. 内置名称空间

作用:存放python解释器自带的名字。

生命周期:解释器启动时生效,关闭时失效。

2. 全局名称空间

作用:除了内置和局部的名字之外,其余都存放在全局名称空间。

生命周期:文件执行时生效,文件执行结束后失效。

3. 局部名称空间

作用:存放函数调用期间函数体产生的名字。

生命周期:文件执行时函数调用期间生效,函数执行结束后失效。

4. 加载顺序

内置(程序运行前加载)>>>全局(从上到下加载)>>>局部(调用时加载)

5. 查找顺序

局部>>>全局>>>内置

x = 1
def func():
    print(x)

x = 10
func()
10

2.2 作用域

定义:作用的区域

注意:

  • 作用域关系在函数定义阶段就固定了,与函数调用无关。

  • 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。

1. 全局作用域

全局有效,全局存活,包含内置名称空间和全局名称空间。

x = 1
def bar():
    print(x)
    
bar()
1

2. 局部作用域

局部有效,临时储存,只包含局部名称空间

def f1():
    def f2():
        def f3():
            print(x)
        x = 2
        f3()
    f2()


f1()
2

3. global和nonlocal

  • global
# 修改全局作用域中的变量
x = 1

def f1():
    x = 2
    def f2():
        global x  # 修改全局
        x = 3
    f2()

f1()
print(x)
3
  • nonlocal
# 修改局部作用域中的变量
x = 1
def f1():
    x = 2
    def f2():
        nonlocal x
        x = 3
    f2()
    print(x)

f1()
2

三、函数嵌套

# 求四个数中的最大值

def max2(x,y):
    m  = x if x>y else y
    return m

def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3
原文地址:https://www.cnblogs.com/binyuanxiang/p/11559423.html