函数及其应用场景
一, 函数的定义
函数的定义
所谓的函数就是一个被命名的, 独立的, 完成特定功能的代码段 (一段连续的代码), 并可能给调用它的程序一个返回值.
被命名的: 在Python中, 函数大多数是有名函数 (普通函数).当然Python中也存在没有名字的函数叫做匿名函数.
独立的, 完成特定功能的代码段: 在实际项目开发中, 定义函数前一定要先考虑一下, 这个函数是为了完成某个操作或某个功能而定义的(函数的功能一定要专一).
返回值: 很多函数在执行完毕之后, 会通过return关键字返回一个结果给调用它的位置
函数的作用
代码重用 (代码重复使用)模块化编程 (模块化编程的核心就是函数, 一般是把一个系统分解为若干个功能, 每个功能就是一个函数)
在编程领域, 编程可以分为两大类:
1. 模块化编程
2. 面向对象编程
函数的结构
def 函数名称([参数1, 参数2, ...]):
函数体
...
[return 返回值]
函数的调用
在python中, 函数和变量一样, 都是先定义后使用.
# 定义函数
def 函数名称([参数1, 参数2, ...]):
函数体
...
[return 返回值]
# 调用函数
函数名称(参数1, 参数2, ...)
二, 函数入门
案例1:使用Python代码, 编写一个打招呼程序
# 第一步: 见到老师打一声招呼
print('您好')
# 第二步: 见到老师打一声招呼
print('您好')
# 第三步: 见到老师打一声招呼
print('您好')
虽然以上程序可以满足程序的需求, 但是我们发现, 代码做了很多重复的工作, 我们可以对以上代码进行进一步优化, 避免代码的重复性编写.
案例2: 升级: 使用Python代码, 编写一个打招呼程序 (函数------一次编写, 多次利用)
# 定义函数 (封装函数)
def greet():
print('您好')
# 调用函数
# 见到一个老师, 打一声招呼
greet()
# 见到一个老师, 打一声招呼
greet()
# 见到一个老师, 打一声招呼
greet()
案例3: 升级: 使用Python代码编写一个打招呼程序, 可以实现向不同的人打招呼
# 定义一个函数, 同时为其定义一个参数
def greet(name):
print(f'{name}, 您好')
# 调用函数
# 见到了张老师, 打一声招呼
greet('老张')
# 见到了李老师, 打一声招呼
greet('老李')
# 见到了王老师, 打一声招呼
greet('老王')
案例4: 函数的设计原则"高内聚, 低耦合", 函数执行完毕后, 应该主动把数返回给调用处而不应该都交由print()等函数直接输出.
# 定义一个函数, 拥有name参数, 同时函数执行完毕后, 拥有一个return返回值
def greet(name):
# 执行一系列相关操作
return name + ', 您好'
# 调用函数
# 见到了张老师, 打一声招呼
print(great('老张'))
# 见到了李老师, 打一声招呼
print(greet('老李'))
# 见到了王老师, 打一声招呼
print(greet('老王'))
三, return返回值
思考1: 如果一个函数有两个return(如下图示), 程序将如何执行?
def return_num():
return 1
return 2
result = return_num()
print(result) # 1
答: 只执行了第一个return, 原因是因为return可以退出当前函数, 导致return下方的代码不执行.
思考2: 如果一个函数要有多个返回值, 该如何书写代码?
答: 在Python中, 理论上一个函数只能返回一个结果. 但是如果我们想让一个函数同时返回多个结果, 我们可以使用return元组的形式.
def return_num():
return 1, 2
result = return_num()
print(result)
print(type(result)) #
思考3: 封装一个函数, 参数有两个num1, num2, 求两个数的四则运算结果
四则运算: 加, 减, 乘, 除
def size(num1 , num2):
jia = num1 + num2
jian = num1 - num2
cheng = num1 * num2
chu = num1 / num2
return jia, jian, cheng, chu
# 调用size方法
print(size(20, 5))
四, 说明文档
定义一个函数后, 程序员在书写程序时通过注释能够快速提示这个函数的作用.如果代码太多, 程序员需要在很多代码中找到这个函数定义的位置, 才能看到注释, 如果想更方便的查看函数的作用, 我们需要通过函数的说明文档(函数的说明文档也叫做函数的文档说明).
五, 函数的嵌套
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数.
函数嵌套的格式
def funcB() # 1
print('这是funcB函数的函数体部分...') # 2
# 3
# 4
def funcA() # 5
print('-' * 40) # 6
print('这是funcA函数的函数体部分...') # 7
# 假设我们在调用funcA函数时, 需要使用到funcB的功能, 则可以嵌套到funcA方式中 # 8
funcB() # 9
print('-' * 40) # 10
# 11
# 12
# 调用funcA函数 # 13
funcA() # 14
函数嵌套的执行流程
Python代码遵循一个“顺序原则”,从上往下,从左往右一行一行执行.当代码执行到第1行时,则在计算机内存中定义一个funcB函数。但是其内部的代码并没有真正的执行,跳过第2行继续向下运行.执行到第5行,发现又声明了一个funcA的函数,根据函数的定义原则,定义就是在内存中声明有这样一个函数,但是没有真正的调用和执行.代码继续向下执行,到第14行,发现funcA(),函数体()就代表调用funcA函数并执行其内部的代码。程序返回到第6行,然后一步一步向下执行,输出40个横杠,然后打印这是funcA函数的函数体部分…,然后继续向下执行,遇到funcB函数,后边有一个圆括号代表执行funcB函数,原程序处于等待状态.进入funcB函数,执行输出这是funcB函数的函数体部分…,当代码完毕后,返回funcA函数中funcB()的位置,继续向下执行,打印40个横杠.最终程序就执行结束了.
函数的应用案例
案例需求
奇偶求和.
编写一个程序,求出一个列表中偶数和奇数的和.
定义函数calculate_sum(),参数为一个数字列表numbers_list, 分别求出偶数和奇数的和.
最后,返回一个列表,第一个元素为偶数的和,第二个元素为奇数的和.
实现思路
定义函数 calculate_sum(), 参数为一个数字列表 numbers_list.初始化偶数和为0.初始化奇数和为0.遍历数字列表中的每个数字.检查数字是否为偶数.如果是偶数, 加到偶数和中.如果是奇数, 加到奇数和中.返回一个列表, 第一个元素为偶数的和, 第二个元素为奇数的和.从输入中获取一个整数列表.调用calculate_sum() 函数并获取结果.打印结果.
# 1. 定义函数 calculate_sum(), 参数为一个数字列表 numbers-list.
def calculate_sum(numbers_list):
# 2. 初始化偶数和为0.
even_sum = 0
# 3. 初始化奇数和为0.
odd_sum = 0
# 4. 遍历数字列表中的每个数字.
for num in numbers_list:
# 5. 检查数字是否为偶数.
if num % 2 == 0:
# 6. 如果是偶数, 加到偶数和中.
even_sum += num
else:
# 7. 如果是奇数, 加到奇数和中.
odd_sum += num
# 8. 返回一个列表, 第一个元素为偶数的和, 第二个元素为奇数的和.
return [even_sum, odd_sum]
# 9. 从输入中获取一个整数数列.
numbers_list = [1, 2, 3, 4, 5, 6, 7]
# 10. 调用calculate_sum()函数并获取结果.
result = calculate_sum(numsbers_list)
# 11. 打印结果.
print(f'偶数的和是: {result[0]}, 奇数的和是: {result[1]}')
五, 总结
Q1:知道函数的作用
模块化编程提高代码的复用性
Q2:函数的定义格式
def 函数名(形参1, 形参2, ...)
函数体
return具体的返回值
Q3: 函数的调用格式
变量名 = 函数名(实参1, 实参2, …)
Q4: 说明文档的作用
如果代码太多, 程序员需要在很多代码中找到这个函数定义的位置, 才能看到注释, 如果想更方便的查看函数的作用, 我们需要通过函数的说明文档(函数的说明文档也叫做函数的文档说明).
Q5: 函数嵌套调用流程
默认按照顺序结构, 从上往下逐级调用