当前位置 : 主页 > 手机开发 > ROM >

函数进阶

来源:互联网 收集:自由互联 发布时间:2021-06-10
函数对象(第一类对象,即可以当做被 数据传递 ) 四种常见使用方式函数名可以被引用 1. 函数名可以被传递 def func(): print ( ‘ from func ‘ ) print (func) # 函数名和函数体代码就是存放一
  • 函数对象(第一类对象,即可以当做被数据传递

  • 四种常见使用方式函数名可以被引用

1. 函数名可以被传递

  • def func():
        print(from func)
    print(func)                 # 函数名和函数体代码就是存放一个内存地址中,所以打印时会直接输出内存地址<function func at 0x0000000000411E18>
    print(id(func))
    f = func                    # 将函数名传递给另一个变量名,从此时开始f也是一个函数名了
    
    func()
    print(f)
    f()                         # 其实指向的也是函数func指向函数体代码的内存地址

 

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

3. 函数可以通过返回值返回

  • def index():
        print(index)
    
    
    def func():
        print(func)
        return index            # 返回为index的内存
    res = func()
    print(res)                  # 打印为index的内存地址
    res()                       # 调用index函数体代码

 

        4. 函数可以被当做容器类型的参数

  • def func():
        print(func)
    print(funnc())
    l = [1,2,func,func()]  # [1,2,<function func at 0x000001F7D79899D8>,None]
    print(l)
  • 函数嵌套调用

  • 在函数的内部调用其他函数,将复杂的代码简单化

  • def my_max(x,y):
        if x > y:
            return x
        return y
    
    def my_max4(a,b,c,d):
        res1 = my_max(a,b)
        res2 = my_max(res1,c)
        res3 = my_max(res2,d)
        return res3
    print(my_max4(34,2,130,4))

     

  • 函数嵌套

  • def outer():
        x = 1
        print(outer)
        def inner():
            print(inner)
        # print(inner)
        return inner
    
    res = outer()           # 强行打印outer() 输出‘outer‘,但是返回值返回的是index的内存地址
                            # print(res)
    res()                   # 借以调用index()来输出‘inner‘

    调用一个函数以实现另一个函数的代码功能

  • 命名空间(Namespace)

  • 分享图片

 

 

  • 定义:命名空间就是存放变量名和变量值绑定关系的地方,有变量名就有变量值,两者不可分割。

  • 内置命名空间:打开python编辑器后,python默认提前定义好的空间,比如一些内置方法(len,max,min等)

  • 全局命名空间:文件级别的代码,运行py文件时即刻创建,结束时立即销毁

  • 局部命名空间:定义函数后,函数体代码中的变量名就存储在其中。调用的时候创建,未被调用即销毁

       **************************************************** 重点理解*********************************************************

 

  • x=111
    def outer():
        def inner():
            print(from inner,x)
        return inner
    f=outer()
    def func():
        x=333
        f()                         # 虽然f()到现在才调用但是它不会从当前的位置查找x的地址和值,而是会从f()也就是index()的定义阶段开始查找
    func()
    #最后输出111,而不是333

    说明,局部命名空间中的变量名在其中寻不到值和地址时,函数查找名字的顺序并不会因为 函数调用的位置而改变,而是依旧按照定义时的位置以局部到全局到内置的顺序来查找名字,不会从调用函数的位置按照正确的顺序来查找名字

  • 作用域

  • 定义:作用范围(其中内置空间和全局空间属于全局作用域,局部空间属于局部作用域),变量名和变量值绑定在局部作用域时,只对定义在函数内部的调用有影响,对于全局定义域的代码操作毫无任何影响。而变量名和变量值绑定在全局作用域的时候,其有一定可能会对局部空间中的函数调用产生影响,影响范围更加广泛深远。

  • 利用global函数在局部修改全局定义域中的变量

  • # global 在局部修改全局的不可变数据类型
    # x = []  # 因为列表是可变类型
    x = 10  # 不可变类型
    username = messi
    def func():
        
        global x,username  # 修改全局变量 而不是创建局部名称空间
        x = 24
        username = kobe
    func()
    print(x)
    print(username)
  • 利用nonlocal在局部修改局部定义域中的变量

  • # nonlocal  局部修改局部
    def func():
        x = 1
        def index():
            nonlocal x
            x = 2
            print(x)
        index()
        print(x)            # 本来应该返回的是1,但是nonlobal修改了局部的变量所以就输出了2
    func()
网友评论