编程与 AI12 分钟阅读更新于 2026-07-15

Python 函数怎么写才好用:参数、返回值、作用域和拆分思路

用真实脚本维护场景讲清 Python 函数的核心用法,重点不是语法炫技,而是把重复代码整理成可复用、可测试的小函数。

相关工具

函数的价值是让重复逻辑有名字

很多人第一次写函数,只是因为教程要求。真正工作里,函数的价值很朴素:把一段重复出现的逻辑起个名字,下次直接调用。比如清洗标题、解析时间、请求接口、保存 JSON,这些动作如果散落在脚本里,改一次要找很多地方;变成函数后,入口清楚,修改也集中。

一个函数最好只做一件清楚的事。比如 clean_title 负责清洗标题,save_json 负责保存文件,不要写一个 process_all 同时负责读取、清洗、请求、保存、打印。大函数看似省事,后面排查问题会非常累。

简单函数示例:

python代码示例
def clean_title(title):
    return " ".join(title.strip().split())

print(clean_title("  Python\n函数 入门  "))

参数是输入,返回值是结果

写函数时先想两件事:它需要哪些输入,它应该返回什么结果。输入不要偷偷从全局变量里拿,结果不要只打印不返回。打印适合调试,返回值才方便后续继续处理。比如清洗标题后,你可能要保存、导出、对比,如果函数只 print,就很难复用。

更实用的写法是:

python代码示例
def build_article(title, slug, category):
    return {
        "title": title.strip(),
        "slug": slug.strip(),
        "category": category.strip(),
    }

article = build_article("Python 函数", "python-function", "编程与 AI")
print(article)

参数不要一口气塞太多。超过五六个参数时,通常说明这个函数承担的事情太多,或者应该传入一个字典。参数越多,调用时越容易传错顺序。

默认参数要小心可变对象

Python 函数里有一个经典坑:不要把列表、字典这种可变对象作为默认参数。因为默认参数只会在函数定义时创建一次,后续多次调用会共享同一个对象,结果可能越来越奇怪。

错误示例:

python代码示例
def add_tag(tag, tags=[]):
    tags.append(tag)
    return tags

print(add_tag("Python"))
print(add_tag("JSON"))

更稳的写法是用 None:

python代码示例
def add_tag(tag, tags=None):
    if tags is None:
        tags = []
    tags.append(tag)
    return tags

把脚本拆成几层会更好维护

一个实用脚本通常可以拆成三层:读取输入、处理数据、输出结果。读取输入可以是读文件、读 CSV、请求接口;处理数据可以是清洗、转换、过滤;输出结果可以是打印、写 JSON、写 CSV。每层拆成函数后,问题出现在哪一步会更清楚。

比如:

python代码示例
def read_lines(path):
    with open(path, "r", encoding="utf-8") as f:
        return f.readlines()

def clean_lines(lines):
    return [" ".join(line.split()) for line in lines if line.strip()]

def save_lines(path, lines):
    with open(path, "w", encoding="utf-8") as f:
        f.write("\n".join(lines))

lines = read_lines("input.txt")
cleaned = clean_lines(lines)
save_lines("output.txt", cleaned)

这种写法不花哨,但非常适合长期维护。以后你想把输入从 txt 换成 CSV,只需要改读取函数;想换清洗规则,只改处理函数。

常见问题

函数是不是越短越好?

不是机械追求短,而是职责清楚。一个函数能用一句话说清楚它做什么,通常就比较好维护。

函数里应该 print 还是 return?

调试可以 print,正式逻辑优先 return。返回值方便继续处理和测试。

默认参数为什么不能写空列表?

空列表会在函数定义时创建并被多次调用共享,容易出现上次调用影响下次调用的问题。

Python 实用

继续阅读

返回专题