• 函数定义,返回值,传参,命名空间,闭包


     
     
     
     
    函数的返回值: 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,打印出结果为 老男孩,这就叫闭包
    闭包的作用:当函数开始执行时,如果遇到闭包,他有一个机制,他会永远开辟一个内存空间,
    #将闭包中的变量等值放入其中,不会随着函数的执行完毕而消失.
  • 相关阅读:
    HDU 6182 A Math Problem 水题
    HDU 6186 CS Course 位运算 思维
    HDU 6188 Duizi and Shunzi 贪心 思维
    HDU 2824 The Euler function 欧拉函数
    HDU 3037 Saving Beans 多重集合的结合 lucas定理
    HDU 3923 Invoker Polya定理
    FZU 2282 Wand 组合数学 错排公式
    HDU 1452 Happy 2004 数论
    HDU 5778 abs 数论
    欧拉回路【判断连通+度数为偶】
  • 原文地址:https://www.cnblogs.com/sunny7/p/9222505.html
Copyright © 2020-2023  润新知