一、前言
函数在任何编程语言中都是非常重要的一个组成部分,不理解函数概念的可以先阅读:函数。
本文主要讲解如何在python中使用函数。
二、基本用法
在python中,函数写法很简单,基本就与数学公式一样,只是多了一个关键字def
,即define
的缩写,意为定义,也就是定义一个函数的意思。
比如最简单的,我想要求两个数字的和:
def sum(a,b):
return a+b
c=sum(100,200)
d=sum(300,400)
通过def
关键字,来定义一个函数,函数的名字叫做sum
,然后后面的小括号中跟着的就是要进行求和的参数a
与b
,
而在函数的内部,通过return
关键字,将求和的结果返回。
注意,定义函数,同样也是用的
:
来标识属于它的代码块,而任何属于它的代码块,前面都必须有一个tab
键的缩进,比如这个求和函数中的return
语句,前面就有一个tab
键的缩进。
而一旦定义了一个函数,后面就可以直接通过函数名字,来调用它,比如这里的:
c=sum(100,200)
d=sum(300,400)
以后我们如果想要求和,就可以直接传入两个数字,让这个函数计算,最后将结果返回,并赋值给这里的c
与d
。
那如何我将函数写在后面会怎么样呢?
c=summ(100,200)
d=summ(300,400)
def summ(a,b):
return a+b
上一章提到过,由于代码是从上往下执行,如果这样写,python首先就看到了第一行,但没有发现这个函数,那就会直接报错:
这里的意思就是summ
这个函数未定义。
这里之所以将原本的
sum
函数名改为summ
,是因为python内部本身也有个叫sum
的函数,如果像前面将自己的sum函数写在前面,则会覆盖其原本的sum函数,所以才仍然会调用自己的函数,而这里写在后面,不改名字的话,它就会默认调用其内部的sum函数,报错信息就会不同,看不出效果来。
简单来说就是,python中写的函数,你必须放在调用的前面
当然,这是最简单的情况,对于函数而言,我们还有很多讨论的点,下面会一 一对其各种特点进行讨论。
三、函数参数
函数参数,具体来说,也就是上面我们所看到的:def sum(a,b):
中的a
和b
。
它的作用是,接收调用这个函数的具体数字,然后方便我们在函数内部进行使用。
比如上面我们调用了两次sum
函数,第一次传入的两个参数是100
与200
,那么a
与b
这两个参数就会按照顺序,分别被赋值为100
和200
。
第二次,传入的
300
,400
,那么此时a
与b
就分别被赋值为300
,400
而函数内部的逻辑却没有任何改变,因为无论是哪两个数字,最终都会被赋值给a和b,如果想要操作,那就可以直接对其进行操作即可,比如这里就是一个求和的操作。
那如果我们少传参数,或者多传入参数会发生什么情况呢?
def sum(a,b):
return a+b
c=sum(100)
比如上面的代码,这个函数需要两个参数,但这里我只给了它一个参数,如果你运行这段代码,解释器就会直接报错:
意思就是,缺少b
参数的值,所以程序就无法运行。
那如果我多传入几个参数呢?
def sum(a,b):
return a+b
c=sum(100,200,300)
程序同样无法运行:
这里的意思就是这个函数只需要两个参数,但你却给了它三个。
所以可以总结出的结论就是:函数需要几个参数,你就必须不多不少的提供给它,否则它将无法运行
如果必须按照这个规则,那就太局限了,比如有时候我想要求5个数的和,求6个数的和怎么办呢?难道还要分别为其写一个函数不成?后面我们会有解决办法!
除此之外,函数参数的填写方式也可以更加的灵活,比如上面的这个代码:
c=sum(100,200)
默认就是将100
赋值给参数a
,200
赋值给参数b
。
但有时候我们会有特定赋值的情况,比如我就想要将100
赋值给b
,200
赋值给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个,没有参数可以接收,直接报错
可以看到,这样做,仍然还是有很大的局限性:无法求任意参数的和。
而如果你
这个时候,我们就需要不定参数了:
def sum(*args):
print(args)
sum(100,200,300)
方法很简单,就是在参数的前面添加一个*
,那么它就能接收任意长度的参数了!
arg
即为argument
,后面的s
表明其为复数,意为接收多个参数,不过这只是个变量名,你可以任意取,只是对于可变参数的变量,比较习惯于用这个变量名
这里我只是将其接收到的参数打印了出来,是一个元组类型: