# 函数定义与调用

URL: https://caijiao.org/python/ch05/functions
Source: docs/python/ch05/functions.md
Description: 本章节介绍 Python 中函数的定义与调用，包括函数的基本语法、参数传递方式及常见应用，帮助你掌握如何构建和使用函数来提升代码复用性。

函数是 [Python](/python/) 中组织代码的基本单位，可以提高代码的可读性和复用性。在本章节中，我们将深入了解 Python 中函数的定义与调用，包括参数的传递方式、返回值的使用等。

## 函数的定义

在 Python 中，使用 `def` 关键字来定义一个函数。函数的定义包括函数名、参数列表以及函数体。

```python
def greet(name):
    print(f"Hello, {name}!")
```

上述代码定义了一个简单的函数 `greet()`，它接收一个参数 `name`，并打印出问候信息。

### 调用函数

定义函数后，我们可以通过函数名来调用它，并传递相应的参数。

```python
greet("Alice")
```

输出：

```
Hello, Alice!
```

## 函数的参数

### 位置参数

位置参数是函数定义时最常见的参数类型，调用时按顺序传递。

```python
def add(x, y):
    return x + y

print(add(2, 3))  # 5
```

### 默认参数

Python 函数支持为参数设置默认值，当调用时没有提供参数值时，使用默认值。

```python
def greet(name="Guest"):
    print(f"Hello, {name}!")

greet()          # Hello, Guest!
greet("Bob")     # Hello, Bob!
```

### 可变参数

有时你可能不知道要传递多少个参数，Python 提供了可变参数的功能，允许函数接收任意数量的位置参数和关键字参数。

#### \*args

`*args` 用于接收多个位置参数，并将它们组合成一个元组。

```python
def sum_all(*args):
    return sum(args)

print(sum_all(1, 2, 3, 4, 5))  # 15
```

#### \*\*kwargs

`**kwargs` 用于接收多个关键字参数，并将它们组合成一个字典。

```python
def greet(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

greet(name="Alice", age=25)
```

输出：

```
name: Alice
age: 25
```

### 参数传递方式总结

- **位置参数**：按顺序传递。
- **默认参数**：提供默认值，可以选择性传递。
- **可变参数**：`*args` 用于位置参数，`**kwargs` 用于关键字参数，支持不定数量的参数。

## 返回值

函数可以使用 `return` 语句返回值。如果没有 `return`，函数将返回 `None`。

```python
def multiply(x, y):
    return x * y

result = multiply(2, 3)
print(result)  # 6
```

如果函数没有返回值，它默认返回 `None`。

```python
def no_return():
    print("This function has no return value.")

result = no_return()  # 输出：This function has no return value.
print(result)  # None
```

## 函数的作用域

在 Python 中，函数内定义的变量是局部变量，仅在函数内有效；而函数外的变量是全局变量，可以在函数外部访问。

```python
x = 10  # 全局变量

def my_function():
    x = 5  # 局部变量
    print(x)

my_function()  # 5
print(x)        # 10
```

### 关键字参数和位置参数的混合使用

关键字参数可以与位置参数混合使用，但关键字参数必须放在位置参数后面。

```python
def introduce(name, age=30, city="New York"):
    print(f"My name is {name}, I am {age} years old, and I live in {city}.")

introduce("Alice")  # My name is Alice, I am 30 years old, and I live in New York.
introduce("Bob", city="Los Angeles")  # My name is Bob, I am 30 years old, and I live in Los Angeles.
```

## 函数的嵌套

在 Python 中，函数可以嵌套定义，即在一个函数内部定义另一个函数。嵌套函数可以访问外部函数的变量。

```python
def outer_function():
    x = 10

    def inner_function():
        print(f"Inner function accessing outer function variable: {x}")

    inner_function()

outer_function()  # Inner function accessing outer function variable: 10
```

## 总结

- 使用 `def` 关键字定义函数，传递参数并返回值。
- 可以使用位置参数、默认参数和可变参数来定义灵活的函数。
- 函数的返回值非常重要，了解如何正确使用 `return`。
- 函数内外的作用域不同，局部变量只能在函数内访问，外部变量可以在函数外访问。
- 函数的嵌套和关键字参数的使用使得 Python 函数更加强大和灵活。

掌握函数的定义与调用是编写 Python 程序的基础，可以帮助你提高代码的复用性和可读性。
