|
4 | 4 | "cell_type": "markdown",
|
5 | 5 | "metadata": {},
|
6 | 6 | "source": [
|
7 | | - "# 参数传递 \n", |
| 7 | + "# 1. 参数传递 \n", |
8 | 8 | "给函数传递参数时的一些简要的关键点:\n",
|
9 | 9 | "- **参数的传递是通过自动将对象赋值给本地变量名来实现的。**因为引用是以指针的形式实现的,所有的参数实际上都是通过指针进行传递的。作为参数,被传递的对象从来不自动拷贝。\n",
|
10 | 10 | "- **在函数内部的参数名的赋值不会影响调用者。**在函数运行时,在函数头部的参数名是一个新的、本地的变量名,这个变量名是在函数的本地作用域内的。\n",
|
11 | 11 | "- **改变函数的可变对象参数的值也许会对调用者有影响。**因为参数是简单地赋值给传入的对象,函数能够就地改变传入的可变对象,其结果会影响调用者。\n",
|
12 | 12 | "\n",
|
13 | | - "## 参数和共享引用 " |
| 13 | + "## 1.1 参数和共享引用 " |
14 | 14 | ]
|
15 | 15 | },
|
16 | 16 | {
|
|
75 | 75 | "cell_type": "markdown",
|
76 | 76 | "metadata": {},
|
77 | 77 | "source": [
|
78 | | - "## 避免可变参数的修改 \n", |
| 78 | + "## 1.2 避免可变参数的修改 \n", |
79 | 79 | "在 Python 中,默认通过引用进行函数的参数传递,这意味着不需要创建多个拷贝就可以在程序中传递很大的对象,并且能够按照需要方便地更新这些对象。 \n",
|
80 | 80 | "\n",
|
81 | 81 | "如果不想要函数内部在原处的修改影响传递给它的对象,可以简单地创建一个明确的可变对象的拷贝。"
|
|
146 | 146 | "source": [
|
147 | 147 | "这种方法强制函数写成绝不改变传入参数的样子,强制对函数比原本应该的进行了更多的限制,通常意义下应该避免出现。 \n",
|
148 | 148 | "\n",
|
149 | | - "## 对参数输出和多重结果进行模拟 \n", |
| 149 | + "## 1.3 对参数输出和多重结果进行模拟 \n", |
150 | 150 | "return 能够返回任意种类的对象,所以它也能够返回多个值,如果这些值封装进一个元组或其他的集合类型。"
|
151 | 151 | ]
|
152 | 152 | },
|
|
182 | 182 | "cell_type": "markdown",
|
183 | 183 | "metadata": {},
|
184 | 184 | "source": [
|
185 | | - "# 特定的参数匹配模型 \n", |
| 185 | + "# 2. 特定的参数匹配模型 \n", |
186 | 186 | "参数在 Python 中总是通过赋值进行传递的。传入的对象赋值给了在 def 头部的变量名。 \n",
|
187 | 187 | "\n",
|
188 | 188 | "默认情况下,参数是通过其位置进行匹配的,从左至右,而且必须精确地传递和函数头部参数名一样多的参数。 \n",
|
189 | 189 | "\n",
|
190 | | - "## 参数匹配基础知识 \n", |
| 190 | + "## 2.1 参数匹配基础知识 \n", |
191 | 191 | "**位置:从左至右进行匹配** \n",
|
192 | 192 | " 一般情况下,是通过位置进行匹配,把参数值传递给函数头部的参数名称,匹配顺序从左到右。\n",
|
193 | 193 | "\n",
|
|
206 | 206 | "**keyword-only 参数:参数必须按照名称传递** \n",
|
207 | 207 | " 函数可以指定参数,参数必须用带有关键参数的名字(而不是位置)来传递。这样的参数通常用来定义实际参数以外的配置选项。 \n",
|
208 | 208 | "\n",
|
209 | | - "## 匹配语法 \n", |
| 209 | + "## 2.2 匹配语法 \n", |
210 | 210 | "\n",
|
211 | 211 | "语法|位置|解释\n",
|
212 | 212 | "----|----|----\n",
|
|
221 | 221 | "`def func(*other, name)`||\n",
|
222 | 222 | "`def func(*, name=value)`|函数|参数必须在调用中按照关键字传递 \n",
|
223 | 223 | "\n",
|
224 | | - "## 细节 \n", |
| 224 | + "## 2.3 细节 \n", |
225 | 225 | "如果决定使用并混合特定的参数匹配模型,Python 将会遵循下面有关顺序的法则:\n",
|
226 | 226 | "- 正在函数调用中,参数必须以此顺序出现:任何位置参数(value),后面跟着任何关键字参数(name=value)和 `*iterable` 形式的组合,后面跟着 `**dict` 形式。 \n",
|
227 | 227 | "- 在函数头部,参数必须以此顺序出现:任何一般参数(name),紧跟着任何默认参数(name=value),如果有的话,后面是 `*name`(或者在 Python 3.X 中是 `*`)的形式,后面跟着任何 name 或 name=value keyword-only参数,后面跟着 `**name` 形式。 \n",
|
|
233 | 233 | "4. 其他额外的关键字参数分配到 `**name` 字典中。\n",
|
234 | 234 | "5. 用默认值分配给在头部未得到分配的参数。\n",
|
235 | 235 | "\n",
|
236 | | - "## 关键字参数和默认参数实例 \n", |
| 236 | + "## 2.4 关键字参数和默认参数实例 \n", |
237 | 237 | "**常规参数**"
|
238 | 238 | ]
|
239 | 239 | },
|
|
492 | 492 | "cell_type": "markdown",
|
493 | 493 | "metadata": {},
|
494 | 494 | "source": [
|
495 | | - "## 任意参数实例 \n", |
| 495 | + "## 2.5 任意参数实例 \n", |
496 | 496 | "`*` 和 `**` 让函数支持接收任意数目的参数,它们都可以出现在函数定义或是函数调用中。 \n",
|
497 | 497 | "\n",
|
498 | 498 | "**头部:收集参数** \n",
|
|
765 | 765 | "cell_type": "markdown",
|
766 | 766 | "metadata": {},
|
767 | 767 | "source": [
|
768 | | - "## Python 3.X 的 Keyword-Only 参数 \n", |
| 768 | + "## 2.6 Python 3.X 的 Keyword-Only 参数 \n", |
769 | 769 | "keyword-only 参数即必须只按照关键字传递并且不会由一个位置参数来填充的参数。 \n",
|
770 | 770 | "\n",
|
771 | 771 | "keyword-only 参数编码为命名的参数,出现在参数列表中的 `*args` 之后。"
|
|
0 commit comments