今日总结

  • 名称空间
  • 名字的查找顺序
  • 作用域
  • global与nonlocal关键字
  • 函数名对象
  • 函数的嵌套

内容详细

名称空间

# 名称空间就是存放变量名与变量值绑定关系的地方
# 名称空间的分类
 1.内置名称空间:就是Python解释器提前给我们定义好的,像len() print() open()等
 2.全局名称空间:在py文件中编写的代码运行产生的名字都会存放到全局名称空间
   eg:name = 'jason'    # 变量名name存入到全局名称空间
      def index():		# 函数名index存入到全局名称空间
        pass
      if True:
            a = 1       #变量名a存入全局名称空间
      for i in range(10):     # 变量名i存入全局名称空间
         pass
      while True:
            b = 2		# 变量名b存入全局名称空间
   3.局部名称空间:函数体代码运行产生的都是局部名称空间
	eg:def index():
            name = 'jasson' 		# name存入局部名称空间
            
# 存活周期
1.内置名称空间:Python解释器一运行就会产生,一关闭就会销毁
2.全局名称空间:py文件开始运行就会产生,一结束就会销毁
3.局部名称空间:函数体代码运行就会产生,一结束就会销毁

名字的顺序查找

# 在查找名字的时候,一定要先知道自己处在哪个空间。如果在局部名称空间,顺序就是:局部名称空间>>>
# 全局名称空间>>>内置名称空间
# 如果在全局名称空间顺序就是:全局名称空间>>>>内置名称空间
# 局部名称空间之间如果不是嵌套关系,那么它们之间就互不干涉

作用域

# 作用域就是名称空间能够作用的范围
内置名称空间
	程序任意阶段任意位置均可使用(全局有效)
全局名称空间
	程序任意阶段任意位置均可使用(全局有效)
局部名称空间	
	一般情况下只在各自局部名称空间中有效(局部有效)
  '''也可以通过一些手段打破规则'''

global与nonlocal关键字

# global关键字:局部修改全局不可变类型
eg:x = 1
    def index():
        x = 2
   (并不是修改全局的x,而是在局部名称空间中创建一个新的x)
#如果想要在局部名称空间中修改全局名称空间的名字(不可变类型),就需要使用关键字global申明
#如果想要在局部名称空间中修改全局名称空间的名字(可变类型),不需要使用关键字global申明
eg:def index():
        x = 111   # 在index的局部产生一个x = 111
        l1 = [11,22,33]
        def f1():
            # x = 222(在f1的局部产生一个x = 222)
            # print(x)
            # 局部名称空间嵌套,内层修改外层
            # nonlocal x
            # x = 333
            l1.append(44)
        f1()
        print(X)
        print(l1)
    index()
# 局部名称空间嵌套的情况下,内层如果想要修改外层,如果数据是不可变类型需要使用关键字nonlocal
# 如果数据是可变类型,不需要使用关键字

 

函数名的多种用法

 1.函数名可以当做变量名赋值
    def index():
        print('from function index')
    print(index)
    res = index   #让res也指向函数体代码
    print(res)
    res()
    index()
    
 2.函数名还可以当成函数的实参
   def index():
        print('from index')
   def func(a):
    	print('from func')
        print(a)
        a()
    func(index)
    
 3.函数名还可以当做函数的返回值
	def func():
        print('from func')
        return index      # 将函数名当做返回值
    def index():
        print('from index')
    res = func()        # res接收函数名
    print(res)         # 指向的是index函数的内存地址
    res()
    
 4.函数名可以作为容器类型的元素(内部可以存放多个元素的数据类型,如列表、集合、字典等)
     def index():
        print('from index')
     l1 = [11,22,33,index]
     print(l1)
     l1[-1]()

函数的嵌套

def index():
    func()
    print('from index')
def func():                # 死循环
    index()
    print('from func')
func() 

def my_max(a,b):
    """返回两个数中的较大值"""
    if a > b:
        return a
    return b
 
 def many_max(a,b,c,d):
    """返回四个数中的较大值"""
    res = my_max(a,b)      # 两两先比
    res1 = my_max(res,b)
    res2 = my_max(res1,d)
    ...
    
def all_func(cmd):
    def register():
        print('注册功能')
    def login():
        print('登录功能')
    def transfer():
        print('转账功能')
    if cmd == '1':
        register()
    elif cmd == '2':
        login()
    elif cmd == '3':
        transfer()
    else:
        print('再见')