函数参数、名称空间与作用域、名字的查找顺序

1|0函数参数、名称空间与作用域、名字的查找顺序

1|1一、函数参数

1|01.形参与实参

1.形式参数 在函数定义阶段括号内填写的参数,简称'形参' 2.实际参数 在函数调用阶段括号内填写的参数,简称'实参' 形参与实参的关系: 形参类似于变量名,在函数定义阶段可以随便写,最好知名见意 eg: def register(name, pwd): pass 实参类似于数据值,在函数调用阶段与形参临时绑定,函数运行结束立刻断开 eg: register('jason', 123) 形参name与jason绑定,形参pwd与123绑定 eg: def register(name, pwd): print(name,pwd) register('jason', 123)

1|02.位置参数

1.位置形参 在函数定义阶段括号内从左到右依次填写的变量名 def func(a, b, c):pass # 当代码只有一行的情况下,可以直接在冒号后编写,不用换行 2.位置实参 在函数调用阶段括号内从左到右依次填写的数据值 eg: def func(a, b,c): print(a,b,c) func(1,2,3) # 1 2 3 name = 'jason' func(name,1,2) # jason 1 2 # 实参必须要与形参的个数一一对应(个数一致),不能多也不能少 eg: def func(a, b): print(a,b) func(1,2) # 1,2 func(1) # 报错,少一个不行,多一个也不行 func(b=1,a=2) # 关键字传参(指名道姓的传) func(b=2,1) # 报错,关键字传参一定要跟在位置传参的后面 func(3,b=9) # 可以 func(1,a=2,b=7) # 报错,同一个形参在调用的时候不能多次赋值 eg: def func(a,b): print(a,b) name = 'jason' pwd = 123 func(name,pwd) # jason 123 func(a=name, b=pwd) # 实参没有固定的含义,可以传数据值,也可以传绑定了数据值的变量名

1|03.关键字参数

1.关键字实参,给函数传值时指定参数名 2.关键字参数指调用阶段,括号内什么等于什么的形式传值,比如a=name,b=pwd 3.注意位置实参必须在关键字参数的前面 4.无论是实参函数形参,遵循简单的在前,复杂的在后,同一个形参在调用的时候不能多次赋值 eg: def func(a,b,c): print(a,b,c) func(1,a=3,b=6) # 报错,同一个形参不能多次赋值

1|04.默认参数

默认参数的本质就是关键字形参,别名默认参数,提前已经给了,用户可以不传,也可以传 eg: def register(name,age,gender = 'male'): print(f''' name:{name} age:{age} gender:{gender} ''') register('jason',12) # name:jason age:12 gender:male register('jia',11,'female') # name:jason age:12 gender:female # 自定义阶段,后续调用不用传值,如果自己传值的话,则后续用自己写的值

1|05.可变长形参

1.*在形参中的应用 eg: def func(*a): print(a) func() # () func(1) # (1,) func(2,4) # (2, 4) # *在形参中用于接收多余的位置参数,组织成元组赋值给*后面的变量名 eg: def func(c,*a): print(a,c) func() # 报错,至少有一个参数给到c func(1) # () 1 func(2,4) # (4,) 2 2.**在形参中的应用 # {'a': 2, 'b': 8, 'c': 9} eg: def func(**k): print(k) func() # {} func(a=1) # {'a': 1} func(a=2,b=8,c=9) # **在形参中,用于接收多余的关键字参数,组织成字典赋值给**后面的变量名 eg: def func(a,**k): print(k) func() # 报错,至少有一个参数给到a func(a=1) # 1 {} func(a=2,b=8,c=9) # 2 {'b': 8, 'c': 9} 3.*和**在形参中的混合应用 eg: def func(*args,**kwargs): print(args,kwargs) func() # () {} func(1,2,3) # (1, 2, 3) {} func(a=1,b=4,c=6) # () {'a': 1, 'b': 4, 'c': 6} func(1,2,3,a=3,b=5,c=8) # (1, 2, 3) {'a': 3, 'b': 5, 'c': 8} ''' *和**在函数的形参中的使用频率很高的,推荐使用下面这种: *args **kwargs def index(*args,**kwargs):pass '''

1|06.可变长实参

eg: def index(a,b,c): print(a,b,c) l1 = [1,2,3] t1 = {1,2,3} f1 = (22,34,66) p1 = 'jas' k1 = {'name':'name','pwd':123,'age':19} index(*l1) # 1 2 3 index(*t1) # 1 2 3 index(*f1) # 22 34 66 index(*p1) # j a s index(*k1) # name pwd age # 将列表,集合,元组,字符串,字典中的三个值,取出来传给函数的三个形参(写得时候注意个数,博客少写或者多写) #这种方法类似于for循环,将所有循环遍历出来得数据按照位置参数一次性穿给函数

1|07.命名关键字参数(了解)

形参必须按照关键字参数传参:命名关键字参数 eg: def index(name,*args,gender='male',**kwargs): print(name,args,gender,kwargs) index('jason',1,2,3,'female',b=3,h=8) # jason (1, 2, 3, 'female') male {'b': 3, 'h': 8}

1|2二、名称空间

eg: name = 'jason' # 1.申请一个内存空间存储jason # 2.给jason绑定一个变量名name # 3.后续通过name就可以访问到jason了 名称空间就是用来存储变量名与数据值绑定关系的地方(存储变量名的地方) 1.内置名称空间 解释器运行自动产生的,可直接使用的方法名字都在里面 eg: len print input 2.全局名称空间 py文件运行产生的,里面存放文件级别的名字 eg: name = 'jason' eg: if name ='jason': age = 18 eg: while True: gender='male' eg: def index(); pass # 上述的name,age,gender,index都是存放文件级别的名字 3.局部名称空间 函数体代码运行/类体代码运行 产生的空间

1|3三、作用域

作用域: 1.内置名称空间 解释器级别的全局有效 2.全局名称空间 py文件级别的全局有效 3.局部名称空间 函数体代码内有效 存活周期: 1.内置名称 解释器启动则创建,关闭则销毁 2.全局名称空间 py文件执行则创建,运行结束则销毁 3.局部名称空间 函数体代码运行创建,函数体代码结束运行则销毁
名称空间 作用域 存活周期
内置名称空间 解释器级别的全局有效 解释器启动则创建,关闭则销毁
全局名称空间 py文件级别的全局有效 py文件执行则创建,运行结束则销毁
局部名称空间 函数体代码内有效 函数体代码运行创建,函数体代码结束运行则销毁

1|4四、名字的查找顺序

涉及到名字的查找的时候,一定要明白自己在哪个空间 1.当我们在局部名称空间的时候 局部名称空间>>>全局名称空间>>>内置名称空间 eg: len = '我是全局名称空间的len' def index(): len = '我是局部名称空间的len' print(len) index() # 我是局部名称空间的len 2.当我们在全局名称空间的时候 全局名称空间>>>内置名称空间
图片名称

1|5五、查找顺序案例

1.互相独立的局部名称空间默认不能相互访问 eg: def func(): name='jason' print(age) 2.局部名称空间嵌套 从局部名称空间开始查找,由内而外依次查找
图片名称

1|6六、作业

判断下列money的值是多少并说明理由 思考如何修改而不是新增绑定关系 money = 100 def index(): money = 666 print(money) # 100 money = 100 def func1(): money = 666 def func2(): money = 888 func2() print(money) # 100 全局money打印出来得

__EOF__

本文作者泡芙有点甜
本文链接https://www.cnblogs.com/zx0524/p/16776809.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   小王应该在学习!  阅读(117)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示