• day10-函数进阶


    函数:可读性,复用性强

    def  函数名():

      函数体

      return 返回值

    def my_max(x,y):
        m = x if x>y else y     三元运算
        return m
    bigger = my_max(10,20)
    print(bigger)

    函数进阶

    命名空间:

    全局命名空间:程序在执行时,有上到下依次加载到内存

    局部命名空间:函数内部定义的名字,只有函数调用时才会加载到内存中

    内置命名空间:python 解释器(print,input...)启动就可以使用的名字存储在内置命名空间,在解释器启动时就会加载到内存中

    在局部可以使用全局与内置命名空间,在全局只能使用内置命名空间;内置不能使用局部与全局命名空间

    多个函数应该有多个局部命名空间,各个函数中局部空间不能互相使用

    #在正常情况下,直接使用内置的名字
    #当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
    #当我自己有的时候 我就不找我的上级要了
    #如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
    # 多个函数应该拥有多个独立的局部名字空间,不互相共享

     作用域:

    # 作用域两种
    # 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals()
    # 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()

    # a = 1
    # def func():
    #    global a             加global后,局部作用域将成全局作用域
    #    a = 2
    #
    # func()
    # print(a)

    # 对于不可变数据类型 在局部可是查看全局作用域中的变量
    # 但是不能直接修改
    # 如果想要修改,需要在程序的一开始添加global声明
    # 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

    #globals 永远打印全局的名字
    #locals 输出什么 根据locals所在的位置

    函数嵌套调用:

    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
    
    # max4(23,-7,31,11)

    def f1():
        def f2():
            def f3():
                print("in f3")
            print("in f2")
            f3()
        print("in f1")
        f2()
        
    f1()

    nonlocal关键字

    1.外部必须有这个变量
    2.在内部函数声明nonlocal变量之前不能再出现同名变量

    3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
    def f1():
        a = 1                 #1
        def f2():        # 3
            nonlocal a      只能修改上一级
            a = 2
        f2()           # 1
        print('a in f1 : ',a)
    
    f1()

    闭包函数

    内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
    #函数内部定义的函数称为内部函数

    由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

    我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?

    是不是直接就把这个函数的名字返回就好了?

    这才是闭包函数最常用的用法

    def outer():
        a = 1
        def inner():
            print(a)
        return inner
    inn = outer()
    inn()

     判断闭包函数的方法__closure__

    #输出的__closure__有cell元素 :是闭包函数
    def func():
        name = 'eva'      调用外部作用域,而非全局作用域
        def inner():
            print(name) 
        print(inner.__closure__)
        return inner
    
    f = func()
    f()
    “结果“:

    (<cell at 0x0000026FD8E90F78: str object at 0x0000026FD9037D18>,)
    egon

    
    #输出的__closure__为None :不是闭包函数
    name = 'egon'
    def func2():
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f2 = func2()
    f2()

    函数的嵌套:

      嵌套调用

      嵌套定义:定义在内部的函数无法直接在全局被调用

    函数名的本质:

      就是一个变量,保存了函数所在的内存地址

    闭包:

      内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

  • 相关阅读:
    SQL索引一步到位
    Timeout expired超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
    电脑开机的相关设置
    SELECT时为何要加WITH(NOLOCK)
    Sqlserver2008R2 数据库镜像配置步骤
    读写分离提高 SQL Server 并发性能
    八、数据结构
    七、数据库技术基础(二)
    缓存
    七、数据库技术基础(一)
  • 原文地址:https://www.cnblogs.com/wzc27229/p/10976596.html
Copyright © 2020-2023  润新知