Python 教程 17:函数基础
“代码复用,从函数开始。”
函数是编程中最重要的概念之一。如果说变量是存储数据的容器,那函数就是执行任务的工具。掌握函数,你的代码将更加模块化、可维护、可复用。
1. 什么是函数
函数是一段可重复使用的代码块,用于完成特定任务。
1# 定义函数
2def greet():
3 print("你好,世界!")
4
5# 调用函数
6greet() # 输出:你好,世界!
7greet() # 可以多次调用
为什么需要函数:
- 代码复用:写一次,用多次
- 模块化:把复杂问题分解
- 可维护:修改一处,处处生效
- 可读性:函数名即文档
2. 函数的定义
1def 函数名(参数列表):
2 """文档字符串"""
3 函数体
4 return 返回值
关键字:
def:定义函数函数名:遵循变量命名规则参数列表:可选return:返回值,可选
1# 最简单的函数
2def hello():
3 print("Hello")
4
5# 带参数的函数
6def greet(name):
7 print(f"你好,{name}!")
8
9# 带返回值的函数
10def add(a, b):
11 return a + b
12
13# 完整的函数
14def calculate_area(radius):
15 """
16 计算圆的面积
17
18 Args:
19 radius: 圆的半径
20
21 Returns:
22 圆的面积
23 """
24 pi = 3.14159
25 return pi * radius ** 2
3. 函数的参数
位置参数
按顺序传递:
1def introduce(name, age, city):
2 print(f"我叫{name},{age}岁,来自{city}")
3
4introduce("张三", 25, "北京")
5# 输出:我叫张三,25岁,来自北京
关键字参数
通过参数名传递:
1# 不需要记住顺序
2introduce(city="上海", name="李四", age=30)
3introduce(name="王五", age=28, city="广州")
4
5# 混合使用(位置参数必须在前)
6introduce("赵六", age=32, city="深圳")
默认参数
参数有默认值:
1def greet(name, greeting="你好"):
2 print(f"{greeting},{name}!")
3
4greet("张三") # 你好,张三!
5greet("李四", "早上好") # 早上好,李四!
6greet("王五", greeting="晚上好") # 晚上好,王五!
注意:默认参数必须在非默认参数之后
1# 错误
2# def func(a=1, b): # SyntaxError
3
4# 正确
5def func(b, a=1):
6 pass
可变参数
*args:接收任意数量的位置参数
1def sum_all(*numbers):
2 """计算所有数字的和"""
3 total = 0
4 for num in numbers:
5 total += num
6 return total
7
8print(sum_all(1, 2, 3)) # 6
9print(sum_all(1, 2, 3, 4, 5)) # 15
*args会把参数打包成元组。
**kwargs:接收任意数量的关键字参数
1def show_info(**info):
2 """显示信息"""
3 for key, value in info.items():
4 print(f"{key}: {value}")
5
6show_info(name="张三", age=25, city="北京")
7# 输出:
8# name: 张三
9# age: 25
10# city: 北京
**kwargs会把参数打包成字典。
混合使用
1def func(a, b, *args, **kwargs):
2 print(f"a={a}, b={b}")
3 print(f"args={args}")
4 print(f"kwargs={kwargs}")
5
6func(1, 2, 3, 4, 5, x=10, y=20)
7# 输出:
8# a=1, b=2
9# args=(3, 4, 5)
10# kwargs={'x': 10, 'y': 20}
参数顺序:位置参数 → *args → 默认参数 → **kwargs
4. 函数的返回值
单个返回值
1def square(x):
2 return x ** 2
3
4result = square(5)
5print(result) # 25
多个返回值(实际是元组)
1def get_info():
2 name = "张三"
3 age = 25
4 return name, age # 返回元组
5
6# 接收返回值
7person_name, person_age = get_info()
8print(person_name, person_age) # 张三 25
9
10# 或者作为元组接收
11info = get_info()
12print(info) # ('张三', 25)
没有 return
没有return的函数返回None:
1def no_return():
2 print("我没有返回值")
3
4result = no_return()
5print(result) # None
5. 变量作用域
局部变量
函数内定义的变量:
1def func():
2 x = 10 # 局部变量
3 print(x)
4
5func()
6# print(x) # NameError: x不存在
全局变量
函数外定义的变量:
1count = 0 # 全局变量
2
3def increment():
4 global count # 声明使用全局变量
5 count += 1
6
7increment()
8print(count) # 1
注意:尽量避免使用全局变量,它会让代码难以维护。
LEGB 规则
变量查找顺序:
- Local:局部作用域
- Enclosing:嵌套函数的外层
- Global:全局作用域
- Built-in:内置作用域
1x = "global"
2
3def outer():
4 x = "outer"
5
6 def inner():
7 x = "inner"
8 print(x) # inner
9
10 inner()
11 print(x) # outer
12
13outer()
14print(x) # global
6. 文档字符串
函数应该有文档说明用途:
1def calculate_bmi(weight, height):
2 """
3 计算BMI指数
4
5 Args:
6 weight (float): 体重(千克)
7 height (float): 身高(米)
8
9 Returns:
10 float: BMI指数
11
12 Examples:
13 >>> calculate_bmi(70, 1.75)
14 22.86
15 """
16 return weight / (height ** 2)
17
18# 查看文档
19print(calculate_bmi.__doc__)
20help(calculate_bmi)
7. 函数是一等公民
在 Python 中,函数可以:
赋值给变量
1def greet():
2 return "Hello"
3
4say_hello = greet
5print(say_hello()) # Hello
作为参数传递
1def execute(func, value):
2 return func(value)
3
4def square(x):
5 return x ** 2
6
7result = execute(square, 5)
8print(result) # 25
作为返回值
1def create_multiplier(n):
2 def multiplier(x):
3 return x * n
4 return multiplier
5
6times3 = create_multiplier(3)
7print(times3(5)) # 15
8. 小结
今天我们学习了函数的基础:
- 定义:
def关键字 - 参数:位置参数、关键字参数、默认参数、*args、**kwargs
- 返回值:单个、多个(元组)、None
- 作用域:局部、全局、LEGB 规则
- 文档字符串:说明函数用途
- 一等公民:函数可以赋值、传递、返回
函数是代码复用和模块化的基础,下一课我们将学习更高级的函数特性。
练习题:
- 写一个函数,判断一个数是否是质数
- 写一个函数,接收任意数量的数字,返回最大值和最小值
- 写一个函数,实现简单的计算器(支持+、-、*、/)
本文代码示例:
关注公众号:极客老墨
更多 AI 应用开发、工程实践和效率工具分享,欢迎扫码关注。
