python中的命名空间以及函数的嵌套

 一.动态传参

函数的形参中除了默认值参数和位置参数外,还有动态传参.当不确定形参有几个或者有很多的时候,就可以使用动态传参.

1.1 动态接收位置参数

在python中使用*来接收动态位置参数

复制代码
 1 def chi(*food):    #只有动态参数
 2     print('我要吃',*food)
 3 chi('','','')   #我要吃 饭 肉 鱼
 4 
 5 def chi(a,b,*food):    #动态参数和位置参数
 6     print('我要吃',*food)
 7 chi('','','','桃子','苹果')   #我要吃 鱼 桃子 苹果
 8 
 9 def chi(*food,a,b):
10     print('我要吃',*food)
11 chi('','','','桃子','苹果')   #chi() missing 2 required keyword-only arguments: 'a' and 'b'
12 #★动态参数必须在位置参数的后面,否则就全被动态参数给收了
13 
14 def chi(a,b,*food,c='哈哈'):    #动态参数和位置参数和默认值参数
15     print('我要吃',*food,c)
16 chi('','','','桃子','苹果')   #我要吃 鱼 桃子 苹果 哈哈
17 #★顺序位置参数,动态参数,默认值参数
复制代码

1.2动态接收关键字参数

在python中使用**来接收动态关键字参数

复制代码
 1 def chi(**food):     #只有动态关键字参数
 2     print(food)
 3 chi(a='收到',b=1,c=6)   #{'a': '收到', 'b': 1, 'c': 6}
 4 
 5 def chi(a,b,**food):     #动态关键字参数和位置参数
 6     print(a,b,food)
 7 chi('sd','zc',n='收到',z=1,x=2)  # 3sd zc {'n': '收到', 'z': 1, 'x': 2}
 8 
 9 def chi(a,b,c='哈哈',**food):     #动态关键字参数和位置参数和默认值参数
10     print(a,b,c,food)
11 chi('sd','zc',n='收到',z=1,x=2)   #sd zc 哈哈 {'n': '收到', 'z': 1, 'x': 2}
复制代码

★★★最终顺序:位置参数>*args>默认值参数>**kwargs★★★

这四种参数可以任意的进行使用

 如果想接受所有的参数:

1 def func(*args,**kwargs):   #无敌
2     print(args,kwargs)
3 func(0,1,2,'',a=1,b=2,c='积极')    #(0, 1, 2, '及') {'a': 1, 'b': 2, 'c': '积极'}
4 ##############接收到的动态位置参数保存在元组中,接收到的动态关键字参数保存在字典中############

1.3 打散和聚合

复制代码
 1 def func(*args):
 2     print(args)
 3 lis=[1,2,3,4,5]
 4 func(lis)    #([1, 2, 3, 4, 5],)
 5 
 6 ##################将一个可迭代对象打碎需要在这个可迭代对象前加*#######################
 7 def func(*args):
 8     print(args)
 9 lis=[1,2,3,4,5]
10 func(*lis)   #(1, 2, 3, 4, 5)
11 
12 #如果是字典
13 
14 def func(**kwargs):
15     print(kwargs)
16 dic={1:'a',2:'b',3:'c',4:'d',5:'e'}
17 func(**dic)     #TypeError: func() keywords must be strings打散之后变成了1='a'不符合逻辑
18 
19 ##################这里字典的键只能是字符串类型####################
20 
21 def func(**kwargs):
22     print(kwargs)
23 dic={'A':'a','B':'b','C':'c','D':'d','E':'e'}
24 func(**dic)    #{'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd', 'E': 'e'}
25 
26 #########################形参的位置*,**: 聚合;实参的位置*,**: 打散#############################
复制代码

1.4 函数的注释

复制代码
 1 #在函数名下且只能在函数名下,输入多行注释即可产生
 2 def func(**kwargs):
 3     '''
 4     这个位置写当前函数是干什么的
 5     :param kwargs: kwargs参数是什么意思
 6     :return: 返回值是什么玩意
 7     '''
 8     print(kwargs)
 9 dic={'A':'a','B':'b','C':'c','D':'d','E':'e'}
10 func(**dic)
复制代码

二.命名空间

2.1

在python解释器开始运行之后,就会在内存中开辟一个空间,每当遇到一个变量的时候,就会把变量名和值之间的关系记录下来,当遇到函数定义的时候,解释器只是把函数的名读入内存,表示这个函数存在了,至于函数内部的变量和逻辑,解释器是不关心的,也就是说,一开始函数只是加载进来,只有当函数被调用或访问的时候,解释器才会根据函数内部声明的变量开辟内存空间,但是,随着函数的执行完毕,这些函数内部变量占用的空间也会随着函数的执行完毕而被清空.

1 def func():
2     a=10
3     print(a)
4 func()
5 print(a)   #此时的a不存在

命名空间 :存放名字和值之间的空间

命名空间的分类:

1.全局命名空间:函数外声明的变量都属于全局命名空间

2.局部命名空间:在函数中声明的变量会放在局部命名空间

3.内置命名空间:python解释器为我们提供的名字,list,tuple......

加载顺序:

1.内置命名空间

2.全局命名空间

3.局部命名空间

2.2作用域就是作用范围.

1.全局作用域

2.局部作用域

复制代码
 1 a=10
 2 def func():
 3     a=40
 4     b=20
 5     def abc():
 6         print('哈哈')
 7     print(a,b)
 8     print(globals())    # 'a': 10, 'func': <function func at 0x0000025C198F2EA0>
 9     print(locals())     # 'b': 20, 'a': 40
10 func()
11 #####通过globals()函数来查看全局作用域中的内容,通过locals()函数来查看局部作用域中的内容
复制代码

2.3 关键字global和nonlocal

global: 在局部访问全局中的内容
nonlocal: 在局部寻找外层函数中离他最近的那个变量
以上是有nonlocal的情况:
一下是没有nonlocal的情况:

 

转载:https://www.cnblogs.com/shanghongyun/

posted @ 2022-06-15 00:14  海_纳百川  阅读(57)  评论(0编辑  收藏  举报
本站总访问量