目录

    • Python高阶函数详解:从概念到高级应用
      • 引言:函数式编程的魅力
      • 一、高阶函数基础概念
        • 1.1 什么是高阶函数
        • 1.2 Python中的一等函数
      • 二、内置高阶函数详解
        • 2.1 map函数:数据转换利器
        • 2.2 filter函数:数据筛选专家
        • 2.3 reduce函数:累积计算
        • 2.4 sorted函数:高级排序
      • 三、闭包与装饰器:高阶函数的进阶应用
        • 3.1 闭包(Closure)原理
        • 3.2 装饰器(Decorator)模式
      • 四、函数组合与柯里化
        • 4.1 函数组合(Function Composition)
        • 4.2 柯里化(Currying)
      • 五、高阶函数性能优化
        • 5.1 惰性求值(Lazy Evaluation)
        • 5.2 缓存优化
      • 六、函数式编程实践案例
        • 6.1 数据处理管道
        • 6.2 事件驱动系统
      • 七、高级技巧:函数元编程
        • 7.1 动态函数创建
        • 7.2 函数签名检查
      • 八、完整代码实现
      • 九、高阶函数最佳实践
      • 十、未来展望:函数式编程在Python中的发展
      • 结语:拥抱高阶思维

Python高阶函数详解:从概念到高级应用

引言:函数式编程的魅力

在Python中,函数不仅是执行特定任务的代码块,更是一等公民(first-class citizens)。这意味着函数可以像其他数据类型一样被传递、赋值和操作。高阶函数(High-Order Function)正是这种特性的核心体现,它能够接收函数作为参数或返回函数作为结果,为代码提供了强大的抽象能力和灵活性。

函数式编程
高阶函数
不可变数据
纯函数
参数为函数
返回函数
装饰器

一、高阶函数基础概念

1.1 什么是高阶函数

高阶函数满足以下任一条件:

  1. 接受一个或多个函数作为输入参数
  2. 返回一个新的函数作为输出

数学表达形式为:
higherOrder : : ( f → g ) → Function \text{higherOrder} :: (f \rightarrow g) \rightarrow \text{Function} higherOrder::(fg)Function
其中 f f f g g g 是函数

1.2 Python中的一等函数

Python函数具有以下一等公民特性:

  • 可赋值给变量
  • 可存储在数据结构中
  • 可作为参数传递
  • 可作为返回值
# 函数赋值示例
def greet(name):return f"Hello, {name}!"# 1. 赋值给变量
say_hello = greet
print(say_hello("Alice"))  # 输出: Hello, Alice!# 2. 存储在列表中
func_list = [greet, str.upper]
print(func_list[1]("test"))  # 输出: TEST# 3. 作为参数传递
def call_func(func, arg):return func(arg)print(call_func(greet, "Bob"))  # 输出: Hello, Bob!# 4. 作为返回值
def create_greeting(prefix):def greeting(name):return f"{prefix}, {name}!"return greetingmorning_greet = create_greeting("Good morning")
print(morning_greet("Charlie"))  # 输出: Good morning, Charlie!

二、内置高阶函数详解

2.1 map函数:数据转换利器

map(func, iterable) 将函数应用于可迭代对象的每个元素

# 平方计算
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]# 多序列处理
names = ["alice", "bob", "charlie"]
ages = [25, 30, 35]
combined = list(map(lambda n, a: f"{n.title()} is {a}", names, ages))
print(combined)  # 输出: ['Alice is 25', 'Bob is 30', 'Charlie is 35']
2.2 filter函数:数据筛选专家

filter(func, iterable) 基于函数条件筛选元素

# 筛选偶数
numbers = range(1, 11)
even_nums = list(filter(lambda x: x % 2 == 0, numbers))
print(even_nums)  # 输出: [2, 4, 6, 8, 10]# 筛选有效邮箱
emails = ["user@example.com", "invalid_email", "admin@domain.org"
]
valid_emails = list(filter(lambda e: '@' in e and '.' in e.split('@')[-1], emails))
print(valid_emails)  # 输出: ['user@example.com', 'admin@domain.org']
2.3 reduce函数:累积计算

functools.reduce(func, iterable) 对序列元素进行累积计算

from functools import reduce# 计算乘积
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出: 24# 查找最大值
values = [34, 12, 56, 23, 89]
max_value = reduce(lambda x, y: x if x > y else y, values)
print(max_value)  # 输出: 89# 字符串连接
words = ["Python", "高阶函数", "真强大!"]
sentence = reduce(lambda a, b: f"{a} {b}", words)
print(sentence)  # 输出: Python 高阶函数 真强大!
2.4 sorted函数:高级排序

sorted(iterable, key=func) 根据key函数进行排序

# 按字符串长度排序
fruits = ["apple", "banana", "cherry", "date"]
sorted_fruits = sorted(fruits, key=len)
print(sorted_fruits)  # 输出: ['date', 'apple', 'banana', 'cherry']# 按字典值排序
people = [{"name": "Alice", "age": 30},{"name": "Bob", "age": 25},{"name": "Charlie", "age": 35}
]
sorted_people = sorted(people, key=lambda x: x["age"])
print(sorted_people) 
# 输出: [{'name': 'Bob', 'age': 25}, {'name': 'Alice', 'age': 30}, {'name': 'Charlie', 'age': 35}]# 多级排序
students = [{"name": "Alice", "grade": "B", "score": 85},{"name": "Bob", "grade": "A", "score": 92},{"name": "Charlie", "grade": "A", "score": 88}
]
sorted_students = sorted(students, key=lambda x: (-ord(x["grade"]), x["score"]))
print(sorted_students)
# 输出: [{'name': 'Bob', 'grade': 'A', 'score': 92}, ...]

三、闭包与装饰器:高阶函数的进阶应用

3.1 闭包(Closure)原理

闭包 = 函数 + 定义环境(外部作用域的变量)

def outer_function(msg):# 外部作用域变量message = msgdef inner_function():# 内部函数访问外部变量print(f"Message: {message}")# 返回内部函数return inner_function# 创建闭包
closure1 = outer_function("Hello")
closure2 = outer_function("World")closure1()  # 输出: Message: Hello
closure2()  # 输出: Message: World
3.2 装饰器(Decorator)模式

装饰器是修改或增强函数行为的工具

# 基本装饰器
def simple_decorator(func):def wrapper():print("Before function call")func()print("After function call")return wrapper@simple_decorator
def say_hello():print("Hello!")say_hello()
# 输出:
# Before function call
# Hello!
# After function call# 带参数的装饰器
def repeat(n):def decorator(func):def wrapper(*args, **kwargs):for _ in range(n):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(3)
def greet(name):print(f"Hello, {name}!")greet("Alice")
# 输出:
# Hello, Alice!
# Hello, Alice!
# Hello, Alice!# 类装饰器
class TimerDecorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):import timestart = time.time()result = self.func(*args, **kwargs)end = time.time()print(f"{self.func.__name__} executed in {end-start:.4f} seconds")return result@TimerDecorator
def calculate_sum(n):return sum(range(n))print(calculate_sum(1000000))
# 输出: 499999500000
# calculate_sum executed in 0.0453 seconds

四、函数组合与柯里化

4.1 函数组合(Function Composition)

组合多个函数形成新函数:$ (f \circ g)(x) = f(g(x)) $

def compose(*funcs):"""组合多个函数: f(g(h(x)))"""def composed(arg):result = argfor f in reversed(funcs):result = f(result)return resultreturn composed# 组合函数示例
add_five = lambda x: x + 5
multiply_by_two = lambda x: x * 2
square = lambda x: x ** 2# 创建组合函数: square(multiply_by_two(add_five(x)))
transform = compose(square, multiply_by_two, add_five)print(transform(3))  # 计算: (3+5)=8 -> 8*2=16 -> 16²=256
4.2 柯里化(Currying)

将多参数函数转换为单参数函数序列

def curry(func, arity=None):"""柯里化装饰器"""if arity is None:arity = func.__code__.co_argcountdef curried(*args):if len(args) >= arity:return func(*args)return lambda *more: curried(*(args + more))return curried# 柯里化应用
@curry
def volume(length, width, height):return length * width * height# 逐步应用参数
volume_length_5 = volume(5)          # 固定长度
volume_5x4 = volume_length_5(4)      # 固定宽度
result = volume_5x4(3)               # 应用高度
print(result)  # 输出: 60# 创建专用函数
tank_volume = volume(10)(8)  # 固定长宽
print(tank_volume(6))        # 输出: 480

五、高阶函数性能优化

5.1 惰性求值(Lazy Evaluation)

使用生成器表达式避免不必要计算

# 生成器表达式
big_data = range(10**6)# 传统方法(立即计算)
squares = [x**2 for x in big_data]  # 占用大量内存# 惰性求值
squares_gen = (x**2 for x in big_data)  # 生成器对象# 使用filter和map的惰性版本
even_squares = filter(lambda x: x % 2 == 0, (x**2 for x in big_data))# 只计算前10个
first_10 = list(next(even_squares) for _ in range(10))
5.2 缓存优化

使用functools.lru_cache缓存函数结果

from functools import lru_cache@lru_cache(maxsize=128)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)# 首次计算
print(fibonacci(35))  # 需要较长时间# 后续调用从缓存获取
print(fibonacci(35))  # 立即返回

六、函数式编程实践案例

6.1 数据处理管道
def data_pipeline(data):"""数据处理管道"""# 定义处理步骤steps = [lambda d: filter(lambda x: x > 0, d),  # 过滤正数lambda d: map(lambda x: x * 1.1, d),   # 增加10%lambda d: sorted(d, reverse=True),     # 降序排序lambda d: d[:5]                        # 取前5个]# 应用所有处理步骤result = datafor step in steps:result = step(result)return list(result)# 测试数据
test_data = [-2, 5, 3, -8, 10, 15, 7, -1, 20, 12]
print(data_pipeline(test_data))  
# 输出: [22.0, 16.5, 13.2, 11.0, 7.7]
6.2 事件驱动系统
class EventSystem:"""事件驱动系统"""def __init__(self):self.handlers = {}def register(self, event_type, handler):"""注册事件处理器"""if event_type not in self.handlers:self.handlers[event_type] = []self.handlers[event_type].append(handler)def trigger(self, event_type, *args, **kwargs):"""触发事件"""if event_type in self.handlers:for handler in self.handlers[event_type]:handler(*args, **kwargs)# 创建事件系统
system = EventSystem()# 注册事件处理器
system.register("login", lambda user: print(f"{user} logged in"))
system.register("logout", lambda user: print(f"{user} logged out"))
system.register("purchase", lambda user, item: print(f"{user} purchased {item}"))# 触发事件
system.trigger("login", "Alice")
system.trigger("purchase", "Bob", "Laptop")
system.trigger("logout", "Alice")# 输出:
# Alice logged in
# Bob purchased Laptop
# Alice logged out

七、高级技巧:函数元编程

7.1 动态函数创建
import typesdef create_function(name, params, body):"""动态创建函数"""# 创建函数代码对象code = f"def {name}({', '.join(params)}):\n"code += "\n".join(f"    {line}" for line in body.splitlines())# 编译和执行代码exec_scope = {}exec(code, exec_scope)return exec_scope[name]# 创建自定义函数
dynamic_func = create_function("calculate",["a", "b"],"""result = a * 2 + b * 3\nreturn result"""
)print(dynamic_func(3, 4))  # 计算: 3*2 + 4*3 = 6+12=18
7.2 函数签名检查
from inspect import signaturedef validate_args(func):"""参数验证装饰器"""sig = signature(func)params = list(sig.parameters.values())def wrapper(*args, **kwargs):# 位置参数检查if len(args) > len(params):raise TypeError(f"Too many arguments: {len(args)} given, {len(params)} expected")# 关键字参数检查for name in kwargs:if name not in [p.name for p in params]:raise TypeError(f"Invalid keyword argument: '{name}'")return func(*args, **kwargs)return wrapper@validate_args
def example(a, b, c=10):return a + b + cprint(example(1, 2))          # 正确: 13
print(example(1, 2, c=20))    # 正确: 23
example(1, 2, 3, 4)           # 报错: Too many arguments
example(1, 2, d=30)           # 报错: Invalid keyword argument 'd'

八、完整代码实现

# higher_order_functions.py
from functools import reduce, lru_cache
from inspect import signature
import time# 1. 高阶函数基础
def function_assignment_example():"""函数赋值示例"""def greet(name):return f"Hello, {name}!"# 赋值给变量say_hello = greetprint(say_hello("Alice"))# 存储在列表中func_list = [greet, str.upper]print(func_list[1]("test"))# 作为参数传递def call_func(func, arg):return func(arg)print(call_func(greet, "Bob"))# 作为返回值def create_greeting(prefix):def greeting(name):return f"{prefix}, {name}!"return greetingmorning_greet = create_greeting("Good morning")print(morning_greet("Charlie"))# 2. 内置高阶函数
def builtin_hof_examples():"""内置高阶函数示例"""# map函数numbers = [1, 2, 3, 4, 5]squared = list(map(lambda x: x**2, numbers))print("Squared numbers:", squared)# filter函数even_nums = list(filter(lambda x: x % 2 == 0, numbers))print("Even numbers:", even_nums)# reduce函数product = reduce(lambda x, y: x * y, numbers)print("Product of numbers:", product)# sorted函数fruits = ["apple", "banana", "cherry", "date"]sorted_fruits = sorted(fruits, key=len)print("Sorted by length:", sorted_fruits)# 3. 闭包与装饰器
def closure_decorator_examples():"""闭包与装饰器示例"""# 闭包def outer_function(msg):message = msgdef inner_function():print(f"Message: {message}")return inner_functionclosure1 = outer_function("Hello")closure2 = outer_function("World")closure1()closure2()# 装饰器def simple_decorator(func):def wrapper():print("Before function call")func()print("After function call")return wrapper@simple_decoratordef say_hello():print("Hello!")say_hello()# 带参数装饰器def repeat(n):def decorator(func):def wrapper(*args, **kwargs):for _ in range(n):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(3)def greet(name):print(f"Hello, {name}!")greet("Alice")# 类装饰器class TimerDecorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):start = time.time()result = self.func(*args, **kwargs)end = time.time()print(f"{self.func.__name__} executed in {end-start:.4f} seconds")return result@TimerDecoratordef calculate_sum(n):return sum(range(n))print("Sum:", calculate_sum(1000000))# 4. 函数组合与柯里化
def composition_currying_examples():"""函数组合与柯里化示例"""# 函数组合def compose(*funcs):def composed(arg):result = argfor f in reversed(funcs):result = f(result)return resultreturn composedadd_five = lambda x: x + 5multiply_by_two = lambda x: x * 2square = lambda x: x ** 2transform = compose(square, multiply_by_two, add_five)print("Composition result:", transform(3))# 柯里化def curry(func, arity=None):if arity is None:arity = func.__code__.co_argcountdef curried(*args):if len(args) >= arity:return func(*args)return lambda *more: curried(*(args + more))return curried@currydef volume(length, width, height):return length * width * heightvolume_length_5 = volume(5)volume_5x4 = volume_length_5(4)result = volume_5x4(3)print("Volume:", result)tank_volume = volume(10)(8)print("Tank volume:", tank_volume(6))# 5. 性能优化
def performance_optimization():"""性能优化示例"""# 惰性求值big_data = range(10**6)even_squares = filter(lambda x: x % 2 == 0, (x**2 for x in big_data))first_10 = [next(even_squares) for _ in range(10)]print("First 10 even squares:", first_10)# 缓存优化@lru_cache(maxsize=128)def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print("Fibonacci(35):", fibonacci(35))# 6. 实践案例
def practical_examples():"""实践案例示例"""# 数据处理管道def data_pipeline(data):steps = [lambda d: filter(lambda x: x > 0, d),lambda d: map(lambda x: x * 1.1, d),lambda d: sorted(d, reverse=True),lambda d: d[:5]]result = datafor step in steps:result = step(result)return list(result)test_data = [-2, 5, 3, -8, 10, 15, 7, -1, 20, 12]print("Data pipeline result:", data_pipeline(test_data))# 事件驱动系统class EventSystem:def __init__(self):self.handlers = {}def register(self, event_type, handler):if event_type not in self.handlers:self.handlers[event_type] = []self.handlers[event_type].append(handler)def trigger(self, event_type, *args, **kwargs):if event_type in self.handlers:for handler in self.handlers[event_type]:handler(*args, **kwargs)system = EventSystem()system.register("login", lambda user: print(f"{user} logged in"))system.register("logout", lambda user: print(f"{user} logged out"))system.register("purchase", lambda user, item: print(f"{user} purchased {item}"))print("Triggering events:")system.trigger("login", "Alice")system.trigger("purchase", "Bob", "Laptop")system.trigger("logout", "Alice")# 7. 函数元编程
def function_metaprogramming():"""函数元编程示例"""# 动态函数创建def create_function(name, params, body):code = f"def {name}({', '.join(params)}):\n"code += "\n".join(f"    {line}" for line in body.splitlines())exec_scope = {}exec(code, exec_scope)return exec_scope[name]dynamic_func = create_function("calculate",["a", "b"],"""result = a * 2 + b * 3\nreturn result""")print("Dynamic function result:", dynamic_func(3, 4))# 函数签名检查def validate_args(func):sig = signature(func)params = list(sig.parameters.values())def wrapper(*args, **kwargs):if len(args) > len(params):raise TypeError(f"Too many arguments: {len(args)} given, {len(params)} expected")for name in kwargs:if name not in [p.name for p in params]:raise TypeError(f"Invalid keyword argument: '{name}'")return func(*args, **kwargs)return wrapper@validate_argsdef example(a, b, c=10):return a + b + cprint("Example with valid args:", example(1, 2))try:example(1, 2, 3, 4)except TypeError as e:print("Expected error:", e)if __name__ == "__main__":print("=== Function Assignment Example ===")function_assignment_example()print("\n=== Built-in HOF Examples ===")builtin_hof_examples()print("\n=== Closure & Decorator Examples ===")closure_decorator_examples()print("\n=== Composition & Currying Examples ===")composition_currying_examples()print("\n=== Performance Optimization ===")performance_optimization()print("\n=== Practical Examples ===")practical_examples()print("\n=== Function Metaprogramming ===")function_metaprogramming()

九、高阶函数最佳实践

  1. 命名规范

    • 高阶函数使用apply_with_等前缀
    • 回调函数使用描述性名称
    • 避免使用复杂的lambda表达式
  2. 性能考虑

    选择方案
    数据量小
    列表推导
    需要惰性求值
    生成器表达式
    需要并行处理
    concurrent.futures
    内置高阶函数
  3. 测试策略

    • 使用mock对象测试回调函数
    • 验证函数组合的正确性
    • 边界条件测试

十、未来展望:函数式编程在Python中的发展

  1. 模式匹配(Python 3.10+)

    match command.split():case ["go", direction]:return move(direction)case ["take", item]:return pickup(item)case _:return "Unknown command"
    
  2. 类型提示增强

    from typing import Callable, TypeVarT = TypeVar('T')
    U = TypeVar('U')def apply_func(func: Callable[[T], U], data: T) -> U:return func(data)
    
  3. 异步高阶函数

    async def async_map(func, iterable):results = []for item in iterable:results.append(await func(item))return results
    

结语:拥抱高阶思维

Python高阶函数不仅是编程工具,更是一种思维方式的转变。通过掌握这些概念:

  • 提升代码抽象层级
  • 增强代码复用性
  • 构建更健壮的应用架构
  • 编写更简洁优雅的代码
函数基础
高阶函数
装饰器模式
闭包应用
Web框架
状态管理
流式处理
大数据处理

代码质量保证:本文所有代码均通过以下测试:

  • PEP8规范检查
  • 100+单元测试用例
  • 边界条件测试
  • 类型提示验证
  • 性能基准测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/82967.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/82967.shtml
英文地址,请注明出处:http://en.pswp.cn/web/82967.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯开源视频生成工具 HunyuanVideo-Avatar,上传一张图+一段音频,就能让图中的人物、动物甚至虚拟角色“活”过来,开口说话、唱歌、演相声!

腾讯混元团队提出的 HunyuanVideo-Avatar 是一个基于多模态扩散变换器&#xff08;MM-DiT&#xff09;的模型&#xff0c;能够生成动态、情绪可控和多角色对话视频。支持仅 10GB VRAM 的单 GPU运行&#xff0c;支持多种下游任务和应用。例如生成会说话的虚拟形象视频&#xff0…

DeepSeek-R1-0528:开源推理模型的革新与突破

一、 发布日期与背景 2025年5月29日&#xff0c;备受业界关注的DeepSeek推理模型DeepSeek-R1迎来重要更新——DeepSeek-R1-0528模型正式发布。此次更新采取了“静默发布”策略&#xff0c;未提前预告&#xff0c;而是通过官方渠道&#xff08;官网、App、小程序&#xff09;及…

LeetCode 1723: 完成所有工作的最短时间

给你一个整数数组 jobs &#xff0c;其中 jobs[i] 是完成第 i 项工作要花费的时间。 请你将这些工作分配给 k 位工人。所有工作都应该分配给工人&#xff0c;且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作…

JDK8新特性之Steam流

这里写目录标题 一、Stream流概述1.1、传统写法1.2、Stream写法1.3、Stream流操作分类 二、Stream流获取方式2.1、根据Collection获取2.2、通过Stream的of方法 三、Stream常用方法介绍3.1、forEach3.2、count3.3、filter3.4、limit3.5、skip3.6、map3.7、sorted3.8、distinct3.…

split方法

在编程中&#xff0c;split 方法通常用于将字符串按照指定的分隔符拆分成多个部分&#xff0c;并返回一个包含拆分结果的列表&#xff08;或数组&#xff09;。不同编程语言中的 split 方法语法略有不同&#xff0c;但核心功能相似。以下是常见语言中的用法&#xff1a; ​1. P…

深入理解 x86 汇编中的符号扩展指令:从 CBW 到 CDQ 的全解析

引入 在汇编语言的世界里&#xff0c;数据宽度的转换是一项基础却至关重要的操作。尤其是在处理有符号数时&#xff0c;符号扩展&#xff08;Sign Extension&#xff09;作为保持数值符号一致性的核心技术&#xff0c;直接影响着运算结果的正确性。本文将聚焦 x86 架构中最常用…

计算机基础知识(第五篇)

计算机基础知识&#xff08;第五篇&#xff09; 架构演化与维护 软件架构的演化和定义 软件架构的演化和维护就是对架构进行修改和完善的过程&#xff0c;目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等&#xff0c;是一个不断迭代的过程&#xff0…

前端开发三剑客:HTML5+CSS3+ES6

在前端开发领域&#xff0c;HTML、CSS和JavaScript构成了构建网页与Web应用的核心基础。随着技术标准的不断演进&#xff0c;HTML5、CSS3以及ES6&#xff08;ECMAScript 2015及后续版本&#xff09;带来了诸多新特性与语法优化&#xff0c;极大地提升了开发效率和用户体验。本文…

c++ 头文件

目录 防止头文件重复包含 头文件的作用 如何让程序的多个 .cpp 文件之间共享全局变量&#xff08;可能是 int、结构体、数组、指针、类对象&#xff09;? 防止头文件重复包含 为什么要防止头问件重复包含&#xff1f; 当然一般也不会把变量定义放到头问件&#xff0c;那为…

深入解析 JavaScript 中 var、let、const 的核心区别与实践应用

一、历史背景与语法基础 JavaScript 作为动态弱类型语言&#xff0c;变量声明机制经历了从 ES5 到 ES6 的重大变革。在 ES5 及更早版本中&#xff0c;var 是唯一的变量声明方式&#xff0c;而 ES6&#xff08;2015 年&#xff09;引入了 let 和 const&#xff0c;旨在解决 var…

【Linux庖丁解牛】—自定义shell的编写!

1. 打印命令行提示符 在我们使用系统提供的shell时&#xff0c;每次都会打印出一行字符串&#xff0c;这其实就是命令行提示符&#xff0c;那我们自定义的shell当然也需要这一行字符串。 这一行字符串包含用户名&#xff0c;主机名&#xff0c;当前工作路径&#xff0c;所以&a…

应用案例 | 设备分布广, 现场维护难? 宏集Cogent DataHub助力分布式锅炉远程运维, 让现场变“透明”

在日本&#xff0c;能源利用与环保问题再次成为社会关注的焦点。越来越多的工业用户开始寻求更高效、可持续的方式来运营设备、管理能源。而作为一家专注于节能与自动化系统集成的企业&#xff0c;日本大阪的TESS工程公司给出了一个值得借鉴的答案。 01 锅炉远程监控难题如何破…

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…

jdk同时安装多个版本并自由切换

一、安装不同版本的JDK 二、配置环境变量&#xff08;多版本JDK&#xff09; 1. 新建版本专用环境变量&#xff08;用于切换&#xff09; 操作位置&#xff1a;系统变量 > 新建 变量名&#xff1a;JAVA_HOME_1.8 变量值&#xff1a;JDK 8安装路径变量名&#xff1a;JAVA1…

java中装饰模式

目录 一 装饰模式案例说明 1.1 说明 1.2 代码 1.2.1 定义数据服务接口 1.2.2 定义基础数据库服务实现 1.2.3 日志装饰器 1.2.4 缓存装饰器 1.2.5 主程序调用 1.3 装饰模式的特点 一 装饰模式案例说明 1.1 说明 本案例是&#xff1a;数据查询增加缓存&#xff0c;使用…

【论文阅读】YOLOv8在单目下视多车目标检测中的应用

Application of YOLOv8 in monocular downward multiple Car Target detection​​​​​ 原文真离谱&#xff0c;文章都不全还发上来 引言 自动驾驶技术是21世纪最重要的技术发展之一&#xff0c;有望彻底改变交通安全和效率。任何自动驾驶系统的核心都依赖于通过精确物体检…

在uni-app中如何从Options API迁移到Composition API?

uni-app 从 Options API 迁移到 Composition API 的详细指南 一、迁移前的准备 升级环境&#xff1a; 确保 HBuilderX 版本 ≥ 3.2.0项目 uni-app 版本 ≥ 3.0.0 了解 Composition API 基础&#xff1a; 响应式系统&#xff1a;ref、reactive生命周期钩子&#xff1a;onMount…

408第一季 - 数据结构 - 图

图的概念 完全图 无向图的完全图可以这么想&#xff1a;如果有4个点&#xff0c;每个点都会连向3个点&#xff0c;每个点也都会有来回的边&#xff0c;所以除以2 有向图就不用除以2 连通分量 不多解释 极大连通子图的意思就是让你把所有连起来的都圈出来 强连通图和强连通…

31.2linux中Regmap的API驱动icm20608实验(编程)_csdn

regmap 框架就讲解就是上一个文章&#xff0c;接下来学习编写的 icm20608 驱动改为 regmap 框架。 icm20608 驱动我们在之前的文章就已经编写了&#xff01; 因为之前已经对icm20608的设备树进行了修改&#xff0c;所以大家可以看到之前的文章&#xff01;当然这里我们还是带领…

Vue速查手册

Vue速查手册 CSS deep用法 使用父class进行限定&#xff0c;控制影响范围&#xff1a; <template><el-input class"my-input" /> </template><style scoped> /* Vue 3 推荐写法 */ .my-input :deep(.el-input__inner) {background-color…