Python 函数基础2 实参与形参

今日内容:

一、函数参数

  • 1.形参与实参定义
  • 2.实参分类
  • 3.形参分类
  • 4.可变参数的整体使用

一、形参与实参定义

def fn(参数们):
    pass
1.1 形参
定义函数,在括号内声明的变量名,用来接外面传来的值
1.2 实参
调用函数,在括号内传入的实际值,值可以为常量,变量,表达式或三者的组合
注:
    1.形参随着函数的调用而产生,随函数调用结束而销毁(有特例)
    2.在函数的外部不能直接使用函数的形参,原因:函数调用结束后,形参会被销毁
    3.外部产生了的变量,内部可以使用
    4.在函数调用()中出现的参数(外界实际存在的值):实参
    5.调用函数时,实参可以有常量,变量,表达式或三种的组合

二、实参分类

2.1 位置参数
不用明确形参名的传参方式,一定按照位置给形参(必须按照顺序)

def fn1(a, b, c):
    print(a, b, c)

# 位置实参:必须按照顺序
fn1(10, 20, 30)
fn1(30, 20, 10)
2.2 关键字参数
必须明确形参的名字和为形参传值,可以不按照位置(可以不按顺序传递,形参按名字取值)

def fn1(a, b, c):
    print(a, b, c)
# 关键字传参:可以不按照顺序传递,形参按名字取值
fn1(a=10,b=20,c=30)
fn1(c=30,b=20,a=10)
2.3 二者混用
1.关键字实参必须出现在位置实参之后
2.多个位置实参按位置传参
3.关键字形参从关键字实参处拿值,可以不用按照指定顺序

# 两者混用:关键字实参必须出现在位置实参之后
def fn2(a, b, c, d, e, f):
    print(a, b, c, d, e, f)

fn2(10, 20, 30, e=100, f=500, d=200)

ps: 实参的作用:为形参传递值

三、形参分类

3.1 位置形参:
可以由位置实参或关键字实参来传值

# 位置形参
def fn3(a,b,c):
    print(a,b,c)
fn3(1,2,3)
3.2 默认形参:
具有默认值,用 '=' 进行赋值,可以是 位置实参与关键字实参,还可以不传值(采用默认值)

# 默认形参具有默认值,用 = 进行赋值
def fn4(a=10,b=20):
    print(a,b)

# 默认形参可以由 位置实参 与 关键字实参 来传值,还可以不用传值
fn4(20,30)
fn4(a=200,b=300)
fn4(100)
fn4(b = 100)
3.3 可变长位置形参:
只能由位置实参来传值

# 可变长形参只能由 位置实参 来传值
def fn6(a,b,*args):
    print(a,b)
    print(args)
fn6(1,20,30,40,50)
3.4 无初值关键字形参:
必须由关键字实参来传值,出现在 * 后的都是关键字形参
def fn7(a,b,*,c,d):
    print(a,b)
    print(c,d)
fn7(1,20,c=30,d=40)
3.5 有初值关键字形参:
可以由关键字实参来传值,也可以不传值

def fn8(a,b,*,c=10,d=20):
    print(a,b)
    print(c,d)
fn8(1,20)  # 有初值关键字形参,不传参数,则输出默认值
3.6 可变长关键字形参:
与无初值关键字形参类似,同样需要传值

def fn(*, a, b=20, c, **kwargs):
    print(a, b)
    print(kwargs)
fn(d=40, e=50, a=10, c=30)  # 以关键字形式传入实参,输出 字典类型
注:
    1.各种形参出现的先后 :
    位置形参 - 默认形参 - 可变长位置形参 - 无 | 有初值关键字形参 - 可变长关键字参数
    
    2.可变长形参会以元组形式接收位置形参与默认形参未接收完的所有传入的位置实参
    
    3.可变长关键字形参:
    用来接收被没有被关键字形参接收玩的关键字形参,也只能由关键字实参来传值,用字典来存放数据
    
    
    ps:可变长形参只能接收位置实参的值,位置实参还必须在关键字实参前,导致默认形参只能由位置实参来传值

    重点:可变长位置形参整体赋值

四、可变参数的整体使用

# 可变长位置形参整体赋值
def fn7(*args):
    print(args)

fn7(1,2,3,4,5,6)


# 单列集合(保护字符串)将该变量进行 打散 传值
# 打散
def fn8(*args):
    print(args)
ls = [1,2,3,4,5]
fn8(ls)  # ([1, 2, 3, 4, 5],)
fn8(*ls) 
# 将ls 打散为1,2,3,4,5 再传值 => (1,2,3,4,5,)
# 可以理解为,将数组的所有值全部赋值给形参


# ---关键字形参------------

# 整体赋值
dic = {'name': 'Owen', 'age': 18}
def fn1(**kwargs):
    print(kwargs)
fn1(**dic)


dd = {
    'k1': [1, 2, 3, 4, 5],
    'k2': {"name":"Bob"}
}
fn1(**dd)

def fn2(*args):
    print(args)
ll = [1, [1, 2], {"name":"Bob"}]
fn2(*ll)  # (1, [1, 2], {"name":"Bob"})
posted @ 2019-03-29 21:38  xt12321  阅读(416)  评论(0编辑  收藏  举报