七. 函数:模块化编程的核心
在编程领域中,函数是最基础且至关重要的概念之一。其本质作用在于“封装”——将一段逻辑独立出来,使代码更易阅读、复用性更强,是构建高质量程序的关键。
7.1 函数的定义与调用(Python基础)

下面是一个最简单的Python函数示例:定义函数并包含文档字符串,随后执行调用。整个过程非常直观易懂。
def greet(name):"""显示问候语(文档字符串)"""print(f"你好,{name}")greet("小明") # 调用# 带返回值def add(a, b):return a + bresult = add(3, 5)
7.2 函数参数类型详解(位置、默认、可变参数)
参数机制是Python函数的核心特性之一,掌握多种参数用法能避免常见错误,提升代码灵活性。
# 1. 位置参数(必须按顺序)def introduce(name, age):print(f"{name} {age}岁")introduce("李华", 18)# 2. 关键字参数(可乱序)introduce(age=20, name="王芳")# 3. 默认参数(必须放在位置参数之后)def power(base, exponent=2):return base ** exponentprint(power(3)) # 9print(power(3, 3)) # 27# 这里要特别注意:默认参数不能用可变对象(比如列表)def add_item(item, lst=[]): # 错误示范,lst会在函数定义时创建一次lst.append(item)return lstprint(add_item(1)) # [1]print(add_item(2)) # [1,2] 并不是 [2],因为共享同一个列表# 正确做法:用None替代def add_item(item, lst=None):if lst is None:lst = []lst.append(item)return lst# 4. 可变位置参数 *args(接收成元组)def sum_all(*numbers):return sum(numbers)print(sum_all(1,2,3,4)) # 10# 5. 可变关键字参数 **kwargs(接收成字典)def print_info(**info):for k, v in info.items():print(f"{k}: {v}")print_info(name="张三", age=25)# 6. 组合使用def func(a, b, *args, c=10, **kwargs):pass
7.3 函数返回值与变量作用域(LEGB规则)
函数可以返回一个或多个值,多个值本质上以元组形式返回。作用域方面,LEGB规则规定了变量查找顺序:优先局部,逐层向外,全局兜底。
# 多个返回值实际返回元组def min_max(lst):return min(lst), max(lst)minimum, maximum = min_max([3,1,4,2])# 作用域(LEGB规则)x = 10 # 全局变量def outer(): y = 20 # 外层变量 def inner(): z = 30 # 局部变量 nonlocal y # 声明要修改外层变量 y += 1 global x # 声明要修改全局变量 x += 1 print(x, y, z) inner()outer()
7.4 lambda 匿名函数(简洁表达式)
当函数逻辑十分简短时,使用lambda匿名函数比def更便捷。它常与sorted、filter、map等内置函数配合使用。
# 简单的单表达式函数square = lambda x: x ** 2print(square(5)) # 25# 常与sorted、filter、map配合students = [("张三", 85), ("李四", 92), ("王五", 78)]students_sorted = sorted(students, key=lambda s: s[1], reverse=True)print(students_sorted)# 按成绩降序# filter 过滤numbers = [1,2,3,4,5,6]evens = list(filter(lambda x: x%2==0, numbers))# map 映射squared = list(map(lambda x: x**2, numbers))
7.5 递归函数简介(深度限制与阶乘示例)
递归即函数调用自身,适用于阶乘、树遍历等场景。但需注意递归深度限制,Python默认约为1000层。
# 计算阶乘def factorial(n):if n == 0:return 1else:return n * factorial(n-1)print(factorial(5)) # 120# 注意递归深度限制(默认1000)
7.6 装饰器入门(为函数动态添加功能)
装饰器本质上是一个返回函数的函数,常用于在不修改原函数逻辑的前提下添加额外功能,例如计算执行耗时。
def timer(func):import timedef wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()print(f"{func.__name__} 耗时 {end-start:.4f}秒")return resultreturn wrapper@timerdef slow_function():import timetime.sleep(1)return "完成"slow_function()
八. 模块与包(代码组织与复用)
8.1 模块导入方式(多种方法对比)
将代码拆分至不同文件中复用的机制称为模块。Python提供了多种导入方式,推荐尽量明确导入内容,避免使用from os import *这种通配写法以防止命名冲突。
# 方式1: 导入整个模块import mathprint(math.sqrt(16))# 方式2: 导入特定函数from random import randint, choiceprint(randint(1,10))# 方式3: 导入所有(不推荐,可能命名冲突)from os import *# 方式4: 起别名import datetime as dtnow = dt.datetime.now()
8.2 if __name__ == "__main__" 的作用(模块安全执行)
这段条件判断的作用是:当该文件作为主程序直接运行时执行指定代码,而被其他模块导入时不执行。撰写模块时添加此语句可提升安全性与可测试性。
创建 mymodule.py:
def hello():print("Hello from module")if __name__ == "__main__":# 当直接运行此文件时执行,被导入时不执行hello()
8.3 创建自己的包(模块文件夹结构)
将多个模块放入一个文件夹,并在其中放置__init__.py文件,即可构成一个包。该文件可以为空,但必须存在以标识包。
mypackage/ __init__.py # 可以为空,但必须存在 module1.py module2.py
导入时使用:from mypackage import module1
8.4 安装第三方库(pip常用命令)
Python的强大生态离不开第三方库,pip是最常用的包管理工具。掌握几个基本命令即可满足日常依赖管理需求。
pip install requests # 安装pip list # 列出已安装pip install requests==2.28.0 # 指定版本pip freeze > requirements.txt # 导出依赖
