zoukankan      html  css  js  c++  java
  • 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 表⽰示在局部作⽤用域中, 调⽤用⽗父级命名空间中的变量, 引入最近的一层,没有则创建

     

  • 相关阅读:
    USACO 4.1 Fence Rails
    POJ 1742
    LA 2031
    uva 10564
    poj 3686
    LA 3350
    asp.net MVC 3多语言方案--再次写, 配源码
    使用Log4net记录日志
    在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
    为什么要使用反射机制
  • 原文地址:https://www.cnblogs.com/tcpblog/p/9648931.html
Copyright © 2011-2022 走看看