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()


























  • 相关阅读:
    JBoss+Ant实现EJB无状态会话bean实例
    Nginx简单介绍
    SVN版本号管理工具使用中常见的代码提交冲突问题的解决方法
    深入分析Java中的I/O类的特征及适用场合
    ZOJ 3689 Digging(贪心+dp)
    uva 10641 (来当雷锋的这回....)
    Java编程中“为了性能”尽量要做到的一些地方
    wikioi 1306 机智Trie树
    PE文件结构(三) 输入表
    初始化的数值(int、double等)(一)
  • 原文地址:https://www.cnblogs.com/echo2019/p/10208944.html
Copyright © 2011-2022 走看看