函数第二天

形参:在定义函数时的参数
实参:在调用函数时的参数
形参与实参的关系:

  1. 在调用时实参会绑定形参
  2. 绑定关系只能在函数体内使用
  3. 实参与形参的绑定关系只有调用时生效,而调用结束后则解除绑定关系

实参传值:

复制代码
# 形式一:
func(1, 2)

# 形式二:
a = 1
b = 2
func(a, b)

# 形式三:
func(int('1'), 2)
复制代码

形参与实参的使用:

位置参数:

  位置形参:在函数定义时,按照从左到右的顺序定义

    特点:必须被传值,形参有几个值,就要传入几个值

  位置实参:调用时按照从左到右的顺序依次传值

    特点:按照形参顺序对应传值

def func(x,y):
    print(x,y)
func(1,2)

关键字参数:

  关键字形参:在函数调用时按照 keys 与 value 的形式传值

    特点:根据“变量名”传值且可以不按照顺序传值

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

func(y=2,x=1)

位置参数与关键字参数的混合使用:

  1,位置实参必须放在关键字实参前

func(1,y=2)

  2,不能同时给同一个形参传多个值

func(1,y=2,x=3) #错误的演示

默认参数:在定义函数时就已经被赋值的形参

    特点:定义时被赋值了调用时就可以不用赋值,当然也可以在重新赋值

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


func(x=1,y=44444)#y在形参定义时已经赋值了,但是调用函数时也可以在重新赋值
复制代码
def register(name,age,gender='男'):
    print(name,age,gender)

register('三炮',18)
register('二炮',19)
register('大炮',19)
register('没炮',19,'女')
复制代码

位置参数与默认参数的混合使用:

  1,位置形参必须在默认形参的左边

def func(y=2,x):
    pass

  2,默认参数的值是在函数定义赋值的,准确的说是赋予了内存地址

m=2
def func(x,y=m): # y=>2的内存地址
    print(x,y
m=3333333333
func(1)

  3,默认值可以指定任意类型,但是不推荐使用可变类型,因为这样会使整个函数的逻辑关系变的混乱。

      函数理想的状态:函数的调用只跟函数本身有关系,不被外界代码影响。

复制代码
def func(x,y,z,l=None):
    if l is None:
        l=[]
    l.append(x)
    l.append(y)
    l.append(z)
    print(l)

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

new_l=[111,222]
func(1,2,3,new_l)
复制代码
可变长度的参数(*与**的用法)
  可变长度指的是在调用函数时,传入的值(实参)的个数不固定
  而实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收

可变长度的位置参数
I:*形参名:用来接收溢出的位置实参,溢出的位置实参会被*保存成元组的格式然后赋值紧跟其后的形参名
*后跟的可以是任意名字,但是约定俗成应该是args
复制代码
def my_sum(*args):
    res=0
    for item in args:
        res+=item
    return res

res=my_sum(1,2,3,4,)
print(res)
复制代码
 II: *可以用在实参中,实参中带*,先*后的值打散成位置实参
复制代码
def func(x,y,z):
    print(x,y,z)

# func(*[11,22,33]) # func(11,22,33)
# func(*[11,22]) # func(11,22)

l=[11,22,33]
func(*l)
复制代码
III: 形参与实参中都带*
def func(x,y,*args): # args=(3,4,5,6)
    print(x,y,args)

func(1,2,[3,4,5,6])
func(1,2,*[3,4,5,6]) # func(1,2,3,4,5,6)
func(*'hello') # func('h','e','l','l','o')
可变长度的关键字参数
I:**形参名:用来接收溢出的关键字实参,**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参名
**后跟的可以是任意名字,但是约定俗成应该是kwargs

def func(x,y,**kwargs):
    print(x,y,kwargs)

func(1,y=2,a=1,b=2,c=3)
II: **可以用在实参中(**后跟的只能是字典),实参中带**,先**后的值打散成关键字实参
def func(x,y,z):
    print(x,y,z)

func(*{'x':1,'y':2,'z':3}) # func('x','y','z')
func(**{'x':1,'y':2,'z':3}) # func(x=1,y=2,z=3)
III: 形参与实参中都带**
def func(x, y, **kwargs):
    print(x, y, kwargs)


func(y=222, x=111, a=333, b=444)
func(**{'y': 222, 'x': 111, 'a': 333, 'b': 4444})
混用*与**:*args必须在**kwargs之前
复制代码

def index(x, y, z):
print('index=>>> ', x, y, z)


def wrapper(*args, **kwargs): # args=(1,) kwargs={'z':3,'y':2}
index(*args, **kwargs)
# index(*(1,),**{'z':3,'y':2})
# index(1,z=3,y=2)


wrapper(1, z=3, y=2)
 
复制代码
posted @ 2020-03-18 20:50  迎着阳光  阅读(121)  评论(0编辑  收藏  举报