翼度科技»论坛 编程开发 python 查看内容

Python名称空间和作用域,闭包函数

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
Python名称空间和作用域,闭包函数


  • 名称的查询顺序
  • 名称空间的作用域
  • global和nonlocal关键字的使用
  • 函数对象(函数名)
  • 函数的嵌套调用
  • 函数的嵌套定义
  • 闭包函数
名称空间

定义
  1. # 什么是名称空间?
  2.         名称空间即存放名字与对象映射/绑定关系的地方。
  3.         就是存放变量名与变量值关系的地方
复制代码
名称空间的分类
  1. 1.内置的名称空间
  2.         内置:就在python解释器里面,可以直接使用
  3.         """一般大多数都是在函数内部存在的都是局部的!"""
  4.         def index():
  5.             a=1
  6.             b=2
  7. 2.全局的名称空间
  8.         全局:在py文件中顶格编写的变量名就是全局变量
  9.                      name='jerry'
  10.              def index():
  11.                     pass
  12.                
  13.              if a:
  14.                 pass
  15.             
  16.              while b:
  17.                     pass
  18.                
  19.              for i in range(10):
  20.                 pass
  21.             
  22. 全局变量:
  23.         在函数外的变量就是全局变量
  24. 局部变量:
  25.         在函数内部的变量就是局部变量
  26.    
复制代码
名称查询顺序
  1. 既然有全局变量和局部变量那么就一定会有查询顺序
  2. 名称空间的加载顺序是(在内置):内置名称空间->全局名称空间->局部名称空间
  3. 如果你在全局:全局--->内置
  4. 局部变量在外部是不能被使用的
  5. 在函数内部打印出来的结构都属于当前函数的局部名称空间
  6. """局部名称空间的嵌套!"""
  7. def f1():
  8.     # x = 222
  9.     def f2():
  10.         print('f2')
  11.         # x = 333
  12.         def f3():
  13.             print('f3')
  14.             # x = 444
  15.             def f4():
  16.                 # x = 555
  17.                 print(x)
  18.             f4()
  19.         f3()
  20.     f2()
  21. f1()
复制代码
名称空间的作用域
  1. 域:范围
  2. 作用域:变量的作用范围
  3. 1. 内置名称空间
  4.         # 在全局的任意位置都能够使用
  5. 2. 全局名称空间
  6.         # 在全局的任意位置任意时间都能够使用
  7. 3. 局部名称空间
  8.         # 一般情况只能够在局部使用
  9.    
  10. def index():
  11.     x = 666
  12.    
复制代码
global和nonlocal的使用
  1. global
  2. 如果你想在局部修改全局的变量:
  3.                 1. 如果你修改的是不可变的类型,需要global关键字的声明
  4.                 2. 如果你修改的是可变类型的,无需使用global关键字声明
  5. # x = 10
  6. # def index():
  7. #     global x # 声明这个x用的是全局的x
  8. #     x = 20  # 我想在局部修改全局的x的值
  9. #     # print(x)
  10. #
  11. # index()
  12. # print(x) # 10
  13. name_list = ['kevin', 'jerry']
  14. def func():
  15.     name_list.append('tank')
  16. func()
  17. print(name_list) # ['kevin', 'jerry', 'tank']
  18. nonlocal
  19. 如果你想在内部的局部修改外部的局部:
  20.                 1. 如果你修改的是不可变的类型,需要nonlocal关键字的声明
  21.                 2. 如果你修改的是可变类型的,无需使用nonlocal关键字声明
  22. nonlocal的使用:
  23. # def outer():
  24. #     x = 666
  25. #     def inner():
  26. #         nonlocal x
  27. #         x = 999
  28. #     inner()
  29. #     print(x) # 此时的x是多少? 666
  30. #
  31. # outer()
  32. def outer():
  33.     name_list = ['a', 'b']
  34.     def inner():
  35.         name_list.append('c')
  36.     inner()
  37.     print(name_list) # 此时的x是多少? 666
  38. outer()
复制代码
函数对象(函数名)

函数名可以当成变量赋值
  1. ef index():
  2.     print('index')
  3.     return 123
  4. # print(index())
  5. '''函数名就是函数在内存中得地址'''
  6. # print(index)  # <function index at 0x0000022FD03AD550>
  7. a = index
  8. # print(a) # <function index at 0x0000022D4E03D550>
  9. res=a()  # index()
  10. print(res)
复制代码
函数名可以的当成函数的实参
  1. def index():
  2.     print('index')
  3.     return None
  4. def func(a):
  5.     # a:index
  6.     print(a)
  7.     res=a()  # index()
  8.     print(res) # res的结果? None
  9. # index:index函数所在的内存地址
复制代码
函数名可以当成函数的返回值
  1. def index():
  2.     print('index')
  3.     return 'index2'
  4. def func():
  5.     print('func')
  6.     # return index() # 'index'
  7.     return index # 'index'
  8. res = func()  #
  9. print(res)
  10. res1=res()  # index()
  11. print(res1)
复制代码
函数名可以当成容器类型的元素
  1. def index():
  2.    print('index')  
  3. return Nonell = [11, 22, 33, index]
  4. # ll = [11, 22, 33, index()]# print(ll[3])
  5. res=ll[3]() # index()
  6. print(res)
复制代码
函数的嵌套调用
  1. 嵌套:函数套函数
  2. # 案例:给你四个数,比较大小,返回最大的
  3. # 两个数的比较大小,返回大的
  4. def my_max(a, b):
  5.     if a >b:
  6.         return a
  7.     return b
  8. # res=my_max(1, 2)
  9. # print(res)
  10. ##
  11. def many_max(a, b, c, d, e):
  12.     '''四个数的比较大小其实还是要两两比较!'''
  13.     res=my_max(a, b) # res得到a和b中得大的那个
  14.     # 怎么样比较res和剩余的大小, 只需要拿res和c或者d中得一个进行比较
  15.     res1=my_max(res, c) # res1:a,b,c中得最大的那个
  16.     res2=my_max(res1, d)
  17.     res3=my_max(res2, e)
  18.     return res3
  19. res=many_max(11, 12, 3, 24)
  20. print(res)
复制代码
闭包函数
  1. # 闭包函数还是函数,它是有函数一点一点演变过来的
  2. 什么是闭包函数?
  3.         闭:就是函数内部定义函数,至少要有2层函数
  4.     包:内部的函数要使用外部函数名称空间中的名字
  5.    
  6. '''只有同时满足以上两个条件,才能称之为是闭包函数'''
  7. def outer():
  8.     x = 666
  9.     def inner():
  10.         print('hello', x)
  11.     return inner
  12. outer()
  13. # 闭包函数的使用场景:
  14. 闭包函数其实是第二种传参方式!
  15. # 第一种传参方式
  16. # def index(username):
  17. #     print(username)
  18. #
  19. # index('jerry')
  20. # 第二种传参方式
  21. # 比较两个数的大小
  22. # def my_max(a, b):
  23. #     if a>b:
  24. #         return a
  25. #     return b
  26. #
  27. # my_max(1, 2)
  28. # 让你用闭包函数实现比较2个数的大小:一次传值,多次使用
  29. def outer(a, b):
  30.     # a = 100
  31.     # b = 200
  32.     def my_max():
  33.         if a > b:
  34.             return a
  35.         return b
  36.     return my_max
  37. res = outer(1, 10)  # my_max函数的内存地址
  38. print(res()) # my_max()
  39. print(res()) # my_max()
  40. print(res()) # my_max()
  41. print(res()) # my_max()
  42. print(res()) # my_max()
  43. print(res()) # my_max()
  44. print(res()) # my_max()
  45. print(res()) # my_max()
  46. res1=outer(10, 20) # res1:my_max
  47. print(res1())
  48. print(res1())
  49. print(res1())
  50. print(res1())
  51. print(res1())
  52. print(res1())
  53. print(res1())
  54. print(res1())
  55. print(res1())
复制代码
来源:https://www.cnblogs.com/zhangfanshixiaobai/p/17685546.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具