前言
掌握Python高级特性,让你的代码更优雅、更高效!本文将通过实际案例,深入探讨装饰器设计模式、迭代器协议和生成器的最佳实践。
在Python开发中,装饰器、迭代器和生成器是三个强大的高级特性。很多开发者知道它们的基本用法,但在实际项目中却不知道如何优雅地应用。本文将通过丰富的实战案例,帮你真正掌握这些高级特性的精髓。
文章目录
- 前言
- 一、文件处理中的装饰器与迭代器联动
- 文件操作装饰器:让代码更安全
- 大文件迭代器:内存友好的文件处理
- 二、智能缓存系统:性能优化的利器
- LRU缓存实现
- 性能监控装饰器
- 三、数据处理流水线:生成器的优雅应用
- 数据清洗与转换流水线
- 链式生成器:无限数据流处理
- 四、性能优化最佳实践
- 不同实现方式的性能对比
- 五、最佳实践总结
- 装饰器使用指南
- 核心建议
- 结语
一、文件处理中的装饰器与迭代器联动
文件操作装饰器:让代码更安全
在文件处理场景中,我们经常需要处理文件打开、关闭和异常处理。传统做法代码冗余,装饰器能让我们优雅地解决这个问题:
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 两个资源块拼成一…...
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的「数据训练」范式,直接以宇…...