实参和形参

一、实参和形参

***** 在函数定义()中出现的参数:形参
***** 形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁
def fn(a, b, c):
# a,b,c必须要从外界获取值,采用意义
print(a)
print(b)
print(c)
# 外部提前产生了的变量,内部可以使用
print(x)
print(y)
print(z)

# x,y,z是实际存在的值
x = 10
y = 20
z = 30
# ***** 在函数调用()中出现的参数(外界实际存在的值):实参
# fn(10, 20, 30)
# fn(x, y, z)
fn(x + 10, y * 2, z / 5)
# ***** 调用函数是,实参可以由 常量、变量、表达式或三种的组合


# 在函数的外部不能直接使用函数的形参,原因:函数调用完毕后,形参被销毁了
# print(a)
# print(b)
# print(c)

二、实参的分类

# 位置实参: 按照位置的顺序,从左到右为形参传递值
# 位置实参:必须按照顺序
fn1(10, 20, 30)
fn1(30, 20, 10)


# 关键字实参

# 实参作用:为形参传递值

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


# 关键字实参:可以不按顺序传递, 形参按名字取值
fn1(a=10, b=20, c=30)
fn1(c=30, b=20, a=10)

# 注:两者混用:
1、关键字实参必须出现在位置实参之后
2、多个位置实参还是按照位置传参
3、关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定的顺序
# fn1(10, c=20, a=30) # 10按位置传参给a,a=30给a传参,c可以拿到20,但b没人传参
# TypeError:fn1() got multiple values for argument 'a' a被多次传值

# 合法传参 *****
fn1(10, c=30, b=20)
fn1(10, b=30, c=20)


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)

三、形参的分类

位置形参的范畴
  • 位置形参

# positional argument
def fn(a, b, c):
   print(a, b, c)
   
# 位置形参可以由 位置实参 与 关键字实参 来传值
fn(10, 20, 30)
fn(a=10, b=20, c=30)
  • 默认形参

def fn(a=10,b=20):
   print(a, b)
   
# 默认形参可以由 位置实参 与 关键字实参 来传值,还可以不用传值(采用自身默认值)
fn()
fn(20, 30)
fn(a=200, b=300)
fn(100)  # 就给a传
fn(b=100)  # 就给b传


# 混用
# 位置形参与默认形参同时存在,默认形参必须在后
def fn1(a,b,c=10,d=20):
   print(a, b, c, d)

# 位置形参必须传值,默认形参分情况传值
fn1(100, 200, d=1000)

  • 可变长形参

# 可变长形参会以 元组 形式接受 位置形参与默认形参未接受完的 所有传入的位置实参,用索引来取第几个
# 可变长形参只能由 位置实参 来传值 *****
def fn(a, b=10, *args):
   print(a, b)
   print(args)
   
   
# 小细节:可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,
#       导致默认形参只能由位置实参来传值
fn(1, 20, 100, 200) # 1给a 20给b,不能用b=20传 100,200给args
   
关键字形参范畴
# 前提:出现在 * 之后的形参
def fn(a, b=10, *, c, d=20, e)
pass
# c,d,e都是出现在*之后,都是关键字形参,由于必须由 关键字实参 来传值,没有顺序的强行要求


# 可变长关键字形参:用来接收没有被关键字形参接收完的关键字形参,也只能由关键字实参来传值
# 用字典来存放数据
def fn(**kwargs):
   print(kwargs)
fn(a=10,b=20)  # {'a': 10, 'b': 20}

dic = {'x': 100, 'y': 200}
fn(**dic)  # {'x': 100, 'y': 200}

四、参数总结

def fn(a, b, c=10, *args, d, e=20, f, **kwargs):
   pass
# 位置形参:a、b
# 默认形参:c
# 可变长位置形参:args
# 无初值关键字形参:d、f
# 有初值关键字形参:e
# 可变长关键字参数:kwargs


# 1.位置形参与默认形参: 能用 位置实参 关键字实参 传值
# 2.可变长位置形参:只能 位置实参 传值
# 3.所以关键字形参:只能 关键字实参 传值

 

 

原文地址:https://www.cnblogs.com/yangyinyin/p/10632723.html