PYTHON学习笔记9(匿名函数、装饰器、数据结构)
匿名函数
python使用lambda来创建匿名函数,不需要使用def关键字定义完整函数。lambda函数是一种小型、匿名、内联的函数,可以具有任意数量的参数,但只能有一个表达式。通常用于编写简单的、单行的函数,通常在需要函数作为参数传递的情况下使用。
lambda函数有以下特点:1、是匿名的,没有函数名称,只能通过赋值给变量或作为参数传递给其他函数来使用。2、通常只包含一行代码
语法格式
lambda arguments:expression #lambda是关键字,用于定义lambda函数 #arguments是参数列表,可以包含零个或多个参数 #expression是一个表达式,用于计算并返回函数的结果下面分别是零参数、一个参数和多个参数的匿名函数的例子:
#没有参数的匿名函数 f = lambda:'hello' print(f()) #输出结果:hello #有参数的匿名函数 x = lambda a : a * a print(x(3)) #输出结果:9 #多个参数的匿名函数 y = lambda a,b : a * b print(y(2,3)) #输出结果:6lambda函数通常与内置函数(如map、filter等函数)一起使用,以便在集合上执行操作。
num = [1,2,3,4,5] squared = list(map(lambda x: x*x, num)) print(squared) #输出结果:[1, 4, 9, 16, 25]装饰器
装饰器是python中的一种高级功能,允许我们动态的修改函数或类的行为。装饰器是一种函数,它接收一个函数作为参数,并返回一个新的函数或修改原来的函数。
装饰器语法:@decorator_name,python还提供了一些内置的装饰器,如@staticmethod(定义静态方法),@classmethod(定义类方法)。
装饰器应用场景:
- 日志记录:装饰器可用于记录函数的调用信息、参数和返回值
- 性能分析:可用于使用装饰器来测量函数的执行时间
- 权限控制:可用于限制对某些函数的访问权限
- 缓存:可用于实现对函数结果的缓存,以提高性能
基本语法
装饰器本质是一个接收函数作为输入并返回一个新的包装过后的函数的对象。通过装饰器,可以在保持代码整洁的同时,灵活高效地扩展程序的功能。
下面是一个装饰器的例子:
decorator是一个装饰器函数,它接收一个函数func作为参数,然后返回一个内部函数wrapper,在wrapper函数内部,可以执行一些额外的操作,然后调用原始函数func,并返回其结果。在下面的例子中,my_decorator是一个装饰器函数,接受say_hellp作为参数,然后返回wrapper函数。
def my_decorator(func): def wrapper(): print("函数执行前") func() print("函数执行后") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello()输出结果:
函数执行前 Hello! 函数执行后类装饰器
类装饰器是一种用于动态修改类行为的装饰器,他接收一个类作为参数,并返回一个新的类或修改后的类。
类装饰器应用:
- 添加/修改类的方法或属性
- 拦截实例化过程
- 实现单例模式、日志记录、权限检查等功能
常见形式
函数形式的类装饰器(接收类作为参数、返回新类)
类形式的类装饰器(实现_call_方法,使其可调用)
内置装饰器
@staticmethod: 将方法定义为静态方法,不需要实例化类即可调用。@classmethod: 将方法定义为类方法,第一个参数是类本身(通常命名为cls)。@property: 将方法转换为属性,使其可以像属性一样访问。
在使用时也可以将多个装饰器堆叠在一起,它们会按照从下到上的顺序依次应用。
数据结构
列表
在python中可以使用列表来实现栈的功能,栈——后进先出的数据结构,即最后添加的元素最先被移除。列表的append()可以把一个元素添加到栈顶、pop()方法可以把一个元素从栈顶释放出来。
栈操作
- 压入 Push:将一个元素添加到栈顶
- 弹出 Pop:移除并返回栈顶元素
- 查看栈顶元素 Peek/Top:返回栈顶元素而不移除它
- 检查是否为空 IsEmpty:检查栈是否为空
- 获取栈的大小 Size:获取栈中元素的数量
1、创建空栈
s = []2、压入
s = [] s.append(1) s.append(2) s.append(3) print(s) #输出结果:[1, 2, 3]3、弹出
s = [] s.append(1) s.append(2) s.append(3) s2 = s.pop() print(s2) print(s) #输出结果:3 [1, 2]4、查看栈顶元素
s = [] s.append(1) s.append(2) s.append(3) s3 = s[-1] print(s3) #输出结果:35、检查是否为空
s = [] s.append(1) s.append(2) s.append(3) is_empty = len(s) == 0 print(is_empty) #输出结果:False6、获取栈大小
s = [] s.append(1) s.append(2) s.append(3) size = len(s) print(size) #输出结果:3队列
队列是一种先进先出的数据结构,最早添加的元素最先被移除。在python中可以使用collections.deque实现队列。使用列表也可以实现队列,但使用collections.deque更高效简洁。
from collections import deque # 创建一个空队列 queue = deque() # 向队尾添加元素 queue.append('a') queue.append('b') queue.append('c') print("队列状态:", queue) # 输出: 队列状态: deque(['a', 'b', 'c'])遍历技巧
在字典遍历中,关键字和对应值可以使用items()方法同时解读出来。
k = {'liming':98,'jenny':100} for k,v in k.items(): print(k,v) #输出结果 #liming 98 #jenny 100在序列遍历中,索引位置和对应值可以使用enumerate()函数同时得到。
a = ['liming','jenny','danny'] for i,v in enumerate(a): print(i,v) #输出结果 #0 liming #1 jenny #2 danny反向遍历一个序列:先指定序列,然后调用reversed()函数。
按顺序遍历一个序列:使用sorted()函数返回一个已排序的序列,并不修改原值。
