李宁老师已经在「极客起源」 微信公众号推出《Python编程思想》电子书,囊括了Python的核心技术,以及Python的主要函数库的使用方法。读者可以在「极客起源」 公众号中输入 160442 开始学习。
《Python编程思想》专栏
目录
1. 函数的定义和调用
2. 多返回值函数
3. 递归函数
函数就是封装代码的单元。如果某一段代码要至少调用2次,通常会将这段代码用函数封装。使用函数的好处如下:
1. 方便重复调用同样的代码;
2. 避免代码冗余
3. 容易维护
示例代码:func_test.py
在使用函数之前必须先定义函数,定义函数的语法格式如下:
def 函数名(形参列表)
# 多条语句
[return[返回值]]
Python声明函数必须使用def关键字,对函数语法格式的详细说明如下:
下面的代码演示了函数的定义和调用:
## 定义一个函数,声明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语句返回的值既可以是有值的变量,也可以是一个表达式。
如果函数需要有多个返回值,则既可将多个值包装成列表之后返回,也可直接返回多个值。如果 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次使用序列解包来获取多个返回值。
在一个函数体内调用它自身,被称为递归函数。函数递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。最典型的递归算法是阶乘和斐波那契数列,下面就用斐波那契数列来演示递归函数的编写方法。
斐波那契数列的计算规则是: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,或扫描下面二维码加群,然后拖加入技术讨论群。