python中可以将某些具备一定功能的代码写成一个函数,通过函数可以在一定程度上减少代码的冗余,节约书写代码的时间。因为有一些代码实现的功能我们可能会在很多地方用到。

1、函数的声明与定义

通过def关键字声明函数,函数名可以自定义,一般时要求做到见名知义,在函数体内我们可以书写实现功能的代码

函数一般分为无参函数,有参函数。无参函数就像下面这样

'''
函数定义:
def 函数名():
    函数体
'''


def fun():
    pass

简单的有参函数一般是下面这样

def fun(x,y):
    pass

其中x,y成为函数的形参

2、函数参数的划分

函数参数一般分为,位置参数,默认值参数,可变长度参数

当定义函数时,参数的顺序一般是位置参数在前,默认值参数随后,可变长度参数最后。可变长度参数一般有分为两种,拥有不同的写法。

仅含有位置参数的例子,如下

def fun(name, age):  # name, age 是位置参数,也是函数的形参
    print(name, age)


fun('ajune', 18)     # 'ajune', 18是函数的实参,分别对应name, age

含有位置参数和默认值参数的例子,如下

def fun(name, age, gender='男'):    # gender 为默认参数,在函数定义时赋初值,仅调用时才可能会变化 
    print(name, age, gender)


fun('ajune', 18)             # ajune 18 男
fun('ajune', 18, '男')       # ajune 18 男
fun('ajune', 18, '女')       # ajune 18 女

默认值参数在调用函数时如果不赋予新的值,那么其值将不会变化。其中函数的参数可以全部是位置参数也可以全部是默认参数。

含有不定长参数的例子之一

def fun(name, *args):
    print(name, args)


fun('ajune', 18)          # ajune (18,)
fun('ajune', 18, '男')    # ajune (18, '男')

当含有多个参数时,*args会接收除了位置参数剩余的参数,并且是元组的形式接收,而且当我们传入一个列表时也会被*args接收,可以将额外的参数写成一个元组或者列表,通过下面的方式可以得到相同的效果。

def fun(name, *args):
    print(name, args)


info = (18, '男')
info1 = [18, '男']
fun('ajune', *info)
fun('ajune', *info1)

含有不定长参数的例子之二

另外一种不定长参数就是**kwargs类型的,特点是只接收键值对形式的额外参数,接收参数也有两种形式,可以直接写成键值对的形式,也可以写成一个字典,将字典作为参数传入

def fun(name, **kwargs):
    print(name, kwargs)


info = {'age': 18, 'gender': '男'}

fun('ajune', age=18, gender='男')
fun('ajune', **info)

python 函数参数指定类型 python 函数参数定义_默认值

可以看出传入的参数从左至右对应,首先位置参数分配完参数,由于后面的就是*args,所以3,4,5会全部被*args接收,而a的值依然是默认值没有改变,如果想要修改的话,在调用时需要键值对的形式,例如这样子写

foo(1, 2, 3, 4, 5, a=9, b=3, c=4, d=5)

。由于后面的是b=3所以会对应形参的b,最后的c=4,d=5便会被**kwargs接收。

 

3、函数的返回值

python函数可以具备返回值,其中返回值的类型是多种多样的,可以是列表,元组,字典......

使用return可以将某个值返回,但是如果函数中没有写return语句,那么默认返回None,一个函数中只会有一条return语句被执行

函数的返回值可以被其他变量接收。

def fun():
    return 'haha'


result = fun()
print(result)

函数的返回值可以是一个函数,多用于函数的嵌套

def fun():
    def fun1():
        return 'haha'

    return fun1()


result = fun()
print(result)

其中函数的返回值还可以是函数名,下面的例子与上面的例子结果是一样的,不同的是返回的是函数名,其实返回的还是函数的内存地址,当被变量接收后,通过变量名()的方式进行调用

def fun():
    def fun1():
        return 'haha'

    return fun1


result = fun()
print(result())

函数的return语句里面可以写多个值,当返回时,隐式的以元组方式返回

def fun():
    x, y = 1, 2
    return x, y


result = fun()
print(result)  # 打印结果(1, 2)