【Python入门系列】第8讲:Python中的函数全面详解(2026最新版)
函数是Python中最重要的代码组织方式。
学会函数,你就从“写一堆散乱代码”升级到“写可复用、可维护的专业代码”。
这一讲我们把函数的所有核心知识一次性讲透,包括参数、返回值、作用域,以及我们之前单独讲过的闭包基础。
1. 什么是函数?为什么需要函数?
函数就是一个可重复使用的代码块,它接收输入(参数),执行特定任务,返回输出(返回值)。
好处:
- 避免重复代码(DRY原则)
- 让代码结构清晰、易读
- 便于测试和维护
- 支持团队协作
定义语法:
def 函数名(参数列表):
"""文档字符串(可选,但强烈推荐)"""
# 函数体
return 返回值 # 可选,没有return默认返回None
2. 函数定义与调用基础
def greet(name):
"""向用户问好"""
print(f"你好,{name}!欢迎学习Python!")
# 调用函数
greet("重阳")
greet("小明")
带返回值的函数:
def add(a, b):
"""返回两个数的和"""
return a + b
result = add(10, 20)
print(result) # 30
3. 函数参数的四种传递方式(超级重要!)
(1)位置参数(最常见)
def power(base, exponent):
return base ** exponent
print(power(2, 3)) # 8
(2)默认参数(给参数设置默认值)
def greet(name, greeting="你好"):
print(f"{greeting},{name}!")
greet("重阳") # 你好,重阳!
greet("小红", "早上好") # 早上好,小红!
默认参数规则:
- 默认参数必须放在非默认参数之后
- 默认参数只在函数定义时计算一次(避免使用可变对象作为默认值!)
(3)关键字参数(显式指定参数名)
def student_info(name, age, city):
print(f"姓名:{name},年龄:{age},城市:{city}")
student_info(age=25, city="Brussels", name="重阳") # 顺序可以打乱
(4)可变参数(*args 和 **kwargs)
# *args:接收任意数量的位置参数 → 元组
def add_all(*args):
return sum(args)
print(add_all(1, 2, 3, 4, 5)) # 15
# **kwargs:接收任意数量的关键字参数 → 字典
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="重阳", age=25, city="Brussels")
组合顺序必须是:def func(普通参数, 默认参数, *args, **kwargs)
4. return 语句
- 一个函数可以有多个
return,但执行到第一个就会立即结束 - 没有
return或只写return时,返回None
def divide(a, b):
if b == 0:
return None # 提前返回
return a / b
5. 变量作用域(Scope)
x = 100 # 全局变量
def func():
y = 200 # 局部变量
global x # 声明使用全局变量
x = 300
print(x, y)
func()
print(x) # 300
# print(y) # 报错,y是局部变量
LEGB规则(查找顺序):
Local(局部) → Enclosing(闭包外层) → Global(全局) → Builtin(内置)
6. 嵌套函数 + 闭包(我们之前讲过的内容复习)
def make_counter():
count = 0
def counter():
nonlocal count # 修改外层变量必须声明
count += 1
return count
return counter
c1 = make_counter()
print(c1()) # 1
print(c1()) # 2
7. 文档字符串(docstring)最佳实践
def calculate_bmi(weight, height):
"""
计算BMI指数
参数:
weight: 体重(公斤)
height: 身高(米)
返回:
BMI数值(保留2位小数)
"""
bmi = weight / (height ** 2)
return round(bmi, 2)
help(calculate_bmi) # 可以查看文档
8. 综合实战 —— 改进版猜数字游戏(使用函数)
import random
def play_guess_game():
"""一个完整的猜数字游戏"""
answer = random.randint(1, 100)
attempts = 0
max_attempts = 10
print("=== 猜数字游戏 ===")
print(f"我在1-100之间想了一个数字,你有{max_attempts}次机会!")
while attempts < max_attempts:
try:
guess = int(input(f"第{attempts+1}次猜测:"))
attempts += 1
if guess < answer:
print("太小了!")
elif guess > answer:
print("太大了!")
else:
print(f"恭喜你猜对了!一共用了{attempts}次")
return
except ValueError:
print("请输入数字!")
print(f"很遗憾,正确答案是{answer}")
# 调用游戏
play_guess_game()
9. 本讲总结口诀
函数四要素:
def 定义 + 参数接收 + 函数体执行 + return 返回
参数记忆:
位置 → 默认 → *args → **kwargs
作用域记忆:
LEGB:Local → Enclosing → Global → Builtin
下一讲预告:
Python入门第9讲:面向对象编程(OOP)基础 —— 类与对象
立即练习(强烈推荐):
- 写一个函数
is_prime(n),判断一个数是否为质数。 - 写一个函数
calc_statistics(numbers),接收一个数字列表,返回最大值、最小值、平均值、总和(用字典返回)。 - 改进之前的BMI计算程序,用函数封装,并支持输入多个人。
- 用
*args和**kwargs写一个万能打印函数,能打印任意数量的参数和关键字信息。
把你的练习代码贴出来,我会帮你仔细检查、优化,并指出可以改进的地方!
准备好了吗?
回复 “下一讲” 我们马上进入面向对象编程世界!
或者对函数的任何部分(参数、作用域、闭包等)有疑问,现在就问我!
函数学完后,你的代码组织能力已经大幅提升,继续加油!你离能独立写小项目越来越近了!🐍✨