Python编程实现(17):必须掌握的函数知识

44 篇文章 4 订阅
33 篇文章 47 订阅

李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。

《Python编程思想》总目录

《Python编程思想》专栏

目录

1. 函数的定义和调用

2. 多返回值函数

3. 递归函数


函数就是封装代码的单元。如果某一段代码要至少调用2次,通常会将这段代码用函数封装。使用函数的好处如下:

1. 方便重复调用同样的代码;

2. 避免代码冗余

3. 容易维护

1. 函数的定义和调用

示例代码:func_test.py

在使用函数之前必须先定义函数,定义函数的语法格式如下:

def 函数名(形参列表)
    # 多条语句
    [return[返回值]]

Python声明函数必须使用def关键字,对函数语法格式的详细说明如下:

  • 函数名:从语法角度来看,函数名只要是一个合法的标识符即可;从程序的可读性角度来看,函数名应该由一个或多个有意义的单词的组合,如get_name,每个单词的所有字母都是小写的,多个单词通过下划线(_)连接;
  • 形参列表:用于定义该函数可以接收的参数。形参列表由多个形参名组成,多个形参名之间以英文逗号(,)隔开。一旦在定义函数时指定了形参列表,调用该函数时就必须传入对应的参数值;

下面的代码演示了函数的定义和调用:

## 定义一个函数,声明2个形参
def max_value(x, y) :
   result = x if x > y else y
   # 返回变量z的值
   return result
# 定义一个函数,声明1个形参
def greet(name) :
   print("正在执行greet函数")
   return f'hello {name}'
a = 3
b = 5
# 调用max_greet函数
result = max_value(a , b)
print("result:", result)
# 调用greet()函数,直接输出函数的返回值
print(greet("李宁")) 

执行这段代码,会输出如下的结果:

result: 5
正在执行greet函数
hello 李宁

上面程序中定义了两个函数:max_value与greet,并且调用了这两个函数。其中max_value函数返回了一个变量,而greet函数返回了一个格式化的字符串,在函数体中使用 return语句可以显式地返回一个值,return语句返回的值既可以是有值的变量,也可以是一个表达式。

2. 多返回值函数

如果函数需要有多个返回值,则既可将多个值包装成列表之后返回,也可直接返回多个值。如果 Python函数直接返回多个值,Python会自动将多个返回值封装成元组。演示代码如下:

# 多返回值
def sum_and_avg(num_list):
    sum = 0
    count = 0
    for value in num_list:
        # 如果元素value是数值
        if isinstance(value, int) or isinstance(value, float):
            count += 1
            sum += value
    return sum, sum / count
num_list = [14, 145, 15.1, 'True', 3.5, 45.9, -31.8,13.4,"hello",False]
# 获取sum_and_avg函数返回的多个值,多个返回值被封装成元组
result = sum_and_avg(num_list)
print(result)
# 使用序列解包来获取多个返回值
s, avg = sum_and_avg(num_list)
print(s)
print(avg)

执行这段代码,会输出如下的内容:

(205.1, 25.6375) 205.1 25.6375

上面代码中的sum_and_avg函数返回了多个值,并且两次调用了sum_and_avg函数,第1次返回了列表,第2次使用序列解包来获取多个返回值。

3. 递归函数

在一个函数体内调用它自身,被称为递归函数。函数递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。最典型的递归算法是阶乘和斐波那契数列,下面就用斐波那契数列来演示递归函数的编写方法。

斐波那契数列的计算规则是:f(0) =1, f(1) =3 ,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数。

现在要求f(10)的值(通用的问题就是计算第n个位置的斐波那契数列的值),递归算法如下:

def fn(n) :
   if n == 0 :
      return 1
   elif n == 1 :
      return 3
   else :
      # 函数中调用它自身,就是递归函数
      return 2 * fn(n - 1) + fn(n - 2)
# 输出fn(10)的结果
print(f"fn(10)的结果是{fn(10)}")

执行这段代码,会输出如下内容:

fn(10)的结果是8119

在上面的fn函数体中再次调用了fn()函数,这就是函数递归。注意在fn()函数体中调用f(n)的形式:return 2*fn(n -1)+ fn(n-2)。对于fn(10)来说,也就是2*fn(9)+fn(8),其中fn(9)又等于2*fn(8)+fn(7),...,依此类推,最终会计算到fn(2)等于2*fn(1)+fn(0),而fn(2)是可计算的,这样递归带来的隐式循环就结束了(当不再调用自身时,递归函数结束)。然后一路反算回去,最后就可以得到fn(10)的值。

对本文感兴趣的同学可以加微信unitymarvel,或扫描下面二维码加群,然后拖加入技术讨论群。

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值