初识函数

1.参数

  1. 函数名加括号是函数的调用,只有print(函数名())才会打印出来函数的返回值.例如:print(func())

  2. 函数的返回值只有print才能呈现出来,而不是函数的调用

  3. 动态参数在函数定义阶段是聚合,函数体中是打散

  4. 动态传参的时候,参数的传递顺序:位置参数,动态位置参数(*args),关键字参数,动态关键字参数(**kwargs)

  5. 动态位置参数的返回值是元组,动态关键字参数的返回值是字典

    def func(a,*args,d='不会',**kwargs):
        print(a,args,d,kwargs)
    
    func('大','作','业',d='一点写不出来','我'='还写吗?','你'='写完讲讲')
    
    dic = {'k1':'v1','k2':'v2'}
    def func(**kwargs):
        print(kwargs)	# 字典本身
        print(*kwargs)	# 键
        # print(**kwargs)	# 报错 : k1是此函数的无效关键字参数
    
    func(**dic)	# **dic:把字典打散成一个个的键值对.比如:'k1'='v1','k2'='v2'进行传参
    
    a = 1
    def func():
        a += 1     # 报错,局部变量不能修改全局变量
        print(a)
    func()
    # 如果把a+=1删掉,是可以print出来的:找a:局部没有,就会去全局找
    #               如果函数是嵌套的,内层没有,去外层找,外层没有就去全局找...
    # 如果上面这个改成下面这个,就会没问题,
    # 局部变量不能修改全局变量,但是列表是可变数据类型,
    # 虽然列表内的元素会改变,但是lst的地址没变
    # 上面这个想要运行:a+=1的上面加上:global a
    lst=[1,23]
    def wrapper():
        lst[0]=2
        print(lst)
        print(globals()) # 全局作用域:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000269941AC320>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/args.py', '__cached__': None, 'lst': [2, 23], 'wrapper': <function wrapper at 0x0000026994281D90>}
    {}
        print(locals()) # 局部作用域:{}
    
    wrapper()