命名关键字参数、函数对象、函数嵌套、名称空间与作用域和闭包函数

  命名关键字参数、函数对象、函数嵌套、名称空间与作用域和闭包函数。

  一、命名关键字参数:在定义函数时,*与**之间参数称之为命名关键字参数

    特点:在调用函数时,命名关键字参数必须按照key=value的形式传值

  二、函数对象

    函数是第一类对象:指的是函数的内存地址可以像一个变量值一样去使用

    def foo():   #foo=函数的内地址

      print('from foo')

    1、变量值可以被引用

      x = 1

      y = x

      f = foo

      print(f)

      f()

    2、变量值可以当作参数传给另外一个函数

      def bar(x):

        print(x)

        x()

      bar(foo)

    3、变量值可以当作函数的返回值

      def func(x):

        return x

      f = func(foo)

      print(f)

 

    4、变量值可以当作容器类型的元素

      l = [foo,]

      print(l)

      l[0]() 

  三、函数嵌套

      函数的嵌套调用:在一个函数内部又调用其他函数

      def max2(x,y):

        if x>y:

          return x

        else:

          return y

      def max4(a,b,c,d):

        res1 = max2(a,b)

        res2 = max2(res1,c)

        res3 = max2(res2,c)

        return res3

      print(max4(1,2,3,4))

    函数的嵌套定义:在函数内又定义了其他函数

      def func():

        def foo():

          print('from foo')

        foo()

        x = 1

        print(x)

      func()

    ******************************************************

      from math import pi

      def circle(radius,action):

        def cal_perimeter():

          return 2*pi*radius

        def cal_area():

          return pi*(radius**2)

        if action == 1:

          res = cal_perimeter()

        elif action ==2: 

          res = cal_area()

        return res

      res = circle(10,1)

      print(res)   

  四、名称空间与作用域

    (1)名称空间相关

      1、名称空间Namespaces:指的就是存放名字与值内存地址绑定关系的地方(内存空间)

      x = 1

      2、名称空间分为三大类

      内置名称空间:存放的是python解释器自带的名字

        产生:python解释器的启动则产生

        销毁:python解释器关闭则销毁

      全局名称空间:在顶级定义的名字

        产生:执行python程序是产生

        销毁:python程序执行完毕后则销毁

      局部名称空间:在函数内定义的名字

        产生:在函数调用时临时产生

        销毁:在函数调用完毕后则销毁

      三种名称空间的产生的先后顺序:内置->全局->局部

      查找名字的顺序:从当前位置往外一层一层查找

        如果当前在局部名称空间:局部->全局->内置

        如果当前在全局名称空间:全局->内置

      

      def foo():

        len = 222

        print(len)

      len = 111

      foo()

      

      x = 0

      def f1():

        x=1

        def f2():

          x = 2

          def f3():

            x=3

            print(x)

          f3()

        f2()

      f1()

    (2)作用域:指的是作用范围

      全局作用域:包含内置于全局名称空间的名字

        特点:全局存活,全局有效

      局部作用域:包含局部名称空间的名字

        特点:临时存活,局部有效

      

      !!!作用域关系是在函数定义阶段就已经固定死了,与调用位置无关

      示范一:

      def f1():

        print(xxx)

      xxx = 111 

      def f2():

        xxx = 222

        f1()

      f2()

      示范二:

      xxx = 111

      def f1():

        print(xxx)

        yyy = 222

        print(yyy)

      f1()

  五、闭包函数

    闭:封闭,指的是该函数是定义一个函数内部的函数

    包:该内部函数包含对外层函数名字的引用

    

    def outter():

      x = 1

      def inner():

        print('from inner',x)

      return inner

    f = outter

    

    def foo():

      x = 111111111

      f()

    foo()

 

    为函数体传值的两种方式:

    def foo():

      print('hello %s' %name)

    方式一:直接以参数的形式传入

    def foo(name)

      print('hello %s'%name)

    foo('egon')

    foo('egon')

    foo('egon')

 

    方式二:闭包函数

    def outter(name):

      def foo():

        print('hello %s'%name)

      return foo

    f = outter('egon')

    f()

    f()

    f()

    f1 = outter('alex')

    f1()

    f1()

    f1()

      

    

posted @ 2018-09-26 18:06  小菜鸟张阳阳  阅读(194)  评论(0编辑  收藏  举报