文章目录
- 一、*与**在实参中的作用
- 二、命名关键字参数(冷门了解)
- 三、名称空间
-
- 四、名字的查找顺序
- 五、名称空间的作用域
- 六、局部名称空间复杂情况
- 七、global与nonlocal关键字
- 八、函数名的多种使用方式
一、*与**在实参中的作用
*在形参中的作用
接收多余的位置参数并组织成元组的形式赋值给*后面的变量名
**在形参中的作用
接收多余的关键字参数并组织成字典的形式赋值给**后面的变量名
*与** 其实在实参和形参中的作用一样 集体我们看例子:
形参:
def func(*args, **kwargs):
print(args)
print(kwargs)
func() 结果:(){}
func([1, 2, 3, 4, 5, 6]) 结果:([1, 2, 3, 4, 5, 6],){} 将多余的位置转为元祖
实参:def func(*args, **kwargs):
print(args)
print(kwargs)
l1 = [1, 2, 3, 4] 列表
s = 'hello' 字符串
d = {'1': 'jason', '2': 18} 字典
func(*l1) 结果:(1,2,3,4) {} *在实参中也是将多余的位置转为元祖
func(*s) 结果:('h', 'e', 'l', 'l', 'o'){} 字符串以字节为单位
func(**d) 结果:(){'1': 'jason', '2': 18} **在实参中也是将多余的位置转为字典
二、命名关键字参数(冷门了解)
想让函数的形参在传值的时候必须要关键字传值:不可以
def func(a,b,*args):
pass
func(1,2) 结果:空
func(a=1,b=2) 结果:空
func(1,b=222) 结果:空
需要形参在传实参的时候 必须按照关键字参数才可以 在*args 后面加上关键形参
下面实参加上数据值即可
def func(a, b, *args, d): 加上关键d形参 不能放在前面
print(a, b, args, d)
func(1, 2, 3, 4, 5, 6, 7) 结果:报错
func(1, 2, 3, 4, 5, 6, d=666) 结果:1 2 (3, 4, 5, 6) 666
三、名称空间
就是用来存放变量名与数据值之间绑定关系的地方
1.内置名称空间
内置名称空间就是python解释器一打开就默认创建的空间
写代码过程中可以直接使用的名字都在该空间中(print、len、input)
2.全局名称空间
py文件运行代码过程中产生的变量名都会存入该空间
1.普通代码里面的变量名 2.分支结构里面的变量名 3.循环结构里面的变量名
4.定义函数的函数名 5.定义类的类名
3.局部名称空间
函数体代码运行过程中产生的名字都会存入该空间
四、名字的查找顺序
寻找变量名之前一要先看自己是那个空间
1.当前在全局名称空间
全局名称空间 >>>: 内置名称空间
2.当前在局部名称空间
局部名称空间 >>>: 全局名称空间 >>>: 内置名称空间
如果三个空间中都没有这个变量名那结果就报错不存在
名字的查找顺序默认情况下不能颠倒只能是 局部>>>:全局>>>:内置
五、名称空间的作用域
1.内置名称空间
在程序任意位置都可以使用(全局有效)随时调用
2.全局名称空间
在程序任意位置都可以使用(全局有效)随时调用
3.局部名称空间
在各自的局部空间可以使用(局部有效)调用的时候才有用
只能在自己的空间里面使用 别的局部空间数据用不到
六、局部名称空间复杂情况
1.各自局部名称空间默认情况下不能彼此共享名字
def func1():
name = 'meijin'
print(age)
def func2(): 结果肯定是报错的
age = 18 在各自的局部空间可以使用(局部有效)
print(name)
func1()
func2()
2.局部案例怎样拿到其他局部的变量名:嵌套式函数
x = 1
def func1():
x = 2
def func2():
x = 3 当本层函数没有x再在外层局部寻找X
def func3(): 外层的局部空间也没有x就在全局空间找
print(x) 全局没有找内置空间 内置空间没有报错
func3()
func2()
func1()
七、global与nonlocal关键字
global
正常情况下 局部名称空间里面出现新的名字会在局部名称空间中存储
但是有时候需要在局部名称空间中修改全局名称空间的名字 这就有了global
局部修改全局名称空间中不可变类型的数据 需要使用关键字global (str、int、float、tuple)
如果是可变类型 则无需关键字声明 (list、dict、set)
money = 999
def func():
global money 加上global这时候改变的就是全局名称中的money
money = 1000 赋值全局名称中的money
print(money)
func()
nonlocal
在内存局部名称空间修改外层局部名称空间中的不可变类型
def func1():
x = 1
l1 = [1,2]
def func2():
nonlocal x 声明修改外层局部x
x = 999 给予新数据值
l1.append(666) l1尾部追加666
func2()
print(x)
print(l1)
func1() 结果:999,[1,2,666]
八、函数名的多种使用方式
1.函数名也可以被用来多次赋值(函数名与变量名使用一致)
def func():
print('from func')
name = func func函数名的数据值赋值给name
name()
name1 = name 函数名name赋值给name1
name1()
result:from func, from func
2.函数名还可以当做函数的实参
def func():
print('from func')
def index(a):
print(a)
index(123) 返回值123
name = 'meijin'
index(name) 返回meijin
index(func) 返回函数体代码
result: 123, jason,
3.函数名还可以当做函数的返回值
def func():
print('from func')
def index():
return func
res = index() 函数名index赋值给res
print(res) 打印出来回事函数体代码地址
res() 运行res函数
result:, from func
4.函数名还可以当做容器类型里面的数据值
def func():
print('from func')
l1 = [1,2,3,4,func] 尾部添加未运行的函数名
print(l1) 1234函数体代码地址
l1[-1]() 索引函数名并运行
result:[1, 2, 3, 4, ],from func