zoukankan      html  css  js  c++  java
  • day 09 函数的进阶

    01 动态参数 *args **kwargs
      
    在函数的定义时,* ** 代表聚合。
    def func(**kwargs):
        print(kwargs)
    func(**{"name":'alex'}, **{'age': 46})
    
    #  {'name': 'alex', 'age': 46}   聚合
    函数的执行(调用)时,* ** 代表打散。
    def func(*args,**kwargs):    #* 代表聚合
        print(args)
        print(kwargs)
    func(*[1,2,3], *'abfc', **{'name':'alex'}, **{'age': 46})   # *代表打散
    def func(*agrs):
        print(agrs)
    # func([1,2,3], [4,5,6 ], 'alex')   #  ([1, 2, 3], [4, 5, 6], 'alex')
    func(*[1,2,3], *[4,5,6 ], *'alex')  #  (1, 2, 3, 4, 5, 6, 'a', 'l', 'e', 'x')   #  打散
    02 形参的顺序
    形参顺序: 位置参数 *args 默认参数 **kwargs
    def func(a,b,*args,sex='',**kwargs,):
        print(a)
        print(b)
        print(args)
        print(sex)
        print(kwargs)
    func(1,2,3,4,5,sex='',name='alex')
    03 名称空间(临时,全局,内置)

    全局名称空间:存放的是py文件中变量与值的对应关系
    局部名称空间:在函数运行时,临时开辟的存放变量名与值得对应关系的空间,函数执行完毕,这块内存空间会被清空。

    内置名称空间:内置函数,关键字等等。 print() input()

    04 作用域:全局作用域,局部作用域
    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
    全局作用域:
      生效于:内置名称空间,全局名称空间
    局部作用域:
      生效于:局部名称空间 (可以用global声明为全局)

    05 加载顺序与取值顺序

    三种名称空间加载顺序:

      内置名称空间 --->  全局名称空间 ---> 局部名称空间

    三种名称空间的取值顺序:

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

      在局部:(就近原则)LEGB原则,局部名称空间 --- > 全局名称空间 ---> 内置名称空间

    print(input)  # <built-in function input>  #第三取值
    input = 'alex'   # 第二取值
    def func():
        input = 'echo'    #  第一取值
        print(input)   
    func()
    06 内置函数:globals() locals()
    globals() 返回全局作用于的所有内容
    locals() 返回当前作用于的所有内容
    def func():
        a = 12
        b = 20
        print(locals())    # 返回一个字典:当前作用域的所有内容 {'b': 20, 'a': 12}
        print(globals())   # 返回一个字典:包含全局作用域所有的内容 {'__name__': '__main__', '__doc__': None,
        # '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002503C91B470>, 
        # '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
        # '__file__': 'D:/study/day 10/00 代码草稿.py', '__cached__': None, 'func': <function func at 0x000002503C813EA0>}
    07 关键字:global nonlocal

    global:

      1,声明一个全局变量。

      2,局部作用域不能对全局作用域的变量进行修改,只能引用,通过设置global可以修改(限于字符串,数字)

    def func():
        global a    # 声明 a=3 为全局变量,之后可以在函数为打印a
        a = 3
    func()
    print(a)
    
    
    count = 1
    def search():
        global count   #  声明后,可以对全局变量进行修改
        count = 2
    search()
    print(count)

    对可变数据类型(list,dict,set)可以直接引用不用通过global。

    li = [1,2,3]
    dic = {'a':'b'}
    
    def change():
        li.append('a')
        dic['q'] = 'g'
        print(dic)
        print(li)
    change()
    print(li)
    print(dic)
    nonlocal:
    1、不能操控全局变量
    2、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
    def wrapper():
        name = 'alex'
        def inner():
            nonlocal name
            name += 'b'
            # print(name)
            def inner1():
                name = 'echo'
        print('1', name)      # alex
        inner()
        print('2', name)      # alexb
        print('3', name)      # alexb   (修改了inner1里面name变量的值)
    wrapper()


























  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/echo2019/p/10208944.html
Copyright © 2011-2022 走看看