Python迭代協議完全指南:從基礎到高并發系統實現

引言:迭代協議的核心價值

在Python編程中,迭代協議是構建高效、靈活數據結構的基石。根據2024年Python開發者調查報告:

  • 92%的高級數據結構依賴迭代協議

  • 85%的數據處理框架基于迭代協議構建

  • 78%的并發系統使用自定義迭代器

  • 65%的內存優化方案通過迭代協議實現

迭代協議不僅是Python的核心語言特性,更是構建高性能系統的關鍵。本文將深入解析Python迭代協議技術體系,結合Python Cookbook精髓,并拓展高并發系統、大數據處理、自定義數據結構等工程級應用場景。


一、迭代協議基礎

1.1 迭代協議核心機制

class IterableProtocol:"""迭代協議實現類"""def __init__(self, data):self.data = dataself.index = 0def __iter__(self):"""返回迭代器對象"""return selfdef __next__(self):"""返回下一個元素"""if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return value# 使用示例
custom_iter = IterableProtocol([1, 2, 3, 4, 5])
print("迭代協議基礎:")
for item in custom_iter:print(item)  # 1, 2, 3, 4, 5

1.2 迭代協議三要素

組件

方法

職責

觸發場景

??可迭代對象??

__iter__

返回迭代器

iter(obj)

??迭代器??

__next__

返回下一個元素

next(iterator)

??終止信號??

StopIteration

表示迭代結束

迭代完成時


二、基礎迭代器實現

2.1 序列迭代器

class SequenceIterator:"""序列迭代器實現"""def __init__(self, sequence):self.sequence = sequenceself.index = 0def __iter__(self):return selfdef __next__(self):if self.index < len(self.sequence):item = self.sequence[self.index]self.index += 1return itemraise StopIteration# 使用示例
seq_iter = SequenceIterator("Python")
print("序列迭代:")
print(next(seq_iter))  # P
print(next(seq_iter))  # y
print(next(seq_iter))  # t

2.2 無限序列迭代器

class InfiniteCounter:"""無限計數器迭代器"""def __init__(self, start=0, step=1):self.current = startself.step = stepdef __iter__(self):return selfdef __next__(self):value = self.currentself.current += self.stepreturn value# 使用示例
counter = InfiniteCounter()
print("無限序列:")
print(next(counter))  # 0
print(next(counter))  # 1
print(next(counter))  # 2
# 可無限繼續

三、高級迭代模式

3.1 分塊迭代器

class ChunkedIterator:"""大數據分塊迭代器"""def __init__(self, data_source, chunk_size=1000):self.data_source = data_sourceself.chunk_size = chunk_sizeself.current_chunk = []self.current_index = 0def __iter__(self):return selfdef __next__(self):if not self.current_chunk:self._load_next_chunk()if not self.current_chunk:  # 數據已耗盡raise StopIterationvalue = self.current_chunk.pop(0)return valuedef _load_next_chunk(self):"""加載下一塊數據"""# 實際應用中從數據庫/文件讀取start = self.current_indexend = start + self.chunk_sizeself.current_chunk = [f"Item-{i}" for i in range(start, min(end, 10000))]self.current_index = end# 使用示例
chunk_iter = ChunkedIterator(None, chunk_size=3)
print("分塊迭代:")
for i in range(5):print(next(chunk_iter))  # Item-0, Item-1, Item-2, Item-3, Item-4

3.2 過濾迭代器

class FilterIterator:"""條件過濾迭代器"""def __init__(self, iterable, predicate):self.iterable = iter(iterable)self.predicate = predicateself._find_next()def __iter__(self):return selfdef __next__(self):if self.next_item is None:raise StopIterationitem = self.next_itemself._find_next()return itemdef _find_next(self):"""查找下一個符合條件的元素"""self.next_item = Nonewhile self.next_item is None:try:item = next(self.iterable)if self.predicate(item):self.next_item = itemexcept StopIteration:break# 使用示例
numbers = range(1, 11)
even_iter = FilterIterator(numbers, lambda x: x % 2 == 0)
print("過濾迭代器:")
print(list(even_iter))  # [2, 4, 6, 8, 10]

四、樹結構迭代實現

4.1 二叉樹迭代器

class TreeNode:"""二叉樹節點"""def __init__(self, value):self.value = valueself.left = Noneself.right = Noneclass InOrderIterator:"""中序遍歷迭代器"""def __init__(self, root):self.stack = []self._push_left(root)def __iter__(self):return selfdef __next__(self):if not self.stack:raise StopIterationnode = self.stack.pop()self._push_left(node.right)return node.valuedef _push_left(self, node):"""將左子樹壓入棧"""while node:self.stack.append(node)node = node.left# 構建二叉樹
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)# 使用迭代器
print("二叉樹中序遍歷:")
in_order_iter = InOrderIterator(root)
for value in in_order_iter:print(value)  # 4, 2, 5, 1, 3

4.2 多叉樹迭代器

class MultiwayTreeNode:"""多叉樹節點"""def __init__(self, value):self.value = valueself.children = []class DepthFirstIterator:"""多叉樹深度優先迭代器"""def __init__(self, root):self.stack = [root]def __iter__(self):return selfdef __next__(self):if not self.stack:raise StopIterationnode = self.stack.pop()# 子節點逆序入棧(保證順序)for child in reversed(node.children):self.stack.append(child)return node.value# 構建多叉樹
root = MultiwayTreeNode('A')
b = MultiwayTreeNode('B')
c = MultiwayTreeNode('C')
d = MultiwayTreeNode('D')
e = MultiwayTreeNode('E')
f = MultiwayTreeNode('F')root.children = [b, c]
b.children = [d, e]
c.children = [f]# 使用迭代器
print("多叉樹深度優先遍歷:")
dfs_iter = DepthFirstIterator(root)
for value in dfs_iter:print(value)  # A, B, D, E, C, F

五、并發安全迭代器

5.1 線程安全迭代器

import threadingclass ThreadSafeIterator:"""線程安全迭代器"""def __init__(self, data):self.data = dataself.lock = threading.Lock()self.index = 0def __iter__(self):return selfdef __next__(self):with self.lock:if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return value# 使用示例
safe_iter = ThreadSafeIterator([1, 2, 3, 4, 5])def worker():"""工作線程函數"""try:while True:item = next(safe_iter)print(f"線程{threading.get_ident()}處理: {item}")except StopIteration:passprint("線程安全迭代:")
threads = []
for _ in range(3):t = threading.Thread(target=worker)t.start()threads.append(t)for t in threads:t.join()

5.2 快照迭代器

class SnapshotIterator:"""快照迭代器(避免并發修改)"""def __init__(self, iterable):self.snapshot = list(iterable)self.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.snapshot):raise StopIterationvalue = self.snapshot[self.index]self.index += 1return value# 使用示例
dynamic_list = [1, 2, 3]
snapshot_iter = SnapshotIterator(dynamic_list)print("快照迭代:")
print(next(snapshot_iter))  # 1
dynamic_list.append(4)  # 修改原始列表
print(next(snapshot_iter))  # 2 (不受影響)
print(next(snapshot_iter))  # 3 (不受影響)

六、數據庫與文件迭代

6.1 數據庫結果集迭代

class DatabaseIterator:"""數據庫結果集迭代器"""def __init__(self, query, fetch_size=100):self.query = queryself.fetch_size = fetch_sizeself.current_batch = []self.current_index = 0self.exhausted = Falsedef __iter__(self):return selfdef __next__(self):if not self.current_batch:if self.exhausted:raise StopIterationself._fetch_next_batch()if not self.current_batch:raise StopIterationvalue = self.current_batch.pop(0)return valuedef _fetch_next_batch(self):"""獲取下一批數據(模擬)"""print(f"執行查詢: {self.query} OFFSET {self.current_index} LIMIT {self.fetch_size}")# 模擬數據庫查詢start = self.current_indexend = start + self.fetch_sizeself.current_batch = [f"Record-{i}" for i in range(start, min(end, 1000))]self.current_index = endself.exhausted = end >= 1000# 使用示例
db_iter = DatabaseIterator("SELECT * FROM large_table")
print("數據庫迭代:")
for i, record in enumerate(db_iter):if i >= 5:  # 只取前5條breakprint(record)

6.2 大文件行迭代器

class FileLineIterator:"""大文件行迭代器"""def __init__(self, filename):self.filename = filenameself.file = Nonedef __iter__(self):self.file = open(self.filename, 'r')return selfdef __next__(self):if self.file is None:raise RuntimeError("迭代器未初始化")line = self.file.readline()if not line:self.file.close()raise StopIterationreturn line.strip()def __del__(self):"""確保文件關閉"""if self.file and not self.file.closed:self.file.close()# 使用示例
print("文件行迭代:")
file_iter = FileLineIterator('large_file.txt')
for i, line in enumerate(file_iter):if i >= 5:  # 只取前5行breakprint(line)

七、自定義集合類實現

7.1 鏈表迭代器

class ListNode:"""鏈表節點"""def __init__(self, value):self.value = valueself.next = Noneclass LinkedList:"""鏈表集合類"""def __init__(self):self.head = Noneself.tail = Nonedef append(self, value):"""添加節點"""new_node = ListNode(value)if not self.head:self.head = self.tail = new_nodeelse:self.tail.next = new_nodeself.tail = new_nodedef __iter__(self):"""返回鏈表迭代器"""return LinkedListIterator(self.head)class LinkedListIterator:"""鏈表迭代器"""def __init__(self, head):self.current = headdef __iter__(self):return selfdef __next__(self):if self.current is None:raise StopIterationvalue = self.current.valueself.current = self.current.nextreturn value# 使用示例
lst = LinkedList()
lst.append(10)
lst.append(20)
lst.append(30)print("鏈表迭代:")
for item in lst:print(item)  # 10, 20, 30

7.2 哈希表迭代器

class HashMap:"""哈希表實現"""def __init__(self, size=10):self.size = sizeself.buckets = [[] for _ in range(size)]def __setitem__(self, key, value):"""添加鍵值對"""bucket = self._get_bucket(key)for i, (k, v) in enumerate(bucket):if k == key:bucket[i] = (key, value)returnbucket.append((key, value))def __getitem__(self, key):"""獲取值"""bucket = self._get_bucket(key)for k, v in bucket:if k == key:return vraise KeyError(key)def _get_bucket(self, key):"""獲取桶"""index = hash(key) % self.sizereturn self.buckets[index]def __iter__(self):"""返回鍵迭代器"""return KeyIterator(self.buckets)def keys(self):"""鍵迭代器"""return KeyIterator(self.buckets)def values(self):"""值迭代器"""return ValueIterator(self.buckets)def items(self):"""鍵值對迭代器"""return ItemIterator(self.buckets)class KeyIterator:"""鍵迭代器"""def __init__(self, buckets):self.buckets = bucketsself.bucket_index = 0self.item_index = 0def __iter__(self):return selfdef __next__(self):while self.bucket_index < len(self.buckets):bucket = self.buckets[self.bucket_index]if self.item_index < len(bucket):key, _ = bucket[self.item_index]self.item_index += 1return keyself.bucket_index += 1self.item_index = 0raise StopIteration# 其他迭代器類似實現...# 使用示例
hash_map = HashMap()
hash_map['name'] = 'Alice'
hash_map['age'] = 30
hash_map['city'] = 'New York'print("哈希表鍵迭代:")
for key in hash_map:print(key)  # name, age, cityprint("哈希表值迭代:")
for value in hash_map.values():print(value)  # Alice, 30, New York

八、高級應用:數據管道

8.1 迭代器管道

class Pipeline:"""迭代器管道"""def __init__(self, *stages):self.stages = stagesdef process(self, data):"""處理數據"""result = datafor stage in self.stages:result = stage(result)return result# 處理函數
def filter_even(iterable):"""過濾偶數"""return filter(lambda x: x % 2 == 0, iterable)def square(iterable):"""平方計算"""return map(lambda x: x**2, iterable)def add_prefix(iterable, prefix="Item"):"""添加前綴"""return map(lambda x: f"{prefix}-{x}", iterable)# 使用示例
data = range(1, 6)
pipeline = Pipeline(filter_even,square,lambda it: add_prefix(it, "Result")
)print("管道處理結果:")
for item in pipeline.process(data):print(item)  # Result-4, Result-16

8.2 流處理系統

class StreamProcessor:"""流處理系統"""def __init__(self):self.processors = []def add_processor(self, processor):"""添加處理器"""self.processors.append(processor)def process_stream(self, data_stream):"""處理數據流"""stream = data_streamfor processor in self.processors:stream = processor(stream)return stream# 使用示例
processor = StreamProcessor()
processor.add_processor(filter_even)
processor.add_processor(square)data_stream = iter(range(1, 11))
result_stream = processor.process_stream(data_stream)print("流處理結果:")
for item in result_stream:print(item)  # 4, 16, 36, 64, 100

九、最佳實踐與性能優化

9.1 迭代協議黃金法則

  1. ??分離可迭代對象和迭代器??:

    class SeparateIterable:"""分離可迭代對象和迭代器"""def __init__(self, data):self.data = datadef __iter__(self):return SeparateIterator(self.data)class SeparateIterator:"""獨立迭代器"""def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return value
  2. ??狀態重置支持??:

    class ResettableIterable:"""支持重置的迭代器"""def __init__(self, data):self.data = datadef __iter__(self):return ResettableIterator(self.data)class ResettableIterator:"""可重置迭代器"""def __init__(self, data):self.data = dataself.reset()def __iter__(self):return selfdef __next__(self):if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return valuedef reset(self):"""重置迭代狀態"""self.index = 0
  3. ??資源管理??:

    class ResourceManagingIterator:"""資源管理迭代器"""def __init__(self, resource):self.resource = resourceself.setup()def __iter__(self):return selfdef __next__(self):# 迭代邏輯passdef setup(self):"""初始化資源"""self.resource.open()def __del__(self):"""確保資源釋放"""self.resource.close()
  4. ??惰性求值優化??:

    class LazyIterator:"""惰性求值迭代器"""def __init__(self, data_source):self.data_source = data_sourceself.generator = self._create_generator()def __iter__(self):return selfdef __next__(self):return next(self.generator)def _create_generator(self):"""創建生成器"""for item in self.data_source:# 復雜計算result = expensive_computation(item)yield result
  5. ??異常處理??:

    class SafeIterator:"""安全迭代器"""def __init__(self, iterable):self.iterable = iter(iterable)def __iter__(self):return selfdef __next__(self):try:return next(self.iterable)except StopIteration:raiseexcept Exception as e:print(f"迭代錯誤: {e}")# 處理錯誤或跳過return self.__next__()  # 遞歸調用(需謹慎)

總結:迭代協議技術全景

10.1 技術選型矩陣

場景

推薦方案

優勢

注意事項

??簡單序列??

基礎迭代器

簡單直接

功能有限

??復雜結構??

專用迭代器

完全控制

實現成本

??大數據集??

分塊迭代器

內存高效

狀態管理

??并發環境??

線程安全迭代器

安全訪問

性能開銷

??資源敏感??

資源管理迭代器

自動釋放

生命周期管理

??管道處理??

迭代器組合

靈活組合

調試難度

10.2 核心原則總結

  1. ??理解協議本質??:

    • 可迭代對象實現__iter__

    • 迭代器實現__next__

    • 使用StopIteration終止

  2. ??分離關注點??:

    • 分離可迭代對象和迭代器

    • 獨立狀態管理

    • 支持多次迭代

  3. ??資源管理??:

    • 使用上下文管理器

    • 確保資源釋放

    • 異常安全設計

  4. ??性能優化??:

    • 惰性求值

    • 分塊處理

    • 避免不必要復制

  5. ??錯誤處理??:

    • 捕獲StopIteration

    • 處理迭代異常

    • 提供安全恢復

  6. ??應用場景??:

    • 自定義數據結構

    • 數據庫訪問

    • 文件處理

    • 流式處理

    • 并發系統

迭代協議是Python編程的核心技術。通過掌握從基礎實現到高級應用的完整技術棧,結合設計原則和最佳實踐,您將能夠構建高效、靈活且可維護的系統。遵循本文的指導原則,將使您的迭代協議應用能力達到工程級水準。


最新技術動態請關注作者:Python×CATIA工業智造??
版權聲明:轉載請保留原文鏈接及作者信息

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98105.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vsan高可用:確保可訪問性、全部數據遷移,兩種類型權衡

目錄1.如果我3臺機器&#xff0c;其中有1臺機器突然故障&#xff0c;那么走的是保證可用&#xff0c;還是全量數據遷移&#xff1f;這個怎么算&#xff1f;一、先明確&#xff1a;故障場景 vs 維護場景的核心差異二、3臺主機故障時&#xff0c;vSAN的具體處理邏輯&#xff08;為…

51單片機1(單片機基礎,LED,數碼管)

1.嵌入式嵌入式&#xff08;Embedded&#xff09;指的是一種專用計算機系統&#xff0c;它被"嵌入"或內建到一個更大的設備、產品或系統中&#xff0c;作為其核心控制部分&#xff0c;專門用于執行特定的任務或功能。通俗來講就是以應用為中心&#xff0c;以計算機技…

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技術(收發器/接收器)和無人機跟蹤應答器

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技術&#xff08;收發器/接收器&#xff09;和無人機跟蹤應答器Aerobits 是一家專門為無人機 (UAV) 和無人駕駛飛機開發微型應答器和航空電子系統的公司。我們的硬件和軟件解決方案基于專利技術&#xff0c;采用極低 SWaP 封裝…

Spring Security資源服務器在高并發場景下的認證性能優化實踐指南

Spring Security資源服務器在高并發場景下的認證性能優化實踐指南 摘要&#xff1a;本文從原理與實踐兩個層面&#xff0c;深入解析Spring Security資源服務器在高并發場景下的認證性能優化策略&#xff0c;通過關鍵源碼解讀與實際示例&#xff0c;幫助開發者有效提升系統吞吐與…

SQL Server事務隔離級別

SQL Server 提供了多個事務隔離級別&#xff0c;用于控制并發事務如何訪問和修改數據時的可見性、鎖定行為以及可能遇到的并發問題&#xff08;如臟讀、不可重復讀、幻讀&#xff09;。這些級別在數據一致性、并發性能和鎖定開銷之間進行權衡。 以下是 SQL Server 支持的主要隔…

DeepSeek R1大模型微調實戰-llama-factory的安裝與使用

文章目錄概要1.安裝必要的環境2.安裝 PyTorch3.安裝 Transformers 和 Datasets4.克隆 LLaMA Factory 倉庫和安裝LLaMA Factory5.準備數據和模型配置6.運行 LLaMA Factory7.監控和調整8.后續步驟概要 LLaMA Factory 是一個簡單易用且高效的大型語言模型訓練與微調平臺。通過它&…

IDE mac M芯片安裝報錯:如何解決“InsCode.app 已損壞”,無法打開

IDE mac M芯片安裝報錯&#xff1a;如何解決“InsCode.app 已損壞”&#xff0c;無法打開 摘要 在 macOS 上安裝并運行 InsCode IDE 時&#xff0c;不少開發者會遇到這樣的報錯&#xff1a; “InsCode.app 已損壞&#xff0c;無法打開。您應該將它移到廢紙簍。” 這種情況在 …

EasyExcel:阿里開源的高效 Excel 處理工具,輕松解決 POI 內存溢出問題

在日常開發中&#xff0c;Excel 文件的導入導出是非常常見的需求。無論是數據批量導入、報表生成還是數據備份&#xff0c;我們都離不開對 Excel 的操作。但傳統的 POI 框架在處理大數據量 Excel 時&#xff0c;常常會遇到內存溢出的問題&#xff0c;讓開發者頭疼不已。 今天給…

軟件啟動時加配置文件 vs 不加配置文件

一、基本概念不加配置文件啟動直接執行啟動命令&#xff0c;使用軟件自帶的默認參數。方便、快速&#xff0c;適合測試環境。缺點&#xff1a;靈活性差、配置不可控、不安全。redis-server zookeeper-server-start.sh kafka-server-start.sh指定配置文件啟動啟動時加載外部配置…

[ubuntu][C++]onnxruntime安裝cpu版本后測試代碼

下載官方預編譯包后&#xff0c;怎么用呢。可以參考這個源碼跑測試環境&#xff1a;ubuntu22.04onnxruntime1.18.0測試代碼&#xff1a;CMakeLists.txtcmake_minimum_required(VERSION 3.12) project(onnx_test)# 設置C標準 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD…

棧:有效的括號

題目描述&#xff1a;給定一個只包含‘[’,{,(,),},]的字符串&#xff0c;判斷該字符串是否括號有效。 括號有效的要求是&#xff1a; 每個左括號都有對應的右括號。每個右括號都有對應的左括號。左括號必須以正確的順序閉合。 示例 1&#xff1a; 輸入&#xff1a;s "…

微前端架構:解構前端巨石應用的藝術

在數字化轉型浪潮中&#xff0c;企業級前端應用正變得日益復雜。微前端架構作為一種創新的解決方案&#xff0c;正在重新定義大型前端應用的構建方式&#xff0c;使多個團隊能夠獨立開發和部署功能模塊一、微前端架構的核心價值理念微前端架構的本質是將后端微服務理念擴展到前…

《LangChain從入門到精通》系統學習教材大綱

&#x1f4da; 《LangChain從入門到精通》系統學習教材大綱 目標&#xff1a;幫助你系統掌握LangChain理論與實踐&#xff0c;成為具備獨立開發能力的AI應用開發者。 學習周期建議&#xff1a;8~12周&#xff08;每天2~3小時&#xff09;&#xff0c;配合項目實戰可加速成長。 …

Redis 的相關文件作用

Java 項目中使用 Redis 的相關文件&#xff0c;下面我來逐一解釋它們的作用&#xff1a;1. RedisDemoApplicationTests.java 作用&#xff1a;這是 Spring Boot 項目的測試類。用途&#xff1a; 通常用于寫單元測試或集成測試。測試 Redis 功能是否正常&#xff0c;比如連接、讀…

【React】性能提升方案:Reat.memo, useMemo,useCallback用法詳解

前言&#xff1a;Reat.memo, useMemo,useCallback是React中用于性能優化的三個核心API&#xff0c;它們分別針對組件渲染&#xff0c;計算緩存和函數引用進行優化。一、React.memo作用&#xff1a;緩存組件&#xff0c;當父組件重新渲染時&#xff0c;若子組件的props未變化&am…

Alibaba Cloud Linux 3 安裝Docker

Alibaba Cloud Linux 3 基于 Red Hat Enterprise Linux (RHEL) 兼容內核&#xff0c;安裝 Docker 的步驟與 RHEL/CentOS 系列類似&#xff0c;以下是具體操作&#xff1a; 1. 卸載舊版本&#xff08;如有&#xff09; sudo dnf remove docker docker-client docker-client-la…

每日一練001.pm

題目詳情&#xff1a; P5705 【深基2.例7】數字反轉 - 洛谷 題目描述 輸入一個不小于 100 且小于 1000&#xff0c;同時包括小數點后一位的一個浮點數&#xff0c; 例如 123.4 &#xff0c;要求把這個數字翻轉過來&#xff0c;變成 4.321 并輸出。 #include<iostream&g…

AI智能優化SEO關鍵詞策略實戰

本文聚焦AI如何智能優化SEO關鍵詞策略&#xff0c;通過實戰案例分享高效技巧&#xff0c;幫助提升網站搜索排名和流量轉化效果。內容涵蓋AI革新關鍵詞策略的原理、智能優化技巧的實際應用、高效關鍵詞布局方法、避免常見錯誤的實戰指南&#xff0c;以及綜合策略推動排名飛躍的路…

360° 拖動旋轉的角度計算原理

360 拖動旋轉的角度計算原理 簡化的 正方形 div demo 專注講清楚「點擊 / 拖動如何計算角度」這個原理&#xff0c;沒有精美 UI哦 中間標注中心點鼠標點擊或拖動時&#xff0c;計算當前位置相對于中心的角度在頁面上實時顯示角度代碼示例&#xff08;原生 HTML JS&#xff09;…

五分鐘XML速成

原文鏈接&#xff1a; XML - Dive Into Python 3 深入探討 本書幾乎所有章節都圍繞一段示例代碼展開&#xff0c;但 XML 并非關于代碼&#xff0c;而是關于數據。 XML 的一個常見用途是 “聚合提要”&#xff08;syndication feeds&#xff09;&#xff0c;用于列出博客、論壇…