人口大计划手游
34.74 MB · 2025-12-21
如果你熟悉 JavaScript,用 JS 对比来理解 Python 的函数传参会非常清晰。虽然两者语法不同,但核心思想有很多相似之处,也有关键差异。
| 特性 | JavaScript (ES6+) | Python |
|---|---|---|
| 位置参数 | 支持 | 支持 |
| 默认参数 | 支持 | 支持 |
| 剩余参数(Rest) | ...args | *args |
| 展开参数(Spread) | ...array / ...obj | *list / **dict |
| 命名参数(Named Params) | 无原生支持(靠对象模拟) | 原生支持关键字参数 |
| 强制关键字参数 | 不支持 | 支持(* 分隔) |
| 仅限位置参数 | 不支持 | 支持(/ 分隔,Python 3.8+) |
function greet(name, age = 18) {
console.log(`Hello ${name}, you are ${age}`);
}
greet("Alice", 25); // Hello Alice, you are 25
greet("Bob"); // Hello Bob, you are 18
def greet(name, age=18):
print(f"Hello {name}, you are {age}")
greet("Alice", 25) # Hello Alice, you are 25
greet("Bob") # Hello Bob, you are 18
结论:这部分两者几乎一致,很简单。
这是最大差异点!
function createUser({ name, email, age = 18 }) {
return { name, email, age };
}
// 调用时必须传对象,顺序无关
createUser({ email: "[email protected]", name: "Alice" });
def create_user(name, email, age=18):
return {"name": name, "email": email, "age": age}
# 可以混用位置 + 关键字,顺序自由(关键字在后)
create_user("Alice", email="[email protected]")
create_user(email="[email protected]", name="Alice") # 全用关键字也可以!
优势:
...argsfunction sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4); // numbers = [1, 2, 3, 4]
*argsdef sum_all(*numbers):
return sum(numbers)
sum_all(1, 2, 3, 4) # numbers = (1, 2, 3, 4) ← 注意是 tuple!
几乎一样!只是 Python 叫 *args,JS 叫 ...args。
const arr = [1, 2, 3];
Math.max(...arr); // 等价于 Math.max(1, 2, 3)
const obj1 = { a: 1 };
const obj2 = { ...obj1, b: 2 }; // { a: 1, b: 2 }
arr = [1, 2, 3]
max(*arr) # 等价于 max(1, 2, 3)
dict1 = {"a": 1}
dict2 = {**dict1, "b": 2} # {"a": 1, "b": 2}
功能一致!只是符号不同:
...*(列表/元组)和 **(字典)这是 JS 没有的概念,也是你觉得“复杂”的来源之一。
def connect(host, port, *, timeout=5, ssl=False):
# * 之后的参数只能用关键字传!
print(f"Connect to {host}:{port}, timeout={timeout}, ssl={ssl}")
# 正确调用
connect("localhost", 8000, timeout=10, ssl=True)
# 错误!不能这样传
connect("localhost", 8000, 10, True) # TypeError!
反过来,有些参数只能按位置传(不能用关键字):
def div(x, y, /): # / 之前的参数只能位置传
return x / y
div(10, 2) # OK
div(x=10, y=2) # TypeError!
def func(
pos_only, /, # 仅限位置
standard, # 标准参数(位置或关键字)
*, # * 之后仅限关键字
kw_only
):
pass
调用方式:
func(1, 2, kw_only=3) #
func(1, standard=2, kw_only=3) #
func(pos_only=1, ...) # pos_only 不能用关键字
func(1, 2, 3) # kw_only 必须用关键字
// 只能靠文档约定,无法语法强制
function func(posOnly, standard, options = {}) {
const { kwOnly } = options;
// ...
}
func(1, 2, { kwOnly: 3 }); // 靠对象传“关键字参数”
| 你的 JS 习惯 | 对应的 Python 写法 |
|---|---|
func(a, b, { c, d }) | func(a, b, c=c, d=d) 或 func(a, b, **options) |
func(...arr) | func(*arr) |
func({...obj}) | func(**obj) |
| “我想让参数名显式写出” | → Python 原生支持!直接 func(param=value) |
| “参数太多记不住顺序” | → 全用关键字参数!func(a=1, b=2, c=3) |