Python高階函數:從入門到精通

目錄

    • 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 -> 162=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…