一、名称空间:
名称空间 | 定义:存放名字和值的绑定关系 | |||
内置名称空间 | python自带的名字,如print、int、str | 解释器启动就会生效 | ||
全局名称空间 | 文件级别定义的名字,都会放在全局名称空间(没有缩进的所有定义的名字) | 执行文件时会产生,执行完就没了 | 这个也算全局的y=3: | |
局部名称空间 | 定义在函数内部的名字 | 只有在调用函数的时候才生效,调用结束就失效 |
加载顺序 | 内置名称空间======》 | 全局名称空间======》 | 局部名称空间 | 另: |
取值顺序 | 局部名称空间======》 | 全局名称空间======》 | 内置名称空间 | 函数与变量的作用域关系在定义的时候就已经固定了,即使后来在外面调用了内层函数,使用的变量任然是定义时的各个函数 |
作用域 | 全局作用域(全局有效) | 内置名称空间+全局名称空间 | ||
局部作用域(局部、函数内部有效) | 局部名称空间 | |||
取值 | 局部作用域=======》 | 全局作用域 |
局部作用域 | locals | 局部要改全局变量,要先声明 globals x,再定义x(尽量避免) |
全局作用域 | globals | 文件执行结束,变量删除,重新定义后才会失效 |
nonlocal | 改上一层的局部变量,如果局部没有,不会改全局 |
二、函数嵌套:
函数的嵌套调用
函数的嵌套定义
函数内定义的函数只能在函数内调用,就像函数内定义的变量,外面无法调用
def f1():def f2():def f3():print('from f3')print('from f2')f3()print('from f1')f2()f1()D:\Python36\python.exe D:/py/test/homework0612.py from f1 from f2 from f3
三、函数对象:
函数是第一类对象: | 可以被引用 |
可以被当做函数参数 | |
可以被当做函数返回值 | |
可以当做容器类型的元素 |
#函数是第一类对象: 指的是函数可以被当做数据传递# def func(): # print('from func')#可被引用 # f=func#可以当做函数的参数 # def func(): # print('from func') # def foo(x): # print(x) # x()# foo(func)#可以当做函数的返回值 # def foo(): # print('from foo') # def bar(): # return foo # f=bar() # print(f) # print(foo) # f()# x=0 # def f1(): # x=1 # def f2(): # # x=2 # print(x) # return f2 # f=f1() # print(f) # f()#可以当做容器类型的元素 # def select(): # print('select function') # # func_dic={ # 'select':select, # } # # print(func_dic['select']) # func_dic['select']() # # # def select(): # print('select func') # # def delete(): # print('delete func') # # def change(): # print('change func') # # def add(): # print('add func') # # # while 1: # cmd=input('>>: ').strip() # if not cmd:continue # if cmd == 'select': # select() # elif cmd == 'delete': # delete() # elif cmd == 'change': # change() # elif cmd == 'add': # add() # else: # print('无效的命令')def select(cmd_l):filename=cmd_l[-1]pattern=cmd_l[1]with open(filename,'r',encoding='utf-8') as f:for line in f:if pattern in line:print(line)def delete():print('delete func')def change():print('change func')def add():print('add func')def check():print('check func')func_dic={'select':select,'delete':delete,'change':change,'add':add,'check':check, }while 1:inp=input('>>: ').strip()if not inp:continue #如果输入为空则继续 输入自带bool值,如果为空,bool值为FALSE,不空则为True。cmd_l=inp.split()# print(cmd_l)cmd=cmd_l[0]if cmd in func_dic:func_dic[cmd](cmd_l)else:print('无效的命令')