自学内容网 自学内容网

前端的 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}"

主要区别

  1. Python 没有箭头函数,但支持 lambda 表达式定义单行匿名函数(见后文)。
  2. 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 同样支持高阶函数,并有 mapfilter 等内置函数。

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. 限制与注意事项

特性JavaScriptPython
动态添加方法可以在运行时动态添加方法不支持直接动态添加方法
函数作为一等公民支持支持
函数体多样性支持多行函数、匿名函数、箭头函数匿名函数(lambda)限制为单行表达式
默认参数与解构默认参数和对象解构非常灵活默认参数支持,解构需要显式操作

总结

Python 和 JavaScript 的函数功能都非常强大,但在实现细节和限制上存在一些差异。对于前端开发者来说:

  1. Python 的 lambda 表达式虽然类似箭头函数,但功能更有限,仅适用于简单场景。
  2. Python 中的 *args**kwargs 提供了优雅的可变参数支持,是 JavaScript 中剩余参数和对象解构的替代品。
  3. Python 的闭包和作用域管理相对更严格,需要通过 nonlocal 修改外部变量。

通过对比这些特性,前端开发者可以更快适应 Python 的函数机制,并在实际项目中灵活运用。


原文地址:https://blog.csdn.net/m0_38015699/article/details/144293632

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!