函数二

一.函数对象

函数是第一类对象:函数名指向的值可以被当参数传递

1.函数名可以传递给变量

def func() :
    print("函数执行")

res = func
res()
View Code

2.函数名可以被当做参数传递给其他函数

def func() :
    print("func函数执行")

def display (x):
    print("display函数执行")
    x()
display(func)
View Code

3.函数名可以被当做函数的返回值

def display ():
    print("display函数执行")
    def func():
        print("func函数执行")

    return  func

res = display()
res()
View Code

4.函数名可以被当做容器类型的参数(在选择功能的时候可以使用这种方式,方便程序的扩展。)

def max() :
    print("max")

def min() :
    print("min")

def exist() :
    print("exist")
li = [max,min,exist]
for i,key in enumerate(li) :
    print("%s %s" %(i,key))
    key()
View Code

ps:函数名的本质是一个内存地址,它可以像其他类型变量一样被使用,它唯一特殊的地方在于加上()以后可以进行方法调用。

     可以被callable 的变量之后可以加( )。类和变量可以加( ).

二.函数的嵌套

函数的嵌套分为两种:嵌套定义和嵌套调用

1.函数的嵌套调用(在函数中调用了其他的函数,连自身也可以调用)

def max (x,y) :
    if x > y :
        return  x
    else:
        return y

print(max(max(3,2),5))
View Code

2.函数的嵌套定义(该函数可以通过传参的不同控制函数执行不同的功能,给用户把多个函数封装成一个函数)

def area (x,y,mode = 0) :
    def rectangle (a,b) :
        return x*y
    def triangle (a,b)  :
        return  1/2*x*y
    if mode == 0 :
        return rectangle (x,y)
    elif mode == 1 :
        return triangle(x,y)

print(area(4,5))
print(area(4,5,1))
View Code

 

三.名称空间

名称空间:存放的是变量名与变量值的内存地址得绑定关系的地方(必须先找到名称空间里变量名才能访问对应的变量值)

名称空间的分类
1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)

2.全局名称空间:文件级别的代码

3.局部名称空间:函数体内创建的名字都属于局部名称空间

生命周期:
内置名称空间:python解释器启动就立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)


名字的查找顺序

需要先确定你当前所在位置(大前提)

1.站在全局: 全局 >>> 内置
2.站在局部: 局部 >>> 全局 >>> 内置

函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变

x=111
def outer():
    def inner():
        print('from inner',x) # local variable 'x' referenced before assignment  
        x = 66666666
    return inner
f=outer()
f()
View Code

 

四.作用域

作用域就是名称空间的范围

作用域的分类:1.全局作用域  2.局部作用域

1.全局作用域:包含内置与全局名称空间的名字    特点:全局存活,全局有效

2.局部作用域:包含局部名称空间的名字               特点:临时存活,局部有效

 

global 在局部修改全局的不可变数据类型

 

x = 1  # 不可变类型

def func():
    global x # 修改全局变量 而不是创建局部名称空间
    x = 999

func()
print(x)
View Code

 

nonlocal  局部修改局部不可变数据类型

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

        x = 2

        def deep () :
            nonlocal x
            x=4
        deep()
        print(x)
    index()
    print(x)
func()       # nonlocal 只能修改上一层最近一次出现相同局部变量的值
View Code


global,nonlocal: 如果想修改多个变量可以用逗号隔开

posted @ 2019-07-10 16:35  Tri_stone  阅读(175)  评论(0编辑  收藏  举报