Python函数的主要目的是为了实现代码的模块化和重用。函数可以将代码块封装起来,提供一个可调用的单元,可以在程序中多次使用。函数还可以接收参数,以便于在调用时传递不同的值,从而实现更灵活的功能。
一、函数目的
函数的目的包括:
-
代码重用:函数可以将常用的代码片段封装起来,使得在不同的地方都可以调用,避免重复编写相同的代码。
-
模块化:函数可以将复杂的任务拆分成多个小部分,每个部分由一个函数来完成,使得代码结构更清晰、易于理解和维护。
-
提高可读性:通过将一系列操作封装在一个函数中,可以提高代码的可读性,使得代码逻辑更加清晰明了。
-
参数传递和返回值:函数可以接收输入参数,并根据参数的不同执行不同的操作。函数还可以返回一个值,供调用函数的地方使用。
二、函数定义
可以使用关键字def
来定义函数。例如:
def function_name(parameters):
"""
函数的文档字符串
"""
# 函数的代码块
return value
三、函数声明
函数名
是函数的名称,参数1, 参数2, ...
是函数接受的参数列表。参数列表可以为空,也可以包含一个或多个参数,多个参数之间使用逗号分隔。函数体是函数的具体实现,包括一系列的语句和操作。
def say_hello():
print("Hello, world!")
say_hello()
四、函数调用
函数调用是使用函数名和括号来完成的。可以调用自定义函数。定义函数通常会包含函数体,函数体是一系列被执行的语句块。
def greet():
print("Hello!")
greet()
五、函数形参
形参是在函数定义的时候使用的变量名,它们会在函数调用的时候被实参赋给实际的值。形参可以用作函数内部的局部变量,来接收函数调用时传入的值。
def add(x, y):
return x + y
result = add(3, 4)
print(result) # 输出结果为7
六、函数实参
函数实参是在调用函数时传递给函数的值,用于在函数体内进行操作。函数实参有多种方式传递给函数,包括位置实参、关键字实参和可变数量实参。
(一)、位置实参:通过按照形参的顺序传递值给函数。
def greet(name, age):
print(f"Hello {name}, you are {age} years old.")
greet("张三", 20)
输出:
Hello 张三, you are 20 years old.
(二)、关键字实参:通过指定形参的名字和对应的值来传递实参。这样可以不按照形参的顺序传递实参。
def greet(name, age):
print(f"Hello {name}, you are {age} years old.")
greet(age=20, name="张三")
输出:
Hello 张三, you are 20 years old.
(三)、可变数量实参:允许传递任意数量的实参,包括没有事先定义的形参。在函数定义时使用*args表示可变数量的位置实参,使用**kwargs表示可变数量的关键字实参。
def greet(*names):
for name in names:
print(f"Hello {name}!")
greet("张三", "李四", "王五")
输出:
Hello 张三!
Hello 李四!
Hello 王五!
七、函数返回值
Python函数可以使用return
语句来返回一个值。return
语句用于指定函数的返回值,并且它会将函数的执行结果传递给调用方。
def add(x, y):
return x + y
result = add(3, 5)
print(result) # 输出: 8
八、函数的参数类型
(一)、位置参数:这是最常见的参数类型,在函数调用时根据参数的位置进行传递。
def add(a, b):
return a + b
sum = add(5, 3)
(二)、关键字参数:这种参数是通过参数的名字进行传递,与位置无关。
def greet(name, message):
print(message + ', ' + name)
greet(name='张三', message='Hello')
(三)、默认参数:这些参数在函数定义时通过给参数指定一个默认值来定义。如果在函数调用时没有传递该参数,将使用默认值。
def power(base, exponent=2):
return base ** exponent
result1 = power(6) # 默认使用指数为2
result2 = power(6, 3) # 指数为3
(四)、可变长度参数:在函数定义时可以使用*args
来表示可变长度参数,可以接受任意数量的参数,以元组的形式传递给函数。
def average(*args):
sum = 0
for num in args:
sum += num
return sum / len(args)
result = average(2, 4, 6, 8) # 通过可变长度参数传递4个参数
(五)、关键字可变长度参数:在函数定义时可以使用**kwargs
来表示关键字可变长度参数,可以接受任意数量的关键字参数,以字典的形式传递给函数。
def print_info(**kwargs):
for key, value in kwargs.items():
print(key + ': ' + value)
print_info(name='张三', age='25', city='下北泽')
这些参数类型可以根据需要在函数定义中组合使用。
九、匿名函数
可以使用lambda关键字创建匿名函数。匿名函数是一种没有函数名的函数,通常用于简单的函数表达式。
add = lambda x, y: x + y
result = add(3, 5)
print(result) # 输出: 8
虽然可以使用匿名函数,但是建议在需要复杂逻辑的情况下还是使用普通函数来书写代码,以增强可读性和可维护性。匿名函数适用于一些简单的函数表达式或作为参数传递给其他函数的时候使用。
十、递归函数
递归函数是在函数体内调用自身的函数。
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
一个数的阶乘。当n等于0时,函数返回1,否则返回n乘以factorial(n-1)的结果。
十一、闭包
闭包是指函数内部定义的函数,并且该内部函数可以访问外部函数的变量。闭包在Python中的定义方式是,在外部函数内部定义一个内部函数,并且该内部函数引用外部函数的变量。
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
print(closure(5)) # 输出15
十二、变量global与nonlocal
global
和nonlocal
是关键字,用于在函数内部操作变量的作用域。
(一)、global
关键字用于在函数内部声明一个变量为全局变量。当一个变量在函数内部被赋值时,默认情况下它是局部变量,只在函数内部可见。但是,通过在函数内部使用global
关键字,可以将该变量声明为全局变量,使其在函数内外均可见和修改。
x = 10
def foo():
global x
x = 20
foo()
print(x) # 输出: 20
(二)、nonlocal
关键字用于在嵌套函数中访问并修改外层函数中的变量。当一个变量在内层函数中被赋值时,默认情况下它是局部变量,只在内层函数内部可见。但是,通过在内层函数中使用nonlocal
关键字,可以将该变量声明为外层函数的变量,使其可被内层函数访问和修改。
def outer():
x = 10
def inner():
nonlocal x
x = 20
inner()
print(x) # 输出: 20
outer()
十三、装饰器
装饰器是一种特殊的函数,用于修改其他函数的功能。装饰器可以在不修改原函数代码的情况下,为函数添加额外的功能或修改函数的行为。装饰器的语法使用@
符号,将装饰器函数放在被装饰函数之前。
def decorator_function(func):
def wrapper():
print("装饰器添加的功能")
func()
return wrapper
@decorator_function
def original_function():
print("原始函数")
original_function()
在使用装饰器时,需要注意装饰器的参数传递问题。如果装饰器需要接受参数,可以在装饰器函数外再包裹一层函数,用于接收参数并返回装饰器函数。另外,被装饰的函数也可以有参数,装饰器可以通过接收参数并传递给被装饰的函数。使用装饰器时,需要考虑参数传递的一致性和正确性。
愿与最重要之人能再次相会。 —— 艾拉《可塑性记忆》