python 函数指动态形参,作用域

函数的动态形参, 作用域

一 动态形参

    如果我们需要给⼀一个函数传参, ⽽而参数⼜又是不确定的. 或者我给⼀一个 函数传很多参数, 我的形参就要写很多, 很⿇麻烦, 怎么办呢. 我们可以考虑使⽤用动态参数

 

动态参数分成两种: 1. 动态接收位置参数,   按位置顺序接受实参 ,如果有位置参数必须写在动态参数前面 默认值参数写在最后方可生效, 传参是必须写  形参 = 值

def func(*args):

  print(args)

func(1,2,3,4,5)

>>>(1,2,3,4,5)   # 接收到的实参聚合成元组

def func(a,*args)

  print(a,args)

func("这样", 1,2,3,4,5)

>>>这样 (1,2,3,4,5)

 

2 动态接收关键字参数

def  func(**kwargs)

 **kwargs 关键字的动态传参, 接收到的是字典

def func(**kwargs):   # key word arguments
     print(kwargs)

func(a=10, b=20, jay="周杰伦", jj="林俊杰")

>>>{"a": 10, "b": 20, "jay": 周杰伦, "jj": "林俊杰"}

func(张无忌=dic['张无忌'], 谢逊=dic['谢逊'], 范瑶=dic['范瑶'])
func(**dic) # 这里的** 是把字典打散. 字典的key作为参数的名字, 字典的值作为参数的值传递给形参

 小结

 在形参上
1. 位置参数
2. 默认值参数
3. 动态参数

  1. *args  位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组
  2. **kwargs  关键字的动态传参. 系统会自动把所有的关键字参数聚合成字典
  3.  def func(*args, **kwargs): 无敌传参
  4. 顺序:  位置参数, *args, 默认值, **kwargs
  5. 在使用的时候, 可以任意的进行搭配

4. 在实参上. *, **表示的打散.  在形参. *,** 表示聚合

 

二 作用域 :作⽤用域就是作⽤用范围, 按照⽣生效范围来看分为 全局作⽤用域和局部作⽤用域

1 全局作⽤用域: 包含内置命名空间和全局命名空间. 在整个⽂文件的任何位置都可以使⽤用(遵循 从上到下逐⾏执⾏).

局部作⽤用域: 函数内部的变量命名空间     在函数内部可以使⽤用.

 

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

 

  我们给存放名字和值的关系的空间起⼀一个名字叫: 命名空间. 我们的变量量在存储的时候就 是存储在这片空间中的.    

命名空间分类:        

@. 全局命名空间--> 我们直接在py⽂文件中, 函数外声明的变量量都属于全局命名空间       

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

3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内 置命名空间

@作⽤用域命名空间:        

1. 全局作⽤用域:    全局命名空间 + 内置命名空间       

2. 局部作⽤用域:    局部命名空间
 

@加载顺序:       

1. 内置命名空间
2. 全局命名空间       

3. 局部命名空间(函数被执⾏行行的时候)       

@取值顺序:       

1. 局部命名空间       

2. 全局命名空间       

3. 内置命名空间

@重要关键字

globals():  查询全局变量命名空间的内容

locals() :查询当前作用域变量命名空间的内容

global表⽰不再使⽤用局部作⽤用域中的内容了了. ⽽而改⽤用全局作⽤用域中的变量

nonlocal 表⽰示在局部作⽤用域中, 调⽤用⽗父级命名空间中的变量, 引入最近的一层,没有则创建

 

posted @ 2018-09-14 20:59  python传言  阅读(218)  评论(0编辑  收藏  举报