zoukankan      html  css  js  c++  java
  • Day 10 函数的进阶-函数的传参-名称空间-作用域

    一、动态传参
    1、形参:
    1.位置参数
    2.默认参数
    3.动态参数
    1. *args:动态接收位置参数
    2. **kwargs:动态接收关键字参数
    def chi(*food):
        print("我要吃", food)
    chi("大米饭", "小米饭")
    结果:
    我要吃 ('大米饭', '小米饭') # 多个参数传递进去. 收到的内容是元组tuple
    
    
    * 表接收位置参数的动态传参
    传参的顺序
    位置 *args 默认值 **kwargs
    如果默认值参数在*args前面. 如果想让默认值生效. *args将永远接不到值
    def func( a, b, *args,c = 5): # arguments参数
        print(a, b, c, args)
    
    func(1,2,3,4,5,6,8,c = 10)
    关键字的动态传参
    *args 位置参数 接收到的是元组
    **kwargs 关键字的动态传参, 接收到的是字典
    def func(**kwargs): # key word arguments
        print(kwargs)
    
    func(a=10, b=20, jay="周杰伦", jj="林俊杰")
    无敌模式. 所有的参数都能接收
    def func(*args, **kwargs):
        print(args)
        print(kwargs)
    
    func(1, 2, 5, jj="陶喆", jay="zhoujielun", soup="胡辣汤")

    运行结果:

    (1, 2, 5)
    {'jj': '陶喆', 'jay': 'zhoujielun', 'soup': '胡辣汤'}




    def func(*args): # 在这里. 其实相当于把传进来的参数做了一次聚合, 聚合成一个元组
        print(args)
    
    lst = ["a","b","c","d","e"]
    lst = ("青菜",“娃娃菜“,“小白菜”)
    lst
    = "娃哈哈" func(*lst) # 在实参位置 * 表示打散, 打散的是可迭代对象


    结果:
    ('a', 'b', 'c', 'd', 'e')
    ('青菜', '娃娃菜', '小白菜')
    ('娃', '哈', '哈')
    def func(**kwargs): # ** 把接收到的关键字参数打包(聚合)成字典
        print(kwargs) # 一定是字典
    
    dic = {"张无忌": "明教教主", "谢逊": "金毛狮王", "范瑶": "光明右使"}
    
    # func(张无忌=dic['张无忌'], 谢逊=dic['谢逊'], 范瑶=dic['范瑶'])
    func(**dic) # 这里的** 是把字典打散. 字典的key作为参数的名字, 字典的值作为参数的值传递给形参


    结果:

    {'张无忌': '明教教主', '谢逊': '金毛狮王', '范瑶': '光明右使'}

    总结:

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

    二、名称空间和作用域

    最开始会开辟一个自己的命名空间- 内置名称空间
    a = 10
    print(a)
    # 直接在py文件一个层面上是全局名称空间
    def func():
        hasakey = 10
    # 在函数内部属于局部名称空间
    func()
    加载顺序: 内置 => 全局 => 局部
    取值顺序: 局部 => 全局 => 内置


    名称空间:保存名字用的(变量,函数,类)
    1.内置名称空间:Python自己,print,input,len
    2.全局名称空间:你写的代码从上到下
    3.局部名称空间:函数,类,方法,其他模块,对象
    加载顺序:内置命名空间, 全局命名空间, 局部命名空间(函数被执行的时候)
    取值顺序:局部命名空间, 全局命名空间, 内置命名空间






    作用域:
    全局作用域
    内置名称空间 + 全局名称空间
    局部作用域
    局部名称空间
    从局部找全局可以,但是从全局找局部是不可以的

    globals() 查看全局作用域中的所有内容
    locals() 查看当前作用域中的名字

    三、函数的嵌套(难点)
    每一层都会产生独自的名称空间
    只要遇见了()就是函数的调用,如果没有()就不是函数的调用

    四、 nonlocal,global
    global:在局部引入全局的内容,可以升华一个变量为全局变量
    nonlocal:在局部,引入上一层名称空间中的变量,如果没有,继续上一层.......
  • 相关阅读:
    windows(64位)下使用curl命令
    ThinkPHP 3.2 性能优化,实现高性能API开发
    如何摆脱恨死人的低价竞争对手
    火狐浏览器如何js关闭窗口的几种解决方法
    当 Swoole 遇上 ThinkPHP5 世界你好
    TCP网络编程杂谈
    SQL语句操作优先级顺序
    记一次常规的Mysql数据库访问的时间分析
    CSS艺术字
    Eclipse Oxygen创建maven web项目(二)
  • 原文地址:https://www.cnblogs.com/xiaomai-rhce/p/10398549.html
Copyright © 2011-2022 走看看