函数
# 函数定义时,*代表聚合。 他将所有的位置参数聚合成一个元组,赋值给了 args。
# **kwargs: ** 将所有的关键字参数聚合到一个字典中,将这个字典赋值给了kwargs(kwargs可更改,但是最好用kwargs)
# 形参的顺序:位置参数,*args,(默认参数,仅限关键字参数),**kwargs
# 默认参数和仅限关键字参数位置可互换
# hobby是仅限关键字参数
def func(name, age, *args, hobby, sex='男', **kwargs):
print(name)
print(age)
print(args)
print(hobby)
print(sex)
print(kwargs)
# 实参顺序:位置参数, 关键字参数。必须和形参对应上
print(func('路飞', 18, '索隆', '山治', sex='女', hobby='onepiece', 乌索普='狙击手', 娜美='航海士'))
# 参数顺序,仅限关键字参数必须有值
def foo(a, b, *args, c, sex=None, **kwargs):
print(a, b) # 12
print(c) # 12
print(sex) # 女
print(args) # 3,4
print(kwargs) # {'name': '太白'}
foo(*[1, 2, 3, 4], **{'name':'太白', 'c': 12, 'sex': '女'})
# 打散 (* 函数调用时)位置参数的实参(可迭代类型)前面加上,相当于将这些实参给拆解成一个一个的组成元素当成位置参数
# ,然后传给args,这时候这个好像取到的是打散的作用。所以在函数的执行时:,*/**起到的是打散的作用。
s1 = 'one piece'
l1 = [1, 2, 3, 4]
tu1 = ('路飞', '娜美', '罗宾',)
def func(*args):
print(args) # ('alex', [1, 2, 3, 4], ('武sir', '太白', '女神'))
func(s1, l1, tu1) # ('one piece', [1, 2, 3, 4], ('路飞', '娜美', '罗宾'))
func(*s1, *l1, *tu1) # ('o', 'n', 'e', ' ', 'p', 'i', 'e', 'c', 'e', 1, 2, 3, 4, '路飞', '娜美', '罗宾')
dic1 = {'name': '太白', 'age': 18}
dic2 = {'hobby': '喝茶', 'sex': '男'}
def func(**kwargs):
print(kwargs)
func(**dic1, **dic2) # {'name': '太白', 'age': 18, 'hobby': '喝茶', 'sex': '男'}
# 名称空间
# 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
# 局部命名空间--> 在函数中声明的变量会放在局部命名空间
# 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
# 加载顺序 内置命名空间-->全局命名空间--> 局部命名空间
# 取值顺序 就进原则 单项不可逆的: 局部命名空间--> 全局命名空间--> 内置命名空间 legb
# 全局作用域: 全局命名空间 + 内置命名空间
# 局部作⽤域: 局部命名空间
# 在全局作用域下打印,则他们获取的都是全局作用域的所有的内容。
a = 2
b = 3
print(globals())
print(locals())
'''
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001806E50C0B8>,
'__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'__file__': 'D:/lnh.python/py project/teaching_show/day09~day15/function.py',
'__cached__': None, 'a': 2, 'b': 3}
'''
# 在局部作用域中打印。
a = 2
b = 3
def foo():
c = 3
print(globals()) # 和上面一样,还是全局作用域的内容
print(locals()) # 只打印 {'c': 3}
foo()