• 第八天pyhton3 函数的返回值、作用域


    返回值

      pthon函数使用return语句返回“返回值”;

      所有函数都有返回值,如果没有return语句,隐式调用return None;

      return 语句并不一定是函数的语句块的最后一条语句;

      一个函数可以存在多个return语句,但是只有一条可以被执行,如果没有一条return语句被执行到,隐式调用return None;

      如果有必要,可以显示调用return None;可以简写为retrun;

      如果函数执行了return语句,函数就会返回,当前被执行的return语句之后的其他语句就不会被执行了;

      作用:结束函数调用,返回值;

      函数不能返回多个值,return[1,3,5]是指明返回一个列表,是一个列表对象;return 1,3,5看似返回多个值,隐式的被python封装成了一个元组;

        

    函数嵌套

      在一个函数中定义了另外一个函数

      

      如上图所示:函数有可见范围,这就是作用域的概念;内部函数不能被外部直接调用,会抛NameError异常;

    作用域

      一个标识符的可见范围,这就是标识符的作用域,一般常说的是变量的作用域;

      全局作用域:在整个程序运行环境中都可见;

      局部作用域:在函数、类等内部可见,局部变量使用范围不能超过其所在的局部作用域;

          

      从嵌套解构例子看出:

        外层变量作用域在内层作用域可见;

        内层作用域inner中,如果定义了o=97,相当于当前作用域中重新定义了一个新的变量o,但是这个o并没有覆盖外层作用域outer中的o;

        

      全局变量global

        

       使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x;

       全局作用域中必须有x的定义;  

            

      上图实验建议不要用ipython、jupyter;因为上下文中有可能有x定义(也可以用“del z”的方式删除该标识符);可能测试不出效果;

      使用global关键字的变量,将foo内的z声明为使用外部的全局作用域中定义的z;

      但是,z = 10赋值即定义,z内部作用域为一个外部作用域的变量赋值,所以z += 1不会报错,注意,这里的z的作用域还是全局的;

     global总结

      x+=1这种是特殊形式产生的错误的原因?先引用后赋值,而python动态语言是赋值才算定义,才能被引用;解决办法,在这条语句前增加x=0之类的赋值语句,或者使用global告诉内部作用域,去全局作用域查找变量定义;

      内部作用域使用x=5之类的复制语句会重新定义局部作用域使用的变量x,但是,一旦这个作用域中使用global声明x为全局的,那么x=5相当于在为全局作用域的变量x赋值;

    global使用原则

      外部作用域变量会内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离;

      如果函数需要使用外部全局变量,请使用函数的形参传参解决;一句话:不用global,学习它就是为了深入理解变量作用域;

    变量名解析原则LEGB

    Local 本地作用域,局部作用域的local命名空间,函数调用时创建,调用结束消亡;

    Enclosing,python2.2时引入了嵌套函数,实现了闭包,这个就是嵌套函数的外部函数的命名空间;

    Global,全局作用域,即一个模块的命名空间,模块被import时创建,解释器退出时消亡;

    Build-in,内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡,例如print(open),print和open都是内置变量;

    所以一个名词的查找顺序就是LEGB;

  • 相关阅读:
    线性回归算法
    K均值算法--应用
    K均值算法
    机器学习相关数学基础
    机器学习概述
    语法制导的语义翻译
    算符优先分析
    自下而上语法分析
    实验二 递归下降语法分析
    LL(1)文法的判断
  • 原文地址:https://www.cnblogs.com/zhangzhide/p/13174900.html
Copyright © 2020-2023  润新知