Python 函数:代码复用与模块化编程的基石
在 Python 编程领域中,函数是实现代码复用和模块化的重要工具。通过将复杂逻辑封装为独立的代码块,函数不仅能够减少重复代码的编写,还能使程序结构更加清晰,便于后续维护与扩展。下面将详细介绍 Python 函数的相关知识。
一、函数的基础概念与定义
函数是具有特定功能且可重复使用的代码块,使用def
关键字进行定义,其基本语法结构如下:
def f(a): # 定义函数f,接收参数a
"""
函数文档字符串,用于描述函数的功能、参数和返回值等信息
"""
# 函数体,实现具体功能的代码
return r # 返回结果r
其中,f
为函数名,用于标识函数以便后续调用;a
是参数,作为函数接收外部输入数据的途径,不同参数值会产生不同的函数输出;函数文档字符串使用三个双引号包裹,可详细说明函数用途、参数含义及返回值情况,方便开发者理解代码;return
语句用于指定函数的输出结果,若缺失该语句,函数将默认返回None
。
以计算两数之和为例:
def add(a, b): # 定义函数add,接收两个参数a和b
"""
该函数的作用是把传入的两个数字加起来,返回它们的和
:param a: 第一个要相加的数字
:param b: 第二个要相加的数字
:return: a和b相加的结果
"""
return a + b # 把a和b加起来,然后返回这个和
r = add(3, 5) # 调用add函数,传入3和5,把得到的结果存到r里
print(r) # 打印结果,输出8
二、函数的参数类型
1. 位置参数
位置参数是最常见的参数类型。调用函数时,需按照函数定义时参数的顺序依次传递值。例如:
def p(n, a): # 定义p函数,有n和a两个参数
print(f"姓名:{n},年龄:{a}") # 按照传入的参数,打印出姓名和年龄
p("Alice", 25) # 调用p函数,"Alice"对应n,25对应a,输出:姓名:Alice,年龄:25
在p
函数中,n
用于接收姓名,a
用于接收年龄,调用时参数顺序不可混淆。
2. 关键字参数
关键字参数允许通过参数名指定参数值,无需遵循固定顺序。例如:
p(a=30, n="Bob") # 调用p函数,用关键字指定参数值,顺序改变不影响结果,输出:姓名:Bob,年龄:30
当函数参数较多时,使用关键字参数可使代码意图更清晰,避免因传参顺序错误导致问题。
3. 默认参数
定义函数时可为参数设置默认值。调用函数时若未传递该参数的值,函数将自动使用默认值。例如:
def g(n, g="Hello"): # 定义g函数,g参数默认值是"Hello"
print(f"{g}, {n}!") # 打印出问候语和名字
g("Charlie") # 调用g函数,只传"Charlie",g使用默认值,输出:Hello, Charlie!
g("David", "Hi") # 传入"Hi",g使用传入的值,输出:Hi, David!
4. 可变参数
实际编程中常遇到参数数量不确定的情况,Python 提供两种可变参数形式:
- 不定长位置参数(*args):
*args
用于接收任意多个位置参数,这些参数会被打包成元组。示例如下:
def s(*a): # 定义s函数,用*a接收不定长位置参数
r = 0 # 初始化r为0,用于存储累加结果
for num in a: # 遍历元组a里的每个数字
r += num # 把数字累加到r上
return r # 返回累加的最终结果
print(s(1, 2, 3, 4, 5)) # 调用s函数,传入1到5,输出15
- ** 不定长关键字参数(kwargs):
**kwargs
用于接收任意多个关键字参数,这些参数会被打包成字典。例如:
def pi(**k): # 定义pi函数,用**k接收不定长关键字参数
for key, value in k.items(): # 遍历字典k里的每一组键值对
print(f"{key}: {value}") # 打印出键和对应的值
pi(n="Ella", a=22, m="Computer Science") # 调用pi函数,传入一些关键字参数
# 输出:
# n: Ella
# a: 22
# m: Computer Science
可变参数适用于处理大量数据或参数个数不确定的场景。
三、函数的返回值
函数通过return
语句返回执行结果,可返回数字、字符串、列表、字典等多种数据类型,甚至可以返回其他函数或类。同时,return
语句也可用于提前结束函数执行。以下为两个示例:
def get(c): # 定义get函数,接收参数c
if c == 1: # 判断c的值
return [1, 2, 3, 4, 5] # 如果c是1,返回这个列表
elif c == 2:
return {"n": "Frank", "a": 28} # 如果c是2,返回这个字典
else:
return "Invalid choice" # 不满足前面条件,返回该字符串
d = get(1) # 调用get函数,传入1,把结果存到d里
print(d) # 打印d,输出[1, 2, 3, 4, 5]
def ch(n): # 定义ch函数,接收参数n
if n % 2 != 0: # 判断n是不是奇数
return # 是奇数就直接结束函数
print(f"{n}是偶数") # 是偶数就打印这句话
ch(4) # 调用ch函数,传入4,输出:4是偶数
ch(5) # 传入5,因为是奇数,函数直接结束,无输出
四、函数的作用域
在 Python 中,变量的作用域决定其可使用范围。函数内部定义的变量为局部变量,仅在函数内部有效;函数外部定义的变量为全局变量,可在整个模块中访问。若要在函数内部修改全局变量,需使用global
关键字声明。示例如下:
g_v = 10 # 定义全局变量g_v,赋值为10
def my_f(): # 定义my_f函数
l_v = 5 # 在函数里定义局部变量l_v,赋值为5
print(f"局部变量: {l_v}") # 打印局部变量的值
print(f"全局变量: {g_v}") # 打印全局变量的值
my_f() # 调用my_f函数
# 输出:
# 局部变量: 5
# 全局变量: 10
print(f"全局变量: {g_v}") # 在函数外面也能访问全局变量,输出:全局变量: 10
c = 0 # 定义全局变量c
def inc(): # 定义inc函数
global c # 声明要修改全局变量c
c += 1 # 把c的值加1
return c # 返回修改后的c
print(inc()) # 调用inc函数,输出1
print(inc()) # 再调用一次,输出2
但过多使用全局变量会使程序逻辑变得复杂,应尽量减少使用。
五、导入其他模块中的函数
编写 Python 程序时,常需使用其他模块中已定义好的函数以提高开发效率。Python 提供多种导入模块和函数的方式:
1. 导入整个模块、从模块中导入特定函数及导入模块中所有函数
- 导入整个模块:使用
import
语句可导入整个模块,通过模块名.函数名
的方式调用模块内的函数。例如,导入 Python 内置的math
模块计算平方根:
import math # 导入math模块
result = math.sqrt(16) # 用math模块里的sqrt函数计算16的平方根
print(result) # 输出4.0
- 从模块中导入特定函数:若只需使用模块中的某个函数,可使用
from...import...
语句,调用函数时无需添加模块名前缀。如导入math
模块中的sin
函数:
from math import sin # 从math模块导入sin函数
value = sin(0) # 计算0的正弦值
print(value) # 输出0.0
- 导入模块中所有函数(不推荐):
from...import *
语句可导入模块中的所有函数,但该方式易引发命名冲突,尤其是多个模块存在同名函数时,因此一般不建议使用。示例如下:
from math import * # 导入math模块所有函数
print(sqrt(25)) # 用sqrt函数计算25的平方根,输出5.0
2. 给导入函数设置别名
在导入函数或模块时,可使用as
关键字为其设置别名,方便在代码中使用,也能解决命名冲突问题。
- 为导入的模块设置别名:当模块名较长,频繁使用时容易使代码冗长,设置别名可简化书写。例如,导入
pandas
模块并将其命名为pd
:
import pandas as pd # 导入pandas模块,设置别名pd
data = pd.read_csv('data.csv') # 使用别名调用read_csv函数读取CSV文件
六、lambda 函数
lambda
函数,即匿名函数,没有具体的函数名称,适用于创建简单的一次性小功能。在 Python 中,使用lambda
关键字进行定义,格式为lambda 参数列表: 表达式
。其中,参数列表可包含一个或多个参数,表达式的结果即为函数的返回值,且只能有一个表达式。
例如,定义一个计算平方的lambda
函数:
square = lambda x: x ** 2 # 定义匿名函数,传入x,返回x的平方
print(square(5)) # 调用这个函数,传入5,输出25
lambda
函数常与map
、filter
等函数配合使用。map
函数将指定函数应用于可迭代对象的每个元素,filter
函数则根据指定函数筛选可迭代对象中的元素。
使用map
函数和lambda
函数对列表中的每个元素求立方:
nums = [1, 2, 3, 4, 5]
result = list(map(lambda x: x ** 3, nums)) # 把立方函数应用到nums的每个元素上
print(result) # 输出[1, 8, 27, 64, 125]
使用filter
函数和lambda
函数筛选出列表中的奇数:
nums = [1, 2, 3, 4, 5, 6]
result = list(filter(lambda x: x % 2 != 0, nums)) # 筛选出奇数
print(result) # 输出[1, 3, 5]
在需要快速定义简单函数且仅使用一次的场景下,lambda
函数能够有效简化代码。