*与 ** 在实参中的作用
- 在形参名前加*:* 会把溢出的位置实参存成元组,然后赋值其后的形参名
- 在形参名前加**:* * 会把溢出的关键字实参存成字典,然后赋值其后的形参名
- 在实参前加 * :* 会把其后的值打散成位置实参
- 在实参前加**:* * 会把其后的值打散关键字实参
名称空间
- 就是用来存放变量与数据之之间绑定关系的地方
名称空间的分类也是有三种的
- 内置名称空间:python解释器运行起来就会自己创建自己的空间,当写代码的过程中就可以直接使用在该空间中的名字。 当运行期运行起来就创建 解释器关闭了就自行结束了。
- 全局名称空间:当解释器文件运行代码过程中产生的名字都会存入该空间;里面有普通代码里面的变量名,分支结构里面的变量名,循环结构里面的变量名,定义函数的函数名,定义类的类名。 解释器py文件运行就创建 当解释器py文件结束就自行结束。
- 局部名称空间:函数体代码运行过程中产生的名字都会存入该空间 当函数体代码运行就创建 函数体代码结束也就自行结束了
名字的查找顺序
- 查找之前一定要看自己当前在那个位置
- 如果你是在局部: 局部>>全局>>>内置
- 如果你是在全局:局部>>>内置 在用名字查找的顺序下是不能颠倒的 只能按着顺序局部到全局在到内置!
名称空间的作用域
- 内置名称空间就是在程序任意位置都可以使用也就是全局使用
- 全局名称空间是在程序任意位置都可以使用也是全局有效
- 局部名称空间在各自的局部空间可以使用
局部名称空间复杂的情况
在各自的局部名称空间默认的情况下不能彼此共享名字
def func1():
name='yqb'
print(age)
def func2();
age=24
print(name)
func1()
func2()
但是也是有特殊情况,在函数定义阶段名字的查找顺序就已经固定死了。
global与nonlocal关键字的使用
正常情况下局部名称空间里面出现新的名字会在局部空间中存储但是有时候需要在局部空间中修改全局名称空间的名字
money=999
def func():
global money
money=1000
print(money)
func()
print(money)
局部修改全局名称空间中不可变类型的数据 需要使用关键字global 如果不可变类型 则无需关键字
li=[1,2,3,4,5]
s=$yqb$
def func():
global s
s='yqb'
res=s.strip('|')
l1.append(113123)
l1.append(666)
func()
peint(l1)
def func1()
x=1
l1=[1,2]
def func2()
nonlocal x
x=999
l1.append(666)
func2()
print(x)
print(l1)
func1()
nonlocal 在内存局部名称空间修改外层局部名称空间中的不可变类型
函数名的多种使用方法
* 函数名可以用来赋值并且多次赋值
name=func
name()
name1=name
name1
* 函数名可以当作实参
def index(a)
print(a)
a()
index(123)
name=‘yqb'
index(name)
index(func)
* 函数名还可以当成返回值
def index():
retunrn func
res=index()
print(res)
res()
* 函数名也可以当成容器中的数据值
l1=[1,2,3,4,func]
print(l1)
l1[-1]()