当前位置:首页 > 随笔 > 正文内容

Python函数与高阶编程范式解析

访客 随笔 2026年7月3日 2

函数的基本概念

函数是组织良好、可重复调用的代码块,用于实现特定或相关联的功能。通过封装逻辑,函数增强了程序的模块化程度,并提升代码复用率。Python内置了如print()等常用函数,同时也支持开发者自定义函数以满足个性化需求。

函数与过程的区别

在一些编程语言中,"过程"指无返回值的操作,"函数"则有明确返回结果。但在Python中,这种区分并不严格:所有函数都默认返回None,即使未显式使用return语句。

def func_with_return():
    print("执行中有返回")
    return "done"

def proc_without_return():
    print("这是一个无返回的过程")

result1 = func_with_return()  # 输出: 执行中有返回
result2 = proc_without_return()  # 输出: 这是一个无返回的过程

print(f"func 返回: {result1}")  # done
print(f"proc 返回: {result2}")  # None

为何使用函数?

  • 代码重用:避免重复编写相同逻辑。
  • 一致性维护:统一处理流程,便于调试和更新。
  • 扩展性强:新增功能时只需修改局部而非全局。

例如日志记录场景:

import time

def log_action():
    timestamp = time.strftime('%Y-%m-%d %X')
    with open('log.txt', 'a', encoding='utf-8') as f:
        f.write(f"{timestamp} - 操作完成\n")

def task_a():
    print("运行任务A")
    log_action()

def task_b():
    print("运行任务B")
    log_action()

task_a()
task_b()

上述设计确保每个任务完成后自动写入时间戳,无需手动插入日志代码。

函数定义语法

Python使用def关键字定义函数,基本结构如下:

def function_name(parameters):
    """文档字符串(可选)"""
    # 函数体
    return value  # 可选

示例:

def greet(name):
    print(f"欢迎, {name}")

greet("Alice")

返回值机制

return语句不仅传递结果,还立即终止函数执行。若省略表达式,则返回None

def demo_return():
    print("开始执行")
    return "中途退出"
    print("这行不会被执行")  # 不可达代码

output = demo_return()
print(output)  # 输出: 中途退出

返回类型可以是任意对象:

  • 单个值 → 直接返回该值
  • 多个值 → 自动打包为元组
  • 函数名本身 → 返回函数引用(内存地址)
def multi_return():
    return 1, "hello", [1, 2], {"key": "value"}

res = multi_return()
print(res)  # (1, 'hello', [1, 2], {'key': 'value'})

参数传递方式

位置参数与关键字参数

def describe_pet(animal, name):
    print(f"我有一只{animal},名字叫{name}")

describe_pet("猫", "小白")                    # 位置传参
describe_pet(name="小黑", animal="狗")         # 关键字传参
describe_pet("兔子", name="跳跳")             # 混合模式(位置在前)

默认参数

允许为参数设置默认值,调用时可不传。

def connect(host, port=80):
    print(f"连接到 {host}:{port}")

connect("localhost")           # 使用默认端口80
connect("api.example.com", 443) # 覆盖默认值

可变参数 (*args 和 **kwargs)

  • *args:接收任意数量的位置参数,封装成元组。
  • **kwargs:接收任意数量的关键字参数,封装成字典。
def flexible_func(*args, **kwargs):
    print("位置参数:", args)
    print("关键字参数:", kwargs)

flexible_func(1, 2, 3, user="Bob", action="login")
# 输出:
# 位置参数: (1, 2, 3)
# 关键字参数: {'user': 'Bob', 'action': 'login'}

变量作用域

局部变量仅在函数内部有效;全局变量可通过global关键字在函数内修改。

counter = 0

def increment():
    global counter
    counter += 1

increment()
print(counter)  # 1

对于可变对象(如列表、字典),即使不声明global,也能修改其内容:

data = [1, 2, 3]

def modify_list():
    data.append(4)  # 成功修改原列表

modify_list()
print(data)  # [1, 2, 3, 4]

递归函数

函数调用自身称为递归。需注意:

  • 必须有明确的终止条件。
  • 每次递归应缩小问题规模。
  • 过深递归可能导致栈溢出。
def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n - 1)

print(factorial(5))  # 120

高阶函数

函数可以作为参数传递给其他函数,或作为返回值输出,这类函数称为高阶函数。

def apply_operation(x, y, operation):
    return operation(x, y)

def add(a, b):
    return a + b

result = apply_operation(3, 4, add)
print(result)  # 7

匿名函数 (lambda)

使用lambda创建简洁的单行函数。

double = lambda x: x * 2
print(double(5))  # 10

嵌套函数

在一个函数内部定义另一个函数,常用于闭包或装饰器实现。

def outer():
    def inner():
        print("这是内部函数")
    inner()

outer()  # 调用外层函数触发内层执行

装饰器原理与实现

装饰器是一种增强函数功能的技术,遵循两个原则:

  1. 不修改被装饰函数源码。
  2. 不改变其调用方式。

核心依赖:高阶函数 + 嵌套函数

示例:统计函数运行时间

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)  # 执行原函数
        end = time.time()
        print(f"函数 {func.__name__} 耗时: {end - start:.2f}s")
        return result
    return wrapper

@timer_decorator
def slow_task():
    time.sleep(1)
    print("任务完成")

slow_task()

上述代码中,@timer_decorator等价于:

slow_task = timer_decorator(slow_task)

装饰器能无缝集成到现有系统,适用于日志、权限控制、缓存等多种场景。

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。