函数的参数

一、函数的参数分为形参与实参
(1) 形参: 在函数定义阶段,括号内定义的参数(变量名),称之为形式参数,简称形参
def func(x,y):
    print(x,y)
(2) 实参: 在函数调用阶段,括号内传入的值(变量值),称之为实际参数,简称实参
func(1,2)

二、详细介绍形参与实参
2.1 位置参数
(1) 位置形参:在函数定义阶段,按照从左到右的顺序依次定义的形参
      特点: 必须被传值
def func(x,y):
    print(x,y)

(2) 位置实参:在函数调用阶段,按照从左到右的顺序依次传入的值
      特点:按照位置与形参一一对应
func(1,2)
func(1,2,3)
func(1,)

func(1,2,3,4,5,)
 
2.2关键字实参: 
在函数调用阶段,按照key=value的形式传值
特点: 可以打破传值的顺序,但仍能指名道姓地为形参赋值
func(y=2,x=1)

      注意:可以混用位置实参与关键字实参,但是
             (1)位置实参必须放在前面
             (2)不能为同一个形参重复赋值
func(111,y=2)
func(y=2,111)
func(111,x=222,y=333)

2.3 默认形参: 
在函数定义阶段,就已经为形参赋值,该形参称之为默认形参
特点: 调用时可以不用为默认形参传值
def func(x,y=222):
    print(x,y)

func(111)
func(111,333)

      注意:可以混用位置形参与默认形参,但是
          (1) 位置形参必须放在前面
          (2) 默认形参的值只在函数定义阶段赋值一次,拿到的一个内存地址
              为函数的每次调用都是独立,默认形参的值通常应该是不可变
def func(y=222,x):
    print(x,y)

m = 222
m = []

def func(x,y=m):
    print(x)
    print(y)

m = 333
m.append(44444444444)
func(111)


def func(name,hobby,hobbies=None):
    # name="egon"
    # hobby="music"
    if hobbies is None:
        hobbies = []
    hobbies.append(hobby)
    print('%s 的爱好是 %s' %(name,hobbies))

func('egon','music')

func('lili','read')

func('jack','movie')
 
#案例;

def register(name,age,sex='male'):
    print(name,age,sex)

register("sean",18)
register("jack",19)
register("tom",20)
register("lili",21,'female')
 
三、 *与**在形参与实参的应用
可变长的实参指的是在调用函数时括号内传入的实参值的个数不固定
而实参无非两种格式:位置实参关键字实参
对应着必须有专门的形参来接收溢出位置实参与关键字实参

3.1 *与**在形参中的应用
(1) *在形参中: *会把溢出的位置实参存成元组的形式,然后赋值给其后的形参名
def func(x,*args): # x=1,args=(2,3)
    print(x,args)

func(1,2,3)


(2) **在形参中: **会把溢出的关键字实参存成字典的形式,然后赋值给其后的形参名
def func(x,**kwargs): # x=1,kwargs={"c":3,"a":1,"b":2}
    print(x,kwargs)

func(x=1,a=1,b=2,c=3)

3.2 *与**在实参中的应用
def func(x,y,z):
    print(x,y,z)

(1) *在实参中:*会将实参值打散成位置实参
func(*[1,2,3])  # func(1,2,3)

(2) **在实参中:**会将字典格式的实参值打算成关键字实参
func(**{"a":1,'b':2,'c':3})  # func(a=1,b=2,c=3)
func(**{"x":1,'y':2,'z':3})  # func(x=1,z=3,y=2)

func(*"hello")  #
func(*{"aaa":1,'bbb':2,'ccc':3})  # func('aaa','bbb','ccc')


3.3 可以混用: **必须在*的后面
def wrapper(*args,**kwargs):  # args=(1,2,3,4,5)  kwargs={"a":1,'b':2,'c':3}
    print(args)
    print(kwargs)

wrapper(1,2,3,4,5,a=1,b=2,c=3)


def wrapper(*args,**kwargs):  # args=("h","e")  kwargs={"a":1,'b':2,'m':333,'n':4444}
    print(args)
    print(kwargs)

wrapper(*'he',a=1,b=2,**{'m':333,'n':4444})  # wrapper("h","e",a=1,b=2,n=4444,m=333)



非常重要的一种格式
def index(x,y):
    print('index===>',x,y)

def wrapper(*args,**kwargs):  # args=(1,2,3)  kwargs={"a":1,'b':2,'c':3}
    index(*args,**kwargs)  # index(*(1,2,3).**{"a":1,'b':2,'c':3})
                          #  index(1,2,3,a=1,b=2,c=3)

    # index(1,y=2)

wrapper(1,y=2)
 
四、可变长参数
def index(x,y,z):
    print(x,y,z)

def wrapper(*args,**kwargs):  # args=(1,2,3,4,5)  kwargs={"a":1,"b":2}
    index(*args,**kwargs)  # index(*(1,2,3,4,5),**{"a":1,"b":2})
                           # index(1,2,3,4,5,a=1,b=2)

    # index(x=1,y=2,z=3)
wrapper(x=1,y=2,z=3)

  

  

原文地址:https://www.cnblogs.com/datatool/p/13405167.html