目录

一、为什么需要函数?

1. 拒绝重复造轮子

2. 让代码像句子一样可读

3. 隔离变化,降低维护成本

二、函数的定义:编写高质量函数的5个要素

基本语法框架

1. 函数命名的黄金法则(PEP8规范)

2. 不可或缺的文档字符串(Docstring)

3. 参数设计的艺术

4. 函数体的单一职责原则

5. 返回值的清晰表达

三、函数调用:3种传递参数的方式

1. 位置参数(最常用)

2. 关键字参数(提升可读性)

3. 混合使用(位置参数在前)

四、形参VS实参:参数的"前世今生"

生动案例:快递柜的故事

参数传递的注意事项

五、实战进阶:温度转换工具函数

六、避坑指南:初学者常犯的5个错误

1. 缩进错误(IndentationError)

2. 参数数量不匹配(TypeError)

3. 忽略返回值

4. 函数名拼写错误

5. 在函数定义前调用函数

七、总结与练习


一、为什么需要函数?

在编程中,函数就像一个"功能盒子"——把重复执行的代码块打包起来,需要时直接"调用"这个盒子即可。想象你每天早上都要做三件事:刷牙、洗脸、吃早餐。如果把这三个动作写成代码,没有函数的话,每次都要重复写三遍相同的步骤;而有了函数,你可以把它们分别定义成brush_teeth()wash_face()eat_breakfast()三个函数,之后只需依次调用这三个函数名即可。

函数的核心目的

  • 代码复用:避免重复编写相同逻辑
  • 模块化:将复杂问题拆解为小任务
  • 可读性:用函数名直接体现代码功能

函数就是代码世界的"工序卡",解决三大核心问题:

1. 拒绝重复造轮子

没有函数的代码:

# 计算三个矩形的面积
print(5*3) # 第一个矩形
print(4*6) # 第二个矩形
print(7*2) # 第三个矩形

有函数的代码:

def calculate_rect_area(width, height):
return width * heightprint(calculate_rect_area(5,3)) # 复用相同逻辑
print(calculate_rect_area(4,6))
print(calculate_rect_area(7,2))

2. 让代码像句子一样可读

# 不好的代码:一堆数字和符号
if score >= 90 and score <= 100:
print("优秀")# 好的代码:函数名即注释
def is_excellent(score):
return 90 <= score <= 100if is_excellent(score):
print("优秀")

3. 隔离变化,降低维护成本

当计算面积的公式需要修改(比如增加单位转换),只需修改函数内部,而不用在代码中到处查找width*height的片段。

二、函数的定义:编写高质量函数的5个要素

基本语法框架

def 函数名(参数列表):"""函数文档字符串(可选但推荐)"""# 函数体(缩进4个空格)return 返回值 # 可选

1. 函数命名的黄金法则(PEP8规范)

  • 全部小写,用下划线分隔:calculate_area ✅,CalculateArea ❌
  • 使用动词或动词短语:get_user_info ✅,user_info ❌
  • 避免单字母命名(除常见约定:i/j循环变量,x/y坐标)

2. 不可或缺的文档字符串(Docstring)

def calculate_circle_area(radius):
"""计算圆的面积参数:
radius (float): 圆的半径,必须大于0返回:
float: 圆的面积(πr²)异常:
ValueError: 当半径为负数时触发
"""
if radius < 0:
raise ValueError("半径不能为负数")
return 3.14159 * radius **2

技巧:在PyCharm等IDE中输入"""按回车,会自动生成文档字符串模板

3. 参数设计的艺术

  • 必要参数:必须传递的参数(如radius
  • 默认参数:带有默认值的参数(def greet(name="Guest")
  • 参数顺序:重要参数放前面,可选参数放后面

4. 函数体的单一职责原则

一个函数只做一件事!以下是反面教材:

def bad_function(user_id):
# 同时做三件事:查询用户、发邮件、记录日志
user = db.query(user_id)
send_email(user.email)
log_activity(user_id)
return user

5. 返回值的清晰表达

  • 始终返回同一类型(避免有时返回列表,有时返回None)
  • 复杂逻辑用多个return提前退出,比嵌套if更清晰:
def get_grade(score):
if score < 0 or score > 100:
return "无效分数" # 提前返回异常情况
if score >= 90:
return "A"
if score >= 80:
return "B"
# ...其他分数段

三、函数调用:3种传递参数的方式

1. 位置参数(最常用)

按参数定义顺序传递:

def divide(dividend, divisor):
return dividend / divisorresult = divide(10, 2) # dividend=10, divisor=2

2. 关键字参数(提升可读性)

明确指定参数名,顺序可以打乱:

result = divide(dividend=10, divisor=2)
# 等价于
result = divide(divisor=2, dividend=10)

3. 混合使用(位置参数在前)

def greet(title, name):
return f"{title}. {name}"greet("Mr", name="Smith") # 正确:位置参数在前
# greet(title="Mr", "Smith") # 错误:关键字参数不能在位置参数前

四、形参VS实参:参数的"前世今生"

维度形参(形式参数)实参(实际参数)
位置函数定义时 def func(x, y)函数调用时 func(3, 5)
本质函数内部的局部变量声明传递给函数的具体值/变量
生命周期函数调用期间存在遵循自身的变量作用域

生动案例:快递柜的故事

  • 形参:快递柜上的"格子A"、"格子B"(定义了存放位置)
  • 实参:你放入格子A的"手机"、格子B的"钥匙"(实际存放的物品)
  • 函数调用:快递柜系统执行"存储(格子A, 手机)"操作

参数传递的注意事项

def add_one(num):
num += 1 # 形参的修改不影响实参x = 5
add_one(x)
print(x) # 输出:5(x的值未改变)

五、实战进阶:温度转换工具函数

让我们构建一个完整的温度转换模块,包含:

  1. 摄氏度转华氏度
  2. 华氏度转摄氏度
  3. 参数验证功能
def celsius_to_fahrenheit(celsius):
"""摄氏度转华氏度 (°F = °C × 9/5 + 32)"""
if not isinstance(celsius, (int, float)):
raise TypeError("温度必须是数字")
if celsius < -273.15:
raise ValueError("温度不能低于绝对零度(-273.15°C)")
return celsius * 9/5 + 32def fahrenheit_to_celsius(fahrenheit):
"""华氏度转摄氏度 (°C = (°F - 32) × 5/9)"""
if not isinstance(fahrenheit, (int, float)):
raise TypeError("温度必须是数字")
if fahrenheit < -459.67:
raise ValueError("温度不能低于绝对零度(-459.67°F)")
return (fahrenheit - 32) * 5/9# 使用示例
try:
temp_f = celsius_to_fahrenheit(25)
print(f"25°C = {temp_f:.1f}°F") # 输出:25°C = 77.0°Ftemp_c = fahrenheit_to_celsius(77)
print(f"77°F = {temp_c:.1f}°C") # 输出:77°F = 25.0°C
except (TypeError, ValueError) as e:
print(f"转换失败:{e}")

六、避坑指南:初学者常犯的5个错误

1. 缩进错误(IndentationError)

def my_func():
print("Hello") # 错误:函数体没有缩进

2. 参数数量不匹配(TypeError)

def add(a, b):
return a + badd(1) # 错误:缺少1个位置参数

3. 忽略返回值

def calculate_sum(a, b):
result = a + b # 错误:没有return语句total = calculate_sum(3, 5)
print(total) # 输出:None

4. 函数名拼写错误

def print_greeting():
print("Hello")print_greetng() # 错误:函数名拼写错误(少了一个i)

5. 在函数定义前调用函数

my_func() # 错误:调用时函数还未定义def my_func():
print("Hello")

七、总结与练习

函数是编程的基础模块,掌握其定义规范、调用逻辑和参数传递机制,是写出简洁、高效、可维护代码的关键。后续将深入学习参数进阶用法(默认参数、不定长参数等)和函数作用域,进一步提升代码灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89332.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89332.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89332.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过轮询方式使用LoRa DTU有什么缺点?

在物联网系统中&#xff0c;DTU&#xff08;Data Transfer Unit&#xff09;通常用于通过485或M-Bus等接口抄读子设备的数据&#xff0c;并将这些数据传输到平台侧。然而&#xff0c;如果DTU采用轮询方式与平台通信&#xff0c;会带来一系列问题&#xff0c;尤其是在功耗和系统…

Syntax Error: Error: PostCSS received undefined instead of CSS string

报错&#xff1a;Syntax Error: Error: PostCSS received undefined instead of CSS string npm rebuild node-sass报错&#xff1a;npm i canvas 报错 canvas2.11.2 run install node-pre-gyp install --fallback-to-build --update-binary npm install canvas --canvas_binar…

人工智能之数学基础:概率论和数理统计在机器学习的地位

概率和统计的概念概率统计是各类学科中唯一一门专门研究随机现象的规律性的学科&#xff0c;随机现象的广泛性决定了这一学科的重要性。概率论是数学的分支&#xff0c;它研究的是如何定量描述随机现象及其规律。我们之前经常在天气软件上看到&#xff1a;“今天下雨的概率是95…

第十四章 Stream API

JAVA语言引入了一个流式Stream API,这个API对集合数据进行操作&#xff0c;类似于使用SQL执行的数据库查询&#xff0c;同样可以使用Stream API并行执行操作。Stream和Collection的区别Collection:静态的内存数据结构&#xff0c;强调的是数据。Stream API:和集合相关的计算操作…

Oracle数据库各版本间的技术迭代详解

今天我想和大家聊聊一个我们可能每天都在用&#xff0c;但未必真正了解的技术——Oracle数据库的版本。如果你是企业的IT工程师&#xff0c;可能经历过“升级数据库”的头疼&#xff1b;如果你是业务负责人&#xff0c;可能疑惑过“为什么一定要换新版本”&#xff1b;甚至如果…

论文reading学习记录3 - weekly - 模块化视觉端到端ST-P3

文章目录前言一、摘要与引言二、Related Word2.1 可解释的端到端架构2.2 鸟瞰图2.3 未来预测2.4 规划三、方法3.1 感知bev特征积累3.1.1 空间融合&#xff08;帧的对齐&#xff09;3.1.2 时间融合3.2 预测&#xff1a;双路径未来建模3.3 规划&#xff1a;先验知识的整合与提炼4…

crawl4ai--bitcointalk爬虫实战项目

&#x1f4cc; 项目目标本项目旨在自动化抓取 Bitcointalk 论坛中指定板块的帖子数据&#xff08;包括主贴和所有回复&#xff09;&#xff0c;并提取出结构化信息如标题、作者、发帖时间、用户等级、活跃度、Merit 等&#xff0c;以便进一步分析或使用。本项目只供科研学习使用…

调用 System.gc() 的弊端及修复方式

弊端分析不可控的执行时机System.gc() 仅是 建议 JVM 执行垃圾回收&#xff0c;但 JVM 可自由忽略该请求&#xff08;尤其是高负载时&#xff09;。实际回收时机不确定&#xff0c;无法保证内存及时释放。严重的性能问题Stop-The-World 停顿&#xff1a;触发 Full GC 时会暂停所…

git merge 和 git rebase 的区别

主要靠一张图&#xff1a;区别 git merge git checkout feature git merge master此时在feature上git会自动产生一个新的commit 修改的是当前分支 feature。 git rebase git checkout feature git rebase master&#xff08;在feature分支上执行&#xff0c;修改的是master分支…

Java学习--JVM(2)

JVM提供垃圾回收机制&#xff0c;其也是JVM的核心机制&#xff0c;其主要是实现自动回收不再被引用的对象所占用的内存&#xff1b;对内存进行整理&#xff0c;防止内存碎片化&#xff1b;以及对内存分配配进行管理。JVM 通过两种主要算法判断对象是否可回收&#xff1a;引用计…

用大模型(qwen)提取知识三元组并构建可视化知识图谱:从文本到图谱的完整实现

引言 知识图谱作为一种结构化的知识表示方式&#xff0c;在智能问答、推荐系统、数据分析等领域有着广泛应用。在信息爆炸的时代&#xff0c;如何从非结构化文本中提取有价值的知识并进行结构化展示&#xff0c;是NLP领域的重要任务。知识三元组&#xff08;Subject-Relation-O…

(附源码)基于 Go 和 gopacket+Fyne 的跨平台网络抓包工具开发实录

基于 Go 和 gopacket Fyne 的跨平台网络抓包工具开发实录 一、项目背景 在网络安全、协议分析、运维排查等场景中&#xff0c;抓包工具是不可或缺的利器。Wireshark 虽然功能强大&#xff0c;但对于部分初学者或有定制需求的开发者来说&#xff0c;学习曲线较陡&#xff0c;且…

Langchain和Faiss搭建本地知识库对比

对比 对比维度及优缺点分析对比维度LangChain&#xff08;封装 FAISS&#xff09;直接使用 FAISS易用性✅ 高&#xff0c;提供高级封装&#xff0c;简化开发流程❌ 中等&#xff0c;需要熟悉 FAISS API学习成本✅ 低&#xff0c;适合快速开发❌ 高&#xff0c;需要掌握 FAISS 的…

Java常用命令汇总

JDK 工具命令jps&#xff08;Java Virtual Machine Process Status Tool&#xff09;命令示例&#xff1a;jps -l 应用场景&#xff1a;列出当前系统中所有Java进程的PID和主类名&#xff0c;常用于快速定位Java应用的进程ID。javac&#xff08;Java Compiler&#xff09;命令示…

Llama 2:开放基础模型与微调聊天模型

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" Llama 2&#xff1a;开放基础模型与微调聊天模型 摘要 在本研究中&#xff0c;我们开发并发布了 Llama 2&#xff0c;一组预训练和微调的大型语言模型&#xff08;LLMs&#xff09;&#xff0c;其规模从 70 亿参…

ThinkPHP 8 在 Apache 下启用伪静态

ThinkPHP 8 在 Apache 下启用伪静态&#xff0c;需要配置 .htaccess 文件并确保 Apache 支持 URL 重写。以下是详细设置步骤&#xff1a;1. 启用 Apache 重写模块首先确保 Apache 的 mod_rewrite 模块已启用。编辑 Apache 配置文件&#xff08;通常是 /etc/apache2/apache2.con…

Android开发中Retrofit使用方法与底层原理详解

Retrofit 是 Android 开发中一个 类型安全、基于注解、高度解耦 的 RESTful HTTP 客户端库&#xff0c;由 Square 公司开发。它极大地简化了 Android 应用与 Web 服务进行网络交互的过程。 核心价值&#xff1a; 声明式 API 定义&#xff1a; 使用 Java/Kotlin 接口和注解描述 …

基于FPGA的IIC控制EEPROM读写(2)

基于FPGA的IIC控制EEPROM读写 文章目录基于FPGA的IIC控制EEPROM读写一、EEPROM简介二、代码实现——个人理解1、状态机2、仿真效果3、上板验证4、代码top.viic_master.vuart三、代码实现——复用性较高的IIC模块1、框架设计2、状态机设计3、仿真效果4、上板验证5、代码top.viic…

C# 界面程序在23H2型号系统中无法退出

20250716记录 环境&#xff1a;c# winform问题描述&#xff1a;主界面退出直接使用了Environment.Exit(0); 程序假死&#xff0c;无法关闭解决措施&#xff1a;//使用 this.Close();以下代码目标&#xff1a;执行完程序自身后&#xff0c;删除指定文件&#xff08;可用于程序文…

Kafka——集群核心参数配置

引言在分布式系统中&#xff0c;Kafka 凭借其高吞吐量、低延迟和强大的扩展性&#xff0c;成为数据管道和流处理的首选解决方案。然而&#xff0c;要充分发挥 Kafka 的性能和稳定性&#xff0c;正确配置集群参数至关重要。为什么参数配置如此重要&#xff1f;Kafka 的参数配置直…