Python 3 入门基础知识【3】递归函数以及参数部分

  1. 在编码过程中除了使用Python内置的函数以外,我们也经常需要自己定义函数。今天来回顾python中的函数。

目录

1.定义函数

2.中函数的返回值

3.递归函数

4.Python函数参数

5.Python函数使用默认参数

 6.Python函数使用可变参数

7.Python函数使用可变关键字参数


1.定义函数

在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号()、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。

我们以定义一个求绝对值的函数my_abs函数为例:

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

我们继续定义一个求列表list所有元素的和的函数:

def list_sum(L):
    result = 0
    for num in L:
        result = result + num
    return result


L = [1, 3, 5, 7, 9, 11]
result =list_sum(L) # 调用定义的sum_list函数并获得return返回的结果
print(result)

2.中函数的返回值

2.1 函数没有返回值

def list_sum(l):
    result = 0
    for num in l:
        result = result + num
    print('result is {}'.format(result))
    return

l = [1, 3, 5, 7, 9, 11]
result =list_sum(l) # 调用定义的sum_list函数并获得return返回的结果
print(result) # ==> None

2.2 函数返回多个值

除了返回None、一个值以外,函数也可以返回多个值,在函数中,如果需要返回多个值,多个值之间使用逗号分隔即可,但是需要注意顺序。

def data_of_square(side):
    C = 4 * side
    S = side * side
    return C, S

C, S = data_of_square(16)
print('周长 = {}'.format(C)) # ==> 周长 = 64
print('面积 = {}'.format(S)) # ==> 面积 = 256

# 也可以使用一个值存储函数返回的多值结果
result = data_of_square(16)
print(result) # ==> (64, 256)

3.递归函数

在函数内部调用其他函数,是非常常见的,通过合理拆分逻辑,可以降低程序的复杂度。如果在一个函数内部调用其自身,这个函数就是递归函数。

举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:

fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n

所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理。
于是,fact(n)用递归的方式写出来就是:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

fact(1) # ==> 1
fact(5) # ==> 120

4.Python函数参数

函数参数是需要传递给函数内部的数据,函数参数可以是任意的数据类型,只要函数内部逻辑可以处理即可。

def print_param(param):
    print(param)

特定的参数就需要根据实际,需要对函数入参进行类型的校验,Python提供isinstance()函数,可以判断参数类型,它接收两个参数,第一个是需要判断的参数,第二个是类型。

def my_abs(x):
    # 这里如果传入字符串就报错了,现在我们进行验证如果不是整数或者浮点数就直接返回none
    if not isinstance(x, int) or not isinstance(x, float):
        print('param type error.')
        return None
    if x >= 0:
        return x
    else:
        return -x

5.Python函数使用默认参数

定义函数的时候,还可以有默认参数,默认参数的意思是当这个参数没有传递的时候,参数就使用定义时的默认值。

例如Python自带的 int() 函数:

int('123') # ==> 123
int('123', 8) # ==> 83  #第二个参数是转换进制base,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数

我们来定义一个计算 x 的N次方的函数:

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

# 如果这里把参数n默认设置成2 就只需要传递一个参数即可 
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
power(9) # 81

需要注意的是,由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面,否则将会出现错误。下面是个错误的例子:

# 错误的定义
def power(n=2, x):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

 6.Python函数使用可变参数

除了默认参数,Python函数还接收一种参数叫做可变参数,可变参数即任意个参数的意思,可变参数通常使用*args来表示。

def func(*args):
    print('args length = {}, args = {}'.format(len(args), args))

func('a') # ==> args length = 1, args = ('a',)
func('a', 'b', 'c') # ==> args length = 3, args = ('a', 'b', 'c')

假设我们要计算任意个数的平均值,就可以定义一个可变参数:

def average(*args):
    sum = 0
    for item in args:
        sum += item
    avg = sum / len(args)
    return avg

在调用的时候,我们就可以这样写:

average(1, 2) # ==> 1.5
average(1, 2, 2, 3, 4) # ==> 2.4
average()
# 报错
Traceback (most recent call last):
ZeroDivisionError: division by zero

在执行average()的时候,却报错了,这是因为在使用可变参数时,没有考虑周全导致的,因为可变参数的长度可能是0,当长度为0的时候,就会出现除0错误。因此需要添加保护的逻辑。

7.Python函数使用可变关键字参数

可变关键字参数,一般使用**kwargs来表示。 

例如,想要打印一个同学的信息,可以这样处理:

def info(**kwargs):
    print('name: {}, gender: {}, age: {}'.format(kwargs.get('name'), kwargs.get('gender'), kwargs.get('age')))

info(name = 'Alice', gender = 'girl', age = 16)

对于一个拥有必需参数,默认参数,可变参数,可变关键字参数的函数,定义顺序是这样的:

def func(param1, param2, param3 = None, *args, **kwargs):
    print(param1)
    print(param2)
    print(param3)
    print(args)
    print(kwargs)

func(100, 200, 300, 400, 500, name = 'Alice', score = 100)
# ==> 100
# ==> 200
# ==> 300
# ==> (400, 500)
# ==> {'name': 'Alice', 'score': 100}

当然,这么多类型的参数,很容易导致出错,在实际使用上,不建议定义这么多的参数。

总结完函数部分,python的入门基础知识基本回顾完了,谢谢。

Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客

Python 3 入门基础知识 之数据容器及用法【2】 推荐-CSDN博客


python中的面向对象编程、继承、多态以及特殊方法:Python 面向对象 继承 多态 slots等特殊方法 【进阶篇 1 】-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值