Python - Function
Table of Contents
在Python中,函数通过关键字 def
定义。
参数
从函数的角度,parameter指函数定义圆括号内的变量列表,而argument指当函数被调用时传递的值。
Parameter
变长参数(variable-length)
- 参数名前加
*
可以表示该参数可以接受任意数目的位置参数。这种情况下,函数会接受元组参数(a tuple of arguments)。以*
开头的参数只能以最后一个位置参数的形式出现。 - 参数名前加
**
可以表示该参数可以接受任意数目的关键字参数。这种情况下,函数会接受元组参数(a tuple of arguments)。以**
开头的参数只能以最后一个参数的形式出现。
默认参数(可选参数)
- 可以在函数定义时,为参数指定默认值。
- 值得注意的是,默认值生效是在函数定义的时候,而不是在函数调用的时候。
- 一旦某个参数有默认值,那么后续所有参数都必须有默认值。为此,需要把有默认值的参数放在没有默认值的参数后面。
- 参数默认值应该重视不可变的对象,比如
None
,True
,False
, 数字或者字符串。 - 如果默认值是可变容器的话,比如列表、集合或者字典,应该把
None
作为默认值,并在函数体内增加对默认值的检查。
Argument
函数调用时的参数可以分为位置参数(positional argument)和关键字参数(keyword argument)。
位置参数
- 位置参数按照调用顺序为对应的参数赋值。
关键字参数
- 关键字参数的调用方式为
kwarg=value
。 - 函数调用时,关键字参数的顺序可以是任意的。
- 关键字参数必须放在位置参数之后。
调用方式的限制
def fn(positional_only1, positional_only2, /, positional_or_keyword1, positional_or_keyword2, *, keyword_only1, keyword_only2):
- 如果
/
和*
都没有,那么函数调用时参数赋值既可以是以位置参数的方式,也可以是关键字参数的方式。 /
之前的参数赋值必须以位置参数的形式。*
之后的参数赋值必须以关键字参数的形式。
Docstring
对函数功能以及参数的描述。
返回值
- 有返回值的函数,通过关键字
return
返回。 - 没有返回值的函数会默认返回
None
。 - 如果需要返回多个值,可以返回一个元组(tuple1)。当调用的函数返回了元组,通常会将结果赋值给多个变量,也即元组解包。
Lambda函数
Lambda函数是匿名函数,没有返回值,不能被其他文件导入,因此不能被外部调用。其格式如下:
lambda argumuent_list: expression
argument_list
为参数列表,与普通函数的参数列表相同。expression
为单行表达式,其中出现的参数需要在argument_list
中有定义。
Map
内置函数 map
能够对输入序列逐元素地应用所提供的函数,返回一个迭代器对象。格式如下:
map(function, *iterables) -> map object
function
为所应用的函数。iterables
为任何可迭代的序列数据类型,如列表、字典等。
并行计算
Python中的并行计算通常要用到模块 multiprocessing
及其子模块 multiprocessing.dummy
,前者用于进程,后者用于线程。这两个模块均包含了 map
函数。所以,可以通过利用这两个模块中的 map
函数很容易地实现基于线程池的多线程并行计算。
from multiprocessing.dummy import Pool # Generate a thread pool including 8 workers. p = Pool(8) # Multithreading results = p.map(function, iterables) # Thread pool stops subsequent job submission. p.close() # Thread pool waits for the completions of the working threads. p.join()
Filter
内置函数 filter
能够对输入序列根据规则逐元素地过滤,返回过滤后的迭代器对象。格式如下:
filter(function | None, iterable) -> filter object
function
为定义过滤规则的函数,只有返回值为True
的元素才会被返回。iterable
为任何可迭代的序列数据类型对象,如列表、字典等。
Reduce
reduce
函数不是python内置函数,需要通过导入。该函数能够将一个可迭代的序列数据类型合并为单个数值,比如求和,求平均等等。格式如下:
from functools import reduce reduce(function, iterable[, initial]) -> value
function
为定义合并规则的函数,输入为两个参数。iterable
为任何可迭代的序列数据类型对象,如列表、字典等。
Footnotes:
1
元组是通过逗号组成的,而不是那些圆括号。