• 函数对象 名称空间 闭包函数


      函数是第一类对象: 指的是函数名指向的值(函数)可以被当作数据去使用

       可以被引用

      可以当做参数传给另外一个函数

      可以当做一个函数的返回值

      可以当做容器类型的元素

      函数的嵌套分为两大类:

      一、函数的嵌套调用:在调用一个函数过程中,其内部代码又调用了其他函数

      二、函数的嵌套定义:一个函数内部又定义了另外一个函数

      

      名称空间namespace

        名称空间就是用来存放名字与值的内存地址 绑定关系的地方(内存空间)

        age=18

        但凡查找值一定要通过名字,访问名字必须去查找名称空间

      名称空间分为三大类:

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

          例如:len max print

        全局名称空间:存放的是文件级别的名字

          例如:以下名字中 xyz\foo都会存放于全局名称空间中

          x=1

          y=1

          if x=1:

            z=3

          while True:

            b=4

            break

          def foo():

            m=3

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

          例如:

            foo内的m这个名字一定是存放于一个局部名称空间中的

        生命周期:

          内置名称空间:在解释器启动时则失效,解释器关闭则失效

          全局名称空间:在解释器执行python文件时则生效,文件执行完毕后则失效

          局部名称空间:只在调用函数时临时产生该函数的局部名称空间,该函数调用完毕则失效

        加载顺序:

          内置->全局->局部

        查找名字的顺序:

          基于当前所在位置往上查找

            假设当前站在局部,查找顺序:局部->全局->内置

            假设当前站在全局,查找顺序:全局->内置

        名字的查找顺序,在函数定义阶段就已经固定死了(即在检测语法时就已经确定了名字的查找顺序),与函数的调用位置无关,也就是说无论在任何地方调用函数,都必须回到当初定义函数的位置去确定名字的查找关系

      作用域:

        域指的是范围,作用域指的就是作用的范围,分为两种

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

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

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

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

        global :在局部声明一个名字来自于全局作用域的,可以用来在布局修改全局的不可变类型

        x=1
        def foo():
          global x
          x=2
        foo()
        print(x)

        nonlocal:声明一个名字是来自于当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型

        x=0
        def f1():
        x=111
        def f2():
        nonlocal x
        x=222
        f2()
        print(x)

        f1()
        print(x)

     
     闭包函数
        闭:指的是闭包函数是定义在一个函数内部的函数
        包:指内部函数包含对外层函数作用域名字的引用
      需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制
      def outter():
    x=111
    def inner():
    print(x)
    return inner

      f=outter() #f=outter内的inner

      def func():
      x=3333
      f()

      func()
      闭包函数提供了一种为函数体传值的解决方案
      为函数体传值的方式一:参数
      def func(x,y):
      print(x+y)
      func(1,2)
      
      为函数体传值的方式二:闭包
      def outter(x,y):
       def func():
       print(x+y)
       return func
      f=outter(1,2)
      f()
      f()
      f()
  • 相关阅读:
    sqlzoo练习系列(一)——SELECT 基础
    域名重定向
    自动识别PC端、移动端,并跳转
    Laravel传递多个参数到页面
    Laravel提示The GET method is not supported for this route. Supported methods: POST.错误的解决办法
    Laravel8和之前Laravel版本的区别
    Laravel使用Ajax提交表单报419 unknown status错误的解决方法
    PHP 函数调用之引用地址
    软件开发流程以及开发原则
    php 函数基础
  • 原文地址:https://www.cnblogs.com/layerluo/p/9507339.html
Copyright © 2020-2023  润新知