Python快速入门专业版(二十六):Python函数基础:定义、调用与返回值(Hello函数案例)
目录
- 引
- 一、函数的核心作用:代码复用与模块化
- 二、函数的定义:用def关键字创建函数
- 1. 无参数函数:不需要输入的函数
- 示例1:定义并调用无参数的say_hello函数
- 2. 有参数函数:接收外部输入的函数
- 示例2:定义并调用带参数的greet函数
- 示例3:带多个参数的函数(计算两数之和)
- 三、函数的返回值:用return传递结果
- 1. 返回单个值
- 示例4:计算圆面积的函数(返回单个值)
- 2. 返回多个值
- 示例5:返回多个值的函数(求和与乘积)
- 3. 无return语句的函数
- 四、函数的调用:执行函数并传递参数
- 1. 位置参数:按顺序传递参数
- 2. 关键字参数:按名称传递参数
- 3. 函数调用的执行流程
- 示例6:函数调用流程演示
- 五、综合案例:自定义数学工具函数
- 1. 案例代码实现
- 2. 案例解析
- 六、函数的参数默认值(进阶技巧)
- 七、总结与练习
- 练习题目(从易到难)
引
在编程中,当一段代码需要重复使用(如多次计算圆面积、反复验证用户输入),或者逻辑复杂需要单独封装时,函数就成为了必不可少的工具。函数是Python中组织代码的基本单元,它能将一段逻辑完整的代码块封装起来,实现“一次定义,多次调用”,大幅提升代码的复用性和可读性。
本文将从函数的核心作用讲起,详细介绍函数的定义语法、调用方式和返回值处理,通过“Hello函数”“加法函数”“圆面积计算函数”等案例,帮助你掌握函数的基础用法,理解函数在模块化编程中的核心价值。
一、函数的核心作用:代码复用与模块化
想象一个场景:你需要在程序的10个不同位置打印“Hello, World!”。如果不使用函数,你需要重复编写10次print("Hello, World!")
;如果使用函数,只需定义一次打印逻辑,然后在10个位置调用即可。这就是函数的核心价值——代码复用。
函数的作用远不止于此:
- 模块化:将复杂程序拆分为多个功能独立的函数,每个函数专注于解决一个小问题,使程序结构清晰,便于调试和维护。
- 抽象逻辑:通过函数名即可理解功能(如
calculate_area()
显然是计算面积的函数),无需关心内部实现细节。 - 参数化:通过参数传递不同的值,使函数能处理多种情况(如
add(2,3)
和add(5,8)
用同一个函数实现不同计算)。
二、函数的定义:用def关键字创建函数
在Python中,函数通过def
关键字定义,基本语法结构如下:
def 函数名(参数列表):"""函数文档字符串(可选,用于说明函数功能)"""函数体(实现功能的代码块,必须缩进)return 返回值(可选,用于返回结果)
- def:定义函数的关键字,必须放在函数名前。
- 函数名:遵循Python命名规则(字母、数字、下划线组成,不能以数字开头),建议使用小写字母和下划线(如
say_hello
、calculate_area
),见名知意。 - 参数列表:函数接收的输入值,多个参数用逗号分隔,无参数时留空(
()
)。 - 函数体:实现函数功能的代码,必须缩进(通常4个空格)。
- return:可选,用于将结果返回给调用者;若省略,函数默认返回
None
。 - 文档字符串:用三引号包裹的说明文字,可通过
help(函数名)
查看,增强代码可读性。
1. 无参数函数:不需要输入的函数
当函数不需要外部输入即可完成功能时,参数列表为空。最典型的例子是打印固定信息的函数。
示例1:定义并调用无参数的say_hello函数
# 定义无参数函数
def say_hello():"""打印Hello, World!"""print("Hello, World!")# 调用函数(函数名+括号)
say_hello() # 输出:Hello, World!
say_hello() # 再次调用,输出同样结果
执行流程解析:
def say_hello():
定义函数:创建一个名为say_hello
的函数,无参数,函数体为打印“Hello, World!”。say_hello()
调用函数:程序跳转到函数定义处,执行print
语句,然后回到调用位置继续执行。- 再次调用时,重复步骤2,实现代码复用。
2. 有参数函数:接收外部输入的函数
大多数情况下,函数需要根据外部输入的不同值执行不同操作,这时就需要定义参数。参数相当于函数内部的变量,其值由调用者传入。
示例2:定义并调用带参数的greet函数
# 定义带一个参数的函数
def greet(name):"""向指定姓名的人打招呼"""print(f"Hello, {name}!")# 调用函数时传入参数
greet("Alice") # 输出:Hello, Alice!
greet("Bob") # 输出:Hello, Bob!
解析:
- 函数定义时,
name
是形式参数(简称“形参”),表示函数需要接收一个输入。 - 调用函数时,
"Alice"
和"Bob"
是实际参数(简称“实参”),会被赋值给形参name
。 - 函数体通过
name
使用外部传入的值,实现“向不同人打招呼”的灵活功能。
示例3:带多个参数的函数(计算两数之和)
# 定义带两个参数的函数
def add(a, b):"""计算两个数的和并返回"""result = a + breturn result # 返回计算结果# 调用函数,传入两个实参
sum1 = add(3, 5) # 实参3赋值给a,5赋值给b,返回8
sum2 = add(10, 20) # 返回30print(sum1) # 输出:8
print(sum2) # 输出:30
解析:
- 函数
add
有两个形参a
和b
,分别接收两个加数。 - 函数体计算
a + b
,并通过return result
将结果返回给调用者。 - 调用时,返回值被赋值给变量
sum1
和sum2
,实现了“复用加法逻辑”的目的。
三、函数的返回值:用return传递结果
return
语句用于将函数的计算结果传递给调用者,是函数与外部通信的重要方式。它有以下特性:
- 返回单个值:直接返回一个数据(数字、字符串、列表等)。
- 返回多个值:用逗号分隔多个值,Python会自动将它们封装为元组返回。
- 终止函数执行:
return
语句执行后,函数会立即结束,后续代码不再执行。
1. 返回单个值
最常见的用法,如示例3中的add
函数返回两数之和,或计算圆面积的函数返回面积值。
示例4:计算圆面积的函数(返回单个值)
import math # 导入数学模块,用于获取π值def circle_area(radius):"""根据半径计算圆的面积(πr²)"""if radius < 0:print("错误:半径不能为负数")return None # 返回None表示无效结果area = math.pi * radius **2return area # 返回面积值# 调用函数
area1 = circle_area(2) # 半径为2的圆面积
area2 = circle_area(-1) # 无效半径print(f"半径为2的圆面积:{area1:.2f}") # 输出:12.57(保留2位小数)
print(f"无效半径的返回值:{area2}") # 输出:None
解析:
- 函数首先判断半径是否为负数,若无效则返回
None
(表示“无有效结果”)。 - 有效时计算面积并返回,调用者通过变量接收结果并使用。
return
不仅返回值,还会终止函数(若半径为负,return None
后不会执行面积计算)。
2. 返回多个值
当函数需要返回多个相关结果时(如同时返回两数之和与乘积),可在return
后用逗号分隔多个值,调用者可用多个变量接收(自动解包)。
示例5:返回多个值的函数(求和与乘积)
def calculate(a, b):"""返回a与b的和、差、积"""sum_ab = a + bdiff_ab = a - bproduct_ab = a * breturn sum_ab, diff_ab, product_ab # 返回多个值(自动封装为元组)# 调用函数,用多个变量接收返回值
sum_val, diff_val, product_val = calculate(5, 3)print(f"和:{sum_val}") # 输出:8
print(f"差:{diff_val}") # 输出:2
print(f"积:{product_val}") # 输出:15# 也可以用单个变量接收(得到元组)
results = calculate(4, 2)
print(f"返回的元组:{results}") # 输出:(6, 2, 8)
解析:
return sum_ab, diff_ab, product_ab
实际返回的是一个元组(sum_ab, diff_ab, product_ab)
。- 调用时,
sum_val, diff_val, product_val = ...
会自动解包元组,将三个值分别赋值给变量。 - 若用单个变量接收(如
results
),则变量会存储整个元组,可通过索引访问其中的值(如results[0]
获取和)。
3. 无return语句的函数
若函数没有return
语句,或return
后没有值,则默认返回None
(Python中表示“无”的特殊值)。
def print_greeting():print("Welcome!") # 没有return语句result = print_greeting()
print(f"函数返回值:{result}") # 输出:None
四、函数的调用:执行函数并传递参数
定义函数后,需要通过“函数名(参数)”的方式调用才能执行其功能。调用时,实参的数量和类型需与函数定义的形参匹配(除非使用默认参数等高级特性)。
1. 位置参数:按顺序传递参数
最常用的参数传递方式,实参与形参按位置一一对应。
def describe_person(name, age):"""描述一个人的姓名和年龄"""print(f"{name}今年{age}岁")# 位置参数:第一个实参给name,第二个给age
describe_person("张三", 25) # 输出:张三今年25岁
注意:位置参数必须按顺序传递,否则会导致逻辑错误:
# 错误示例:参数顺序颠倒
describe_person(25, "张三") # 输出:25今年张三岁(逻辑错误)
2. 关键字参数:按名称传递参数
为避免位置错误,可在调用时指定“形参名=实参”,明确参数对应关系,参数顺序可任意。
# 关键字参数:明确指定参数对应的形参
describe_person(age=25, name="张三") # 输出:张三今年25岁(顺序颠倒但结果正确)
适用场景:当函数参数较多时,关键字参数能提高代码可读性,避免因参数顺序错误导致的bug。
3. 函数调用的执行流程
函数调用时,程序的执行流程会发生跳转,具体步骤如下:
- 调用函数时,计算实参的值,传递给对应的形参。
- 程序跳转到函数定义处,执行函数体中的代码。
- 遇到
return
语句时,将返回值传递给调用者,程序跳转回调用位置。 - 若函数体执行完毕仍未遇到
return
,则返回None
,程序跳转回调用位置。
示例6:函数调用流程演示
def multiply(x, y):print("开始计算乘积...")result = x * yprint("计算结束,准备返回结果")return resultprint("程序开始")
product = multiply(3, 4) # 调用函数
print(f"3×4的结果是:{product}")
print("程序结束")
执行流程与输出:
程序开始
开始计算乘积...
计算结束,准备返回结果
3×4的结果是:12
程序结束
解析:
- 程序先执行
print("程序开始")
。 - 调用
multiply(3,4)
时,跳转到函数内,执行打印和计算。 return result
将12返回给product
,程序跳转回调用处。- 继续执行后续的
print
语句。
五、综合案例:自定义数学工具函数
我们通过一个“数学工具”案例,综合应用函数的定义、调用和返回值,实现三个功能:计算绝对值、判断奇偶性、求两数中较大值。
1. 案例代码实现
def absolute_value(num):"""计算一个数的绝对值"""if num < 0:return -num # 负数的绝对值是其相反数else:return num # 非负数的绝对值是自身def is_even(num):"""判断一个数是否为偶数,返回布尔值"""return num % 2 == 0 # 能被2整除则为偶数def max_of_two(a, b):"""返回两个数中较大的那个数"""if a > b:return aelse:return b# 测试函数
if __name__ == "__main__":# 测试绝对值函数print(f"-5的绝对值:{absolute_value(-5)}") # 输出:5print(f"3的绝对值:{absolute_value(3)}") # 输出:3# 测试奇偶性判断print(f"6是否为偶数:{is_even(6)}") # 输出:Trueprint(f"7是否为偶数:{is_even(7)}") # 输出:False# 测试求最大值print(f"4和9中较大的是:{max_of_two(4, 9)}") # 输出:9print(f"10和5中较大的是:{max_of_two(10, 5)}") # 输出:10
2. 案例解析
- 函数封装:每个函数专注于单一功能,代码逻辑清晰,可独立测试和复用。
- 返回值设计:
absolute_value
返回数值(绝对值)。is_even
返回布尔值(True
/False
),适合直接用于条件判断。max_of_two
返回两个数中的较大值,便于后续计算。
- 测试代码:
if __name__ == "__main__":
确保测试代码仅在直接运行该文件时执行,当文件被导入为模块时不执行,符合模块化设计原则。
六、函数的参数默认值(进阶技巧)
为了让函数更灵活,Python允许为参数设置默认值:当调用者未传递该参数时,函数使用默认值;若传递了参数,则覆盖默认值。
def greet(name="Guest"):"""向指定姓名的人打招呼,默认是Guest"""print(f"Hello, {name}!")greet("Alice") # 传递参数,输出:Hello, Alice!
greet() # 未传递参数,使用默认值,输出:Hello, Guest!
注意:带默认值的参数必须放在无默认值参数的后面(否则会报错):
# 正确:无默认值参数在前,有默认值在后
def introduce(name, age=18):print(f"{name}今年{age}岁")# 错误:有默认值参数不能放在无默认值参数前
# def introduce(age=18, name):
# print(f"{name}今年{age}岁") # SyntaxError
七、总结与练习
函数是Python编程的基础组件,本文核心知识点:
- 定义语法:
def 函数名(参数): 函数体 return 返回值
。 - 核心作用:代码复用(避免重复编写)、模块化(拆分复杂逻辑)。
- 参数传递:位置参数(按顺序)和关键字参数(按名称),确保实参与形参匹配。
- 返回值:
return
可返回单个值或多个值(自动封装为元组),无return
则返回None
。 - 执行流程:调用时跳转至函数定义,执行后返回调用位置。
练习题目(从易到难)
- 定义一个无参数函数
print_menu()
,打印餐厅菜单(至少3个菜品)。 - 定义一个带参数的函数
calculate_rect_area(length, width)
,返回长方形的面积。 - 定义一个函数
get_user_info(name, age, city)
,返回一个包含这三个信息的字典。 - 定义一个函数
temperature_convert(celsius, target_unit)
,将摄氏度转换为华氏度(默认)或开尔文度,返回转换后的值(华氏度公式:celsius×1.8+32;开尔文度公式:celsius+273.15)。
通过这些练习,你将逐步掌握函数的灵活应用,为后续学习函数的高级特性(如可变参数、匿名函数)打下基础。