函数对象,嵌套,名称空间与作用域

一:函数对象

(1)函数名可以被传递

(2)函数名可以被当做参数传递给其余函数

(3)函数名可以当做函数的返回值

(4)函数名可以当做容器类型的参数

例如:

# 函数名可以被传递给变量
def func():
    print('test')
f = func  # 变量名f指向函数的内存地址 通过该内存地址该变量可以找到函数对应的代码块
f()       # 变量名f调用函数
print(f)  # <function func at 0x00000000020A2E18>

#函数名可以当做参数传递给其余函数
def func():
    print('test')
def func1(args):
    print(args)
func1(func)   #指向func的内存地址 <function func at 0x0000000002032E18>
func1(func()) # test 没有写return 默认返回None

#函数名可以当做函数的返回值
def func():
    print('test')
def index():
    return func
print(index)  # <function index at 0x00000000021BAA60>
index()       # 调用函数index
res = index() # 输出index的返回值其指向func的内存地址 因为return指向的是func
res()         # 调用函数func 输出test 在上述中res已经找到啦func的内存地址 通过内存地址可以调用函数

#函数名可以当做容器类型里的元素
def index():
    return 'SR'
list = [index,index()]  # 函数的内存地址 以及函数的值
print(list)             # [<function index at 0x00000000020C2E18>, 'SR']
函数对象

 

二:函数的嵌套

定义:函数内层在定义函数

作用:可以将复杂的问题进行简单化

例如:

#函数嵌套 比较大小
#a,b,c,d求出其中的最大值
#步骤一:两两比较 选出其中大的在与第三个值比较
def my_max(x,y):
    if x>y:
        return x
    return y
#步骤二:调用步骤一中两两比较的函数 在与第三个比较
def index(a,b,c,d):
    res=my_max(a,b)
    res1=my_max(res,c)
    res2=my_max(res1,d)
    return res2
print(index(1,2,3,4))  # 4
函数的嵌套

 

三:名称空间

(1)

定义:存放变量名与变量值绑定关系的地方

例如:

x = 1
#ps:其中变量值存在内存中 那么变量名则存在内存空间中

 

(2)名称空间的分类

(1)内置名称空间:用来存放Python给我们定义的变量名

例如:

len
max
print

(2)全局名称空间:当执行python文件的时候 以文件为基础加载进入全局名称空间

例如:

x = 1
while True:
    y == 2
# PS 无论while 与 if里面嵌套多少层子代码都属于全局名称空间

(3)局部名称空间:属于函数子代码块里的创建的名称

例如:

def index():
    number = [1,2,3]
    user_info ={'name':'SR','age':18}
#PS:其中里面的number与user_info属于局部名称

 

(3)名称空间的加载顺序

  (1)当启动python解释器的时候 加载内置空间

  (2)当执行python文件的时候 加载全局名称空间

  (3)当调用函数里的子代码块的时候 加载的是局部名称空间 

 

(4)名称空间的查找顺序

  (1)如果处于全局:全局--->内置

例如:

# 处于全局位置
len = '处于全局名称空间'
def index():
    len = '处于局部名称空间'
print(len)  # 站在全部调用的是全局名称空间 处于全局名称空间

#全局名称空间不存在
def index():
    len = '处于局部名称空间'
print(len)  # <built-in function len> 内置空间

 

  (2)如果处于局部:局部--->全局--->---内置

例如:

当局部空间存在值的时候
max=1
def f1():
    # max=2
    def f2():
        max=3
        print(max)  # 3 直接查找查找局部空间地址
    f2()
f1()
print(max)          # 1 查找的全局空间地址

#当局部空间不存在值的时候
max=1
def f1():
    def f2():
        print(max)  # 1 查找的全局空间地址 局部空间地址不存在值
    f2()
f1()
print(max)           # 1 查找的全局空间地址

 

四:作用域

作用域范围:

(1)全局作用域:内置名称空间 与全局名称空间都属于该范围 全局有效 全局存活

(2)局部作用域:局部名称空间属于该范围 局部存活 局部有效

PS:函数作用域在定义阶段就已经作用好了 与函数的调用位置无关

 

x = 1
def index():
    global x
    x = 999
    print(x)
index()  # 999
print(x) # 999 global将全局名称给修改了

def func():
    x = 1
    def index():
        nonlocal x
        x = 2
    index()
    print(x)
func()  # 2
作用域修改

 

posted @ 2019-07-10 16:28  SR丶  阅读(263)  评论(0编辑  收藏  举报