zoukankan      html  css  js  c++  java
  • 函数的动态参数和作用域


    1. 动态参数

    位置参数的动态参数: *args
    * 在这里表示接收位置参数的动态传参,接收到的是元祖
    def chi(*food): # 可以传入任意的位置参数 food是参数名,*便是动态参数
      print("我要吃",food) # 动态参数接收到的是tuple类型的数据
    chi("盖浇饭", "辣条", "面条")
    chi('大米饭','小米饭')
    chi() # 可以接收空,接收到的也是元祖
    关键字参数的动态参数 : **kwargs
    def func(**food):         # **food动态接收关键字参数
        print(food)                # 接收到的是dict类型
    
    func(good_food="盖浇饭", no_good_food="辣条", drink="冰封")
    这个函数可以接收所有的参数(无敌的)
    def func(*args, **kwargs):
        print(args)
        print(kwargs)
    func(1, 2, 5, 6, name="taibai",age=18, sex="不详")
    顺序:位置,*args,默认值,**kwargs

    在形参上:'*','**',表示聚合,所有的位置参数,*聚合成元祖,**聚合成字典
    在实参上:'*','**',表示打散,*打散,迭代传参,**打散字典,以k=v形式进行传参
    def func(*args, **kwargs):
        print(args)
        print(kwargs)
    lst = ["钢铁侠", "蜘蛛侠", "煎饼侠", "蝙蝠侠"]
    func(*lst)     # 实参, 打散, 迭代产生的
    func(lst)       #没有打散
    dic = {"name":"小猴", "age":26}
    func(**dic)     # 把字典打散. 以key=value形式进行传参
    func(dic)      # 没有打散
    
    
    
    ('钢铁侠', '蜘蛛侠', '煎饼侠', '蝙蝠侠')     # 是个元祖,里边装了4个元素
    (['钢铁侠', '蜘蛛侠', '煎饼侠', '蝙蝠侠'],)   # 也是个元祖,里边是个列表,但是是1个元素
    {'name': '小猴', 'age': 26}    # 就是一个字典
    ({'name': '小猴', 'age': 26},)    # 是个元祖,装了个字典
    定义函数

    def 函数名(形参): 1.位置参数, 2, *args, 3.默认值参数, 4. **kwargs
    函数体
      return 返回值

    函数名(实参) 1. 位置参数. 2.关键字参数. 3. 混合参数,
    2. 命名空间和作用域

    命名空间: 存放名字和值的空间
    1. 内置命名空间: python解释器内部运行时存储的:int,str,list,tuple这些名字的空间
    2. 全局命名空间: 在代码运行初始,创建的存储名字和值的空间
    3. 局部命名空间: 在函数内部运行中创建的空间

    作用域:
    1.全局作用域:内置+全局命名空间,在整个文件的任意位置都可以被引用,全局有效
    2.局部作用域:局部命名空间,只在局部范围内生效

    globals() 查看全局作用域中的名字
    locals() 查看当前作用域中的名字
    a = 10
    def func():
        a = 20
        print(globals())  # globals() 获取到全局作用域(内置,全局)中的所有名字
        print(locals())  # locals() 查看当前作用域中的所有名字
    func()



    记住:如果是函数必须是函数调用后,才能查看作用域
    
    

    三种命名空间之间的加载与取值顺序:

    
    

    加载顺序:内置命名空间(程序运行前加载)=>全局命名空间(程序运行中:从上到下加载)=>局部命名空间(程序运行中:调用时才加载)

    
    

    取值顺序:

    
    

      在局部调用:局部命名空间->全局命名空间->内置命名空间

    
    

      在全局调用:全局命名空间->内置命名空间



    3.函数的嵌套

    降维模式,一层一层去分析
    def func1():
        print("呵呵")
        def func2():
            print("哈哈")
        func2()
        print("吼吼")
    func1()
    
    def func1():
        print("")
        def func2():
            print("")
            def func3():
                print("")
            print("")
        def func4():
            print("哈哈")
            func2()
        print("")
        func2()
    func1()
    4. global和nonlocal

    global: 把全局变量拿到局部来用.
    a = 10
    def func():
        global a    # 把外面全局中的a 引进来
        a = 30      # 把全局中的a重新赋值成30   外面的a也就变成30了
        print(a)
    func()
    print(a)
    
    
    # 30
    # 30
    nonlocal: 把最近的一层的变量拿过来.不会找全局
    def func1():
        a = 10           
        def func2():
            nonlocal a    # 找局部作用域中 离他最近的那个变量引入进来
            a = 20         # 把a重新赋值成20
            print(a)
        func2()
        print(a)
    func1()
    
    
    # 20
    # 20
    记住:
    # global 如果在全局中找不到,会把局部变量升级成全局变量
    # nonlocal 如果在局部中找不到,会报错
     
    默写:
        1,形参的接收顺序。
    位置参数 => *args => 默认值参数 => **kwargs
    
        2,什么是命名空间,什么是全局名称空间,什么是局部名称空间,什么是内置名称空间
    命名空间:存放名字和值的关系的空间
    全局名称空间: 在代码运行初始,(俗称函数外)创建的存储名字和值的空间
    局部名称空间: 函数运行中创建的空间
    内置名称空间: python解释器内部运行时存储的:int,str,list,tuple这些名字的空间
    
        3,什么是全局作用域,什么是局部作用域。
    全局作用域: 包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
    局部作用域: 局部名称空间,只能在局部范围内生效
    
        4,名称空间的加载顺序,取值顺序。
    加载顺序:内置命名空间(程序运行前加载)=>全局命名空间(程序运行中:从上到下加载)=>局部命名空间(程序运行中:调用时才加载)
    调用顺序:
           在局部调用:局部命名空间->全局命名空间->内置命名空间
           在全局调用:全局命名空间->内置命名空间
    
        5,解释一下什么是global,什么是nonlocal。
    global:    把全局变量拿到局部来用.
    nonlocal:  在函数内部中,把最近的一层的变量拿过来.不会找全局
    
    
    
     
  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/hmw112626/p/9310086.html
Copyright © 2011-2022 走看看