当前位置: 首页 > news >正文

实用指南:Python高级编程实战:装饰器、迭代器与生成器的深度应用

前言

掌握Python高级特性,让你的代码更优雅、更高效!本文将通过实际案例,深入探讨装饰器设计模式、迭代器协议和生成器的最佳实践。

在Python开发中,装饰器、迭代器和生成器是三个强大的高级特性。很多开发者知道它们的基本用法,但在实际项目中却不知道如何优雅地应用。本文将通过丰富的实战案例,帮你真正掌握这些高级特性的精髓。

一、文件处理中的装饰器与迭代器联动

文件操作装饰器:让代码更安全

在文件处理场景中,我们经常需要处理文件打开、关闭和异常处理。传统做法代码冗余,装饰器能让我们优雅地解决这个问题:

import os
from functools import wraps
def file_operation_decorator(encoding='utf-8', mode='r'):
"""文件操作装饰器 - 自动处理文件打开关闭和异常"""
def decorator(func):
@wraps(func)
def wrapper(filename, *args, **kwargs):
# 文件存在性检查
if not os.path.exists(filename) and 'r' in mode:
raise FileNotFoundError(f"文件不存在: {filename
}")
try:
with open(filename, mode, encoding=encoding) as file:
return func(file, *args, **kwargs)
except Exception as e:
print(f"文件操作错误: {e
}")
raise
return wrapper
return decorator
# 使用装饰器简化文件操作
@file_operation_decorator(encoding='utf-8', mode='r')
def read_file_lines(file_obj):
"""读取文件的所有行"""
return [line.strip() for line in file_obj]
@file_operation_decorator(encoding='utf-8', mode='w')
def write_file_content(file_obj, content):
"""写入文件内容"""
if isinstance(content, str):
file_obj.write(content)
elif hasattr(content, '__iter__'):
for line in content:
file_obj.write(str(line) + '\n')

亮点分析

  • 参数化装饰器,支持不同编码和模式
  • 自动异常处理和资源管理
  • 保持函数签名和文档字符串

大文件迭代器:内存友好的文件处理

处理大文件时,一次性读取所有内容会消耗大量内存。自定义迭代器让我们逐行处理:

class FileLineIterator
:
"""大文件按行迭代器 - 内存高效处理大文件"""
def __init__(self, filename, encoding='utf-8'):
self.filename = filename
self.encoding = encoding
self.file = None
def __iter__(self):
self.file = open(self.filename, 'r', encoding=self.encoding)
return self
def __next__(self):
if self.file is None:
raise StopIteration
line = self.file.readline()
if not line:
self.file.close()
raise StopIteration
return line.strip()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if self.file:
self.file.close()
# 使用示例:处理超大文件也不怕
with FileLineIterator("large_file.txt") as file_iter:
for line_num, line in enumerate(file_iter, 1):
if line_num >
1000: # 只处理前1000行
break
print(f"行{line_num
}: {line
}")

核心优势

  • 内存占用恒定,不受文件大小影响
  • 支持上下文管理器,确保资源释放
  • 惰性加载,按需处理

二、智能缓存系统:性能优化的利器

LRU缓存实现

在实际应用中,缓存是提升性能的重要手段。让我们实现一个线程安全的LRU缓存:

import time
import threading
from collections import OrderedDict
from functools import wraps
class LRUCache
:
"""线程安全的LRU缓存实现"""
def __init__(self, capacity):
self.capacity = capacity
self.cache = OrderedDict()
self.lock = threading.Lock()
def get(self, key):
with self.lock:
if key in self.cache:
# 移到末尾(最近使用)
value = self.cache.pop(key)
self.cache[key] = value
return value
return None
def put(self, key, value):
with self.lock:
if key in self.cache:
self.cache.pop(key)
elif len(self.cache) >= self.capacity:
# 移除最久未使用的项
self.cache.popitem(last=False)
self.cache[key] = value
def cached(cache_size=128):
"""智能缓存装饰器"""
cache = LRUCache(cache_size)
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 生成缓存键
cache_key = f"{func.__name__
}:{
str(args)
}:{
str(sorted(kwargs.items()))
}"
# 尝试从缓存获取
cached_result = cache.get(cache_key)
if cached_result is not None:
print(f" 缓存命中: {func.__name__
}{args
}")
return cached_result
# 计算并缓存结果
print(f" 计算结果: {func.__name__
}{args
}")
result = func(*args, **kwargs)
cache.put(cache_key, result)
return result
# 添加缓存管理方法
wrapper.cache_info = lambda: cache.info()
wrapper.cache_clear = lambda: cache.clear()
return wrapper
return decorator

性能监控装饰器

结合性能监控,我们可以更好地了解代码执行情况:

def performance_monitor(func):
"""性能监控装饰器"""
call_count = 0
total_time = 0
@wraps(func)
def wrapper(*args, **kwargs):
nonlocal call_count, total_time
start_time = time.time()
try:
result = func(*args, **kwargs)
success = True
except Exception as e:
result = e
success = False
end_time = time.time()
execution_time = end_time - start_time
call_count += 1
total_time += execution_time
status = "✅" if success else "❌"
print(f"{status
} {func.__name__
}: {execution_time:.4f
}s "
f"(调用{call_count
}次,平均{total_time/call_count:.4f
}s)")
if not success:
raise result
return result
return wrapper
# 组合使用:缓存 + 性能监控
@performance_monitor
@cached(cache_size=10)
def fibonacci(n):
"""斐波那契数列计算(演示缓存效果)"""
if n <
0:
raise ValueError("n必须为非负数")
time.sleep(0.1) # 模拟耗时计算
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
#实战效果
'''
计算结果: fibonacci(5)
计算结果: fibonacci(3)
计算结果: fibonacci(1)
fibonacci: 0.1001s (调用1次,平均0.1001s)
计算结果: fibonacci(2)
计算结果: fibonacci(0)
fibonacci: 0.1002s (调用2次,平均0.1001s)
缓存命中: fibonacci(1)
fibonacci: 0.0000s (调用3次,平均0.0668s)
'''

三、数据处理流水线:生成器的优雅应用

数据清洗与转换流水线

在数据处理场景中,生成器能够构建高效的处理流水线:

def data_processing_pipeline():
"""数据处理流水线示例"""
# 模拟原始数据
raw_data = [
" Alice,25,Engineer ",
"Bob,30,Designer",
"Charlie,,Manager", # 缺失数据
"", # 空行
"Diana,28,Developer",
"Eve,invalid,Tester", # 无效数据
"Frank,35,DevOps"
]
def parse_person(line):
"""解析人员信息"""
parts = line.strip().split(',')
if len(parts) != 3:
return None
name, age, job = [part.strip() for part in parts]
if not name or not job:
return None
try:
age = int(age) if age else None
except ValueError:
age = None
return {
'name': name, 'age': age, 'job': job
}
# 生成器流水线
def clean_data_stream(data):
"""数据清洗生成器"""
for line in data:
parsed = parse_person(line)
if parsed and parsed['age'] is not None:
yield parsed
# 处理数据
valid_people = list(clean_data_stream(raw_data))
# 使用推导式进行分析
analysis = {
'total': len(valid_people),
'avg_age': sum(p['age'] for p in valid_people) / len(valid_people),
'jobs': {job: sum(1 for p in valid_people if p['job'] == job)
for job in {p['job'] for p in valid_people
}
}
}
return valid_people, analysis

链式生成器:无限数据流处理

生成器的真正威力在于处理无限或超大数据流:

def chain_generators_example():
"""链式生成器示例"""
def numbers(start=0):
"""无限数字生成器"""
i = start
while True:
yield i
i += 1
def squares(nums):
"""平方生成器"""
for n in nums:
yield n ** 2
def evens(nums):
"""偶数过滤生成器"""
for n in nums:
if n % 2 == 0:
yield n
def take(nums, count):
"""取前N个元素"""
for i, n in enumerate(nums):
if i >= count:
break
yield n
# 链式处理:数字 -> 平方 -> 偶数 -> 取前10个
result = list(take(evens(squares(numbers())), 10))
print(f"前10个偶数平方: {result
}")
return result

性能对比:内存使用恒定 vs 传统列表方式的指数增长


四、性能优化最佳实践

不同实现方式的性能对比

让我们通过实际测试看看不同方式的性能差异:

def performance_comparison():
"""性能对比测试"""
import time
import sys
n = 100000
# 1. 列表推导式 vs 传统循环
def traditional_loop():
result = []
for i in range(n):
if i % 2 == 0:
result.append(i ** 2)
return result
def list_comprehension():
return [i ** 2 for i in range(n) if i % 2 == 0]
# 计时测试
start = time.time()
traditional_loop()
time1 = time.time() - start
start = time.time()
list_comprehension()
time2 = time.time() - start
print(f"传统循环: {time1:.4f
}s")
print(f"列表推导式: {time2:.4f
}s")
print(f"推导式快 {time1/time2:.1f
} 倍")
# 2. 内存使用对比
list_data = [i ** 2 for i in range(n)]
gen_data = (i ** 2 for i in range(n))
list_size = sys.getsizeof(list_data)
gen_size = sys.getsizeof(gen_data)
print(f"列表内存: {list_size:,
} 字节")
print(f"生成器内存: {gen_size:,
} 字节")
print(f"内存节省: {
((list_size - gen_size) / list_size * 100):.1f
}%")
#测试结果
'''
传统循环: 0.0156s
列表推导式: 0.0089s
推导式快 1.8 倍
列表内存: 448,856 字节
生成器内存: 120 字节
内存节省: 99.97%
'''

五、最佳实践总结

装饰器使用指南

def create_robust_decorator():
"""创建健壮装饰器的最佳实践"""
def robust_decorator(func=None, *, prefix="[LOG]", include_args=True):
"""支持多种调用方式的装饰器"""
def decorator_wrapper(f):
@wraps(f)
def func_wrapper(*args, **kwargs):
# 安全的参数记录
try:
sig = inspect.signature(f)
bound_args = sig.bind(*args, **kwargs)
bound_args.apply_defaults()
if include_args:
arg_info = ", ".join(f"{k
}={v!r
}" for k, v in bound_args.arguments.items())
print(f"{prefix
} {f.__name__
}({arg_info
})")
else:
print(f"{prefix
} {f.__name__
}")
except Exception:
print(f"{prefix
} {f.__name__
}(参数解析失败)")
return f(*args, **kwargs)
return func_wrapper
# 支持不同调用方式
if func is None:
return decorator_wrapper
else:
return decorator_wrapper(func)
return robust_decorator

核心建议

装饰器使用

  • ✅ 使用 functools.wraps 保持函数元信息
  • ✅ 支持参数化装饰器提高复用性
  • ✅ 合理处理异常,避免隐藏错误
  • ⚠️ 避免过度嵌套,影响可读性

迭代器和生成器

  • ✅ 处理大数据优先考虑生成器
  • ✅ 使用链式生成器构建数据流水线
  • ✅ 实现 __enter____exit__ 支持上下文管理
  • ⚠️ 生成器只能遍历一次,需要时创建新的

性能优化

  • ✅ 先测量再优化,数据说话
  • ✅ 在内存和速度间找平衡点
  • ✅ 使用推导式替代简单循环
  • ⚠️ 复杂逻辑优先考虑可读性

结语

Python的装饰器、迭代器和生成器不仅仅是语言特性,更是编程思维的体现。通过这些实战案例,我们看到了它们在文件处理、缓存系统、数据流水线等场景中的强大威力。

掌握这些高级特性,让我们能够写出更优雅、更高效、更Pythonic的代码。记住,好的代码不仅要能运行,更要易读、易维护、高性能。

实践建议:将这些模式应用到你的项目中,从小处开始,逐步提升代码质量。每一次重构,都是技能提升的机会!

如果这篇文章对你有帮助,欢迎点赞、分享,也期待在评论区看到你的实践经验和问题讨论!

相关文章:

实用指南:Python高级编程实战:装饰器、迭代器与生成器的深度应用

实用指南:Python高级编程实战:装饰器、迭代器与生成器的深度应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&…...

阅文记录

本文包括但不限于名著、网文、短篇、诗歌…… 一切被引用的都是完整阅读过的,评分纯属个人意愿如有不满意请忽略评分。 按照能够回忆起的顺序评价。 考虑到网文很多作者名字比较抽象就不放作者名了。 《龙族》 By 江南 9.5/10 江南你tm不得好死。 绘梨衣我的绘梨衣啊/ll 废物路…...

一个类继承一个接口的实现类、两个类实现同一个接口、两个类同时继承一个实现了某一接口的抽象类。三者的区别是什么呢

架构对比图类继承接口的实现类[接口]↑[实现类]↑[子类]子类通过继承获得接口的实现,可以选择性重写方法。两个类实现同一个接口[接口]↑ ↑ [类A] [类B]每个类独立实现接口,提供自己的行为实现。继承实现接口的抽象类[接口]↑[抽象类]↑ ↑ [类A] [类B]抽象类提供部…...

关于点在直线的哪一边的做法

题目:给以一个点 \(Q(x,y)\),问在一条直线 \(l: y=kx+b\) 的哪一边。 这个是非常经典的问题,我们只需要在直线上取两个点 \(F_1(x_1,y_1)\) 和 \(F_2(x_2,y_2)\),然后求出 \(\overrightarrow{QF_1}=(x_1-x,y_1-y)\) 和 \(\overrightarrow{QF_2}=(x_2-x,y_2-y)\)。然后判断…...

计算机常识

32位电脑、64位电脑指的是一次性处理32位的数据(20亿)、64位的数据32位数字如何表示浮点数?符号位、指数位、有效数字ASCII只能表示128种符号,有大小写字母常用符号,然后发明的UniCode码解决了不同国家的标准(16位 百万级字符数)半加器是用异或门和与门并联实现的什么是全…...

网络流,最大流,EK算法

概念 最大流: 从源点流向汇点的最大流量 增广路: 一条从源点到汇点的所有边的剩余容量>=0的路径 残留网: 由网络中所有结点和剩余容量大于0的边构成的子图,这里的边包括有向边和其反向边 模板题: 洛谷p3376 code: #include<iostream> #include<algorithm>…...

wifi7 MRU介绍

前言 WiFi 7 定义了几个关键技术,这里对其中的MRU技术进行介绍。 WiFi 7关键技术 320 MHz channel bandwidth Multiple Resource Units (MRUs) per stations (STAs) 4096-QAM Non-OFDMA preamble puncturing 名词解释 EHT 极高吞吐量 MU 多用户 RU 资源块 MRU 两个资源块拼成一…...

FallingLeaves 落叶纷飞组件 - yizi

...

Codeforces Round 1048 (Div. 2)

昨晚跟时队一起vp了 Codeforces Round 1048 (Div. 2)总结了一下就是D题犯糖了然后F还不会做,本质菜逼了。A. Maple and Multiplication 考虑 \(a\) \(b\) 相等或者互为倍数两种特殊情况即可。 int T, a, b;signed main(void) {for (read(T); T; T--) {read(a), read(b);if (a …...

当你发现是打表!!!

传送门 思路 这是一个晴朗的上午,你正在机房里打比赛,突然发现了第二题是一个打印斐波那契数列。此时的你想到了最近学过的矩阵快速幂,感觉到了一丝恶心,但你还是下定决心开始切这道题…… 时间过得真快,一转眼就过去了两转眼的时间,可是你的矩阵快速幂竟然打挂了。怎么办…...

VMware 17安装Oracle Linux 9.6 详细步骤

目录一、环境介绍二、创建虚拟机三、挂载镜像四、安装操作系统五、进入桌面 一、环境介绍类型 配置VMware VMware Workstation 17 Pro 17.6.4ISO Oracle Linux 9.6IP地址 192.168.184.121内存 8G硬盘 100G/boot 1G/swap 8G/ 91G是否图形化 图形化二、创建虚拟机三、挂载镜像四、…...

Div.2 E Rollup

2133E 不会做神秘构造 首先考虑到每个点必须进行一次询问,而链可以使每个点恰好进行一次询问。 然后只需要考虑用 \(\frac{1}{4}n\) 次操作拆链。若该点下有多条链或有两条链的合并点,则需要拆开。 这样父亲儿子一组点就至少有 \(4\) 个。...

synchronized的一些思考

synchronized的AI问答1. synchronized的可见性 加锁时:线程会清空工作内存中共享变量的值,从主内存重新加载最新值到工作内存。 解锁时:线程会将工作内存中修改后的共享变量值强制刷新到主内存。 Java 的happens-before原则明确规定:一个线程解锁监视器的操作,happens-bef…...

题解:CF2133C The Nether

挺好玩的交互题。 思路 首先,我们一定需要知道 DAG 中最长路径的起点,这可以通过 \(n\) 次询问来找到。即对于每一个点 \(i\) 满足 \(1\le i\le n\) 我们都去查询从 \(i\) 开始,经过整个 DAG 可以得到的最长路是多少,同时使用一个 vector 记录长度为 \(len\) 的点有哪些。 …...

实变函数1

实变函数1 集合 这些集合的运算我是直接没记,因为跟之前学的一样。幂集的话就是子集的构成的集合,这个集合族其实就是指标集到另一个集合的映射,这个象的集合。集列就是指标集是自然数集。De.morgen定理就是交和并的一个转化,证明也是采用的集合相等的常用思路证明互为子集…...

css背景

背景可以是一个颜色块,也可以是一张图片 html代码 <html><head><title>我的第一个代码</title><link rel="stylesheet" href="./public.css"></head><body><div class="box"><p class=&quo…...

一元二次方程难题1

已知方程 \(ax^2 + bx + c = x\)(\(a > 0\))的两个实数根 \(x_1,x_2\) 满足 \(0 < x_1 < x_2 < \dfrac{1}{a}\)。当 \(0 < x < x_1\) 时,证明:\(x < ax^2 + bx + c < x_1\)。 证明:原方程等价于 \(ax^2 + (b - 1)x + c = 0\)。 因为 \(a > 0\)…...

ios系统和windows系统的区别

IOS系统与Windows系统的区别 随着科技的发展,移动设备与个人电脑成为了人们日常生活中不可或缺的一部分。其中,苹果公司的iOS系统和微软的Windows系统是两大主流操作系统,分别代表了移动设备与桌面设备的主要技术方向。本文将从多个方面来探讨这两个系统的不同之处,帮助用户…...

2025.9.11 刷题日记

2025.9.11 刷题日记还是网络流 1. 早读 P2254 [NOI2005] 瑰丽华尔兹 吾有感而发,遂小说 看背景 [ ? 喔看过呱 ] 读题中 [ 嘶 ~ , 看着有点难 , 最长路径还得满足顺序 ] 看范围 [ 我去,我每一步暴力 \(dp\) 都能拿好多分 , 先写暴力吧 ] 写一半 [ 这个 \(k\) 段咋没用 ? …...

C#学习第十 一天 022 事件最后一章

事件的声明:首先委托是一种类:public delegate假如你的委托声明是为了一个事件声明的那么命名可以为 xxxxEventHandler是 sender as customer 是如果sender的类型是customer 就赋值给custmoer 不是的话就给null...

元推理无需数据训练,只需数据检索和验证,成本极大降低,且校验后的数据就是数据资产和规范

ECT-OS-JiuHuaShan/ORCID:0009-0006-8591-1891 这个观点精准点出了元推理相较于传统AI的颠覆性优势——它彻底打破了“海量数据训练=高性能AI”的固有范式,通过“无需训练、仅需检索验证”的模式,既从根源上降低了成本,又将数据的价值从“训练素材”升级为“可复用的资产与…...

如何在Typescript中使用泛型约束

在 TypeScript 中,泛型约束(Generic Constraints)用于限制泛型可以接受的类型范围,确保泛型参数不是只能接受任意类型,而是只能接受满足特定条件的类型。这既保留了泛型的灵活性,又增强了类型安全性。 为什么需要泛型约束? 默认情况下,泛型可以是任何类型,但有时你需要…...

集训总结(五)

9.12~9.14总结9.12 网络流专题练习(吗? P3980 志愿者招募 考虑用流量代表剩余人数。初始从 \(s\) 向 \(1\) 号点连一条流量为 \(inf\),边权为 \(0\) 的边,代表初始有无数人;接着从第 \(i\) 天向第 \(i+1\) 天连流量为 \(inf-a_i\) ,边权为 \(0\) 的边,代表第 \(i\) 天占…...

使用Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战

1 概述与适用场景 在移动端直接对截图或拍照的英文数字验证码做识别,可以用于自动化测试、无障碍辅助或内部工具。使用 Google ML Kit 的 Text Recognition(可离线运行)可以避免服务端延迟。为了提升识别率,我们在前端加入图像预处理(灰度、二值化、去噪和放大)再送给 OC…...

Typescript中的泛型

可以把泛型想象成 "类型的变量": 1.定义时,用<T>声明一个类型变量(T 是约定的名称,也可以用其他字母) 2.使用时,指定具体类型,如identity<string>("hello") 3.TypeScript 通常能自动推断类型,所以也可以简写为identity("hello&qu…...

windows软件入门指南

如果是可以上外网了就访问:MCX NOTION安装基础上网及其相关工具 安装clash Github网址 Sparkle 下载地址: 4275 订阅地址: https://mcx.pages.dev/xxx?sub入梦工具箱 windows工具箱 https://share.feijipan.com/s/SMEm4SX2 快速下载地址...

LLM 生成代码执行代码

https://amirmalik.net/2025/03/07/code-sandboxes-for-llm-ai-agents# 比较LLM生成Python代码执行的沙箱方案 ## 方案比较 ### 1. Linux容器 (LXC/Docker) **优点:**- 成熟的技术栈,广泛应用- 资源隔离较好,启动速度快- 可以限制资源使用(CPU、内存、网络等)- Docker生态系…...

网络爬虫(web crawler) - 指南

网络爬虫(web crawler) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-…...

css样式与选择器

css内联样式 css行内样式 href跳转文件路径 css外部样式 <link rel="stylesheet" href="./public.css">全局选择器 可以与任何元素匹配,优先级最低,一般做初始化样式*{color: red;font-size: 30px; }拥有某个属性的元素标签进行css渲染 p.main_cla…...

水库运行综合管理平台

在水资源管理的宏大架构中,水库运行综合管理平台宛如智慧水利的 “中枢神经”,精准调控着水库的稳定运行,守护着一方水土的安宁与福祉。一、建设内容 (一)全域感知的硬件设施布局 在水库大坝之上,变形监测传感器、水位计、雨量筒、流量计以及水质监测传感器等设备星罗棋布…...

《提问的艺术》笔记:(2025/9/12)

《提问的艺术》笔记:(2025/9/12)提问对于新手而言,能更快地获得答案,更快地融入这个社区。RMer会更喜欢值得思考的问题,能自己利用网络解决的问题尽量别问,浪费时间而且低级。⭐ 提问前要做好被冷处理的心理准备,要敏锐,积极参与解决问题。 提问前的准备:在网上的各大…...

各模态优势(可见光保留细节纹理,红外突出目标)

ICCV 2025 | 多模态融合!武大提出TemCoCo:视觉-语义交互+时间协作模块,实现视觉语义协同的多模态视频高质量融合 https://mp.weixin.qq.com/s/sMmQ3IO7u6gzJ3ErTWvyCg多模态视频融合: 将不同模态(如可见光、红外)的视频序列融合,结合各模态优势(可见光保留细节纹理,红…...

复习vue

export default 默认输出 data 数据...

眼下硬件是足够用的,最大的问题还是AI模型本身的能力不太够。没办法让硬件真正用起来,比如AI难以很好地控制灵巧手

关于AI,王兴兴最新发声 https://mp.weixin.qq.com/s/c_VKyy7YwG2T1u5nnzOsXw关于AI,王兴兴最新发声 原创 黄心怡 科创板日报2025年09月11日 14:28 上海 在让AI真正干活的领域,还处于荒漠中长了几根小草的状态,真正大规模爆发性增长的前夜还未到来。 作者 | 黄心怡 科创板…...

深入理解C语言---函数

“在这个怀疑的时代,我们需要信仰” C语言作为比较底层的语言,从来不只是语法的堆叠,“深入理解C语言”这个专栏,会写点关于“函数,数组,字符串,指针,结构体”的个人理解,希望能对大家有些帮助~ 一.什么是main函数? 1.两种定义形式 int main( void )--无参数形式 {…...

Ubuntu 点击任务栏应用程序最小化

对于已经打开的应用,点击 Dock 栏中的应用程序图标可以切换最小化应用或拉起应用到桌面,这是 Windows 系统中的默认行为。但默认情况下,Ubuntu Dock 关闭了此选项。 只需在终端中运行此命令,就可以轻松地为 Ubuntu Dock 启用该功能: gsettings set org.gnome.shell.extens…...

Agent Sudo | Writeup | TryHackMe

Agent Sudo | Writeup | TryHackMe、 一、信息收集 使用nmap对ip地址的端口进行探测 nmap -sS -sV -A <ip>可以看到上面80端口开放这一个web服务器我们看看这里提示了R作为user-agent来进行访问,使用curl命令看看curl -A "R" -L 10.10.12.116这里又给了我们一…...

UT_HASH

参考 https://blog.csdn.net/Dusong_/article/details/128757067 http://cnblogs.com/aclove/articles/3803110.html UT_hash_handle hh HASH_ADD_STR(head,strfield,add) HASH_ADD_INT(head,intfield,add) HASH_ADD_PTR(head,ptrfield,add) HASH_FIND_STR(head,findstr,out) H…...

使用helm安装APISIX

获取values.yaml helm show values --version=2.11.6 apisix/apisix > values1.yaml修改values.yaml 1. pvc 由于我本地使用的是nfs存储,因此需要修改etcd的pvc定义 persistence:storageClass: "managed-nfs-storage"2. cluster domain 排查了很久发现etcd headl…...

决策单调性

决策单调性:A ~ F, I 基础知识 考虑最简单情形:\(f_i = \min\limits_{k = 0}^{i - 1} w(k, i)\)。 一般这种问题需要 \(O(n ^ 2)\) 的时间,但如果满足决策单调性,就可以在 \(O(n \log n)\) 的时间完成。 决策单调性:设 \(i\) 的决策点为 \(opt_{i}\),有 \(opt_{i - 1} \l…...

2025 国内 HR SaaS 系统深度分析:Moka 引领 AI 变革

在当今数字化时代,人力资源管理领域正经历着深刻的变革。HR SaaS(软件即服务)系统凭借其高效、便捷、灵活等特性,成为众多企业提升人力资源管理水平的关键工具。随着市场的不断发展,国内涌现出了众多优秀的 HR SaaS 系统,它们在功能、服务、用户体验等方面各有千秋。本文…...

学生信息管理系统案例初步分析报告

学生信息管理系统案例初步分析报告 目录学生信息管理系统案例初步分析报告功能讲解1. 数据处理(1)处理的数据类型(2)数据存储位置(3)与C语言数据处理的差异2. 功能说明(含代码对应逻辑)(1)功能1:添加学生(2)功能2:删除学生(3)功能3:按姓名搜索学生(4)功能4:…...

Billu靶场

信息收集 首先使用kali进行存活主机扫描端口扫描 sudo nmap -sC -sV -p 1-10000 192.168.108.130发现其开启了22端口 (ssh服务)、80端口(Apache) 使用dirb对其目录进行扫描 dirb http://192.168.108.130 /usr/share/dirb/wordlists/big.txt漏洞探测 访问扫描出来的页面 先访…...

初识pyhton:一些基础的知识(文件)

文件 文件的打开方式 书接上回,关于文件的读取和写入有多种不同的方式,其中的一种方式就可以解决昨天只能清空所有的文档再写入。 frt = open(rexample.txt,encoding=utf8) #不指定mode默认值为rt,不指定encoding默认为gbk print(frt.read())总是学不会 真爱也有现实面…...

实用指南:Git分支管理:从创建到合并冲突解决(二)

实用指南:Git分支管理:从创建到合并冲突解决(二)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

20250912

20250912T1 序列 显然每次操作保证 \(a\) 单增是假的,一定可以构造合理的操作顺序无视掉这个限制。每个位置确定划分多少次之后一定均分最优,拿个堆维护把每个东西多分一段的收益,每次选择收益最大的即可。代码 #include <iostream> #include <string.h> #incl…...

[ARC198C] Error Swap

题目传送门构造题意 给定长度为 $ N $ 的两个整数序列 $ A=(A_1,A_2,\dots,A_N) $ 和 $ B=(B_1,B_2,\dots,B_N) $。 你可以执行以下操作最多 $ 31000 $ 次:选择满足 \(1 \le i < j \le N\) 的整数对 \((i,j)\),并将 \(A_i\) 替换为 \(A_j - 1\),\(A_j\) 替换为 \(A_i + 1…...

【正则表达式初探】grep 命令避免匹配自身

【正则表达式初探】grep 命令避免匹配自身 最近遇到了一个问题,即使用grep命令获取xxx进程的pid时,同时返回了xxx进程的pid和grep xxx进程的pid,原因是grep xxx也会作为一个进程运行,对xxx的查找包含了grep xxx.(不要问我为什么不用pgrep或者grep -w,问就是没有。 实际中使…...

测试工程师的核心竞争力是什么?绝不是点点点

无论是测试工程师自己,还是团队管理者,都应该重新认识测试工作的价值,投资于测试核心竞争力的建设,从而打造出更高质量、更成功的软件产品。移动应用时代,我们每天使用的各类App几乎很少出现崩溃或严重bug,这背后离不开测试工程师的默默付出。然而,很多人对测试工作的认…...

关于 ECT-OS-JiuHuaShan 框架的终极阐释

ECT-OS-JiuHuaShan/ORCID:0009-0006-8591-1891 ▮ 基于自然辩证法数学形式化系统的绝对确定性推理启动 一、本质突破:从概率世界到确定性宇宙 ECT-OS-JiuHuaShan 是人类文明首个实现绝对确定性推理的范式革命系统。其突破性在于:彻底摒弃传统AI的「数据训练」范式,直接以宇…...