十、函数进阶

形参中的动态参数

def func(a,b,*args,c='f',**kwargs):
    print(a)
    print(b)
    print(args)
    print(c)
    print(kwargs)
func(9,2,3,4,45,6,c='3',d=45,f='pp')
#9
 2
 (3, 4, 45, 6)
 3
 {'d': 45, 'f': 'pp'}

 

args  是把实参中多余的的位置参数放到一个元祖中     

kwargs  是把实参中多余的关键字参数放到一个字典中

最终的形参的排列顺序:位置参数,*args,默认参数,**kwargs

*   在函数的调用执行时,输入的参数为可迭代对象可以将元素意义添加到args

**  再函数调用执行时,可以将字典的所有的键值对放到一个字典中给kwargs(这种方式的字典的键必须是字符串)

 

def func(*args,**kwarg):
    print(args)
    print(kwarg)
dic1 = {2:'dsd','4':"dfaf"}
dic2 = {'3':'rerre','5':'vxcvxvcx'}
func(*[2,3,4,4,5],*dic1,**dic2)
#(2, 3, 4, 4, 5, 2, '4')
   {'3': 'rerre', '5': 'vxcvxvcx'}

 

命名空间一共分为三种:

  全局名称空间

  局部名称空间

  内置名称空间

*内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

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

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

取值顺序:不能逆向取值

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

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

综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围生效

globals()   locals()  的用法

a = 2
b = 3
def func():
    c = 4
    d = 5
    print(globals())
    print(locals())
func()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020251399588>, '__spec__': None, 
'__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'H:/pycharm文件/day10/课堂练习.py', '__cached__': None, 'a': 2, 'b': 3, 'func': <function func at 0x000002024F501E18>} {'d': 5, 'c': 4} 将变量和对应的值用字典表示出来

  

global  在局部变量中声明一个全局变量  并且改变全局变量

nonlocal   在函数嵌套中通过在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。


 

 

上一篇:Kafka源码分析之MemoryRecords


下一篇:三、数据类型初识