函数(二)

一、函数的参数详解

形参和实参

  形参:形式参数,就是在定义函数时,括号中指定的参数,本质就是一个名字

  实参:实际参数,在调用函数时传入的参数,是一个实际(明确)的值

当我们在调用函数时就会自动把形参和实参进行绑定

位置参数(用的最多)

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

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

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

      位置实参: def func(1,2,3)     #1,2,3都是位置实参

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

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

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

关键字参数

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

  优点:可以打破传入参数的顺序,可以不予形参顺序相同

注意:

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

  2、关键字参数必须位于位置参数的后面

  3、不能为同一个参数多次传值(即每个参数只能穿一个值)

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

  注意:实参决定是位置参数还是关键字参数

默认形参:

  在定义时,就已经为形参指定了一个值,那这个形参就叫做默认形参

  特点:

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

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

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

注意(了解):不能将默认形参的默认值设置为一个可变类型,否则,会导致每次函数调用都共用同一个默认参数,所以,我们应该将函数设计为独立的功能,使得每次调用互不干扰

可变长参数(重难点)

  可以传任意个数的实参

  传入实参的目的:给实参使用(意味着形参必须具备可以接收任意个数实参的能力)

* 和 **

  *的使用

    带* 的形参表示可以接收任意个数的实参,接收到的实参会被打包成元组类型

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

    interable是可迭代的,只要是可以被for in循环使用的都是可以迭代的(字符串 列表 元组 字典 集合)

    实参前面带*,会自动将*后的值打散

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

  **的使用

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

    先为前面的形参赋值,后续多余的关键字参数赋值给**

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

位置形参和可变长形参混合使用

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

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

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

原文地址:https://www.cnblogs.com/zhangzhechun/p/10255515.html