当前位置: 首页 > 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.xdnf.cn/news/1419229.html

相关文章:

  • 【LeetCode 热题 100】5. 最长回文子串——中心扩散法
  • 数组基础及原理
  • NoteGen – 跨平台 AI 笔记应用,支持截图、插图和文本输入记录方式
  • 从零开始学习n8n-定时器+HTTP+飞书多维表格(下)
  • 在 Halo 中导入 Markdown 和 Word 文档
  • Go语言入门学习笔记
  • React前端开发笔记合集
  • Go 语言 sync 包解析
  • 三消消乐益智小游戏抖音快手微信小程序看广告流量主开源
  • 前端安全防护深度实践:从XSS到CSRF的完整安全解决方案
  • 大模型落地:从微调到部署的全景式实战指南
  • DAY02:【DL 第一弹】pytorch
  • 宋红康 JVM 笔记 Day09|方法区
  • 【阿里云实战】基于MQTT的Java SDK收发消息-终端和终端消息收发
  • 汽车曲柄连杆机构cad+ea113+设计说明书
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第八章知识点问答(18题)
  • 从理论到RTL,实战实现高可靠ECC校验(附完整开源代码/脚本)(3) RTL实现实战
  • DBeaver社区版AI助手(AI Assistant)设置
  • 基于Hadoop与层次聚类技术的电子游戏销售分析系统的设计与实现
  • 机器翻译:python库PyGTranslator的详细使用
  • (论文速读)3DTopia-XL:高质量3D资产生成技术
  • FOUPK3云服务平台旗下产品
  • ARM-进阶汇编指令
  • linux安装gitlab详细教程,本地管理源代码
  • 存储掉电强制拉库引起ORA-01555和ORA-01189/ORA-01190故障处理---惜分飞
  • 英伟达Newton与OpenTwins如何重构具身智能“伴随式数采”范式
  • 【ElasticSearch实用篇-04】Boost权重底层原理和基本使用
  • Ruoyi项目MyBatis升级MyBatis-Plus指南
  • linux:离线/无网环境安装docker
  • 从Java全栈开发到微服务架构:一次真实的面试实录