day11 函数参数详解

上节回顾

1.什么是函数

实现某一功能的代码集合体

2.为什么需要函数

代码结构不清晰,可读性差

冗余度高

扩展性差,可维护性差

3.定义函数

def 函数名(参数):

    '''

    文档注释

    '''

    代码块 

    return 值

函数的三种分类

1.有参函数:执行过程需要外部数据参与运算

2.无参函数:执行过程中不需要外部数据参数运算

3.空函数

可选:return 参数 注释

4.调用函数

函数名加括号

print(函数名()) #打印返回值

print(函数名) #打印函数的内存地址

函数名()*10 #在表达式中调用函数

5.函数的返回值

可以一次性return多个值 得到元祖

什么用时候返回值:当调用者需要拿到一个明确的结束

不写return 或者 return 返回一个None

函数执行过程中 一旦遇到return 立马返回 后续的代码都不执行

定义阶段:

1.申请内存空间,将函数体的代码存储到内存中

2.将函数的内存地址,与函数名进行绑定

调用阶段

1.通过函数名找到函数的内存地址

2.加括号触发函数体的执行

 

今日内容

01函数参数详解

    1.形参与实参

    形参即形式参数,就是在定义函数时括号中指定的参数

    实参即实际参数,就是在调用函数的时候传入的参数

    在调用函数时就会自动把形参(变量名)和实参(值)进行绑定,在函数调用结束之后绑定关系就解除

    2.位置参数(用的最多)

    根据调用阶段 参数分为两类 形参和实参

    所以对应的位置参数也有两种:

    位置形参:

    def func(a,b,c): #abc都是位置参数

        print(a)

    位置实参:

    func(1,2,3) # 1,2,3 都是位置参数

    位置,其实指的是顺序,从左往右来定义的参数就是位置参数

 

    需要注意的是:

    只要是被定义了的位置形参都必须被传值

    位置形参的数量与位置实参的数量必须一致,不能多传也不能少传

    实参会按照传入的位置依次赋值给形参

    3.关键字参数

    关键字实参:在调用函数时指名道姓的为形参赋值就称之为关键字参数

    优点:

    可以打破传入参数的顺序 可以不与形参顺序相同

    需要被注意的:

    1.不管以什么样的方式传值,每一个形参都必须被传值

    2.关键字必须在位置参数后面***

    3.不能为用一个参数传多个值

    4.使用关键字传参时,实参的名字必须与形参的名字匹配

 

    到底是位置参数还是关键字参数 由实参决定

    def func(a,b,c)

        print(a)

    func(a=1,c=3,b=2)  #可以打破位置参数的顺序 限制

    4.默认参数

    在定义时,就已经为形参制定了一个值,那这个形参就称之为默认形参

    特点:

    在调用时可以不用为默认形参传值,使用时就是默认值

    当然也可以传值,这样的话内部使用的就是你传入的值

    场景:

    当函数中的某一形参经常出现重复的值,就可以将其定义成默认形态,就可以简化调用代码

    注意:

    1.默认形参必须放在非默认形参后面

    2.默认形参的值在定义时就已经固定了

    3.不应该就默认形参的默认值设置为一个可变类型,会导致每次函数调用共用同一个默认参数.我们应该讲函数设计为独立的功能,每次调用互不干扰

    只能是int float str tuple

    def register(name,age,sale='woman')

        print(name,age,sale)

    register('egon',19)

    register('egons',19,'man')

    5.可变参数(重难点)

    可以传任意个数的实参

    传入实参是为了给形参来使用,那就意味着必须让形参也具备接受任意个数实参的能力

    也就是*和**

 

    带*的形参

    带*的形参表示可以接受任意个数位置的实参,这些接收到的实参会被打包成元祖类型

    形参的名字可以随意,但是建议用args 是 arguments的缩写

 

    带*的实参

    在实参前面带*,会自动将*后的值打散,('a,b,c'打散变成了'a','b,'c')

    带*的形参不能接受关键字实参

 

    **的使用

    1形参中如果有**,会把关键字实参打包成字典类型传入

    只能接受多出来的关键字实参

    **不能单独接受位置实参(先为后面的形参赋值,后续的多余的关键字参数赋值个**)

    2.实参中如果有**,会把**后的字典(也必须是字典)打散成关键字实参(**{'a':1}打散成a=1)

 

    *和**可以为函数预留扩展空间,后期 可以根据需求增加函数,而且旧的调用方式也不会出现问题.

    简单的说就是提高了函数的扩展性

    

    当可变长形参出现在了位置形参的前面时,那么后面的位置形参必须以关键字实参来传入

    当可变长形参出现在了位置形参的后面时,会先按照顺序给前面的位置形参赋值,最后剩余的赋值给可变长args

 

    #inerable 可迭代的 只要是可以被for in 循环使用的都是可迭代的 字符串 列表 元祖 字典 集合

 

写一个带有可变长的位置形参

 

def func(*args,**kwargs)

该方式可以接受任意个数的位置实参和关键字实参

但是注意顺序,位置实参必须在关键字之前

 

def inner(name,sex,age):

    print(name,sex,age)

 

def outer(*args,**kwargs):

    print(args)

    print(kwargs)

    inner(*args,**kwargs) # inner(1,2,3,a=10,b=20)

 

outer(1,2,3,100,a=10,b=20)

 

# 上述写法 可以将outer接收到的所有参数 原模原样的传给inner函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值