(十)函数

1. 函数的定义和调用

1.1 函数的定义

def functionname( parameters ):
    '''函数说明_文档字符串'''
    function_suite
    return [expression]

1.2 函数的调用

functionname( parameters )

2. 形参和实参

定义函数的时候,向函数传递的参数 parameters 就是形参。 调用函数的时候,向函数传递(如果有)的参数就是实参。

2.1 位置实参

调用函数的时候,传递的实参与形参要一一对应 ,像这种基于位置的最简单的关联方式称为位置实参。

def f(num, str1):
    '''测试'''
    return str(num) + str1
f(1, '2') # 12
f('1', 2) # TypeError

2.2 关键字实参

关键字实参是传递给函数的 名称-值对,在是实参中就已经将形参与实参关联起来了。

def f(num, str1):
    '''测试'''
    return str(num) + str1
f(str1 = '2', num = 1) # 12

2.4 默认值形参

给形参以默认值,这样在调用函数但缺少相应参数时,函数将使用默认值。 注意,使用默认值时,必须先列出没有默认值的形参,最后列出默认值形参。(这样函数才能正确读取位置实参)

2.5 让实参变成可选的

有时候传递的实参的数量可能并没有这么多,即参数是可选的。 给可选形参的默认值设为 '',并放到形参末尾,然后根据条件判断,确定参数个数。

def sum(x1, x2, x3=''):
    '''测试'''
    if x3:
        return x1 + x2 + x3
    else:
        return x1 + x2

3. 传递列表

Python 函数可以将列表作为参数传递,并在函数内部对其进行一些修改等操作。

4. 传递任意数量的实参

Python 函数的通过将形参设置为 *paras 的形式来接受任意数量的参数。 Python 将接受的任意数量的实参封存在一个元组 (paras) 中,使用 for 在函数体中即可遍历。

def sum(*x):
    y = 0
    for i in x:
        y += i
    return y
sum(1,2,3) # 6

5. 使用任意数量的关键字实参

Python 函数以 **paras 的形参形式来接受任意数量的关键字实参。 并使用 for k, v in paras.items() 来遍历操作传进来的 键值对 实参。

def func(**x):
    d = {}
    for k, v in x:
        d[k] = v
    return d

接受任意数量的参数的形参形式可以与位置参数一起使用,但要放到各参数的末尾。

6. 将函数存储在模块中

通过创建 .py 文件来创建模块,并将函数代码写在该模块中。 导入和使用模块的方法:

import module_name
module_name.func_name( paras )

若模块文件放在指定文件夹(例如lib)中,则要使用 from 从目录路径中导入:

from lib import module_name
module_name.func_name( paras )

导入指定函数:

from module_name import func_name1, func_name2, func_name3
func_name1()
func_name2()
func_name3()

使用 as 指定别名

import x_module_name as x
from x_module_name import func as f
f()

导入模块中所有函数:

from module_name import *

7. 函数编写指南

  • 所有的函数都要有描述其功能的注释,且使用文档字符串的形式紧跟在函数定义后
    def func():
        '''函数说明文档字符串'''
        # do something
    
  • 使用关键字实参和给参数指定默认值的时候,等号两边不要留空格

    def func(x, y=10, z=20):
        # do something
    
  • PEP 规定了一行代码不超过 79 个字符,当函数形参过多时候可换行然后按两次 tab 并使用定义函数。

    def func(
            para0, para1, para2,
            para3, para4, para5):
        # do something
    

8. lambda 表达式

可以用 lambda 关键字来创建一个小的匿名函数。这个函数返回两个参数的和: lambda a, b: a+b 。Lambda函数可以在需要函数对象的任何地方使用。它们在语法上限于单个表达式。从语义上来说,它们只是正常函数定义的语法糖。

语法糖:

name = lambda [list] : 单个表达式

正常函数写法:

def name(list):
    return 单个表达式
name(list)

9. Python 闭包函数