Python 函数与模块核心知识点全解析
前言
在 Python 编程中,函数与模块是实现代码复用、提升开发效率、优化程序结构的核心要素。熟练掌握自定义函数、变量作用域、内置函数以及模块与包的使用,能让我们的代码更简洁、更易维护。本文将结合实战案例,全面解析 Python 函数与模块的关键知识点,从基础语法到实际应用,层层递进讲解,适合 Python 入门及进阶开发者学习参考。
一、Python 函数基础
函数是一段可以重复使用的代码块,通过传递参数实现不同的逻辑处理并返回结果。Python 中的函数分为无参函数和带参函数,同时支持匿名函数、内置函数等多种形式,满足不同的编程需求。
1.1 无参函数
无参函数即定义和调用时均无需传递参数的函数,以关键字def开头,遵循函数名 + 小括号 + 冒号的语法结构,通过return语句返回结果(若无返回值则默认返回None)。
函数名命名规则:由字母、数字和下划线组成,不能以数字开头,遵循标识符命名规范。
实战案例 1:无参函数实现两数相加
python
运行
# 无返回值的无参函数
def add():
op1 = 10
op2 = 20
rt = op1 + op2
print(op1, '+', op2, '=', rt)
return
add() # 调用函数,输出:10 + 20 = 30
# 有返回值的无参函数
def add2():
op1 = 10
op2 = 20
rt = op1 + op2
return rt
i = add2()
print(i) # 调用函数并接收返回值,输出:30
实战案例 2:无参函数输出九九乘法表
python
运行
def nine():
op1 = (1, 2, 3, 4, 5, 6, 7, 8, 9)
op2 = (1, 2, 3, 4, 5, 6, 7, 8, 9)
for i in op1:
for j in op2:
print(i, "*", j, "=", i * j)
return
nine()
无参函数使用常见错误
表格
| 错误类型 | 错误原因 | 解决方法 |
|---|---|---|
| 函数未定义先调用 | 调用语句写在函数定义之前 | 将函数定义放在调用语句上方 |
| 代码块无缩进 | 函数体代码未按 Python 规范缩进 | 函数体内代码统一缩进 4 个空格 / 1 个 Tab |
| 调用函数加冒号 | 调用时在函数名后加了: |
调用函数仅需函数名(),无需冒号 |
1.2 带参函数
带参函数是 Python 中最常用的函数形式,通过形参(定义时的占位符)和实参(调用时的实际值)实现参数传递,灵活处理不同的输入数据。
基本语法
python
运行
def 函数名称(形式参数列表):
代码块
return [表达式]
参数传递方式
带参函数支持位置参数和关键字参数两种调用方式,二者的核心区别在于参数匹配的依据不同。
- 位置参数:根据参数的位置顺序匹配形参,实参顺序需与形参完全一致;
- 关键字参数:通过
形参名=实参值的形式明确匹配关系,与参数位置无关,适合参数较多的场景。
实战案例:两种参数传递方式对比
python
运行
# 位置参数调用
def aa(x, y):
print(x, y)
aa(10, 6) # 输出:10 6
aa(6, 10) # 输出:6 10
# 关键字参数调用
aa(x=10, y=6) # 输出:10 6
aa(y=6, x=10) # 输出:10 6
参数默认值
为避免实参与形参个数不匹配导致的错误,Python 支持为形参设置默认值,调用时可省略该参数(省略时使用默认值,传递值时覆盖默认值)。
语法规则:有默认值的参数必须放在位置参数之后,否则会报语法错误。
实战案例:参数默认值的使用
python
运行
# 正确定义:默认值参数在位置参数后
def aa(x, y=6):
print(x, y)
aa(10) # 省略y,使用默认值6,输出:10 6
aa(x=10) # 关键字参数省略y,输出:10 6
aa(10, 5) # 传递y=5,覆盖默认值,输出:10 5
aa(x=10, y=5) # 关键字参数覆盖默认值,输出:10 5
# 错误定义:位置参数在默认值参数后(会报SyntaxError)
# def aa(x=1, y):
# print(x, y)
实战案例 3:带参函数实现简易计算器
实现功能:用户输入两个数字和运算符,程序执行加、减、乘、除运算,通过多个带参函数拆分逻辑,让程序结构更清晰。
python
运行
# 定义四则运算函数
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("选择运算:")
print("1、相加")
print("2、相减")
print("3、相乘")
print("4、相除")
choice = int(input("输入你的选择(1/2/3/4):"))
num1 = int(input("输入第一个数字: "))
num2 = int(input("输入第二个数字: "))
# 根据选择执行对应运算
if choice == 1:
print(num1, "+", num2, "=", add(num1,num2))
elif choice == 2:
print(num1, "-", num2, "=", subtract(num1,num2))
elif choice == 3:
print(num1, "*", num2, "=", multiply(num1,num2))
elif choice == 4:
print(num1, "/", num2, "=", divide(num1,num2))
else:
print("非法输入")
二、函数的变量作用域
变量的作用域指变量在程序中的有效使用范围,由变量的声明位置决定。Python 中按作用域可将变量分为局部变量和全局变量,二者的使用规则和优先级不同,合理区分能避免数据被意外修改。
2.1 局部变量与全局变量定义
表格
| 变量类型 | 定义位置 | 作用域 | 生命周期 |
|---|---|---|---|
| 局部变量 | 函数内部 | 仅在定义它的函数内部有效 | 函数调用时创建,执行结束后释放 |
| 全局变量 | 模块最高级别(所有函数外部) | 整个模块内部所有函数均可访问 | 程序运行时创建,结束后释放 |
2.2 核心使用规则
- 局部变量的作用域仅限于定义它的函数,外部无法访问;
- 全局变量的作用域覆盖整个模块,所有函数均可直接访问;
- 同一函数内不允许定义同名局部变量,不同函数内可定义同名局部变量(相互独立,互不影响);
- 全局变量与局部变量同名时,局部变量具有更高的优先级(函数内部优先使用局部变量)。
实战案例:局部变量与全局变量的使用
python
运行
name = 'Tim' # 全局变量
def f1():
age = 18 # 局部变量
print(age, name) # 函数内可访问局部变量+全局变量
def f2():
age=19 # 不同函数的同名局部变量,相互独立
print(age, name)
f1() # 输出:18 Tim
f2() # 输出:19 Tim
2.3 global 关键字:函数内定义全局变量
默认情况下,函数内部定义的变量为局部变量,若需在函数内定义全局变量,需使用global关键字声明,声明后变量可在整个模块中访问。
使用规则:global关键字需写在变量定义之前,先声明后赋值。
实战案例:global 关键字的使用
python
运行
def f1():
global name # 声明name为全局变量
name='Tim' # 为全局变量赋值
age = 18 # 局部变量
print(age,name)
def f2():
age=19 # 局部变量
print(age,name) # 访问f1中定义的全局变量name
f1() # 输出:18 Tim
f2() # 输出:19 Tim
2.4 开发建议
Python 中尽量避免使用全局变量,原因如下:
- 全局变量可被程序中任意代码访问和修改,易出现数据被意外篡改的错误;
- 全局变量的错误难以排查,尤其是在大型程序中,无法快速定位修改数据的代码位置;
- 过度使用全局变量会降低代码的可维护性和可读性,违背模块化编程思想。
三、lambda 匿名函数
lambda 函数是 Python 中创建匿名函数的特殊方式,无需通过def关键字定义函数名,语法简洁,仅需一条语句即可实现简单的函数逻辑,适合定义一次性、无需复用的简单函数。
3.1 基本语法
python
运行
函数名 = lambda params: expr
params:函数的参数列表,支持多个参数(用逗号分隔);expr:函数的返回值表达式,只能是单个表达式,不能包含if、for、while等条件和循环语句。
3.2 实战案例:lambda 函数与普通函数对比
实现两数相加的功能,分别用普通函数和 lambda 函数实现,对比二者的语法差异。
python
运行
# 普通函数
def sum1(x,y):
return x+y
# lambda匿名函数
sum2 = lambda x,y:x+y
# 调用结果一致
print(sum1(3,4)) # 输出:7
print(sum2(3,4)) # 输出:7
3.3 适用场景
lambda 函数适合处理简单的逻辑运算,常见使用场景包括:
- 作为内置函数的参数(如
sort()、filter()、map()等); - 定义临时使用的简单函数,避免多余的函数名定义;
- 简化代码结构,让代码更简洁易读。
注意:lambda 函数仅适用于简单逻辑,若需实现复杂的条件判断、循环等逻辑,建议使用普通函数。
四、Python 常用内置函数
Python 提供了大量内置函数(内建函数),这些函数无需导入任何模块,解释器可直接识别并调用,能大幅提升程序编写效率。内置函数覆盖了数据类型转换、数值计算、序列操作等常用功能,下面介绍开发中最常用的内置函数。
4.1 核心内置函数速查
表格
| 函数名 | 功能描述 | 语法 | 示例 | 输出结果 |
|---|---|---|---|---|
abs() |
返回数字的绝对值 | abs(x) |
abs(-10)、abs(3.14) |
10、3.14 |
bool() |
将参数转换为布尔值(True/False) | bool(x) |
bool(0)、bool('abc')、bool([]) |
False、True、False |
float() |
将参数转换为浮点型 | float(x) |
float('25')、float(3) |
25.0、3.0 |
int() |
将参数转换为整型 | int(x) |
int(199.99)、int('100') |
199、100 |
range() |
生成整数迭代对象,常与 for 循环配合 | range(start, stop, step) |
list(range(0,5))、list(range(30,0,-3)) |
[0,1,2,3,4]、[30,27,24,21,18,15,12,9,6,3] |
sum() |
对序列(列表、元组等)中的元素求和 | sum(seq) |
sum([1,2,3,4])、sum(range(1,101)) |
10、5050 |
max() |
返回序列 / 多个参数中的最大值 | max(seq)/max(x1,x2,...) |
max([6,2,65])、max(100,2678,9) |
65、2678 |
min() |
返回序列 / 多个参数中的最小值 | min(seq)/min(x1,x2,...) |
min([6,2,65])、min(100,2678,9) |
2、9 |
4.2 关键注意点
bool()转换规则:数字0、空字符串''、空列表[]、空元组()、空字典{}、None均返回False,其余值返回True;int()转换规则:参数为字符串时,字符串必须是纯整数格式(如'99'),浮点格式字符串(如'99.9')会报ValueError;range()规则:起始值start默认值为0,步长step默认值为1,生成的序列包含start,不包含stop(即左闭右开);max()/min()对字符串的比较:英文字母大于数字,小写字母大于大写字母(如max('d,D')返回'd')。
五、Python 模块与包
当程序中的函数、类较多时,需要对代码进行模块化组织,Python 中的模块和包是实现代码组织和复用的核心方式。模块用于管理复杂度较低的代码,包用于管理复杂度较高、模块数量较多的代码,二者均能实现代码的跨文件复用。
5.1 模块(Module)
模块本质上是一个以.py 为后缀的 Python 文件,文件中包含 Python 的函数、类、变量和语句,将一组相关的功能代码组织在一个文件中,即为一个模块。模块名与文件名一致(如myModule.py的模块名为myModule)。
核心作用
- 实现代码复用:模块中的函数、类可被其他 Python 文件调用,无需重复编写;
- 优化程序结构:将不同功能的代码拆分到不同模块,让程序结构更清晰;
- 避免命名冲突:不同模块中的函数名、变量名可重复,通过模块名。标识符的方式调用,避免冲突。
5.2 模块的定义与导入
5.2.1 模块的定义
直接创建.py文件,在文件中定义函数、类等内容即可完成模块定义,建议将功能相关的代码放在同一个模块中。
实战案例:定义自定义模块myModule.py
python
运行
# 文件名:myModule.py
# 定义加法函数
def add(a,b):
print(a+b)
# 定义乘法函数
def mul(a,b):
print(a*b)
5.2.2 模块的导入
使用模块中的内容前,必须先导入模块,Python 支持多种导入方式,可根据需求选择,核心导入语法如下表所示。
表格
| 导入方式 | 语法 | 调用方式 | 适用场景 |
|---|---|---|---|
| 导入整个模块 | import 模块名 |
模块名.函数名/变量名 |
需要使用模块中的多个功能 |
| 导入多个模块 | import 模块名1,模块名2 |
模块名1.xxx、模块名2.xxx |
需要使用多个模块的功能 |
| 导入模块指定属性 | from 模块名 import 函数名1,函数名2 |
直接使用函数名1 |
仅需使用模块中的部分功能 |
| 模块重命名 | import 模块名 as 新模块名 |
新模块名.xxx |
模块名过长或避免命名冲突 |
| 模块属性重命名 | from 模块名 import 函数名 as 新函数名 |
直接使用新函数名 |
函数名过长或避免命名冲突 |
实战案例:导入自定义模块myModule.py
python
运行
# 方式1:导入整个模块
import myModule
myModule.add(2,3) # 输出:5
myModule.mul(2,3) # 输出:6
# 方式2:导入模块指定属性
from myModule import add,mul
add(2,3) # 输出:5
mul(2,3) # 输出:6
# 方式3:属性重命名
from myModule import add as add1, mul as mul1
add1(2,3) # 输出:5
mul1(2,3) # 输出:6
5.2.3 模块的作用域与加载规则
- 导入作用域:在模块顶层导入,作用域为全局;在函数内部导入,作用域为局部(仅在该函数内有效),推荐顶层导入;
- 加载规则:一个模块仅能被加载一次,无论被导入多少次,避免多重导入时代码被多次执行;
- 模块分类:Python 中的模块分为三类 —— 标准库模块(Python 自带,如
sys、random)、第三方模块(如numpy、pandas)、自定义模块(开发者自己编写)。
5.3 包(Package)
包是多个模块的集合,本质上是一个包含__init__.py 文件的目录,用于将功能相关的多个模块组织在一起,实现模块的分层管理。当程序中的模块数量较多时,使用包能让代码结构更清晰。
5.3.1 包的创建条件
- 创建一个目录,作为包的根目录;
- 在该目录中创建init.py 文件(前后均为两个下划线),该文件可以是空文件,也可以编写初始化代码;
- 在包目录中创建多个.py 模块文件,或嵌套创建子包(子包同样需要包含__init__.py 文件)。
5.3.2 包的目录结构示例
plaintext
project/ # 根目录
project.py # 主程序文件
subproject/ # 子包目录
__init__.py # 包初始化文件(必须有)
submodel.py # 包内的模块文件
5.3.3 包的导入与调用
导入包中的模块,需在模块名前加上包名,采用包名.模块名的形式,调用时再加上函数名/类名,即包名.模块名.标识符。
实战案例:调用包中的模块
python
运行
# 第一步:在subproject/submodel.py中定义函数
# submodel.py
def add(a,b):
return a+b
# 第二步:在project/project.py中导入并调用
# project.py
import subproject.submodel
print(subproject.submodel.add(1,3)) # 输出:4
5.3.4 init.py 文件的作用
init.py 是包的初始化文件,核心作用如下:
- 标识当前目录为 Python 的包目录,若无此文件,Python 会将该目录视为普通目录,无法作为包导入;
- 初始化包的公共变量和方法,在第一次导入包中的任何模块时,会自动执行__init__.py 中的代码;
- 可通过
__all__变量指定包被from 包名 import *时导入的模块列表。
实战案例:init.py 的初始化功能
python
运行
# subproject/__init__.py
name = '__init__.py'
print('subproject->',name)
# 运行project.py,输出结果:
# subproject-> __init__.py
# 4
5.4 Python 常用标准库模块
Python 的标准库提供了大量实用模块,无需额外安装,导入后即可使用,下面介绍开发中最常用的标准库模块,涵盖关键字判断、随机数生成、系统信息、时间处理等功能。
5.4.1 keyword 模块:Python 关键字操作
用于查看和判断 Python 的关键字,核心属性和方法如下:
keyword.kwlist:返回包含所有 Python 关键字的列表;keyword.iskeyword(字符串):判断指定字符串是否为 Python 关键字,返回布尔值(True/False)。
实战案例:
python
运行
import keyword
print(keyword.iskeyword("if")) # 输出:True
print(keyword.iskeyword("abc")) # 输出:False
print(keyword.kwlist) # 输出:['False', 'None', 'True', 'and', 'as', ...]
5.4.2 random 模块:随机数生成
用于生成随机浮点数、整数、随机选择序列元素等,开发中常用于验证码生成、随机抽样、游戏开发等场景,核心方法如下表所示。
表格
| 方法 | 功能描述 | 示例 |
|---|---|---|
random.random() |
生成 0.0~1.0 之间的随机浮点数 | random.random() → 0.652345 |
random.uniform(a,b) |
生成 a~b 之间的随机浮点数 | random.uniform(1,10) → 5.892 |
random.randint(a,b) |
生成 a~b 之间的随机整数(包含 a 和 b) | random.randint(1,100) → 68 |
random.choice(seq) |
从序列(列表、元组、字符串)中随机选取一个元素 | random.choice(['a','b','c']) → 'b' |
random.shuffle(seq) |
随机打乱序列中元素的顺序(原地修改) | random.shuffle([1,2,3]) → [3,1,2] |
random.sample(seq,k) |
从序列中随机选取 k 个元素,返回新列表(原序列不变) | random.sample([1,2,3,4],2) → [2,4] |
实战案例:
python
运行
import random
# 生成1-100的随机整数
print(random.randint(1,100))
# 从列表中随机选元素
list1 = ['aaa','bbb','ccc']
print(random.choice(list1))
# 打乱列表顺序
random.shuffle(list1)
print(list1)
5.4.3 sys 模块:Python 解释器与系统交互
包含与 Python 解释器和运行环境相关的属性和方法,可获取系统信息、模块路径、退出程序等,核心属性 / 方法如下表所示。
表格
| 属性 / 方法 | 功能描述 |
|---|---|
sys.version |
获取 Python 解释器的版本信息 |
sys.platform |
获取当前操作系统平台名称(如 linux、win32、darwin) |
sys.path |
获取 Python 模块的搜索路径列表 |
sys.exit() |
退出 Python 解释器,终止程序运行 |
sys.stdin |
标准输入(用于读取用户输入) |
sys.stdout |
标准输出(用于打印内容到控制台) |
实战案例:
python
运行
import sys
# 获取Python版本
print("Python版本:", sys.version)
# 获取操作系统平台
print("操作系统:", sys.platform)
# 获取模块搜索路径
print("模块搜索路径:", sys.path)
5.4.4 time 模块:时间处理
包含各种操作时间的方法,支持时间戳、元组、字符串等多种时间格式的转换和处理,核心方法如下表所示。
表格
| 方法 | 功能描述 |
|---|---|
time.time() |
获取当前时间戳(以 1970-01-01 00:00:00 为起点的秒数偏移量) |
time.localtime() |
获取当前时间的元组形式(9 个元素,包含年、月、日、时、分、秒等) |
time.ctime() |
获取当前时间的字符串形式(如 Wed Dec 13 21:33:20 2023) |
time.asctime(t) |
将时间元组 t 转换为字符串形式 |
time.sleep(secs) |
程序休眠指定秒数,推迟执行 |
时间元组的 9 个元素:(year, month, day, hours, minutes, second, weekday, Julian day, DST flag)
weekday:星期(0 表示周一,6 表示周日);Julian day:一年中的第几天;DST flag:是否为夏令时(-1/0/1)。
实战案例:
python
运行
import time
# 获取时间戳
print(time.time()) # 输出:1702474400.840029
# 获取当前时间字符串
print(time.ctime()) # 输出:Wed Dec 13 21:33:20 2023
# 获取时间元组并提取年份
t2 = time.localtime()
print("当前年份:", t2[0]) # 输出:2023
# 程序休眠2秒
time.sleep(2)
print("休眠2秒后执行")
六、总结
本文全面解析了 Python 函数与模块的核心知识点,从自定义函数的基础语法(无参 / 带参)、变量作用域,到 lambda 匿名函数、常用内置函数,再到模块与包的定义、导入和使用,结合大量实战案例和表格总结,让知识点更清晰、更易理解。
核心要点回顾:
- 函数是代码复用的基础,带参函数的参数默认值、关键字参数是开发中的常用技巧,需注意参数的定义规则;
- 变量作用域的核心是区分局部和全局变量,
global关键字可在函数内定义全局变量,开发中尽量避免使用全局变量; - lambda 函数适合简单逻辑,语法简洁,是普通函数的补充,不可替代普通函数处理复杂逻辑;
- 内置函数是 Python 的内置工具,无需导入即可使用,熟练掌握能大幅提升开发效率;
- 模块和包是代码组织的核心方式,模块实现单文件代码复用,包实现多模块分层管理,*init.py*是包的核心标识;
- Python 标准库提供了大量实用模块(
keyword、random、sys、time等),熟练使用能避免重复造轮子。
掌握函数与模块的使用,是 Python 从入门到进阶的关键一步,在实际开发中,建议养成模块化编程的习惯,将不同功能的代码拆分到不同的模块和包中,让代码更简洁、更易维护、更易扩展。后续可进一步学习 Python 的面向对象编程、第三方模块的使用,结合函数与模块的知识,构建更复杂的 Python 程序。
更多推荐



所有评论(0)