简介
在Python编程中,函数和模块是实现代码复用、提高开发效率的核心机制。本文将结合理论与实例,解析Python函数与模块的核心知识点,帮助开发者打下基础。
一、函数
函数是一段可重复调用的代码块,通过参数传递实现灵活的逻辑封装。Python中的函数分为内置函数(如range()
、len()
)和用户自定义函数,后者是我们重点讨论的内容。
1. 无参函数
无参函数不接收外部参数,适用于固定逻辑的场景。
语法:
def 函数名():
代码块
[return 表达式] # 可选,无返回值时默认返回None
示例1:计算固定两数之和
def add():
op1 = 10
op2 = 20
return op1 + op2 # 返回计算结果
result = add()
print(result) # 输出:30
示例2:打印九九乘法表
def nine():
for i in range(1, 10):
for j in range(1, i+1):
print(f"{i}*{j}={i*j}", end="\t")
print() # 换行
nine()
注意事项:
- 函数定义必须在调用前,否则抛出
NameError
。 - 函数体通过缩进(通常4个空格)界定,缩进错误会导致语法错误。
2. 带参函数
带参函数通过形式参数(形参)接收外部输入,实现通用逻辑。
语法:
def 函数名(形参列表):
代码块
[return 表达式]
参数传递方式
- 位置参数:实参与形参按顺序匹配。
def aa(x, y):
print(x, y)
aa(10, 6) # 输出:10 6(位置匹配)
aa(6, 10) # 输出:6 10(顺序改变结果不同)
- 关键字参数:显式指定参数名,忽略顺序。
aa(y=6, x=10) # 输出:10 6(通过参数名匹配)
- 默认参数:为形参设置默认值,调用时可省略。
def aa(x, y=6): # y的默认值为6
print(x, y)
aa(10) # 输出:10 6(使用y的默认值)
aa(10, 5) # 输出:10 5(覆盖默认值)
- 注意:位置参数必须位于默认参数之前,否则语法错误。
# 错误示例:默认参数在前,位置参数在后
def aa(x=1, y):
pass # 报错:SyntaxError
示例:
def add(x, y): return x + y
def subtract(x, y): return x - y
def multiply(x, y): return x * y
def divide(x, y): return x / y
print("选择运算:1.加 2.减 3.乘 4.除")
choice = int(input("输入选择:"))
num1 = int(input("第一个数:"))
num2 = int(input("第二个数:"))
if choice == 1:
print(f"{num1}+{num2}={add(num1, num2)}")
elif choice == 2:
print(f"{num1}-{num2}={subtract(num1, num2)}")
else:
print("非法输入")
3. 变量作用域
变量的作用域由定义位置决定,分为:
- 局部变量:在函数内定义,仅在函数执行期间有效,函数结束后销毁。
- 全局变量:在模块顶层定义,作用域为整个模块,可被所有函数访问。
规则:
- 函数内可直接访问全局变量,但无法修改(除非用
global
声明)。 - 当局部变量与全局变量同名时,函数内优先使用局部变量。
示例:全局变量与局部变量
name = "Tim" # 全局变量
def f1():
age = 18 # 局部变量
print(age, name) # 输出:18 Tim(访问全局变量)
def f2():
name = "Alice" # 局部变量(与全局同名)
print(name) # 输出:Alice(优先使用局部变量)
f1()
f2()
print(name) # 输出:Tim(全局变量未被修改)
修改全局变量:global
关键字
def f1():
global name # 声明name为全局变量
name = "Tim" # 修改全局变量
age = 18
print(age, name) # 输出:18 Tim
f1()
print(name) # 输出:Tim(全局变量已被修改)
4. lambda函数
lambda函数用于创建单行表达式的匿名函数,适用于简单逻辑或作为参数传递。
语法:
lambda 形参列表: 表达式
示例:对比普通函数与lambda函数
# 普通函数
def sum1(x, y):
return x + y
# lambda函数(赋值给变量或直接调用)
sum2 = lambda x, y: x + y
print(sum1(3, 4)) # 7
print(sum2(3, 4)) # 7
限制:lambda函数只能包含一个表达式,不能使用if
、for
等语句,适合轻量场景。
5. 常用内建函数
Python内置了大量实用函数,无需导入即可直接使用:
- 数值处理:
-
abs(x)
:返回绝对值(abs(-10)
→ 10)。 -
float(x)
/int(x)
:类型转换(float("25")
→ 25.0,int(199.99)
→ 199)。
- 布尔判断:
-
bool(x)
:转换为布尔值(0、空字符串、None
等返回False
,其余True
)。
- 序列操作:
-
range(start, stop, step)
:生成整数序列(range(0, 5)
→ 0,1,2,3,4)。 -
sum(iterable)
:求和(sum(range(1, 101))
→ 5050)。 -
max()
/min()
:返回最大/最小值(max([6,2,12])
→ 12)。
二、模块与包
当代码规模扩大时,模块和包用于组织代码,实现跨文件复用。
1. 模块
模块是一个.py
文件,包含函数、类或变量,可被其他文件导入。
定义模块
创建myModule.py
:
# myModule.py
def add(a, b):
return a + b
def mul(a, b):
return a * b
导入模块的方式
- 导入整个模块:
import myModule
print(myModule.add(2, 3)) # 输出:5(通过“模块名.函数名”调用)
- 导入指定函数:
from myModule import add, mul
print(add(2, 3)) # 输出:5(直接使用函数名)
- 别名导入:
from myModule import add as add_func
print(add_func(2, 3)) # 输出:5(避免命名冲突)
2. 包
包是包含__init__.py
文件的目录,用于管理多个模块,支持嵌套结构。
目录结构示例
project/
├── project.py
└── subproject/
├── __init__.py # 标识包的存在,可包含初始化代码
└── submodel.py
包的使用
在submodel.py
中定义函数:
# submodel.py
def add(a, b):
return a + b
在project.py
中导入包中的模块:
# project.py
import subproject.submodel
print(subproject.submodel.add(1, 3)) # 输出:4
__init__.py
的作用:
- 首次导入包时执行,可用于初始化全局变量或批量导入模块。
- 例如,在
__init__.py
中添加from .submodel import add
,可简化调用为from subproject import add
。
3. 常用标准库模块
(1) keyword模块:查看Python关键字
import keyword
print(keyword.iskeyword("if")) # True(判断是否为关键字)
print(keyword.kwlist) # 输出所有关键字列表
(2) random模块:生成随机数据
import random
print(random.randint(1, 100)) # 1-100随机整数
list1 = ["aaa", "bbb", "ccc"]
print(random.choice(list1)) # 随机选取列表元素
random.shuffle(list1) # 打乱列表顺序
(3) sys模块:访问解释器环境
import sys
print("Python版本:", sys.version) # 解释器版本
print("操作系统:", sys.platform) # 平台信息(如'linux'、'win32')
sys.exit() # 退出程序
(4) time模块:处理时间数据
import time
print(time.time()) # 当前时间戳(秒级浮点数)
print(time.ctime()) # 可读时间字符串(如'Wed Dec 13 21:33:20 2023')
time.sleep(2) # 暂停程序2秒
三、总结
- 函数设计:
- 保持单一职责,避免函数过于复杂。
- 合理使用默认参数和关键字参数,提高接口灵活性。
- 模块与包:
- 按功能划分模块,避免单文件代码膨胀。
- 使用
__init__.py
规范包的公共接口。
- 作用域:
- 尽量减少全局变量,必要时用
global
显式声明。
- 内置函数与标准库:
- 熟悉常用内建函数,避免重复造轮子。
- 善用标准库模块(如
random
、sys
)提升开发效率。
通过掌握函数与模块,开发者能写出更简洁、可维护的代码。实践中建议从简单示例入手,逐步尝试复杂场景,最终实现高效的代码组织与复用。