前端的 Python 入门指南(二):函数的定义、参数、作用域对比
作为前端python入门的第二篇文章,详细你已经读了前端的 Python 入门指南(一):常用语法和关键字对比 本文将带你理解 Python 中函数的定义、功能和限制,对快速上手非常重要,将详细对比两种语言中函数的语法、特性以及一些关键的异同点。
1. 函数定义:语法与基本形式
JavaScript
JavaScript 提供多种方式定义函数,包括函数声明、函数表达式和箭头函数。
// 函数声明
function greet(name) {
return `Hello, ${name}`;
}
// 函数表达式
const greet = function(name) {
return `Hello, ${name}`;
};
// 箭头函数
const greet = (name) => `Hello, ${name}`;
Python
Python 函数使用 def
关键字定义,并通过冒号和缩进划分代码块。
# 函数定义
def greet(name):
return f"Hello, {name}"
主要区别:
- Python 没有箭头函数,但支持
lambda
表达式定义单行匿名函数(见后文)。 - Python 的函数定义没有花括号,使用冒号和缩进来标识代码块。
2. 默认参数与解构赋值
默认参数
两种语言都支持为函数参数提供默认值。
JavaScript
function greet(name = "World") {
return `Hello, ${name}`;
}
console.log(greet()); // Hello, World
Python
def greet(name="World"):
return f"Hello, {name}"
print(greet()) # Hello, World
两者语法非常相似,但 Python 的默认参数使用等号直接定义,且更加直观。
参数解构
JavaScript 支持对象和数组解构,而 Python 中主要通过元组或字典实现类似功能。
JavaScript
function greet({ name, age }) {
return `Hello, ${name}, age ${age}`;
}
console.log(greet({ name: "Alice", age: 25 })); // Hello, Alice, age 25
Python
def greet(person):
name, age = person["name"], person["age"]
return f"Hello, {name}, age {age}"
print(greet({"name": "Alice", "age": 25})) # Hello, Alice, age 25
主要区别:
- JavaScript 提供内置的解构语法,更加简洁。
- Python 中解构需要显式提取值,或者使用
**kwargs
(后文详述)。
3. 匿名函数
JavaScript
JavaScript 提供箭头函数和 function
关键字用于定义匿名函数。
const add = (x, y) => x + y;
console.log(add(2, 3)); // 5
Python
Python 使用 lambda
表达式定义单行匿名函数。
add = lambda x, y: x + y
print(add(2, 3)) # 5
主要区别:
- JavaScript 的箭头函数功能更强,支持多行代码和复杂逻辑。
- Python 的
lambda
仅支持单行表达式,适合简单操作。
4. 函数参数:位置参数、可变参数与关键字参数
位置参数
Python 和 JavaScript 都支持按顺序传递参数。
JavaScript
function add(a, b) {
return a + b;
}
console.log(add(1, 2)); // 3
Python
def add(a, b):
return a + b
print(add(1, 2)) # 3
可变参数
两者都支持传入任意数量的参数,方法不同。
JavaScript
JavaScript 使用 ...args
(剩余参数)实现:
function sum(...args) {
return args.reduce((acc, val) => acc + val, 0);
}
console.log(sum(1, 2, 3, 4)); // 10
Python
Python 使用 *args
表示可变参数:
def sum(*args):
return sum(args)
print(sum(1, 2, 3, 4)) # 10
关键字参数
Python 允许通过 **kwargs
传入命名参数,JavaScript 则可以使用对象。
JavaScript
function greet({ name = "World", age = 0 }) {
return `Hello, ${name}, age ${age}`;
}
console.log(greet({ name: "Alice", age: 25 })); // Hello, Alice, age 25
Python
def greet(**kwargs):
return f"Hello, {kwargs.get('name', 'World')}, age {kwargs.get('age', 0)}"
print(greet(name="Alice", age=25)) # Hello, Alice, age 25
主要区别:
- Python 的
**kwargs
是语言内置的,功能强大且灵活。 - JavaScript 的对象解构虽然不直接等价,但可以达到类似效果。
5. 高阶函数
JavaScript
JavaScript 支持高阶函数,可以将函数作为参数或返回值。
function applyOperation(a, b, operation) {
return operation(a, b);
}
console.log(applyOperation(3, 4, (x, y) => x + y)); // 7
Python
Python 同样支持高阶函数,并有 map
、filter
等内置函数。
def apply_operation(a, b, operation):
return operation(a, b)
print(apply_operation(3, 4, lambda x, y: x + y)) # 7
6. 作用域和闭包
JavaScript
JavaScript 的函数可以访问外部变量,这被称为闭包。
function outer() {
let count = 0;
return function inner() {
count++;
return count;
};
}
const counter = outer();
console.log(counter()); // 1
console.log(counter()); // 2
Python
Python 也支持闭包,通过 nonlocal
关键字可以修改外层作用域的变量。
def outer():
count = 0
def inner():
nonlocal count
count += 1
return count
return inner
counter = outer()
print(counter()) # 1
print(counter()) # 2
主要区别:
- JavaScript 闭包更常见,用于各种回调和事件处理。
- Python 闭包使用频率较低,更多使用类和对象来管理状态。
7. 限制与注意事项
特性 | JavaScript | Python |
---|---|---|
动态添加方法 | 可以在运行时动态添加方法 | 不支持直接动态添加方法 |
函数作为一等公民 | 支持 | 支持 |
函数体多样性 | 支持多行函数、匿名函数、箭头函数 | 匿名函数(lambda )限制为单行表达式 |
默认参数与解构 | 默认参数和对象解构非常灵活 | 默认参数支持,解构需要显式操作 |
总结
Python 和 JavaScript 的函数功能都非常强大,但在实现细节和限制上存在一些差异。对于前端开发者来说:
- Python 的
lambda
表达式虽然类似箭头函数,但功能更有限,仅适用于简单场景。 - Python 中的
*args
和**kwargs
提供了优雅的可变参数支持,是 JavaScript 中剩余参数和对象解构的替代品。 - Python 的闭包和作用域管理相对更严格,需要通过
nonlocal
修改外部变量。
通过对比这些特性,前端开发者可以更快适应 Python 的函数机制,并在实际项目中灵活运用。
原文地址:https://blog.csdn.net/m0_38015699/article/details/144293632
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!