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

元组是通过逗号组成的,而不是那些圆括号。