python基础六:函数的几种类型与局部变量和全局变量、申明修改全局变量global与修改嵌套函数变量的nonlocal

举报
橙子园 发表于 2022/05/25 23:08:45 2022/05/25
1.1k+ 0 0
【摘要】 阅读时注意看代码注释 python定义一个函数格式:函数有无参数无返回值类型、无参数有返回值类型(返回特定数据时使用)、有参数无返 回值类型、有参数有返回值类型(所有返回值要用关键字return返回)。 def    函数变量名(形式参数):      &nb...

阅读时注意看代码注释

python定义一个函数格式:函数有无参数无返回值类型、无参数有返回值类型(返回特定数据时使用)、有参数无返

回值类型、有参数有返回值类型(所有返回值要用关键字return返回)。

def    函数变量名(形式参数):

            执行语句(如果有返回值用return)

实例:


      # 有参数返回型
      def dance(num):
         for i in range(num):
             return '跳舞{}次。'.format(i)
      # 无参返回型
      def dance1():
          num = 3
         for i in range(num):
             return '跳舞{}次。'.format(i)
      # 无参无返回型
      def dance2():
          num = 3
         for i in range(num):
             print('跳舞{}次。'.format(i))
      # 有参无返回型
      def dance3(num):
         for i in range(num):
             print('跳舞{}次。'.format(i))
      # if __name__ == '__main__':为主线程执行入口(可以没有,没有就是无缩进的代码是执行入口,然后一行一行执行)
      if __name__ == '__main__':
          a = dance(3)
         print(a)
         print('*'*20)
          b = dance1()
         print(b)
         print('*' * 20)
          dance2()
         print('*' * 20)
          dance3(3)
      结果:
      跳舞0次。
      ********************
      跳舞0次。
      ********************
      跳舞0次。
      跳舞1次。
      跳舞2次。
      ********************
      跳舞0次。
      跳舞1次。
      跳舞2次。
  
 

注意:可以看到第一和第二个有返回类型的时候,return 在第一次循环返回结果后,会跳出循环,所一达不到循环的结果,写代码时要注意。

Python中引用一个变量的时候,是按照找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来寻找变量的,即所谓的LEGB规则。 

但是当在一个函数内部给一个局部变量(本地作用域的变量名)赋值的时候,并不是按照上面所说LEGB规则来首先找到变量,之后

为该变量赋值。而是遵循这样一条规则:在函数中给一个变量名赋值(不是在一个表达式中对其进行引用),Python中是创建或改变

本地作用域的变量名,而对其他作用域没有影响(如果它已经在那个函数中被声明为全局变量,则所有的作用域都可用)。

几个实例来说明:

简单例子:

赋值:可以看到第一个输出的的是dance函数的print结果是函数中变量num的值2,而全局下,print输出的结果是全局变量num的值(并没有受到dance函数局部变量的影响)。


      num = 1
      def dance():
          num = 2
         print(num)
      if __name__ == '__main__':
          dance()
         print(num)
      结果:
      2
      1
  
 

 引用:将上面代码的num=2注释掉,结果中dance函数中的print输出的num在本地作用域没有找到,到全局作用域找到num的值为1并输出,全局中的print输出全局变量num的值1.


      # 将num = 2注释掉
      num = 1
      def dance():
         # num = 2
         print(num)
      if __name__ == '__main__':
          dance()
         print(num)
      结果:
      1
      1
  
 

结论:赋值只改变和创建本地作用域的变量值,不改变其他作用域,而引用可以一层一层的寻找。

有函数嵌套也一样,给个代码自己体会:


      num = 1
      def dance():
          num = 2
         # 嵌套函数
         def sing():
              num = 3
             print(num)
          sing()
         print(num)
      if __name__ == '__main__':
          dance()
         print(num)
  
 

关键字:global

用法:在函数中申明要修改全局变量。

实例:dance函数内的num申明修改了全局变量,所以全局变量的num变成了2,全局print输出2


      num = 1
      def dance():
         # 申明修改全局变量num
         global num
          num = 2
         print(num)
      if __name__ == '__main__':
          dance()
         print(num)
      结果
      2
      2
  
 

关键字:nonlocal (Python3.0中新增的关键字,python2.x不支持)

用法:使用nonlocal关键字可以在一个嵌套的函数中修改嵌套作用域中的变量

实例:


      def dance():
         # 外部函数要修改的变量num必须存在
          num = 2
         # 嵌套函数
         def sing():
             # 申明修改外部函数变量num(外部函数要修改的变量num必须存在)
             nonlocal num
              num = 3
             print(num)
         # 在外部函数调用内部函数
          sing()
         print(num)
      if __name__ == '__main__':
          dance()
      结果:
      3
      3
  
 

注意:使用global关键字修饰的变量之前可以并不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在。

文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Chenftli/article/details/79996708

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。