Python:第8天:函数(上)—— 把重复代码打包成“积木块”
🎯 今日目标
理解函数的作用(代码复用、模块化)
学会定义和调用函数
掌握带参数的函数(给函数“喂”数据)
掌握带返回值的函数(让函数“吐”结果)
理解
return和print的区别理解局部变量和全局变量的区别
🧱 一、为什么要用函数?
不用函数的问题:
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.3return和print的区别(非常重要!)
这是新手最容易混淆的两个概念:
return | print | |
|---|---|---|
| 作用 | 把值传回给调用者 | 把值显示在屏幕上(给人看) |
| 后续能否使用 | ✅ 能被变量接收,继续计算 | ❌ 显示后就没了,无法继续使用 |
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(函数没有返回,拿不到值)
💡记住这个口诀:
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没有return | 用return返回结果 |
UnboundLocalError | 在函数内给全局变量赋值但没声明global | 加上global 变量名或用参数传递 |
| 参数顺序写错 | introduce("北京", "小明") | 检查定义时的顺序,或使用关键字参数 |
错误演示:忘记return
python
def double(n): result = n * 2 # 忘记写 return result value = double(5) print(value) # None
🎯 今日总结
今天你学会了:
函数的作用:代码复用、模块化
用
def定义函数带参数的函数(传递数据进去)
带返回值的函数(用
return把结果传出来)return和print的区别(重要!)默认参数值
局部变量和全局变量的区别
