1.函数的参数,动态传参

2.名称空间,局部名称空间,全局名称空间,作用域,加载顺序

3.函数的嵌套

4.gloabl,nonlcoal关键字

一 函数的动态传参,一个函数如果有多个参数就要写很多形参什么的,很麻烦,所以就有了动态参数

动态参数分两种

动态接收位置参数

这个和位置参数差不多

def yue(*args):

       print(“我要吃”,args)

yue(‘ ’,‘ ’)

需要记住的几个是1,这个动态参数必须要在,位置参数后面,否则就是下面的是关键字参数   def yue(‘a“)   yue(a=XXX)

但是这样位置参数也没用了啊,永远先写位置参数,

2默认值参数的话,默认值的话也只能放在他后面,放在他前面的话只有当实参数小于形参数的时候才能使用,否则实参就吞噬他了

如果在后面的话,前面动态参数把所有实参都收了,默认值永远有除非单个默认值传参

2.动态接收关键字参数

在py中可以动态的位置参数,但是这种情况只能接收位置参数无法接受关键字参数 在py中使用**来接收动态关键字参数

def yue(**kwargs):

        print(‘我’,kwargs)

yue(a=1,b=2)

这个结果是一个dic   a:1

还有个顺序问题,关键字参数,一定要在位置参数后面,否则容易造成串行,整个代码会报错

位置参数必须在关键字参数前面

最终顺序         位置参数 *args 关键字参数 **kwargs

如果想接收所有参数*args **kwargs

还有一种方法  lst  str  可以打乱   

def  yue(*args):

      print(args)

def(*lst)

def(*str)

这些*打乱过的,到时候打印出来的都是元组

字典也可以打乱  不过需要2*  字典打印出来的还是字典

二命名空间    命名分类为1全局命名2局部命名3内置命名

加载顺序1内置命名2全局命名3局部命名

取值顺序1局部命名2全局命名3内置命名

三作用域

就是分为全局作用域,局部作用域

全局命名域,包含内置命名空间和全局命名空间,在全局都可以使用,遵循从上到下

局部作用域,在函数内运行

作用域命名空间

全局作用域   全局命名空间+内置命名空间,

 局部作用域  局部命名空间

我们可以通过globals()函数来查看全局作用域的内容,也可以通过locals()来查看局部作用域中的变量和函数信息

四函数的嵌套

1只要遇见了()就是函数的调用,如果没有()就不是函数的调用

2函数的执行顺序

从中间平分比谁距离最左边最进紧贴左边且在读取函数或打印函数上边为第一打印,执行函数下边的除外,左右位置相同时以上下为标准 ,先上后下,

在读取函数上边有打印则打印,没有则看下一函数      最后打印执行函数下边的    

在看执行函数上边的打印时从下往上看,除了我说的顺序其他一切按上下顺序看

 在执行函数上有头齐的打印则先执行打印,打印的是该函数外边的值且无视该打印的任何操作 例如nonlocal    只有执行函数上有才无视,读取函数上有不行

经过了差不多2小时的努力总算总结出规律了,妈的,一点一点看,看的我是头皮发麻啊

五关键字global和nonlocal

想使用或改变全局变量用global

a=100
def f():
  global a
  a=28
  print(a)
f()
print(a)               这样就是把a变成28了
 
对于可改变的数据类型可直接访问

lst = ["麻花藤", "刘嘉玲", "詹姆斯"]

def func():

  lst.append("⻢马云云")了了. 不不能赋值

  print(lst)

func():

print(lst)      这两个打印出来的都是多了马云的,但是地址没变,就是不能赋值

nonlocal为调用他上层的值,上层没有则一直往上找,除了最外面的全局变量,如果没有会报错,并且新的变量会改变上边的变量,下边再执行新变量