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

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

阅读时注意看代码注释

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

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

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

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

实例:


  
  1. # 有参数返回型
  2. def dance(num):
  3. for i in range(num):
  4. return '跳舞{}次。'.format(i)
  5. # 无参返回型
  6. def dance1():
  7. num = 3
  8. for i in range(num):
  9. return '跳舞{}次。'.format(i)
  10. # 无参无返回型
  11. def dance2():
  12. num = 3
  13. for i in range(num):
  14. print('跳舞{}次。'.format(i))
  15. # 有参无返回型
  16. def dance3(num):
  17. for i in range(num):
  18. print('跳舞{}次。'.format(i))
  19. # if __name__ == '__main__':为主线程执行入口(可以没有,没有就是无缩进的代码是执行入口,然后一行一行执行)
  20. if __name__ == '__main__':
  21. a = dance(3)
  22. print(a)
  23. print('*'*20)
  24. b = dance1()
  25. print(b)
  26. print('*' * 20)
  27. dance2()
  28. print('*' * 20)
  29. dance3(3)
  30. 结果:
  31. 跳舞0次。
  32. ********************
  33. 跳舞0次。
  34. ********************
  35. 跳舞0次。
  36. 跳舞1次。
  37. 跳舞2次。
  38. ********************
  39. 跳舞0次。
  40. 跳舞1次。
  41. 跳舞2次。

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

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

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

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

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

几个实例来说明:

简单例子:

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


  
  1. num = 1
  2. def dance():
  3. num = 2
  4. print(num)
  5. if __name__ == '__main__':
  6. dance()
  7. print(num)
  8. 结果:
  9. 2
  10. 1

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


  
  1. # 将num = 2注释掉
  2. num = 1
  3. def dance():
  4. # num = 2
  5. print(num)
  6. if __name__ == '__main__':
  7. dance()
  8. print(num)
  9. 结果:
  10. 1
  11. 1

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

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


  
  1. num = 1
  2. def dance():
  3. num = 2
  4. # 嵌套函数
  5. def sing():
  6. num = 3
  7. print(num)
  8. sing()
  9. print(num)
  10. if __name__ == '__main__':
  11. dance()
  12. print(num)

关键字:global

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

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


  
  1. num = 1
  2. def dance():
  3. # 申明修改全局变量num
  4. global num
  5. num = 2
  6. print(num)
  7. if __name__ == '__main__':
  8. dance()
  9. print(num)
  10. 结果
  11. 2
  12. 2

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

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

实例:


  
  1. def dance():
  2. # 外部函数要修改的变量num必须存在
  3. num = 2
  4. # 嵌套函数
  5. def sing():
  6. # 申明修改外部函数变量num(外部函数要修改的变量num必须存在)
  7. nonlocal num
  8. num = 3
  9. print(num)
  10. # 在外部函数调用内部函数
  11. sing()
  12. print(num)
  13. if __name__ == '__main__':
  14. dance()
  15. 结果:
  16. 3
  17. 3

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

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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