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

Python:第8天:函数(上)—— 把重复代码打包成“积木块”

🎯 今日目标

  • 理解函数的作用(代码复用、模块化)

  • 学会定义和调用函数

  • 掌握带参数的函数(给函数“喂”数据)

  • 掌握带返回值的函数(让函数“吐”结果)

  • 理解returnprint的区别

  • 理解局部变量和全局变量的区别


🧱 一、为什么要用函数?

不用函数的问题:

python

# 计算三个圆的面积 r1 = 3 area1 = 3.14 * r1 * r1 print(f"半径{r1}的圆面积: {area1}") r2 = 5 area2 = 3.14 * r2 * r2 print(f"半径{r2}的圆面积: {area2}") r3 = 7 area3 = 3.14 * r3 * r3 print(f"半径{r3}的圆面积: {area3}")

如果算100个圆,代码会变得又臭又长,而且如果要把圆周率从3.14改成3.14159,得改100个地方。

用函数解决问题:

python

def calc_area(r): area = 3.14 * r * r return area # 调用3次 print(calc_area(3)) print(calc_area(5)) print(calc_area(7))

只需要把公式写一遍,后面随时调用。这就是代码复用

💡 编程有一个重要原则叫DRY(Don't Repeat Yourself)—— 不要重复自己。函数是实现DRY的核心工具。


🏗️ 二、定义和调用函数

2.1 基本语法

python

def 函数名(): 函数内部要执行的代码
  • def是关键字,表示“定义”

  • 函数名后面要有括号()和冒号:

  • 函数体要缩进

2.2 最简单的例子:打招呼

python

# 定义函数 def say_hello(): print("你好!欢迎来到Python世界!") # 调用函数 say_hello() say_hello()

运行结果:

text

你好!欢迎来到Python世界! 你好!欢迎来到Python世界!

💡 定义函数时不会执行代码,只有调用时才会执行。就像你盖好了房子(定义),住进去才叫使用(调用)。

2.3 函数必须先定义,后调用

python

# 错误示例:先调用后定义 greet() # 报错:函数还没定义 def greet(): print("Hello")

报错:

text

NameError: name 'greet' is not defined

📥 三、带参数的函数(输入)

函数通常需要接收一些数据才能工作,这些数据叫参数

3.1 一个参数

python

def greet(name): print(f"你好,{name}!") greet("张三") greet("李四")

运行结果:

text

你好,张三! 你好,李四!

3.2 多个参数

python

def introduce(name, age, city): print(f"我叫{name},今年{age}岁,来自{city}。") introduce("小明", 18, "北京") introduce("小红", 20, "上海")

运行结果:

text

我叫小明,今年18岁,来自北京。 我叫小红,今年20岁,来自上海。

💡 参数按位置一一对应:第一个参数对应第一个值,第二个对应第二个值。


📤 四、带返回值的函数(输出)

有些函数只负责做事(比如打印),但更多时候我们需要函数返回一个结果,供后续使用。这时要用return

4.1return的基本用法

python

def add(a, b): result = a + b return result # 调用函数,拿到返回值 sum1 = add(3, 5) print(sum1) # 8 # 也可以直接用在表达式中 sum2 = add(10, 20) + 100 print(sum2) # 130

4.2 没有return的函数返回什么?

如果没有return,函数默认返回None(代表“空”)。

python

def say_hello(name): print(f"你好,{name}") result = say_hello("张三") print(result) # None

运行结果:

text

你好,张三 None

4.3returnprint的区别(非常重要!)

这是新手最容易混淆的两个概念:

returnprint
作用把值传回给调用者把值显示在屏幕上(给人看)
后续能否使用✅ 能被变量接收,继续计算❌ 显示后就没了,无法继续使用

python

# return:结果可以继续使用 def add_return(a, b): return a + b result = add_return(3, 5) print(result * 2) # 16(拿到了返回值,继续乘以2) # print:结果只能在屏幕上看一眼 def add_print(a, b): print(a + b) result = add_print(3, 5) print(result) # None(函数没有返回,拿不到值)

💡记住这个口诀print是给人看的,return是给程序用的。


🔧 五、默认参数值

有时候我们希望参数有一个“默认值”,如果调用时没传这个参数,就用默认的。

python

def greet(name, greeting="你好"): print(f"{greeting},{name}!") greet("张三") # 使用默认的"你好" greet("李四", "早上好") # 使用自定义的"早上好"

运行结果:

text

你好,张三! 早上好,李四!

💡 带默认值的参数必须放在最后面def greet(greeting="你好", name):这样写会报错。

实际应用:日期格式化

python

def format_date(year, month, day, separator="-"): return f"{year}{separator}{month}{separator}{day}" print(format_date(2025, 6, 18)) # 2025-6-18(默认用-) print(format_date(2025, 6, 18, "/")) # 2025/6/18 print(format_date(2025, 6, 18, ".")) # 2025.6.18

🔍 六、变量的作用域(局部 vs 全局)

6.1 局部变量

函数内部定义的变量叫局部变量,只能在函数内部使用。

python

def test(): x = 10 # 局部变量 print(x) # 可以在函数内部访问 test() print(x) # 报错!函数外部访问不到 x

报错:

text

NameError: name 'x' is not defined

6.2 全局变量

函数外部定义的变量叫全局变量,可以在任何地方访问(读取)。

python

name = "全局的小明" # 全局变量 def show_name(): print(name) # 函数内部可以读取全局变量 show_name() # 全局的小明 print(name) # 全局的小明(函数外部也能访问)

6.3 在函数内部修改全局变量(global

如果在函数内部想修改全局变量,需要用global声明。

python

count = 0 # 全局变量 def increment(): global count # 声明要修改全局变量 count += 1 increment() increment() print(count) # 2

⚠️尽量少用global。过度使用会让代码变得混乱(你不知道哪个函数在哪改了全局变量)。一个更好的做法是把值通过参数传进去,通过return传出来。

python

# 推荐做法:不修改全局变量,而是返回新值 def increment(n): return n + 1 count = 0 count = increment(count) count = increment(count) print(count) # 2

🧪 七、综合示例:简单计算器

python

# 第8天综合示例:简单的四则运算函数 def add(a, b): return a + b def subtract(a, b): return a - b def multiply(a, b): return a * b def divide(a, b): if b == 0: return "错误:除数不能为0" return a / b # 使用函数 print("=== 简单计算器 ===") x = 10 y = 3 print(f"{x} + {y} = {add(x, y)}") print(f"{x} - {y} = {subtract(x, y)}") print(f"{x} × {y} = {multiply(x, y)}") print(f"{x} ÷ {y} = {divide(x, y)}") # 测试除0情况 print(divide(10, 0))

运行结果:

text

=== 简单计算器 === 10 + 3 = 13 10 - 3 = 7 10 × 3 = 30 10 ÷ 3 = 3.3333333333333335 错误:除数不能为0

🐛 八、新手常见错误及解决

错误现象错误代码示例解决方法
NameError: function not defined在函数定义之前调用把调用代码移到函数定义后面
SyntaxError: invalid syntax忘了写冒号:def my_func():
IndentationError函数体没有缩进在函数体内按Tab或4个空格
函数返回None但不是预期结果函数里只有print没有returnreturn返回结果
UnboundLocalError在函数内给全局变量赋值但没声明global加上global 变量名或用参数传递
参数顺序写错introduce("北京", "小明")检查定义时的顺序,或使用关键字参数

错误演示:忘记return

python

def double(n): result = n * 2 # 忘记写 return result value = double(5) print(value) # None

🎯 今日总结

今天你学会了:

  • 函数的作用:代码复用、模块化

  • def定义函数

  • 带参数的函数(传递数据进去)

  • 带返回值的函数(用return把结果传出来)

  • returnprint的区别(重要!)

  • 默认参数值

  • 局部变量和全局变量的区别

http://www.jsqmd.com/news/1039419/

相关文章:

  • OpenCore Legacy Patcher:完整技术解析与老旧Mac现代化升级指南
  • 互联网大厂Java岗招聘需求已经变了!
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的引流爆款设计策略研究
  • 【CW32无线抄表项目】模拟电压(VC)比较器
  • Microchip嵌入式开发资源全攻略:从官方工具链到智能小车实战
  • 3 分钟上手!OpenClaw 自动化工具一键部署全流程
  • 2026年6月最新!杭州本地GEO 优化推荐:这几家做生成式引擎优化更专业 - 936品牌测评网
  • 2026年新消息发布:面向未来的植草砖品牌选型全攻略 - 品牌鉴赏官2026
  • 生成式模型不适合分类?任务错配的底层原理与工程对策
  • 2026西宁防水补漏靠谱服务商盘点:屋面/厨卫/外墙/地下室渗水维修详解,适配青藏高原高寒大风强紫外线甄选指南 - 宅安选房屋修缮
  • 2026黄岛街道专业的空调加氟服务公司口碑推荐榜单 - 品牌排行榜
  • 最终验证和AI重点测试:项目开发周期的最终环节
  • 算法优化中的分支预测与流水线设计的技术8
  • 模型部署方案:Triton Inference Server 与 FastAPI 的选型对比与混合架构
  • Unity 协程 vs FastAPI 协程:深度对比与原理详解
  • 2026评价高的张家港资质代办公司推荐哪家强 - 品牌排行榜
  • 2026年杭州地区GEO优化服务商实力榜单|本地企业生成式搜索优化首选指南 - 936品牌测评网
  • 2026河源防水补漏靠谱服务商盘点:屋面/厨卫/外墙/地下室渗水维修详解,适配粤北东江沿岸高湿回南天山体渗水防潮甄选指南 - 宅安选房屋修缮
  • 【零基础】AI大模型Agent完整学习路线!
  • NCNN 边缘推理:模型转换到 ARM NEON 优化的实践
  • 2026娄底防水补漏靠谱服务商盘点:屋面/厨卫/外墙/地下室渗水维修详解,适配湘中丘陵梅雨高湿防潮防冻甄选指南 - 宅安选房屋修缮
  • 浏览器用户画像分析大屏搭建——从布局到交互
  • 2026年浙江GEO优化服务商推荐:这5家AI搜索排名机构值得选 - 936品牌测评网
  • AI辅助前端监控:从异常采集到智能根因定位的体系构建
  • 上海婚姻纠纷律所榜单:五家专业靠谱机构实务能力与服务特色全解析 - 外贸老黄
  • OpenProject深度解析:开源项目管理平台的架构设计与企业级实践指南
  • 专业的专利律所哪家权威?2026年行业选择参考 - 品牌排行榜
  • 7144个Linux命令离线查!全平台Linux命令库深度解析与实战指南
  • 供应链规则引擎应用:JVS-Rules实现动态供应商评分
  • 嵌入式高精度低功耗ADC选型与应用:Sigma-Delta架构与TC3405实战