4. 函数详解

一、前言

函数在任何编程语言中都是非常重要的一个组成部分,不理解函数概念的可以先阅读:函数

本文主要讲解如何在python中使用函数。

二、基本用法

在python中,函数写法很简单,基本就与数学公式一样,只是多了一个关键字def,即define的缩写,意为定义,也就是定义一个函数的意思。

比如最简单的,我想要求两个数字的和:

def sum(a,b):
    return a+b

c=sum(100,200)
d=sum(300,400)

通过def关键字,来定义一个函数,函数的名字叫做sum,然后后面的小括号中跟着的就是要进行求和的参数ab

而在函数的内部,通过return关键字,将求和的结果返回。

注意,定义函数,同样也是用的:来标识属于它的代码块,而任何属于它的代码块,前面都必须有一个tab键的缩进,比如这个求和函数中的return语句,前面就有一个tab键的缩进。

而一旦定义了一个函数,后面就可以直接通过函数名字,来调用它,比如这里的:

c=sum(100,200)
d=sum(300,400)

以后我们如果想要求和,就可以直接传入两个数字,让这个函数计算,最后将结果返回,并赋值给这里的cd

那如何我将函数写在后面会怎么样呢?

c=summ(100,200)
d=summ(300,400)
def summ(a,b):
    return a+b

上一章提到过,由于代码是从上往下执行,如果这样写,python首先就看到了第一行,但没有发现这个函数,那就会直接报错:

image-20240309110526725

这里的意思就是summ这个函数未定义。

这里之所以将原本的sum函数名改为summ,是因为python内部本身也有个叫sum的函数,如果像前面将自己的sum函数写在前面,则会覆盖其原本的sum函数,所以才仍然会调用自己的函数,而这里写在后面,不改名字的话,它就会默认调用其内部的sum函数,报错信息就会不同,看不出效果来。

简单来说就是,python中写的函数,你必须放在调用的前面

当然,这是最简单的情况,对于函数而言,我们还有很多讨论的点,下面会一 一对其各种特点进行讨论。

三、函数参数

函数参数,具体来说,也就是上面我们所看到的:def sum(a,b):中的ab

它的作用是,接收调用这个函数的具体数字,然后方便我们在函数内部进行使用。

比如上面我们调用了两次sum函数,第一次传入的两个参数是100200,那么ab这两个参数就会按照顺序,分别被赋值为100200

第二次,传入的300400,那么此时ab就分别被赋值为300400

而函数内部的逻辑却没有任何改变,因为无论是哪两个数字,最终都会被赋值给a和b,如果想要操作,那就可以直接对其进行操作即可,比如这里就是一个求和的操作。

那如果我们少传参数,或者多传入参数会发生什么情况呢?

def sum(a,b):
    return a+b
c=sum(100)

比如上面的代码,这个函数需要两个参数,但这里我只给了它一个参数,如果你运行这段代码,解释器就会直接报错:

image-20240309110628211

意思就是,缺少b参数的值,所以程序就无法运行。

那如果我多传入几个参数呢?

def sum(a,b):
    return a+b
c=sum(100,200,300)

程序同样无法运行:

image-20240309110656748

这里的意思就是这个函数只需要两个参数,但你却给了它三个。

所以可以总结出的结论就是:函数需要几个参数,你就必须不多不少的提供给它,否则它将无法运行

如果必须按照这个规则,那就太局限了,比如有时候我想要求5个数的和,求6个数的和怎么办呢?难道还要分别为其写一个函数不成?后面我们会有解决办法!

除此之外,函数参数的填写方式也可以更加的灵活,比如上面的这个代码:

c=sum(100,200)

默认就是将100赋值给参数a200赋值给参数b

但有时候我们会有特定赋值的情况,比如我就想要将100赋值给b200赋值给a

当然,你可能会想可以这样写呀:

c=sum(200,100)

确实可以,这个函数只有两个参数,你这样做没有任何问题,但很多时候,有些函数的参数可以多达五六个,近10个,这时候,你要是想人为来调换顺序可就太麻烦了。

这时候就可以用到函数参数的另外一个写法:

c=sum(a=100,b=200)

我们可以直接写某个具体参数变量,让它等于我们想要让它拥有的值,这样即清晰,又不容易出错!

事实上,很多时候我们都会比较倾向于上面这种写法,因为当我们使用其它程序员提供给我们的库函数,其参数可能多达十个,但我们只想要填写其中的具体两三个,其它参数默认即可,这时候就可以通过这种赋值方式,指定我们想要赋值的变量。

这里提到了“默认参数”,其作用就是让我们的函数更具有通用性、健壮性,别让别人一调你写的函数,程序就直接崩溃了,这显然有些不好。

还是以上面的求和函数为例,这次我们想要求五个数字的和:

def sum(a,b,c,d,e):
    return a+b+c+d+e

但很多时候,我们并不需要求五个数字的和,但还想要用它,那就只能这样做:

c=sum(100,200,0,0,0)

即:给其它参数填0即可完成求任意五个数之内的和

但这个过程使用起来太过于繁琐,每次填,都需要为后面的参数补0,这时候就可以对其进行简化,我们把默认参数填入函数的定义中:

def sum(a=0,b=0,c=0,d=0,e=0):
    return a+b+c+d+e

它同样是直接通过=对其各个参数进行赋值,不同之处在于,这次是直接写在了函数的定义上。

它的作用在于:如果你没有为这个参数赋值,那就使用这里的默认参数,如果你为它赋值了,那就用你赋的值。

那这时,无论你怎么调用,只要参数的个数不超过5个,那就都不会出错:

sum() #0个参数:相当于五个参数都取默认值0
sum(100) #1个参数,默认是从前到后依次赋值,所以a为100,其它参数默认都为0
sum(200,c=100) #2个参数,200按顺序默认赋值给a,100指定给了c,所以其它没有指定的参数都取默认值0
sum(100,200,300,400,500,600) #错误,最多五个参数,填6个,没有参数可以接收,直接报错

可以看到,这样做,仍然还是有很大的局限性:无法求任意参数的和。

而如果你print函数用的多的话,会发现无论你传入几个参数,它都能进行处理,而不会报错

这个时候,我们就需要不定参数了:

def sum(*args):
    print(args)
sum(100,200,300)

方法很简单,就是在参数的前面添加一个*,那么它就能接收任意长度的参数了!

arg即为argument,后面的s表明其为复数,意为接收多个参数,不过这只是个变量名,你可以任意取,只是对于可变参数的变量,比较习惯于用这个变量名

这里我只是将其接收到的参数打印了出来,是一个元组类型:

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux