标签 函数传参 下的文章

必选参数

函数的一种参数类型,在调用这个函数的时候必须传入数据的参数。

传递实参时的顺序

在传递必选参数时,形参会按照定义的顺序依次接收数据。

调用函数时第一个参数传递给name,第二个参数传递给pet。

缺少实参

在调用函数时,缺少或超出对必选参数的传递会导致程序错误。

也就是说,在函数中定义了多少个必选参数就要传递多少个实参。

关键字传递

当我们忘记了传递顺序时,可以利用“形参名=实参名”的方式传递实参。

这样以关键字传递实参的形式,简称为关键字实参。

小练习

定义一个函数getArea,设定参数width与height分别接收矩形的宽高,计算矩形的面积并返回。

调用该函数,用关键字的形式传递参数宽为5、高为3,并按照“矩形的面积为xx”的格式输出结果。

def getArea(width, height):
    return width*height

ret = getArea(width=5, height=3)
print(f"矩形的面积为{ret}")

若定义一个计算圆形面积的函数,设定参数为半径(radius)与圆周率(pi)。

多数情况下,圆周率都会近似为3.14。

若pi不是必选参数,设其默认为3.14。只在需要修改圆周率时传递数据,函数调用起来会方便很多。

必选参数定义起来虽然简单,在调用函数时经常会因为缺少实参造成程序错误。

接下来学习给形参设置默认值。

默认值参数

def getArea(radius, pi=3.14):
    ret = radius * radius * pi
    return ret

ret1 = getArea(2)
print(ret1)
ret2 = getArea(2, 3.14159)
print(ret2)

代码的作用

定义一个函数getArea,根据传递的半径与圆周率,计算圆的面积并输出。

在第1行,定义形参radius与pi,并为pi设定默认值为3.14。

在第5行,调用函数getArea,并传递数据2。

在第7行,调用函数getArea,并传递数据2与3.14159。

关键字

一个关键字,def函数定义的关键字,是define的缩写。

括号
括号与冒号,这是函数定义的固定格式。

逗号
一个逗号,用来分割多个参数。

必选参数
一串字母radius,必选参数。

必选参数要定义在默认值参数之前。

默认参数
一串字母pi,默认值参数。

默认参数可以有任意个,但必须定义在必选参数之后(若必选参数存在)。

等号
一个等号,赋值符号。

默认值
一组数据,为参数pi设置默认值。

若在调用函数时,没有为参数pi传递实参,参数pi默认为3.14。

传递一个实参
调用函数,只为必选参数传递整数2。

因为pi没有接收到参数,所以pi将使用默认值3.14。

传递两个实参
调用函数,传递参数2与3.14159。

此时pi接收到的实参数据3.14159会覆盖默认值3.14。

代码小结
当我们定义一个默认值参数时就需要这几个部分

目前学习了两种类型的参数,必选参数与默认值参数。这两种参数形式涵盖了80%以上的函数使用。
在定义不同的参数时,需要注意避免一些常见的错误。

1.定义参数的顺序

在定义函数时,定义形参的顺序是:1,必选参数;2,默认参数。
当有必选参数和默认参数的时候,必选参数必须写在默认参数的前面,否则程序会出错

2.参数名避免使用无意义的字母

在传递实参给函数时,若忘记定义顺序可以使用“形参名=实参”的方式。
但如果定义的形参名是诸如a,abc这样无意义的名字,会减少代码可读性,容易混淆。
所以设定参数名时,尽量使用有意义的名称。

最后,对这两种参数的差异性做一个总结。

初识函数

定义
函数是指封装了某一特定功能的代码块。

简单的讲,函数就是用来存储代码的“特殊变量”。

前面接触过的很多“功能”都是函数。

比如在屏幕上输出一些数据的print(),生成一个指定范围整数序列的range()等。

函数的功能是如何定义的呢?

定义函数

def sayWelcome():
    print("欢迎光临")
    print("商品一律九折")

代码的作用
这3行代码做的事情是定义了一个叫做“sayWelcome”的函数。

这个函数的功能是输出欢迎语内容。

def
一个关键字,def函数定义的关键字,是define的缩写。

sayWelcome
一个名称,函数名。
这里的名称其实就是变量名,只不过需要存储的不再是数据,而是代码,我们称为函数名。

括号
一对括号,是函数定义的标准格式。

冒号
一个冒号,表明接下来缩进的代码是属于这个函数的。

缩进
四个空格。

和判断、循环一样,函数内部的代码也需要缩进相应的空格。

函数体
几行代码组成的代码块。

实现该函数功能的代码块,称为函数体。

代码小结
当我们要定义函数时就需要这几个部分。

现在我们已经将输出欢迎语的代码打包,并为它贴上了sayWelcome的标签。当我们需要展示欢迎语时,只需要“打电话”(call)给电脑,让它在此处执行sayWelcome的代码。

在代码中使用我们已经定义好的函数,这个过程称为调用函数(Call Function)。

调用函数

def sayWelcome():
    print("欢迎光临")
    print("商品一律九折")

sayWelcome()
sayWelcome()

代码的作用
定义一个sayWelcome函数,实现输出欢迎语的功能。

第5、6行代码,调用了sayWelcome函数。

sayWelcome
一个名称,被调用的函数名。

程序通过函数名来定位函数体中的代码。

括号
一对括号,调用符号。

表示在此处执行该函数中的代码,是调用函数的标准格式。

代码小结
当我们要调用函数时就需要这几个部分。

代码执行顺序
函数体中的代码不是立刻执行的,而是等到该函数被调用时才执行。

我们可以理解为:函数的调用是一个迂回的路径。

当程序执行到第七行代码时,开始调用setWatermark函数时,并不会继续执行第八行代码,而是跳转到定义函数setWatermark()的内部

从第二行开始执行

直到第2,3,4行代码结束

再跳回到第7行代码,从而继续执行第8行代码

现在我们可以把需要重复使用的代码定义为一个函数,就像刚才的sayWelcome函数。

若我们希望修改函数中的内容怎么办呢?

若定义函数时预留一个位置接收数据。根据不同的情况传递不同的数据,就能更加灵活的解决刚才的问题。

这时候我们需要为函数“挖空”,并在调用函数时“填空”,即设置参数。

我们把提前挖好的“空”称为形参,把用来填空的数据称为实参。

形参与实参

定义
形参是形式参数的简称,指定义函数时设置的参数名称。

实参是实际参数的简称,指调用函数时实际传递的数据。

为函数设置参数

def sayWelcome(discount):
    print("欢迎光临")
    print(f"商品一律{discount}")

sayWelcome("九折")
sayWelcome("五折")

代码的作用
定义sayWelcome函数,并为它们设置一个参数discount。

第1行,定义sayWelcome函数并在括号中设置形参名称discount。

第3行,将discount形参放到函数体中使用,使discount中的数据按照指定的格式输出。

第5~6行,多次调用sayWelcome函数,并分别为discount形参传递实参数据“九折”、“五折”。

形参
定义一个形参,用来接收数据的参数名称。

形参
在代码中使用形参,接收到的数据会被传递到此处使用。

实参
实参,调用函数时传递给形参discount的数据。

代码小结
我们通过下面的代码为函数设置参数。

形参
形参是定义函数时设置的参数名称。

相当于我们定义了一个变量,但不需要给该变量赋值。

实参
实参是调用函数时传递给形参的数据。

相当于为形参变量赋值的数据。

参数可以定义多个,也可以不定义。

如果参数不止一个,多个参数之间可以用英文逗号“,”隔开。

根据函数的功能不同,我们可以传递不同类型的实参数据。

比如,我们可以把店铺名称与产品折扣都设置为参数。

小练习

计算BMI指数
请定义一个叫做“getBMI()”的函数,该函数包括2个参数height, weight,分别代表身高和体重。

这个函数的功能是通过一个人的身高和体重计算BMI指数,并用print输出结果。

BMI指数的计算公式为:BMI = 体重 /(身高X身高)

然后分两次调用这个函数:

第一次传入参数(1.83, 60)。

第二次传入参数(1.60, 50)。

def getBMI(height, weight):
    BMI = weight / (height * height)
    print(BMI)

getBMI(1.83, 60)
getBMI(1.60, 50)

请定义一个叫做“isOdd”的函数,该函数包括1个参数number,代表一个整数。

这个函数的功能是通过if语句判断number中的数字是否为奇数,并用print输出结果。

若此数为奇数,输出“奇数”,否则输出“偶数”。 然后分两次调用这个函数:

第一次传入参数25。

第二次传入参数10。

# 定义isOdd函数
def isOdd(number):
    # 判断number是否为奇数
    if number % 2 == 1 :
        print("奇数")
    else :
        print("偶数")

# 调用isOdd函数
isOdd(25)
isOdd(10)

函数声明

自定义函数分为两类,有名函数和匿名函数。
有名函数的定义也叫函数声明,基本语法:


//function 函数名(){
// 需要执行的代码
//}

// 命名函数
function fn(){
 alert(1)
}

 // 调用该函数
fn();

匿名函数的定义有两种形式,函数表达式形式和事件注册形式。
函数表达式的基本语法:
函数表达式将匿名函数赋给一个变量,这样调用的匿名函数就可以通过这个变量来调用。


//let 变量名 = function (){
// 需要执行的代码
//}

// 函数表达式
var fn2 = function(){
    console.log(123);
};

事件注册式的基本语法:


//文档对象.事件 = function(){
//    console.log(123)
//};

btn.onclick = function(){
    console.log(123);
}

函数传参

实参与形参

所有的数据类型都可以当参数传递进去,多个参数用逗号隔开。


// n,f 形参 - 形式上定义的参数名,形参与实参一一对应
function fn(n,f){

    alert(n);  //1

    console.log(f);  //2
}

// 1,2 实参 - 实际传递的参数
fn(1,2);

//fn([1,2,3],function(){ alert('aaa') })

arguments 不定参

arguments其实就是传递给函数的实参集合。
它类似数组Array的对象,存放在arguments中的每一个实参,可以用arguments[下标]的格式来访问,对于arguments中存放的实参个数则可以使用arguments.length获得,除了length属性和通过索引值引用之外不能用任何数组的方法。


function fn(){
    // arguments 获取一组实参 伪数组
    console.log(arguments[1]);  //2

    // 实参的长度
    console.log(arguments.length);  //5

}

fn(1,2,3,4,99);

// arguments 不定参应用 实参的累加和
function fnSum(){
    var sum = 0;
    for(var i=0;i<arguments.length;i++){
        sum+=arguments[i];
    }
    console.log(sum);
}

fnSum(1,2,3,4,5,6,7,8,9);  //45