4.2. 使用可选参数和命名参数
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 4.2. 使用可选参数和命名参数

Python 允许函数参数有缺省值；如果调用函数时不使用参数，参数将获得它的缺省值。此外，通过使用命名参数还可以以任意顺序指定参数。SQL Server Transact/SQL 中的存储过程也可以做到这些；如果你是脚本高手，你可以略过这部分。

`info` 函数就是这样一个例子，它有两个可选参数。

    def info(object, spacing=10, collapse=1):

`spacing` 和 `collapse` 是可选参数，因为它们已经定义了缺省值。`object` 是必备参数，因为它没有指定缺省值。如果调用 `info` 时只指定一个参数，那么 `spacing` 缺省为 `10` ，`collapse` 缺省为 `1`。如果调用 `info` 时指定两个参数，`collapse` 依然默认为 `1`。

假如你要指定 `collapse` 的值，但是又想要接受 `spacing` 的缺省值。在绝大部分语言中，你可能运气就不太好了，因为你需要使用三个参数来调用函数，这势必要重新指定 `spacing` 的值。但是在 Python 中，参数可以通过名称以任意顺序指定。

### 例 4.4. `info` 的有效调用

    info(odbchelper)
    info(odbchelper, 12)
    info(odbchelper, collapse=0)
    info(spacing=15, object=odbchelper)

| 只使用一个参数，`spacing` 使用缺省值 `10` ，`collapse` 使用缺省值 `1`。
| 使用两个参数，`collapse` 使用缺省值 `1`。
| 这里你显式命名了 `collapse` 并指定了它的值。`spacing` 将依然使用它的缺省值 `10`。
| 甚至必备参数 (例如 `object`，没有指定缺省值) 也可以采用命名参数的方式，而且命名参数可以以任意顺序出现。

这些看上去非常累，除非你意识到参数不过是一个字典。“通常” 不使用参数名称的函数调用只是一个简写的形式，Python 按照函数声明中定义的的参数顺序将参数值和参数名称匹配起来。大部分时间，你会使用“通常”方式调用函数，但是如果你需要，总是可以提供附加的灵活性。

调用函数时唯一必须做的事情就是为每一个必备参数指定值 (以某种方式)；以何种具体的方式和顺序都取决于你。

### 进一步阅读

- Python Tutorial 确切地讨论了何时、如何进行缺省参数赋值，这都和缺省值是一个 list 还是一个具有副作用的表达式有关。