前言:封装代码,提升复用
函数是编程中最重要的代码组织工具。它允许你将一段代码封装起来,给它一个名字,以后可以通过这个名字来调用这段代码。想象一下,如果你需要多次执行同样的操作,没有函数的话,你就得重复写很多遍;而有了函数,你只需要写一次,然后调用多次。
本课程将带你深入了解Python函数的各个方面,从基本的函数定义到高级的参数处理,帮助你掌握函数式编程的核心技能。
一、函数基础
1.1 定义函数
def 函数名():
语句块
1.2 基本示例
def say_hello():
"""简单的问候函数"""
print("Hello, World!")
# 调用函数
say_hello()
1.3 带参数的函数
def greet(name):
"""带参数的问候函数"""
print(f"你好,{name}!")
greet("小明") # 你好,小明!
1.4 带返回值的函数
def add(a, b):
"""返回两个数的和"""
return a + b
result = add(3, 5)
print(result) # 8
二、函数参数详解
2.1 默认参数
def greet(name, greeting="你好"):
"""默认参数示例"""
print(f"{greeting},{name}!")
greet("小明") # 你好,小明!
greet("小红", "早上好") # 早上好,小红!
2.2 关键字参数
def power(base, exponent):
"""计算幂运算"""
return base ** exponent
# 使用关键字参数
power(base=2, exponent=3) # 8
power(exponent=3, base=2) # 8(顺序无关)
2.3 可变参数
# *args - 接收任意数量的位置参数
def sum_all(*args):
"""计算所有参数的和"""
total = 0
for num in args:
total += num
return total
print(sum_all(1, 2, 3)) # 6
print(sum_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=18, city="北京")
2.4 参数组合顺序
def func(required, *args, default="值", **kwargs):
"""参数组合示例"""
print(f"必需参数: {required}")
print(f"默认参数: {default}")
print(f"可变位置参数: {args}")
print(f"可变关键字参数: {kwargs}")
func("必需", 1, 2, default="新值", name="test")
三、函数返回值
3.1 单返回值
def square(x):
return x ** 2
result = square(5)
print(result) # 25
3.2 多返回值
def divide(a, b):
"""返回商和余数"""
quotient = a // b
remainder = a % b
return quotient, remainder
q, r = divide(10, 3)
print(f"商: {q}, 余数: {r}") # 商: 3, 余数: 1
3.3 早期返回
def find_first_positive(numbers):
"""找到第一个正数"""
for num in numbers:
if num > 0:
return num
return None # 没有找到正数
print(find_first_positive([-3, -1, -5])) # None
print(find_first_positive([-3, 2, -5])) # 2
四、变量作用域
4.1 局部变量
def func():
local_var = "局部变量"
print(local_var)
func() # 正常执行
print(local_var) # NameError: name 'local_var' is not defined
4.2 全局变量
global_var = "全局变量"
def func():
print(global_var)
func() # 全局变量
4.3 global关键字
counter = 0
def increment():
global counter
counter += 1
print(f"计数器: {counter}")
increment() # 计数器: 1
increment() # 计数器: 2
4.4 nonlocal关键字
def outer():
count = 0
def inner():
nonlocal count
count += 1
print(f"内部: {count}")
inner()
print(f"外部: {count}")
outer()
五、匿名函数Lambda
5.1 基本语法
lambda 参数: 表达式
5.2 示例
# 普通函数
def square(x):
return x ** 2
# Lambda函数
square = lambda x: x ** 2
print(square(5)) # 25
# 带多个参数的Lambda
add = lambda x, y: x + y
print(add(3, 5)) # 8
5.3 Lambda与内置函数结合
# 与sorted结合
students = [("小明", 85), ("小红", 92), ("小李", 78)]
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
print(sorted_students) # [('小红', 92), ('小明', 85), ('小李', 78)]
# 与map结合
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x ** 2, numbers))
print(squares) # [1, 4, 9, 16, 25]
# 与filter结合
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # [2, 4]
六、装饰器
6.1 装饰器基础
def my_decorator(func):
"""简单的装饰器"""
def wrapper():
print("装饰器:执行前")
func()
print("装饰器:执行后")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
# 输出:
# 装饰器:执行前
# Hello!
# 装饰器:执行后
6.2 带参数的装饰器
def repeat(times):
"""重复执行指定次数的装饰器"""
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"你好,{name}!")
greet("小明")
# 你好,小明!
# 你好,小明!
# 你好,小明!
七、实战项目:计算器模块
7.1 项目需求
创建一个计算器模块,包含:
- 基本运算函数(加减乘除)
- 高级运算函数(幂运算、平方根)
- 使用装饰器添加日志功能
7.2 完整代码
import math
from datetime import datetime
def logger(func):
"""日志装饰器"""
def wrapper(*args, **kwargs):
print(f"[{datetime.now()}] 调用函数: {func.__name__}")
result = func(*args, **kwargs)
print(f"[{datetime.now()}] 返回结果: {result}")
return result
return wrapper
@logger
def add(a, b):
"""加法"""
return a + b
@logger
def subtract(a, b):
"""减法"""
return a - b
@logger
def multiply(a, b):
"""乘法"""
return a * b
@logger
def divide(a, b):
"""除法"""
if b == 0:
return "错误:除数不能为零"
return a / b
@logger
def power(base, exponent):
"""幂运算"""
return base ** exponent
@logger
def square_root(x):
"""平方根"""
if x < 0:
return "错误:负数没有实数平方根"
return math.sqrt(x)
def calculator():
"""计算器主函数"""
print("=" * 50)
print("Python计算器 - 支持加减乘除幂运算和平方根")
print("=" * 50)
operations = {
"1": ("加法", add),
"2": ("减法", subtract),
"3": ("乘法", multiply),
"4": ("除法", divide),
"5": ("幂运算", power),
"6": ("平方根", square_root),
}
while True:
print("\n请选择运算:")
for key, (name, _) in operations.items():
print(f"{key}. {name}")
print("0. 退出")
choice = input("\n请输入选项: ")
if choice == "0":
print("感谢使用计算器!")
break
if choice not in operations:
print("无效的选项!")
continue
_, func = operations[choice]
try:
if func in [square_root]:
a = float(input("请输入数字: "))
result = func(a)
else:
a = float(input("请输入第一个数字: "))
b = float(input("请输入第二个数字: "))
result = func(a, b)
print(f"结果: {result}")
except ValueError:
print("错误:请输入有效的数字")
if __name__ == "__main__":
calculator()
总结
本课程学习了:
- 函数基础:定义、参数、返回值
- 参数类型:默认参数、关键字参数、可变参数
- 变量作用域:局部、全局、nonlocal
- Lambda函数:匿名函数的用法
- 装饰器:增强函数功能
- 实战项目:带日志的计算器模块
核心要点:
- 函数封装代码,提高复用性
- 参数顺序:必需 > *args > 默认 > **kwargs
- Lambda适合简单的单行函数
- 装饰器在不修改原函数的情况下增强功能
下一篇预告:
Python编程第09课:Python列表(List)操作完全手册


895

被折叠的 条评论
为什么被折叠?



