前言

在 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 [表达式]
参数传递方式

带参函数支持位置参数关键字参数两种调用方式,二者的核心区别在于参数匹配的依据不同。

  1. 位置参数:根据参数的位置顺序匹配形参,实参顺序需与形参完全一致;
  2. 关键字参数:通过形参名=实参值的形式明确匹配关系,与参数位置无关,适合参数较多的场景。

实战案例:两种参数传递方式对比

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 核心使用规则

  1. 局部变量的作用域仅限于定义它的函数,外部无法访问;
  2. 全局变量的作用域覆盖整个模块,所有函数均可直接访问;
  3. 同一函数内不允许定义同名局部变量,不同函数内可定义同名局部变量(相互独立,互不影响);
  4. 全局变量与局部变量同名时,局部变量具有更高的优先级(函数内部优先使用局部变量)。

实战案例:局部变量与全局变量的使用

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 中尽量避免使用全局变量,原因如下:

  1. 全局变量可被程序中任意代码访问和修改,易出现数据被意外篡改的错误;
  2. 全局变量的错误难以排查,尤其是在大型程序中,无法快速定位修改数据的代码位置;
  3. 过度使用全局变量会降低代码的可维护性和可读性,违背模块化编程思想。

三、lambda 匿名函数

lambda 函数是 Python 中创建匿名函数的特殊方式,无需通过def关键字定义函数名,语法简洁,仅需一条语句即可实现简单的函数逻辑,适合定义一次性、无需复用的简单函数。

3.1 基本语法

python

运行

函数名 = lambda params: expr
  • params:函数的参数列表,支持多个参数(用逗号分隔);
  • expr:函数的返回值表达式,只能是单个表达式,不能包含ifforwhile等条件和循环语句。

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 函数适合处理简单的逻辑运算,常见使用场景包括:

  1. 作为内置函数的参数(如sort()filter()map()等);
  2. 定义临时使用的简单函数,避免多余的函数名定义;
  3. 简化代码结构,让代码更简洁易读。

注意:lambda 函数仅适用于简单逻辑,若需实现复杂的条件判断、循环等逻辑,建议使用普通函数。

四、Python 常用内置函数

Python 提供了大量内置函数(内建函数),这些函数无需导入任何模块,解释器可直接识别并调用,能大幅提升程序编写效率。内置函数覆盖了数据类型转换、数值计算、序列操作等常用功能,下面介绍开发中最常用的内置函数。

4.1 核心内置函数速查

表格

函数名 功能描述 语法 示例 输出结果
abs() 返回数字的绝对值 abs(x) abs(-10)abs(3.14) 103.14
bool() 将参数转换为布尔值(True/False) bool(x) bool(0)bool('abc')bool([]) FalseTrueFalse
float() 将参数转换为浮点型 float(x) float('25')float(3) 25.03.0
int() 将参数转换为整型 int(x) int(199.99)int('100') 199100
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)) 105050
max() 返回序列 / 多个参数中的最大值 max(seq)/max(x1,x2,...) max([6,2,65])max(100,2678,9) 652678
min() 返回序列 / 多个参数中的最小值 min(seq)/min(x1,x2,...) min([6,2,65])min(100,2678,9) 29

4.2 关键注意点

  1. bool()转换规则:数字0、空字符串''、空列表[]、空元组()、空字典{}None均返回False,其余值返回True
  2. int()转换规则:参数为字符串时,字符串必须是纯整数格式(如'99'),浮点格式字符串(如'99.9')会报ValueError
  3. range()规则:起始值start默认值为0,步长step默认值为1,生成的序列包含start,不包含stop(即左闭右开);
  4. max()/min()对字符串的比较:英文字母大于数字,小写字母大于大写字母(如max('d,D')返回'd')。

五、Python 模块与包

当程序中的函数、类较多时,需要对代码进行模块化组织,Python 中的模块是实现代码组织和复用的核心方式。模块用于管理复杂度较低的代码,用于管理复杂度较高、模块数量较多的代码,二者均能实现代码的跨文件复用。

5.1 模块(Module)

模块本质上是一个以.py 为后缀的 Python 文件,文件中包含 Python 的函数、类、变量和语句,将一组相关的功能代码组织在一个文件中,即为一个模块。模块名与文件名一致(如myModule.py的模块名为myModule)。

核心作用
  1. 实现代码复用:模块中的函数、类可被其他 Python 文件调用,无需重复编写;
  2. 优化程序结构:将不同功能的代码拆分到不同模块,让程序结构更清晰;
  3. 避免命名冲突:不同模块中的函数名、变量名可重复,通过模块名。标识符的方式调用,避免冲突。

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 模块的作用域与加载规则
  1. 导入作用域:在模块顶层导入,作用域为全局;在函数内部导入,作用域为局部(仅在该函数内有效),推荐顶层导入
  2. 加载规则:一个模块仅能被加载一次,无论被导入多少次,避免多重导入时代码被多次执行;
  3. 模块分类:Python 中的模块分为三类 —— 标准库模块(Python 自带,如sysrandom)、第三方模块(如numpypandas)、自定义模块(开发者自己编写)。

5.3 包(Package)

包是多个模块的集合,本质上是一个包含__init__.py 文件的目录,用于将功能相关的多个模块组织在一起,实现模块的分层管理。当程序中的模块数量较多时,使用包能让代码结构更清晰。

5.3.1 包的创建条件
  1. 创建一个目录,作为包的根目录;
  2. 在该目录中创建init.py 文件(前后均为两个下划线),该文件可以是空文件,也可以编写初始化代码;
  3. 在包目录中创建多个.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 是包的初始化文件,核心作用如下:

  1. 标识当前目录为 Python 的包目录,若无此文件,Python 会将该目录视为普通目录,无法作为包导入;
  2. 初始化包的公共变量和方法,在第一次导入包中的任何模块时,会自动执行__init__.py 中的代码;
  3. 可通过__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 的关键字,核心属性和方法如下:

  1. keyword.kwlist:返回包含所有 Python 关键字的列表;
  2. 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 匿名函数、常用内置函数,再到模块与包的定义、导入和使用,结合大量实战案例和表格总结,让知识点更清晰、更易理解。

核心要点回顾:

  1. 函数是代码复用的基础,带参函数的参数默认值关键字参数是开发中的常用技巧,需注意参数的定义规则;
  2. 变量作用域的核心是区分局部和全局变量,global关键字可在函数内定义全局变量,开发中尽量避免使用全局变量;
  3. lambda 函数适合简单逻辑,语法简洁,是普通函数的补充,不可替代普通函数处理复杂逻辑;
  4. 内置函数是 Python 的内置工具,无需导入即可使用,熟练掌握能大幅提升开发效率;
  5. 模块和包是代码组织的核心方式,模块实现单文件代码复用,包实现多模块分层管理,*init.py*是包的核心标识;
  6. Python 标准库提供了大量实用模块(keywordrandomsystime等),熟练使用能避免重复造轮子。

掌握函数与模块的使用,是 Python 从入门到进阶的关键一步,在实际开发中,建议养成模块化编程的习惯,将不同功能的代码拆分到不同的模块和包中,让代码更简洁、更易维护、更易扩展。后续可进一步学习 Python 的面向对象编程、第三方模块的使用,结合函数与模块的知识,构建更复杂的 Python 程序。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐