Python函数:代码复用与模块化编程的基石

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函数常与mapfilter等函数配合使用。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函数能够有效简化代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值