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

Python核心技术开发指南(033)——函数的嵌套


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

在这里插入图片描述

一、函数嵌套调用的基本语法

函数嵌套调用指的是在一个函数的函数体内部,调用另一个已定义的函数。其基本语法结构如下:

def 函数A():# 函数A的功能实现函数B()  # 在函数A内部调用函数B# 函数A的其他功能实现def 函数B():# 函数B的功能实现# 调用外层函数
函数A()

在上述结构中,函数A被称为外层函数,函数B被称为内层被调用函数。当执行函数A时,程序会在遇到函数B调用的位置暂停函数A的执行,转而执行函数B;函数B执行完毕后,程序会返回到函数A中函数B调用的位置,继续执行函数A的后续代码。

二、函数嵌套调用的示例描述与实现

示例1:数学运算中的嵌套调用

示例描述:定义两个函数,square函数用于计算一个数的平方,sum_of_squares函数用于计算两个数的平方和,其中sum_of_squares函数内部嵌套调用square函数。

示例实现

def square(x):"""计算一个数的平方"""return x **2def sum_of_squares(a, b):"""计算两个数的平方和,嵌套调用square函数"""# 嵌套调用square函数计算a的平方square_a = square(a)# 嵌套调用square函数计算b的平方square_b = square(b)return square_a + square_b# 调用外层函数sum_of_squares
result = sum_of_squares(3, 4)
print(f"3的平方与4的平方之和为:{result}")  # 输出:3的平方与4的平方之和为:25

说明sum_of_squares函数通过两次嵌套调用square函数,分别获取3和4的平方值,再将其相加得到结果25。

示例2:文本处理中的嵌套调用

示例描述:定义三个函数,capitalize_first函数用于将字符串首字母大写,trim_whitespace函数用于去除字符串首尾空格,process_text函数用于对文本进行综合处理(先去除空格,再首字母大写),其中process_text函数嵌套调用前两个函数。

示例实现

def capitalize_first(s):"""将字符串的首字母大写,其余字母小写"""if len(s) == 0:return sreturn s[0].upper() + s[1:].lower()def trim_whitespace(s):"""去除字符串首尾的空格"""return s.strip()def process_text(text):"""综合处理文本:先去除空格,再首字母大写"""# 第一步:嵌套调用trim_whitespace去除空格trimmed_text = trim_whitespace(text)# 第二步:嵌套调用capitalize_first处理首字母processed_text = capitalize_first(trimmed_text)return processed_text# 测试不同输入的处理结果
print(process_text("   hello world   "))  # 输出:Hello world
print(process_text("  python programming  "))  # 输出:Python programming
print(process_text("   "))  # 输出:(空字符串)

说明process_text函数通过嵌套调用两个专用函数,分步骤完成文本处理,使代码逻辑清晰,每个函数仅负责单一功能,便于维护和扩展。

示例3:流程控制中的多层嵌套调用

示例描述:定义四个函数,log_action函数用于记录操作日志,validate_input函数用于验证输入是否为正整数,calculate_factorial函数用于计算正整数的阶乘,process_factorial函数作为外层函数,依次嵌套调用前三个函数完成"输入验证→计算阶乘→记录日志"的完整流程。

示例实现

def log_action(message):"""记录操作日志,在消息前添加时间标识"""import timetimestamp = time.strftime("%H:%M:%S", time.localtime())return f"[{timestamp}] 操作日志:{message}"def validate_input(n):"""验证输入是否为正整数,返回验证结果(布尔值)和提示信息"""if not isinstance(n, int):return False, "输入必须是整数"if n <= 0:return False, "输入必须是正整数"return True, "输入有效"def calculate_factorial(n):"""计算正整数n的阶乘"""result = 1for i in range(1, n + 1):result *= ireturn resultdef process_factorial(num):"""处理阶乘计算的完整流程:验证输入→计算阶乘→记录日志"""# 第一层嵌套:验证输入is_valid, msg = validate_input(num)if not is_valid:# 嵌套调用日志函数记录错误信息return log_action(f"阶乘计算失败:{msg}")# 第二层嵌套:计算阶乘factorial = calculate_factorial(num)# 第三层嵌套:记录成功日志return log_action(f"{num}的阶乘为{factorial},计算成功")# 测试不同输入的处理结果
print(process_factorial(5))   # 输出:[当前时间] 操作日志:5的阶乘为120,计算成功
print(process_factorial(-3))  # 输出:[当前时间] 操作日志:阶乘计算失败:输入必须是正整数
print(process_factorial(3.5)) # 输出:[当前时间] 操作日志:阶乘计算失败:输入必须是整数

说明:该示例展示了多层嵌套调用的场景,process_factorial函数通过三次嵌套调用,将复杂流程分解为独立的验证、计算和日志记录步骤。

示例4:图形绘制中的嵌套调用

示例描述:定义两个函数,draw_line函数用于绘制指定长度和字符的直线,draw_rectangle函数用于绘制矩形,其中draw_rectangle函数多次嵌套调用draw_line函数绘制矩形的上下边和侧边。

示例实现

def draw_line(length, char):"""绘制一条由指定字符组成的、指定长度的直线"""if length <= 0:returnprint(char * length)def draw_rectangle(width, height, border_char):"""绘制矩形,嵌套调用draw_line函数绘制各边"""if width < 2 or height < 2:print("矩形的宽和高必须至少为2")return# 绘制上边框draw_line(width, border_char)# 绘制侧边(中间部分)for _ in range(height - 2):# 侧边由一个边框字符、中间空格和另一个边框字符组成print(border_char + " " * (width - 2) + border_char)# 绘制下边框draw_line(width, border_char)# 调用函数绘制不同的矩形
print("3x5的矩形:")
draw_rectangle(3, 5, "*")print("\n6x4的矩形:")
draw_rectangle(6, 4, "#")print("\n无效尺寸的矩形:")
draw_rectangle(1, 3, "*")  # 输出:矩形的宽和高必须至少为2

运行结果

3x5的矩形:
***
* *
* *
* *
***6x4的矩形:
######
#    #
#    #
######无效尺寸的矩形:
矩形的宽和高必须至少为2

说明draw_rectangle函数通过嵌套调用draw_line函数绘制上下边框,使代码避免了重复编写绘制直线的逻辑,同时将矩形绘制的整体逻辑与直线绘制的细节逻辑分离。

三、函数嵌套调用的执行流程总结

函数嵌套调用的执行遵循"先进后出"的原则:

  1. 程序执行外层函数时,遇到内层函数调用即暂停外层函数的执行。
  2. 转入执行内层函数,若内层函数中还有更深层次的函数调用,则重复步骤1。
  3. 最内层函数执行完毕后,返回其结果到上一层函数的调用位置,恢复该层函数的执行。
  4. 依次类推,直至外层函数执行完毕,返回最终结果。
http://www.dtcms.com/a/361865.html

相关文章:

  • matlab扫雷小游戏
  • 计算机组成原理易混知识点
  • Python3环境搭建教程 - 使用Conda工具
  • Chrome 如何清除浏览器缓存
  • MinerU环境部署
  • (Arxiv-2025)HunyuanCustom:一种面向多模态驱动的定制化视频生成架构
  • Cesium 加载桥梁3DTiles数据时,出现部分区域发暗、部分正常的现象
  • 汽车曲柄连杆机构cad+ea113+设计说明书
  • 零跑汽车8月交付57066台,同比增长超88%
  • 微算法科技(NASDAQ:MLGO)张量网络与机器学习融合,MPS分类器助力顶夸克信号识别
  • 后端Web实战-多表操作员工列表查询
  • Java基础第8天总结(map遍历、Stream流)
  • ES6新特性:JavaScript的进化装备箱[特殊字符]
  • 「日拱一码」076 深度学习——自然语言处理NLP
  • vue动态(自适应定位)表格
  • ansible临时命令实验题
  • 自动化运维-ansible中的管理机密
  • Ansible之playbook剧本
  • Docker镜像安全守护神HarborGuard
  • Shell编程入门指南
  • apollo学习之纳什均衡求解最优策略
  • MySQL 中 InnoDB 引擎的事务隔离级别与“可重复读”隔离级别下的 SQL 编写规范
  • 2025 中国算力大会精彩回顾:算力驱动未来,液冷引领革新
  • 从 Oracle 到 TiDB,通过ETL工具,高效实现数据拉通
  • HarvardX TinyML小笔记2(番外3:数据工程)(TODO)
  • 【C++游记】AVL树
  • 通过 select into outfile / load data infile 进行数据导入导出学习笔记
  • 【网络安全入门基础教程】网络安全就业方向(非常详细)零基础入门到精通,收藏这篇就够了
  • three.js+WebGL踩坑经验合集(10.2):镜像问题又一坑——THREE.InstancedMesh的正反面向光问题
  • 亥姆霍兹线圈和放载流线圈