一、函数的基本概念
函数是Python中最重要的一种代码组织机制。有了函数,我们可以把程序分解成各个小模块,从而使大型程序更易于开发和维护。函数的定义具有独立性,可以在不影响程序结构或其它函数的情况下被重用。
函数的语法格式如下:
def function_name(parameters):
"""docstring"""
statement(s)
其中,function_name是函数名,parameters是函数的参数列表(可以为空),冒号后是函数体,函数体中语句的缩进是四个空格。函数体中如果有文档注释,要放在函数体内第一行的逻辑行。用help()函数可以查看函数帮助文档。
二、函数的参数
在Python函数中,可以使用位置参数、默认参数、可变参数和关键字参数来定义参数。在调用函数时,必须提供所有位置参数,而默认参数则可以不提供。
位置参数是按照位置顺序传递的参数。例如:
def greet(name):
print("Hello, " + name + "!")
greet("Bob")
默认参数可以提供默认值,如果不传递参数则使用默认值。例如:
def greet(name, greeting="Hello"):
print(greeting + ", " + name + "!")
greet("Bob")
greet("Bob", "Good morning")
可变参数可以接收任意数量的参数。例如:
def greet(*names):
for name in names:
print("Hello, " + name + "!")
greet("Bob", "Alice", "Charlie")
关键字参数是用于传递带有参数名的参数。例如:
def greet(**kwargs):
for key, value in kwargs.items():
print(key + " says " + value)
greet(Bob="Hi", Alice="Hello", Charlie="Good morning")
三、函数的返回值
函数的返回值可以使用return语句指定。如果函数没有返回值,则返回None。例如:
def add(a, b):
return a + b
result = add(3, 4)
print(result)
当函数执行到return时,就会停止执行函数体中的其它语句并返回指定的值。例如:
def greet(name):
if name == "Alice":
return "Hello, Alice!"
else:
return "Hello, stranger!"
print(greet("Bob"))
print(greet("Alice"))
四、函数的作用域
Python中有两种作用域:全局作用域和局部作用域。全局作用域是在模块中定义的,可以被模块中的任何函数或类访问。局部作用域是在函数、方法或语句块中定义的,只能被相应的函数、方法或语句块内的代码访问。
在函数内部,可以使用global关键字来访问或修改全局变量。
x = 10
def add():
global x
x += 1
add()
print(x)
在函数内部,可以使用nonlocal关键字来访问或修改外层函数的变量。
def outer():
x = 10
def inner():
nonlocal x
x += 1
print("inner x:", x)
inner()
print("outer x:", x)
outer()
五、函数的高级特性
在Python中,函数可以作为对象传递和调用。可以使用lambda表达式定义匿名函数。可以使用map、filter、reduce函数对序列进行操作。可以使用装饰器对函数进行增强。
使用lambda表达式定义匿名函数:
f = lambda x: x + 1
print(f(3))
使用map函数对序列进行操作:
lst = [1, 2, 3, 4]
result = map(lambda x: x*x, lst)
print(list(result))
使用filter函数对序列进行筛选:
lst = [1, 2, 3, 4]
result = filter(lambda x: x%2 == 0, lst)
print(list(result))
使用reduce函数对序列进行求积:
from functools import reduce
lst = [1, 2, 3, 4]
result = reduce(lambda x, y: x * y, lst)
print(result)
使用装饰器对函数进行增强:
def trace(func):
def wrapper(*args, **kwargs):
print("Calling", func.__name__)
result = func(*args, **kwargs)
print("Returned", result)
return result
return wrapper
@trace
def greet(name):
return "Hello, " + name + "!"
print(greet("Bob"))