函数参数顺序
位置参数 > *args > 默认值参数 > **kwargs
动态参数的另⼀种传参⽅式 :
在实参位置上给⼀个序列,列表,可迭代对象前⾯加个*表⽰把这个序列按顺序打散
l = [11,22,33,44] s = "臣妾做不到" def fun(*args): print(args) fun(*l) #fun打印结果为: (11, 22, 33, 44) fun(*s) #fun打印结果为: ('臣', '妾', '做', '不', '到')
在形参的位置上的* 表⽰把接收到的参数组合成⼀个元组
如果是⼀个字典, 那么也可以打散.
不过需要⽤两个*
def fun(**kwargs): print(kwargs) dic = {'a':1, 'b':2} fun(**dic) # {'a': 1, 'b': 2}
函数的注释:
def chi(food, drink): """ 这⾥是函数的注释, 先写⼀下当前这个函数是⼲什么的, ⽐如我这个函数就是⼀个吃 :param :param food: 参数food是什么意思 :param :param drink: 参数drink是什么意思 :return :return: 返回的是什么东东 """ print(food, drink) return "very good"
命名空间
在python解释器开始执⾏之后, 就会在内存中开辟⼀个空间, 每当遇到⼀个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表⽰这个函数存在了, ⾄于函数内部的变量和逻辑, 解释器是不关⼼的. 也就是说⼀开始
的时候函数只是加载进来, 仅此⽽已, 只有当函数被调⽤和访问的时候, 解释器才会根据函数内部声明的变量来进⾏开辟变量的内部空间. 随着函数执⾏完毕, 这些函数内部变量占⽤的空间也会随着函数执⾏完毕⽽被清空
命名空间分类:
1. 全局命名空间--> 我们直接在py⽂件中, 函数外声明的变量都属于全局命名空间
2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
加载顺序:
1. 内置命名空间
2. 全局命名空间
3. 局部命名空间(函数被执⾏的时候)
取值顺序:
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间
我们可以通过globals()函数来查看全局作⽤域中的内容, 也可以通过locals()来查看局部作
⽤域中的变量和函数信息
print(globals()) #{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00466590>, '__spec__': None,
'__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/ZYP/PycharmProjects/python_ui/test_tools/test.py', '__cached__': None} def func(): a = 10 print(locals()) #{'a': 10} func()
对于可变数据类型可以直接进⾏访问. 但是不能改地址. 说⽩了. 不能赋值
l = [11,22,33,44] def fun(): l.append(55) print(l) # [11, 22, 33, 44, 55] fun() print(l) # [11, 22, 33, 44, 55]