- 普通函数
- 匿名函数(Lambda函数)
- 高阶函数
- 内置函数
- 递归函数
- 闭包函数
- 装饰器函数
- 方法
8.1. 实例方法
8.2. 类方法
8.3. 静态方法
1. 普通函数
最基本的函数类型,通过 def 关键字定义。
def add(a, b):return a + bprint(add(3, 5)) # 输出: 8
2. 匿名函数(Lambda函数)
使用 lambda 关键字定义的函数,与普通函数不同,Lambda 函数通常是一次性使用的,通常用于定义简单的、短小的函数。
add = lambda a, b: a + bprint(add(3, 5)) # 输出: 8
无参数的 Lambda 函数
greet = lambda: "Hello, World!"
print(greet()) # 输出: Hello, World!
Lambda 函数的局限性
只包含一个表达式: Lambda 函数只能包含一个表达式,不适合处理复杂的逻辑。
可读性: 由于 Lambda 函数没有名字,如果逻辑稍微复杂一些,会影响代码的可读性。
调试困难: 匿名函数在调试时不容易定位问题。
3. 高阶函数
高阶函数具备以下特征之一:
- 接受一个或多个函数作为参数。
- 返回一个函数。
可以接受函数作为参数或返回值的函数。高阶函数广泛应用于各种场景,如数据处理、事件处理和回调等。
def apply_function(func, x, y):return func(x, y)print(apply_function(add, 3, 5)) # 输出: 8
4. 内置函数
Python 提供的一些内置函数,例如 len(), max(), min(), print() 等。
5. 递归函数
一个递归函数通常包含以下两部分:
基准情形: 处理简单的、直接可解决的情况,防止无限递归。
递归调用: 将问题分解为一个或多个子问题,并调用自身来解决这些子问题。
在函数内部调用自身的函数,通常用于解决递归问题。
def factorial(n):if n == 1:return 1else:return n * factorial(n - 1)print(factorial(5)) # 输出: 120
6. 闭包函数(函数内定义的函数)
闭包(Closure)是指一个函数内部定义的函数,这个内部函数可以引用外部函数的变量。闭包不仅可以捕获这些变量,还可以在外部函数返回后继续使用它们。闭包常用于需要封装一些状态或行为的场景中。
闭包由以下三个部分构成:
外部函数: 包含内嵌函数的函数。
内嵌函数: 定义在外部函数内部并且引用外部函数的变量。
自由变量: 内嵌函数引用的、定义在外部函数中的变量。
一个函数可以返回另一个函数,返回的函数可以访问到外部函数的变量。
通过闭包实现一个简单的计数器:
def make_counter(): # 外部函数count = 0 # 自由变量def counter(): # 内嵌函数nonlocal countcount += 1return countreturn counter# 创建计数器实例
counter1 = make_counter()
print(counter1()) # 输出: 1
print(counter1()) # 输出: 2counter2 = make_counter()
print(counter2()) # 输出: 1
counter 是一个闭包,它保存了 make_counter 中的 count 变量,并且通过 nonlocal 关键字可以修改这个变量。
内部工作机制
创建闭包: 当 make_counter 函数被调用时,count 变量和 counter 函数被创建。counter 函数形成一个闭包,捕获 count 变量的引用。
返回闭包: make_counter 函数执行完毕,但 counter 函数和 count 变量仍然存在,因为 counter 函数持有对 count 的引用。
修改和访问状态: 每次调用 counter1 时,都会访问和修改 count 变量,从而实现了一个持续的状态。
7. 装饰器函数
装饰器函数(Decorator functions)在 Python 中是一种强大的工具,用于修改或扩展函数或类的功能。它们允许在不改变原始函数或类代码的情况下,通过添加额外的功能来改变它们的行为。通常情况下,装饰器是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。
用于修改或增强其他函数功能的函数。
# 假设我们有一个函数 add_numbers,它用于计算两个数字的和。
# 我们希望在调用这个函数之前,检查传入的参数是否都是数字。如果不是,我们希望提示用户参数无效。
# 可以使用装饰器来实现这个功能:def validate_numbers(func):def wrapper(*args, **kwargs):# 检查所有参数是否都是数字if all(isinstance(arg, (int, float)) for arg in args):return func(*args, **kwargs)else:print("参数无效,必须是数字。")return wrapper@validate_numbers
def add_numbers(a, b):return a + b# 测试函数
print(add_numbers(10, 20)) # 输出: 30
print(add_numbers(10, '20')) # 输出: 参数无效,必须是数字。
装饰器函数可以用于很多场景,比如缓存、日志记录、权限验证等,它们使得代码更加模块化和易于维护。
8. 方法
方法是属于对象的函数,也就是定义在类内部的函数。方法在调用时会隐式地接收一个对象实例作为第一个参数(通常是 self)。方法可以访问对象的属性和其他方法,并对对象的状态进行修改。
在类中定义的函数。包括实例方法、类方法和静态方法。
8.1. 实例方法
需要一个类的实例来调用的方法。
class MyClass:def instance_method(self):return "This is an instance method"obj = MyClass()
print(obj.instance_method()) # 输出: This is an instance method
8.2. 类方法
使用 @classmethod 装饰器定义的方法,第一个参数是类本身。
class MyClass:@classmethoddef class_method(cls):return "This is a class method"print(MyClass.class_method()) # 输出: This is a class method
8.3. 静态方法
使用 @staticmethod 装饰器定义的方法,不依赖于类或实例。
class MyClass:@staticmethoddef static_method():return "This is a static method"print(MyClass.static_method()) # 输出: This is a static method
参考:
https://blog.csdn.net/Lzcsfg/article/details/140720452