函数、参数与模块系统
用默认参数和关键字参数取代重载;用元组取代包装类;每个文件都是一个模块。
12 分钟 · 右栏代码可点击「运行」
函数定义:没有重载,没有 return 类型 ceremony
Java
1// 想返回两个值?先建一个 record2record Stats(int min, int max) {}34static Stats minMax(int[] xs) {5 return new Stats(xs[0], xs[xs.length - 1]);6}
Python
1def min_max(xs):2 return xs[0], xs[-1] # 返回元组34low, high = min_max([3, 1, 4]) # 自动解包
参数体系:默认值 + 关键字参数 取代 重载
Java
1connect("db://x");2connect("db://x", 5432);3connect("db://x", 5432, true);4// 三个重载 = 三份样板
Python
1def connect(url, port=5432, ssl=True):2 ...34connect("db://x")5connect("db://x", port=6379)6connect("db://x", ssl=False) # 调用点自说明
- 关键字参数让调用点像文档:
retry(req, timeout=3)比retry(req, 3, false)安全得多。 *args收多余位置参数(变 Object...),**kwargs收关键字参数(变 Map)。
模块:每个文件就是模块,import 即用
Java
1package com.demo.util;23public class Strs {4 public static String trim(String s) { ... }5}67// 使用处8import com.demo.util.Strs;9Strs.trim(s);
Python
1# util.py — 文件即模块,不需要 class 壳2def trim(s):3 return s.strip()45# 使用处6from util import trim7trim(s)
- Python 里函数是第一公民:工具函数直接放模块顶层,不需要
class Strs这种静态方法容器。 - 包 = 带
__init__.py的目录(或 namespace package)。pip装的第三方包和你的模块用同一套 import 语法。
程序入口:if __name__ == "__main__"
Java
1public static void main(String[] args) {2 run(args);3}
Python
1def main():2 ...34if __name__ == "__main__": # 本文件被直接运行时才执行5 main()
- 被 import 时不执行入口块,和 Java 的 main 只在主类执行的语义对齐。这是脚本与模块复用的关键。
TIP
没有 private / public — _name 前缀是「内部使用」的约定,__name 会触发名称改写。公共 API 靠文档和 lint 工具守护,而不是编译器 —— 团队规范里加 ruff check 即可。
练一练
这张卡的示例代码已在游乐场中备好,改一改再运行。