zoukankan      html  css  js  c++  java
  • 第八天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;

  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/zhangzhide/p/13174900.html
Copyright © 2011-2022 走看看