Python 函数


函数是用于完成一个特定任务的一组有关联的语句。


函数定义格式如下:

def 函数名(参数列表):
  """函数说明"""
  函数体

函数由下面几部分组成:

  • def,标记函数定义的开始。
  • 函数名,函数的名字。
  • 参数列表,参数用于函数调用方传递数据给函数。参数是可选的。
  • 函数说明,说明函数的作用。函数说明是可选的。
  • 函数体,函数体包含一组语句用于完成一个任务。函数体中可以有一个可选的return语句用来从函数中返回一个值。如果函数体中没有return语句,函数返回None。

下面是函数的例子:

#!/usr/bin/python

def add(a, b):
    """add two number"""
    return a + b;

def say(s):
    print(s)    # hello

print('a + b =', add(1, 2)) # 3
print(say('hello')) # None

函数参数

Python有4种函数参数:

  • 必须参数(Required argument),函数定义时,没有给参数指定默认值的参数称为必须参数。函数调用时,必须给该参数传值。
  • 关键字参数(Keyword argument),函数调用时,同时传递参数名和参数值arg = value,传递参数的顺序可以和函数定义时的参数顺序不同。
  • 默认值参数(Default argument),函数定义时,使用arg = value的方式给参数指定一个默认值。函数调用时,如果给参数arg传值,则使用该默认值。
  • 可变长度参数(Variable-length argument),即任意长度的参数,函数定义时,在形参前面加上1个或2个*,如使用*args**dictargs来表示由多个实参组成的可变长度参数,可将*args看作一个tuple,**dictargs看作一个dict。

下面是函数参数的例子:

#!/usr/bin/python

# msg是必须参数,pet是默认值参数
def say(msg, pet = 'dog'):
    print(msg, pet)

say('hi')
say('hi', 'cat')

# pet和msg使用关键字参数
say(pet = 'bird', msg = 'hello')

# pets是可变长度参数
def say(msg, *pets):
    print(msg, end=' ')
    for p in pets:
        print(p, end=', ')  #  cat, dog, bird,

say('pets : ', 'cat', 'dog', 'bird')

# colors是可变长度参数
def say(msg, **colors):
    print(msg, end=' ')
    for k, v in colors.items():
        print(k, ':', v, end=', ')  #  orange : orange, apple : red, banana : yellow, 

say('\ncolors : ', apple='red', banana='yellow', orange='orange')

嵌套函数

嵌套函数(Nested function)是定义在其它函数中的函数。嵌套函数可以访问外部函数的变量。

下面是嵌套函数的例子:

#!/usr/bin/python

def out_func():
    out_list = [1, 2]

    def nested_func():
        out_list.append(3)

    nested_func()
    print(out_list) # [1, 2, 3]

out_func()

闭包

闭包(Closure)是嵌套函数。闭包被外部函数作为一个函数对象返回给调用方。即使外部函数执行完成,闭包仍然可以访问外部函数中的变量。函数是第一类对象(first-class object),函数可以做为函数的参数和返回值。

下面是闭包的例子:

#!/usr/bin/python

def out_func(out_list):
    def nested_func(nested_data):
        out_list.append(nested_data)
    return nested_func

list = [1, 2]
closure = out_func(list)
closure(3)
print(list) # [1, 2, 3]

匿名函数

匿名函数指定义函数时不指定函数名的函数。使用lambda关键字定义匿名函数。匿名函数也称为lambda函数。

匿名函数定义格式如下:

lambda 参数列表: 函数体

匿名函数的函数体只能包含一个表达式。

下面是匿名函数的例子:

#!/usr/bin/python

add = lambda a, b : 1 + 2
print('1 + 2 =', add(1, 2)) # 3

print('2 + 3 =', (lambda a, b : a + b)(2, 3)) # 5