当前位置: 首页 > news >正文

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_hellocalculate_area),见名知意。
  • 参数列表:函数接收的输入值,多个参数用逗号分隔,无参数时留空(())。
  • 函数体:实现函数功能的代码,必须缩进(通常4个空格)。
  • return:可选,用于将结果返回给调用者;若省略,函数默认返回None
  • 文档字符串:用三引号包裹的说明文字,可通过help(函数名)查看,增强代码可读性。

1. 无参数函数:不需要输入的函数

当函数不需要外部输入即可完成功能时,参数列表为空。最典型的例子是打印固定信息的函数。

示例1:定义并调用无参数的say_hello函数

# 定义无参数函数
def say_hello():"""打印Hello, World!"""print("Hello, World!")# 调用函数(函数名+括号)
say_hello()  # 输出:Hello, World!
say_hello()  # 再次调用,输出同样结果

执行流程解析

  1. def say_hello():定义函数:创建一个名为say_hello的函数,无参数,函数体为打印“Hello, World!”。
  2. say_hello()调用函数:程序跳转到函数定义处,执行print语句,然后回到调用位置继续执行。
  3. 再次调用时,重复步骤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有两个形参ab,分别接收两个加数。
  • 函数体计算a + b,并通过return result将结果返回给调用者。
  • 调用时,返回值被赋值给变量sum1sum2,实现了“复用加法逻辑”的目的。

三、函数的返回值:用return传递结果

return语句用于将函数的计算结果传递给调用者,是函数与外部通信的重要方式。它有以下特性:

  1. 返回单个值:直接返回一个数据(数字、字符串、列表等)。
  2. 返回多个值:用逗号分隔多个值,Python会自动将它们封装为元组返回。
  3. 终止函数执行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. 函数调用的执行流程

函数调用时,程序的执行流程会发生跳转,具体步骤如下:

  1. 调用函数时,计算实参的值,传递给对应的形参。
  2. 程序跳转到函数定义处,执行函数体中的代码。
  3. 遇到return语句时,将返回值传递给调用者,程序跳转回调用位置。
  4. 若函数体执行完毕仍未遇到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
  • 执行流程:调用时跳转至函数定义,执行后返回调用位置。

练习题目(从易到难)

  1. 定义一个无参数函数print_menu(),打印餐厅菜单(至少3个菜品)。
  2. 定义一个带参数的函数calculate_rect_area(length, width),返回长方形的面积。
  3. 定义一个函数get_user_info(name, age, city),返回一个包含这三个信息的字典。
  4. 定义一个函数temperature_convert(celsius, target_unit),将摄氏度转换为华氏度(默认)或开尔文度,返回转换后的值(华氏度公式:celsius×1.8+32;开尔文度公式:celsius+273.15)。

通过这些练习,你将逐步掌握函数的灵活应用,为后续学习函数的高级特性(如可变参数、匿名函数)打下基础。


文章转载自:

http://au5z4cnc.Lbgdf.cn
http://a6OJEFqQ.Lbgdf.cn
http://hIJrmiTd.Lbgdf.cn
http://9QpA5SbV.Lbgdf.cn
http://ZZ9Gr501.Lbgdf.cn
http://u6oPFrPP.Lbgdf.cn
http://OysnefzE.Lbgdf.cn
http://buxBWsts.Lbgdf.cn
http://Pnnm0kSO.Lbgdf.cn
http://4JgP8dYg.Lbgdf.cn
http://6g5Q6Rn1.Lbgdf.cn
http://YT9HWl2w.Lbgdf.cn
http://wRUxIFKn.Lbgdf.cn
http://lYWw7pLV.Lbgdf.cn
http://at9mHk6T.Lbgdf.cn
http://d4PrKWOH.Lbgdf.cn
http://428znBfB.Lbgdf.cn
http://6XVygCuD.Lbgdf.cn
http://c1w5dX9c.Lbgdf.cn
http://a7Cq9EN2.Lbgdf.cn
http://x0INrmrj.Lbgdf.cn
http://z3re4jxX.Lbgdf.cn
http://ouT1fz4y.Lbgdf.cn
http://kd6lpFkO.Lbgdf.cn
http://6YnBTcW9.Lbgdf.cn
http://yT8iSVVj.Lbgdf.cn
http://5IJQRDKH.Lbgdf.cn
http://B08fK81l.Lbgdf.cn
http://3IfIhcbu.Lbgdf.cn
http://GbsZIe57.Lbgdf.cn
http://www.dtcms.com/a/382685.html

相关文章:

  • 【系列文章】Linux中的并发与竞争[03]-自旋锁
  • Web前端面试题(1)
  • 海盗王客户端BMP纹理图片解密
  • FreeRTOS 知识点
  • Mac电脑上如何打印出字体图标
  • 2.2顺序表
  • 如何打造高效AI智能体工具
  • 2025智能制造研发效率提升指南:从“项目-流程-数据”闭环看工具选型
  • 【leetcode】5. 最长回文子串
  • 01trie
  • P4342 [IOI 1998] Polygon -普及+/提高
  • 13.ImGui-搭建内部绘制的ImGui项目框架(无消息循环的简单ImGui实例)
  • 工业互联网与数字孪生:解码产业数字化转型的核心支撑
  • 知识库内容冗余重复该怎么办
  • ScreenToGif:一款免费开源的屏幕录制与GIF制作工具
  • XHR与Fetch取消请求的方法及原理深度解析
  • 除了 transformer 还有哪些 新的 神经网络架构
  • 鸿蒙NEXT的Web组件网络安全与隐私保护实践
  • D. Coprime
  • 利用python pandas库清洗病例处方清洗步骤
  • 数据库在并发访问时,不同隔离级别下脏读幻读问题
  • Python核心技术开发指南(065)——with语句
  • Python核心技术开发指南(064)——析构方法
  • 20250913-01: Langchain概念:Runnable可运行接口
  • 记一次谷歌语法获取路径 针对空白页面
  • Java GC:从GC Roots到分代设计的哲学
  • 一款4000℃高温材料设计方案及性能预测
  • 【leetcode】64. 最小路径和
  • 2.10组件间的通信
  • MinerU学习