zoukankan      html  css  js  c++  java
  • 函数定义,返回值,传参,命名空间,闭包

     
     
     
     
    函数的返回值: return是返回给函数的调用者
    函数外面的代码想要获取函数的执行结果,就可以在函数里,用return语句把结果返回.
     
    注意:在函数的执行过程中主要遇到return语句,就会停止执行并返回结果,
           so可以理解为return语句代表着函数的结束
         如果未在函数中指定return,那这个函数的返回值为none
         函数的返回值,可以返回一个函数名(可以将嵌套函数里的执行结果return给函数体外,进行执行)
    return永远且只能返回一个值,,如果返回多各值呢?
     
    def func1(name,age):
    return [name,age]                           #这里加上[]就可以返回['alex', 18],元祖,字典同理
    start = func1('alex',18)
    print(start)
     
    返回:['alex', 18]
     
     
     关于函数的返回值
    def   wraaper():
           def inner():
               print(666)
          return inner
    wraaper()()  #将inner这个函数的值返回给waaper然后给打印出来
     
    age  = 19
    def func1():
        def func2():
            print(age)
        age = 73
        func2()
    func1()
    返回:73
     
     
     
    函数什么时候执行?函数调用的时候执行,
     
    函数嵌套:代码从上至下执行,调用函数.函数里面从上至下执行.
    print(111)
    def func1():
    print(333)
    def func2():
    print(444)
    def func3():
    print(555)
    func2()
    func1()
    print(222)
    返回:111,333,222  嵌套函数哦执行顺序
     
     
    函数内部可以再次被定义,执行需要被调用才执行
    age  = 19
    def func1():
        age = 73
        print(age)
        def func2():
            print(age)
        func2()
    func1()
    返回:73,73
    说明,在执行finc2的时候改函数里面没有定义age的变量,所以他就开始一级一级的往上去找.
     
     
    age  = 19
    def func1():
        print(age)
        def func2():
            print(age)
        func2()
    func1()
    返回:19,19
    加深印象说明函数嵌套情况下,他是一级一级往外面去找的,你看,函数里面(局部作用域)没有了,就在函数外面(全局作用域)去找.
     
     
    函数传参:
    • 实参角度: 
    1.位置传参,按顺序,一一对应.
     
     
    2.关键字传参,不按顺序,一一对应
     
    3.混合传参,关键字参数永远在位置参数的后面
     
     
     
     
     
     
    • 形参角度
    1.位置传参,按照顺序,一一对应
     
    2.默认参数,传参则覆盖,不传则默认,默认参数永远在位置参数的后面
     
    3.动态传参:又叫万能传参.args,kwargs只是一个变量名,但一般情况下都这么写
    •   *args  接收的是实参对应的,所有位置参数(剩余,无意义),并将其,放在元祖中, 
    def func1(age,*args):
        print(args)  #(3, 6, 9, 4)
        print(age)   #18
    func1(18,3,6,9,4,)
    只是举例说明,*args接受的参数有哪些,并返回的是元祖
     
     
    • **kwargs   他讲所有的关键字参数(无意义)放到一个字典中    
     
    def func2(a,b,c,**kwargs):
        print(kwargs)
    func2(12,23,34,b1=1,b2=3,c3=6)
    #返回;{'b1': 1, 'b2': 3, 'c3': 6}
    这里print(kwargs)返回的是一个字典
     
    总结:形参角度来说分,位置传参,默认参数,动态传参,那么他们之间的优先级先后顺序是什么呢?看例题:
    def func3(a,b,c,d,*args,e ='男',**kwargs):
        print(args)                #返回:(5, 6, 7)
        print(kwargs)              #返回:{'v': 3, 'm': 7, 'h': 9}
        print(e)                   #返回:女
    func3(1,2,3,4,5,6,7,v = 3,m = 7,h = 9,e = '女')
    分析结果:对应传参关系是:  a->1,b->2,c->3,d->4,(这是位置参数)
                            *args -> 5,6,7      (*args接受剩余无意义的位置参数)
                            e = '男'->e = '女'   (e= '男'对应,e ='女',如果关键字参数传参给默认参数,关键字参数将默认参数的值覆盖,不传参则默认参数保持不变.)
     
     
     
     
    作用域:
    python中函数就是一个作用域,局部变量防止在其作用域中
    代码定义完成后,作用域已经生成,作用域链向上查找,(从里想外查找
     
    age = 18
    def func1():
        age = 73
        def func2():
            print(age)
     
        return func2 #函数名也可以被当做变量,return给函数的调用者
     
    val = func1()
    val()
    返回:73,这说明嵌套函数内当返回一个函数名的时候,而func2又没有定义变量,他就从里面往向上找,
            加入这里的func1,func2都没有定义变量的话,那么,他讲会往上,到全局作用域去找.
     
     
     
     五,闭包:就是内层函数对外层函数(非全局)变量的引用
    如何判断:内层函数名 ._closure_ 返回cell就是等于闭包
    理解闭包
    def wraaper():
    name = "老男孩"
    def inner():
    print(name)
    该代码没有打印结果,这print(name)就是内层对外层函数变量的引用
     
    #可以输出的代码
    def wraaper1():
    name = "老男孩"
    def inner():
    print(name)
    inner()
    print(inner.__closure__)
    wraaper1()
     
    里层没有变量,要引用外层的name,打印出结果为 老男孩,这就叫闭包
    闭包的作用:当函数开始执行时,如果遇到闭包,他有一个机制,他会永远开辟一个内存空间,
    #将闭包中的变量等值放入其中,不会随着函数的执行完毕而消失.
  • 相关阅读:
    设计模式(十六):职责链模式
    设计模式(十五):状态模式
    设计模式(十四):命令模式
    设计模式(十三):模板模式
    设计模式(十二):观察者模式
    远程连接数据库常出现的错误解析
    [解决] Error Code: 1044. Access denied for user 'root'@'%' to database
    linux常用命令
    linux上svn项目管理,同步服务器,用户管理
    linux 磁盘分区
  • 原文地址:https://www.cnblogs.com/sunny7/p/9222505.html
Copyright © 2011-2022 走看看