6-day6-函数-1
增删改查 文件当作存放数据的仓库
做个工具和用户交互,可以处理用户命令
用户输入什么命令,就print什么命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 ( '>>: ' ) |
函数参数的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 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 ) |
函数对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | # 可被引用 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() |
名称空间和作用域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | # 名称空间 :存放名字与值的绑定关系 # 名称空间分为三种: # 内置名称空间: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 ()) # 全局的局部是全局 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf