可变长参数补充知识、名称空间详述以及函数名的使用方法

*与**在实参中的作用

def func(*args,**kwargs):
    print(args)
    print(kwargs)
func()  # ()   {}
func([1,2,3,4,5])  # ([1, 2, 3, 4, 5],)  {}
l1 = [1,2,3,4,5]
func(*l1)  # (1, 2, 3, 4, 5)
s = 'hello'
func(*s)  # ('h', 'e', 'l', 'l', 'o')
d = {'name':'jason','age':18}
func(*d)  # ('name', 'age')
func(**d)  # {'name': 'jason', 'age': 18}
func(username ='jason',age =17)  # {'username': 'jason', 'age': 17}
t2 = (1,2,3,4,5)
func(*t2)

'''*与**在行参的作用
    * :接受多余的位置参数,并组织成元组的形式赋值给*后面的变量名
    **:接受多余的关键字参数,并组织成字典的性质赋值给**号后面的变量名
'''

'''*与**在实参的作用
   *: 将实参中的容器中的所有元素一一传入位置参数(*号在实参中类似于for循环)
   **:将实参中的字典的kv键值对一一传入关键字参数
'''

命名关键字参数

def func(a,b,*args):
    pass
func(1,b=222)
'''需要行参在传实参的时候,必须要按照关键字参数才可以
'''
# 在行参*args的后面
def func(a,b,*args,c):
    print(a,b,args,c)
# func(1,2,3,4,5)  # 报错
func(1,2,3,4,5,c=100)  # 1 2 (3, 4, 5) 100

# 如果行参中还有**kwargs,那必须在它的后面
def func(a,b,*args,c,**kwargs):
    pass

func(1,2,3,4,c=100,name ='jason')

名称空间

就是用来存反复变量名于数据值之间绑定关系的地方
"""
name = 'jason'
在内存中申请一块内存空间存储jason,然后绑定变量名name
变量名name与值的绑定关系就被存储到名称空间中,之后使用名字都是去名称空间中查找并锁定对应的数据值

del name
删除的不是数据值,而是变量名以及变量名与数据值之间的绑定关系
"""

# 1.名称空间的分类
'内置名称空间'
    python解释器运行就会立刻创建的空间
    写代码过程中可以直接使用的名字都在该空间中
	eg:len()  print()  input()...
	
'全局名称空间'
    py文件运行代码过程中产生的名字都会存入该空间
    普通代码里面的变量名
    分支结构里面的变量名
    循环结构里面的变量名
    定义函数的函数名
    定义类的类名

'局部名称空间'
    函数体代码运行过程中产生的名字都会存入该空间

# 2.名称空间的存活周期
     内置名称空间
	解释器运行(创建)   解释器关闭(销毁)
     全局名称空间
	py文件运行(创建)   py文件结束(销毁)
     局部名称空间
	函数体代码运行(创建)   函数体代码结束(销毁)

名字的查找顺序

"""查找名字之前一定要看自己在哪个名称空间"""
1.当前在全局名称空间
    全局名称空间-->>:内置名称空间
2.当前在局部名称空间
    局部名称空间-->>:全局名称空间-->>:内置名称空间

名称空间的作用域

1.内置名称空间
	在程序任意位置都可以使用(全局有效)
2.全局名称空间
	在程序任意位置都可以使用(全局有效)
3.局部名称空间
	在各自的局部空间可以使用(局部有效)

局部名称空间复杂情况

# 1.各自局部名称空间默认情况下不能彼此共享名字
def fun1():
    name = 'jason'
    print(age)
def fun2():
    age = 18
    print(name)
fun1()
fun2()  # 报错

# 2.特殊情况
x = 1
def func1():
    x =2
    def func2():
        print(x)  # 特例, pycharm识别到局部名称空间中print(x)下面有赋值的变量x,所以报错
        x =3
    func2()
func1()

global与nonlocal关键字

'1.global'
# money =1000
# def index():
#     global money   # 申明局部空间的money操作的是全局的money
#     money = 10000
#     print(money)
# index()
# print(money)

"""
正常情况下,局部名称空间里面出现的新的名字会在局部名称空间中存储
但是有时候需要在局部名称空间中修改全局名称空间的名字,这样其他局部
名称空间可以使用这个名字
"""
# l1 = [1,3,4,5,6]
# s = '$jason$'
# def func():
#     global s
#     s =s.strip('$')
#     print(s)  # jason
#     l1.append(1000)
# func()
# print(l1)  # [1, 3, 4, 5, 6, 1000]
# print(s)  # jason

"""
局部修改全局名称空间中不可变类型的数据,需要使用关键字global申明
如果是可变类型,则无需关键字申明
"""

'2.nonlocal'
def func1():
    x = 1
    l1 = [1,2,3,4,5]
    def func2():
      nonlocal x
      x =1000
      l1.append(1000)
    func2()
    print(x)  # 1000
    print(l1)  # [1, 2, 3, 4, 5, 1000]
func1()
"""
nonlocal 在内存局部名称空间修改外层局部名称空间中的不可变类型
"""

函数名的多种使用方式

def func():
    print('from func')

# 1.函数名也可以被用来多次赋值(函数名与变量名使用一致)
# name = func
# name()  # from func
# name1 = name
# name1()  # from func

# 2.函数名还可以当作函数的实参
# def index(a):
#     print(a)  # <function func at 0x1046b8430>
#     a()
# index(func)  # from func

# 3.函数名还可以当作函数的返回值
# def index():
#     return func
# res = index()
# res()  # from func

# 4.函数名还可以当作容易类型里面的数据值
l1 =[1,2,3,4,func]
res = l1[-1]
res()  # from func
posted @ 2022-07-04 16:15  荀飞  阅读(19)  评论(0编辑  收藏  举报