在 Python 中,def 关键字用于定义函数。函数是一段可重用的代码块,用于执行特定的任务或操作。通过定义函数,可以将一段代码封装起来,使其可以在程序中被多次调用,提高代码的复用性和可维护性。
下面是 def 函数定义的基本语法结构:
def function_name(parameters):
"""Docstring"""
# Function body
# 可能包含多条语句
return value
def:关键字用于声明函数的开始。
function_name:函数的名称,用于标识函数。
parameters:函数的参数列表,可以是零个或多个参数,多个参数之间用逗号分隔。
“”“Docstring”“”:函数的文档字符串(docstring),用于描述函数的作用、参数和返回值等信息。
return value:return 语句用于从函数中返回值,可以选择性地指定返回值。如果函数不需要返回值,可以省略 return 语句。
下面是一个简单的示例,演示了如何定义一个函数并调用它:
def greet(name):
"""This function greets the person with the given name."""
print("Hello, " + name + "!")
# 调用函数
greet("Alice") # 输出:Hello, Alice!
函数的参数传递
位置参数:
位置参数是最常见的参数传递方式,它按照定义时的顺序将参数传递给函数。调用函数时,传递的参数数量和顺序必须与函数定义时的参数数量和顺序一致。
def greet(name, message):
print(f"{message}, {name}!")
# 调用函数
greet("Alice", "Hello") # 输出:Hello, Alice!
关键字参数:
关键字参数允许在调用函数时使用参数名来传递参数,可以无需考虑参数的顺序。在函数定义时,可以使用 **kwargs 来表示一个字典,其中包含了所有额外的关键字参数。
def greet(**kwargs):
for name, message in kwargs.items():
print(f"{message}, {name}!")
# 调用函数
greet(Alice="Hello", Bob="Hi", Charlie="Hey") # 输出:Hello, Alice! Hi, Bob! Hey, Charlie!
默认参数:
默认参数允许在定义函数时为参数指定默认值,如果调用函数时未提供该参数的值,则会使用默认值。
def greet(name, message="Hello"):
print(f"{message}, {name}!")
# 调用函数
greet("Alice") # 输出:Hello, Alice!
greet("Bob", "Hi") # 输出:Hi, Bob!
可变数量参数:
可变数量参数允许函数接受任意数量的参数。在函数定义时,可以使用 *args 来表示一个元组,其中包含了所有额外的位置参数。
可变数量参数也被称为不定长参数,因为它们允许函数接受任意数量的参数,而不需要事先确定参数的数量。在 Python 中,可变数量参数使用 *args 来表示,它将额外的位置参数收集到一个元组中。这使得函数能够处理不同数量的参数,而不必为每种情况都定义不同的函数签名。
def greet(*names):
for name in names:
print(f"Hello, {name}!")
# 调用函数
greet("Alice", "Bob", "Charlie") # 输出:Hello, Alice! Hello, Bob! Hello, Charlie!
什么是变量的作用域?
局部作用域(Local Scope):局部作用域是指在函数内部定义的变量,只能在函数内部被访问。这意味着它们的生命周期仅限于函数的执行期间。
def my_function():
x = 10 # x 是局部变量
print(x)
my_function() # 输出:10
print(x) # 报错,x 在函数外部不可访问
全局作用域(Global Scope):全局作用域是指在模块顶层定义的变量,可以在模块中的任何地方被访问。
x = 10 # 全局变量
def my_function():
print(x) # 函数中可以访问全局变量
my_function() # 输出:10
print(x) # 输出:10
嵌套作用域(Enclosing Scope):嵌套作用域是指在嵌套函数中访问的变量,例如一个函数内部包含另一个函数。内部函数可以访问外部函数中的变量,但外部函数无法访问内部函数的变量。
def outer_function():
x = 10 # 外部函数的局部变量
def inner_function():
print(x) # 内部函数可以访问外部函数的变量
inner_function()
outer_function() # 输出:10
内置作用域(Built-in Scope):内置作用域是指 Python 中预先定义的一些内置函数和对象,例如 print()、len() 等。这些内置函数和对象可以在任何地方被访问。
print("Hello, world!") # 内置函数在任何地方都可以访问
函数的特殊形式
匿名函数(lambda 函数):
匿名函数是一种特殊的函数形式,它使用 lambda 关键字来创建,通常用于简单的函数操作。它们可以在需要函数对象的任何地方使用,并且通常用于作为参数传递给高阶函数。
# lambda 函数的语法:lambda parameters: expression
# 创建一个简单的匿名函数,计算两个数的和
add = lambda x, y: x + y
print(add(3, 5)) # 输出:8
# 在排序函数中使用 lambda 函数
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1]) # 按元组中的第二个元素排序
print(pairs) # 输出:[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
生成器函数:
生成器函数是一种特殊的函数形式,它使用 yield 关键字来生成一个值序列。当调用生成器函数时,它会返回一个生成器对象,可以逐个地产生值而不必一次性生成所有值,从而节省内存空间。
# 定义一个简单的生成器函数,生成斐波那契数列
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 调用生成器函数,返回一个生成器对象
fib_gen = fibonacci()
# 逐个生成斐波那契数列的值
for i in range(10):
print(next(fib_gen)) # 通过 next() 函数获取下一个值
递归函数
递归是一种常见的问题解决技巧,通常用于解决可以被拆解为更小相同问题的问题。递归函数在问题的解决过程中,通过逐步缩小问题的规模,最终达到一个简单的基本情况,然后开始回溯,将所有解决子问题的结果合并为最终的解决方案。
def factorial(n):
if n == 0: # 基本情况:0 的阶乘为 1
return 1
else:
return n * factorial(n - 1) # 递归调用自身,缩小问题规模
# 调用递归函数
result = factorial(5)
print(result) # 输出:120