Python初学笔记(四)函数让代码开始有结构

发表于 2025-03-18 22:44 1061 字 6 min read

Spring AI学习笔记(四)工具调用和MCPSpring AI学习笔记(三)RAG从文档入库到回答Spring AI学习笔记(二)ChatClient从怎么调到怎么封装Spring AI学习笔记(一)它到底解决什么问题java新版本-java25学习笔记(四)用JFR和GC日志做一次体检java新版本-java25学习笔记(三)虚拟线程要和资源边界一起看java新版本-java25学习笔记(二)运行时基线先统一java新版本-java25学习笔记(一)LTS版本对比和学习路线主流AI Agent能力对比与工程选型我用Kiro做了个自己的工具站盘一盘虚拟线程我用Trae做了个AstrBot的AI角色扮演插件Python初学笔记(六)常用标准库先学这几个Python初学笔记(五)读写文件和处理异常Python初学笔记(四)函数让代码开始有结构Python初学笔记(三)条件、循环和推导式Python初学笔记(二)变量和基础类型比想象中重要Python初学笔记(一)先把环境和运行方式弄明白主流AI大模型能力对比Java 21和Spring Boot 3升级笔记(五)日志指标与可观测性Java 21和Spring Boot 3升级笔记(四)数据访问层适配Java 21和Spring Boot 3升级笔记(三)虚拟线程使用边界Java 21和Spring Boot 3升级笔记(二)Jakarta迁移要点Java 21和Spring Boot 3升级笔记(一)工程基线整理魔法値をどうやって我慢する?JPAのSpecification大改造!处理生僻字乱码:JPA框架对于Oracle的NVarchar2,NChar,NClob类型支持Redis Stream能不能当轻量消息队列用RocketMQ 5学习笔记:普通消息之外要看什么事件流不是换个消息队列这么简单Kubernetes学习笔记04:发布、排障和观测Kubernetes学习笔记03:配置、密钥和存储Kubernetes学习笔记02:Deployment、Service和IngressKubernetes学习笔记01:Pod和控制器mysql索引原理02--存储引擎索引的实现mysql索引原理01--索引的数据结构
この投稿は「日本語」では表示できません。元の投稿を表示しています。
  写 Python 脚本时,如果只是十几行代码,全部写在一个文件里也能跑。   但代码一多,就会发现需要函数。函数可以把一段逻辑命名、复用、测试,也能让程序结构更清楚。   这篇记录 Python 函数的基础用法,包括定义、参数、返回值、默认参数、可变参数、作用域和类型提示。 定义函数   Python 用 def...

前言

  写 Python 脚本时,如果只是十几行代码,全部写在一个文件里也能跑。

  但代码一多,就会发现需要函数。函数可以把一段逻辑命名、复用、测试,也能让程序结构更清楚。

  这篇记录 Python 函数的基础用法,包括定义、参数、返回值、默认参数、可变参数、作用域和类型提示。

定义函数

  Python 用 def 定义函数。

def say_hello(name):
    print(f"hello {name}")

调用:

say_hello("Tom")

函数名应该表达动作或意图。比如parse_userload_configcalculate_total。不要起handledo_it这种过于模糊的名字。

函数本身就是一种说明。名字起得好,读代码的人能少看很多细节。

返回值

  函数用 return 返回结果。

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

如果没有 return,函数默认返回 None。

def log_message(message):
    print(message)


result = log_message("hello")
print(result)

这里 result 是 None。

初学时要分清楚 print 和 return。print 是输出到控制台,return 是把结果交给调用方。

多个返回值

  Python 函数可以看起来返回多个值。

def get_user():
    return "Tom", 18


name, age = get_user()

本质上返回的是一个元组,然后调用方解包。

这个写法很方便,但不要返回太多值。如果一个函数返回五六个值,读起来会很乱。可以考虑返回字典、dataclass 或专门对象。

默认参数

  函数参数可以有默认值。

def greet(name, prefix="hello"):
    return f"{prefix} {name}"

调用时可以不传 prefix。

greet("Tom")
greet("Tom", "hi")

默认参数很方便,但有一个经典坑:不要用可变对象做默认值。

def add_item(item, items=[]):
    items.append(item)
    return items

这个写法会导致多次调用共享同一个列表。

推荐写法:

def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

关键字参数

  Python 调函数时可以用关键字参数。

def create_user(name, age, active=True):
    pass


create_user(name="Tom", age=18, active=False)

当参数比较多时,关键字参数比按位置传参更清楚。

比如:

create_user("Tom", 18, False)

别人看这行代码,不一定马上知道 False 代表什么。写成active=False就清楚很多。

可变参数

  *args可以接收多个位置参数。

def total(*numbers):
    return sum(numbers)

调用:

total(1, 2, 3)

**kwargs可以接收多个关键字参数。

def print_config(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

可变参数适合写通用工具,但普通业务函数不要滥用。参数越明确,函数越容易理解和检查。

作用域

  函数内部定义的变量,外部不能直接访问。

def demo():
    message = "hello"


print(message)

这会报错。

Python 也能在函数里访问外部变量,但我不建议过度依赖。函数最好通过参数接收输入,通过 return 返回输出。

这样函数更容易测试,也更不容易被外部状态影响。

类型提示

  Python 是动态语言,但可以写类型提示。

def add(a: int, b: int) -> int:
    return a + b

类型提示不会像 Java 那样在运行时强制检查,但 IDE、类型检查工具和读代码的人都能受益。

对于稍微正式一点的代码,我觉得类型提示很值得写。它能让函数边界更清楚。

def summarize(text: str, max_length: int = 100) -> str:
    return text[:max_length]

函数要短一点

  刚开始写代码,很容易一个函数写到底。

读文件、解析数据、处理逻辑、输出结果,全放在 main 里。能跑,但很难维护。

可以拆成几个函数:

def load_lines(path: str) -> list[str]:
    pass


def parse_lines(lines: list[str]) -> list[dict]:
    pass


def save_result(result: list[dict], path: str) -> None:
    pass

每个函数做一件事,名字表达清楚。这样后面改某一段逻辑时,不用在一大坨代码里找。

小结

  函数让 Python 代码从“脚本”开始变得有结构。

  要分清 print 和 return,默认参数不要用可变对象,参数多时用关键字参数,复杂输入输出可以加类型提示。函数最好短一点、职责清楚一点。

  写函数不是为了显得正式,而是为了让代码能复用、能测试、能被以后的人看懂。

気に入ったならばコメントを残してくださいね~

© 2019 - 2026 VincentHo @VincentHo
Powered by theme astro-koharu · Inspired by Shoka