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