1. 概述:
函数是重用的程序段。你给一个语句块一个名称,然后你用这个名字可以在你的程序的任何地方,任意多次地运行这个语句块,这被称为调用函数。
函数用关键字def 来定义。def 关键字后跟一个函数的标识符名称,然后跟一对圆括号。圆括号之中可以包括一些变量名,该行以冒号结尾。
接下来是一块语句,它们是函数体。
2. 函数的参数:
(1). 形参与实参、位置参数。
(2). 默认参数。
(3). 关键字参数。
(4). Varargs参数:
有时,你或许想定义一个能获取任意个数参数的函数,这可通过使用 * 号来实现。
当我们定义一个带星的参数,像 *param 时,从那一点后所有的普通参数被收集为一个叫做 ’param’ 的元组。
同样的,当我们定义一个带两个星的参数,像 **param 时,从那一点开始的所有的关键字参数会被收集为一个叫做 ’param’ 的字典。
Varargs参数也叫收集参数,有很多使用的小规则小技巧,如:Python中函数参数的设置是有顺序的,不然的话很有可能报错。具体的问题都很
简单,即使实践中发生了,也很容易相同和改正。
(5). Keyword-only参数:
如果想指定特定的关键参数为 keyword-only 而不是位置参数,可以在带星的参数后申明。(亲测不可以在带两个星后面申明关键字参数或普通参数).
如果你想使用keyword-only 参数,但又不需要带星的参数,可以简单地使用不使用名字的空星,如def total(initial=5, *, vegetables) 。
3. 变量的作用域、生存期或可见性:
Python中的变量根据作用域分为全局变量,局部变量,非局部变量。仅从字面意义上就可以直观地理解变量的作用域和定义的位置的关系。
如果实在是想在函数体内对全局变量或者非局部变量进行修改,可以采用 global 语句和 nonlocal 语句(nonlocal语句是Python3的新特性,
在旧的Python中只能考虑用列表代替变量, 好像与变量的储存及屏蔽机制有关,有待深入的学习)。
4. 函数的Docstrings:
由于文档字符串帮助你的程序文档更加简单易懂,你应该尽量使用它。你甚至可以在程序运行的时候,从函数恢复文档字符串!
在函数的第一个逻辑行的字符串是这个函数的文档字符串。注意,DocStrings 也适用于模块和,这个后面再说。
文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。最好在自己的函数中
使用文档字符串时遵循这个惯例。
你可以使用__doc__ (注意双下划线)调用 printMax 函数的文档字符串属性(属于函数的名称)。请记住Python 把每一样东西都作为对象,包括这个函数。
还可以使用help(printMax)。
5. 函数的return语句
6. 内嵌函数和闭包:
内嵌函数,顾名思义,就是定义在函数体内的函数,也称内部函数。
闭包是一种内嵌函数,简单地说,闭包就是根据不同的配置信息得到不同的结果。闭包往往有以下特点,内嵌函数调用自身函数体外且在外部函数内的变量,
就是非局部变量,包含闭包的外部函数往往返回的是闭包的函数名。
关于闭包的深刻理解,请移步到这位大侠的博客 。
7. lambda表达式:
lambda表达式即匿名函数。只能由一行组成。如 g = lambda x :x * x。冒号前面是参数,可以有一个或多个参数,冒号后面是函数返回值,用表达式表示,
有且仅能有一个表达式。lambda表达式可以使代码更精简,增强可读性,把某些简短且需多次调用的函数写成匿名函数可以大大提高程序运行的效率。
Python3中lambda表达式经常用于排序。
在许多语言中都有类似lambda表达式的设计,有点像C语言的宏定义或者C++里面的inline。
8. 几个很牛逼的BIF:
filter(), map(), reduce(),
如果这三个函数你都不会用的话别说你学过Python。
9. 函数中递归的设计,如你所知,递归总是程序设计中最迷人又最绕人的地方。有道是,“普通程序员用迭代,天才用递归”。