1. python 函数的参数传递
    1.传递方式:
        位置传参
        序列传参
        关键字传参
        字典关键字传参
    2. 位置传参:
        实际调用参数(实参)的对应关系与形式参数(形参)的对应关系
        是按位置来一次对应的
        示意:

def fx(a,b,c):
    pass
fx(1, 2, 3)

    3.序列传参:


        序列传参是批在函数调用过程中,用*将序列拆解后按位置进行


        传递的传参方式,实参和形参通过序列传递和匹配


        示例1:


def fx(a, b, c):
    pass
s1 = [11, 22, 33]  #列表
fx(*s1)  # 将s1序列拆解后按位置传入fx中

        示例2:

def fx(a, b, c):
    print('a = ', a)
    print("b = ", b)
    print('c = ', c)
s1 = [11, 22, 33]
# fx(s1[0],s1[1],s1[2]) # 用索引传参
fx(*s1) # 序列传参,*代表将s1 拆解后再依次传入
fx(*"ABC")  # A  B  C
fx(*(101,102,103))

    4.关键字传参


        是指传参时,按着形参的名称给形参赋值


        实参和形参按名称进行匹配


        示例:


def fx(a, b, c):
    pass
fx(b=22, c=33, a=11) # 11--->a, 22---->b, 33---->c

    注:


            实参和形参按形参名进行匹配,可以不按位置进行匹配


# 此示例示关键字列传参
def fx(a, b, c):
    print('a = ', a)
    print("b = ", b)
    print('c = ', c)
fx(b=22, c=33, a=11)

    5.字典关键字传参:


        实参为字典,用**拆解字典后再进行关键字传参


        示例:


def fx(a, b ,c):
    pass
d = {'c':33, 'b': 22, 'a':11}
fx(**d) # 拆解字典内依次按关键字传参

      说明:


            字典的键名和形参名必须一致


            字典的键名必须为字符串


            字典的键名必须在形参中存在


# 此示例示字典关键字列传参
def fx(a, b, c):
    print('a = ', a)
    print("b = ", b)
    print('c = ', c)
d = {'c':33, 'b': 22, 'a':11}
fx(**d)

    6.综合传参:


        函数的传参方式子能确定形参能唯一匹配到相应实参的情况下


        可以任意组合


        注:


            通常位置传参和序列传参先传递,其次关键字传参和字典关键字传参


        示例:


def fx(a,b,c,e,f):
    pass
fx(10, *[20,30],e=50,**{'d':40,'f':60})
# 以下是错误的做饭
fx(e=50,**{'d':40,'f':60},10, *[20,30])

2.函数的形参


    1.函数的缺省参数


        语法:


            def 函数名(形参名1=默认实参1,形参名2=默认实参2,....):


                  语句


        示例:


def info(name,age=1,address="不详"):
      print("我叫",name, '我今年:',age, '岁,家庭住址:',address)
info("张飞",30,"中原")
info("Tarena",10)
info('赵云')
# 我叫 张飞 我今年: 30 岁,家庭住址: 中原
# 我叫 Tarena 我今年: 10 岁,家庭住址: 不详
# 我叫 赵云 我今年: 1 岁,家庭住址: 不详

        说明:


            缺省参数必须自右至左(倒序)依次存在


            缺省参数可以有0个,1个,多个,甚至全部都有缺省参数


            缺省参数的绑定对象存在于函数内,同函数的生命周期一致


        示例:


def fn(a,lst=[]):
    lst.append(a)
    print(lst)
L = [1,2,3,4]
fn(5,L) # [1, 2, 3, 4, 5]
fn(6,L) # [1, 2, 3, 4, 5,6]

fn(1.1)  # [1.1]
fn(2.2)  # [1.1, 2.2]
fn(3.3)  # [1.1, 2.2, 3.3]
fn(4.4)  # [1.1, 2.2, 3.3, 4.4]

    2.函数的形参定义方式:


        1.位置形参


        2.星号元组形参


        3.命名关键字形参


        4.双星号字典形参


    3.位置形参:


        def 函数名(形参名1,形参名2...)


            语句块


    4.星号元组形参:


        语法:


            def 函数名(*元组形参名):


                语句块


        作用:


            收集位置多余的位置传参


        示例:


# 此示例示意星号元组形参
def func(*args):
      print("实参个数是:",len(args))
      print("args的值是:",args)
func(1,2,3)
func("ABCD",3.14,100,True,None)

    5.命名关键字形参


        语法:


            def 函数名(*,命名关键字形参):


                语句块


            或


            def 函数名(*arge,命名关键字形参):


                语句块


        作用:


            所有的命名关键字形参都是强调采用者采用关键字传参或字典关键字传


            参的方式调用


        示例1:


# 此示例示意命名关键字形参
def myfun(a,*,k):
    print("a =", a)
    print("k =", k)
myfun(100,k=200) # k强调使用关键字传参
myfun(10,**{'k':20})

    示例2:


def myfun2(b, *args, c, d):
    print("b=",b)
    print("args=",args)
    print("c=",c)
    print("d=",d)
myfun2(100,200,300,400,d=600,c=500)

    6.双星号字典形参:


        语法:


            def 函数名(**字典形参名):


                语句块


        作用:


            收集多余的关键字传参


        注:


            字典形参名通常叫kwargs


        示例:


# 此示例示意双星号字典形参的用法:
def func(**kwargs):
    print("关键字传参的个数是:",len(kwargs))
    print("kwargs=",kwargs)
func(name='tarena',age=15)
func(a=1, b='BBBB',c=[2,3,4],d=True)

3.函数参数说明:


    位置形参,缺省参数,星号元组形参,命名关键字形参,双星号字典形参,


    可以混合使用



    函数参数自左至由的顺序为:


        1.位置形参


        2.星号元组形参


        3.命名关键字形参


        4.双星号字典形参


    示例:


def fn(a,b,*args,c,**kwargs):
    pass
fn(100,200,300,400,*"AB",**{'d':"D"},c=100)

4.可以接受任意位置传参和关键字传参的函数:


def fn(*args,**kwargs):
 	print(args,kwargs)
fn(100,200,300,400,a=100,b=200,**{'c':3,'d':5})
# (100, 200, 300, 400) {'c': 3, 'b': 200, 'd': 5, 'a': 100}