6-day6-函数-1
增删改查 文件当作存放数据的仓库
做个工具和用户交互,可以处理用户命令
用户输入什么命令,就print什么命令
def select(x,y,z): with open(z,'w',encoding='utf-8') as f: for line in f: if y in f: print(line) def delete(): print('delete func') def change(): print('change func') def add(): print('delete func') func_dic = { 'select': select, 'add': add, 'change': change, 'del': delete } while True: inp = input('>>: ').strip() if not inp: continue cmd_l = inp.split(' ') if cmd_l[0] in func_dic: func_dic[cmd_l[0]](cmd_l[0], cmd_l[1], cmd_l[2]) else: print('无效命令') input('>>: ')
函数参数的使用
def func1(): if 1 > 2: print('d') else: print('ok') func1() # 形参与实参 # 形参是变量名 实参是1 2,形参函数内 def foo(x,y): return x+y foo(1,2) # 位置参数:按照从左到右的顺序一次定义的参数 # 按位置定义的形参,必须被传值,多一个不行,少一个也不行 # 按位置定义的实参,必须与形参一一对应 # 关键字参数:参数在定义时,按照key=value进行定义,形参与实参不必一一对应 func1(x=1, y=2, z=3) func1(1,y=2) #混合,位置实参必须在关键字实参前面 # 一个形参只能被传值一次 # 默认参数:在定义函数阶段,就已经为形参赋值,调用阶段就无需传值。 def func1(x, y=10) # 默认参数,必须放在位置形参后面 def func1(x=10, y) #不行! # 默认参数通常要定义成不可变类型,只在定义阶段赋值一次 #可变长形参-分两种 def func2(x,y,*args): #多余的参数存储在元组里 print(x,y) print(args) func2(1,2,3,4,5,6) func2(1,2,*(3,4,5,6)) #注意这种幅值方法 func2(*('a','b','c')) == func2('a','b','c') def func3(x,y,**kwargs): # 多余的参数放在字典里 #多余的关键字参数被**接受,传给kwargs print(x,y) print(kwargs) func2(y=2,x=1,z=3,a=5) #命名关键字参数 #放置出现异常# 实参必须要以关键字传值 def register(*,name,age): print(age) print(name) register(age=18) register(name='alex',age=21) def register(*args,name,age): print(age) print(name) register(1,2,3,4,name='egon',age=10)
函数对象
# 可被引用 f = func() # 可以当作函数的参数 # 可以当作函数的返回值 def foo(): print('from foo') def bar(): return foo f = bar() print(f) # 可以当作容器类型的元素: 字典,value为函数名 def select(): print('select function') func_dict={ 'select':select } func_dict['select']() # x = 0 def f1(): x = 1 def f2(): x = 2 print(x) return f2 f = f1() print(f) f() x = 1 def func1(): x = 2 def fun2(): x = 3 def fun3(): #global x nonlocal x x = 10000 print(x) fun3() print(x) fun2() func1()
名称空间和作用域
# 名称空间 :存放名字与值的绑定关系 # 名称空间分为三种: # 内置名称空间:python解释器自带的名字,解释器启动就生成空间 # 全局名称空间:文件级别定义的名字都会存放在全局名称空间,执行python文件时会产生,顶头写的定义 x = 1 def fun1(): class Foo: pass import os os.name # 局部名称空间:定义在函数内部的名字,在函数调用阶段才会生效 #三者的加载顺序: 内置——全局--局部。 # 取值 内部函数顺序:局部-内置-全局 # 作用域:作用范围(生效分为) x = 0 def f1(): x = 1 def f2(): x = 2 def f3(): x = 3 print(x) f3() f2() f1() # 全局作用域: 内置名称空间和全局名称空间的名字属于全局范围,在整个文件任意位置都能被调用,全局有效 def foo(x,y): print(max(x,y)) foo(12,23) # 局部作用域: 局部名称空间的名字,属于局部范围,只在函数内,局部有效 def foo(x,y): def maxx(x,y): if x > y: return x else: return y print(maxx(x,y)) # print(globals()) print(locals()) foo(12,23) # 局部作用域-->全局作用域 print(globals()) print(dir(globals()['__builtins__'])) print(locals()) print(globals() is locals()) # 全局的局部是全局