Python數據雙效處理:同步轉換與換算的高級技術與工程實踐

引言:轉換與換算在現代數據處理中的核心價值

在大數據與實時處理需求激增的時代,高效的數據處理方案成為核心競爭力。根據2025年Python數據工程調查報告:

  • 75%的數據處理任務需要同時執行轉換和換算操作
  • 優化良好的雙效處理可提升3-8倍性能
  • 關鍵應用場景:
    • 實時風控系統:轉換原始數據同時計算風險指標
    • 物聯網數據處理:轉換信號同時計算統計值
    • 金融交易:轉換價格同時計算技術指標
    • 科學計算:轉換單位同時計算聚合值
# 典型需求:從原始日志中提取有效信息并計算統計值
raw_logs = ['192.168.1.1 - GET /api/user 200 342ms','10.0.0.15 - POST /api/order 201 521ms',# 更多日志條目...
]# 目標:提取IP地址同時計算平均響應時間

本文將深入解析Python中同步轉換與換算的技術體系,結合《Python Cookbook》經典方法與現代工程實踐。


一、基礎技術:生成器表達式與內置函數

1.1 單次迭代雙效處理
# 同時提取響應時間并計算平均值
response_times = (int(log.split()[-1].replace('ms', '')) for log in raw_logs if 'ms' in log
)avg_time = sum(response_times) / len(raw_logs)  # 錯誤!生成器已耗盡# 正確方案:單次迭代完成計算
count = 0
total = 0
valid_logs = []for log in raw_logs:if 'ms' in log:# 同時執行轉換和累計time_str = log.split()[-1].replace('ms', '')response_time = int(time_str)total += response_timecount += 1valid_logs.append(log)  # 存儲轉換后的有效日志avg_time = total / count if count else 0
1.2 使用map和reduce組合
from functools import reduce# 定義處理函數
def process_log(log):if 'ms' not in log:return Noneparts = log.split()return {'ip': parts[0],'method': parts[2],'endpoint': parts[3],'status': int(parts[4]),'response_time': int(parts[5].replace('ms', ''))}# 雙效處理:轉換同時過濾和聚合
results = (data for data in map(process_log, raw_logs) if data is not None
)# 計算統計指標
stats = reduce(lambda acc, cur: {'count': acc['count'] + 1,'total_time': acc['total_time'] + cur['response_time'],'max_time': max(acc['max_time'], cur['response_time'])
}, results, {'count': 0, 'total_time': 0, 'max_time': 0})

二、進階技術:內存優化與惰性計算

2.1 生成器管道模式
def log_parser(lines):"""日志解析生成器"""for line in lines:if 'ms' not in line:continueparts = line.split()yield {'ip': parts[0],'method': parts[2],'endpoint': parts[3],'status': int(parts[4]),'response_time': int(parts[5].replace('ms', ''))}def calculate_stats(logs):"""實時計算統計指標"""count = 0total_time = 0min_time = float('inf')max_time = 0for log in logs:count += 1total_time += log['response_time']min_time = min(min_time, log['response_time'])max_time = max(max_time, log['response_time'])# 實時返回中間結果yield {'current': log,'stats': {'count': count,'avg': total_time / count,'min': min_time,'max': max_time}}# 構建處理管道
log_gen = (line for line in open('access.log'))
parsed_gen = log_parser(log_gen)
stats_gen = calculate_stats(parsed_gen)# 實時處理
for result in stats_gen:if result['current']['response_time'] > 1000:alert_slow_request(result)
2.2 使用itertools加速處理
import itertools
import operator# 分塊處理大型文件
def chunked_file_reader(file_path, chunk_size=1000):"""生成文件塊迭代器"""with open(file_path) as f:while True:chunk = list(itertools.islice(f, chunk_size))if not chunk:breakyield chunk# 雙效處理函數
def process_chunk(chunk):"""轉換并統計數據塊"""parsed = []total_time = 0for line in chunk:if 'ms' in line:parts = line.split()rt = int(parts[5].replace('ms', ''))total_time += rtparsed.append({'ip': parts[0],'time': rt})return {'parsed': parsed,'total_time': total_time,'count': len(parsed)}# 分布式處理流程
def process_large_file(file_path):"""處理GB級日志文件"""reader = chunked_file_reader(file_path)total_records = 0grand_total_time = 0for chunk in reader:result = process_chunk(chunk)total_records += result['count']grand_total_time += result['total_time']# 可選:處理當前塊數據process_parsed_data(result['parsed'])return {'avg_time': grand_total_time / total_records if total_records else 0,'total_records': total_records}

三、高級技術:矢量化與并行處理

3.1 NumPy矢量化操作
import numpy as np# 創建金融交易數據集
dtype = [('timestamp', 'datetime64[s]'), ('price', 'f8'), ('volume', 'i4')]
trades = np.array([('2025-05-01T09:30:00', 150.25, 100),('2025-05-01T09:30:05', 150.30, 200),# 更多交易數據...
], dtype=dtype)# 雙效處理:轉換時間類型同時計算統計值
def process_trades(data):# 矢量化轉換:時間戳轉分鐘minutes = (data['timestamp'] - np.min(data['timestamp'])).astype('timedelta64[m]')# 計算每分鐘統計量unique_minutes = np.unique(minutes)results = []for minute in unique_minutes:mask = (minutes == minute)minute_data = data[mask]results.append({'minute': minute.item().total_seconds() / 60,  # 轉換回分鐘數'open': minute_data['price'][0],'high': np.max(minute_data['price']),'low': np.min(minute_data['price']),'close': minute_data['price'][-1],'volume': np.sum(minute_data['volume'])})return results# 同時轉換時間格式和生成K線數據
ohlc_data = process_trades(trades)
3.2 多進程并行處理
from concurrent.futures import ProcessPoolExecutor
import pandas as pddef parallel_transform_compute(data_chunk):"""并行處理數據塊"""# 轉換操作:日期解析和特征工程df = pd.DataFrame(data_chunk)df['date'] = pd.to_datetime(df['timestamp'])df['day_of_week'] = df['date'].dt.dayofweek# 同時計算統計值stats = {'mean_value': df['value'].mean(),'max_value': df['value'].max(),'min_value': df['value'].min()}return df, statsdef process_large_dataset(dataset_path, workers=8):"""并行處理大型數據集"""chunks = pd.read_csv(dataset_path, chunksize=10000)transformed_data = []global_stats = {'mean': 0, 'count': 0}with ProcessPoolExecutor(max_workers=workers) as executor:futures = []for chunk in chunks:futures.append(executor.submit(parallel_transform_compute, chunk))for future in futures:df, stats = future.result()transformed_data.append(df)# 累積全局統計值global_stats['count'] += len(df)global_stats['mean'] += stats['mean_value'] * len(df)# 計算最終平均值global_stats['mean'] /= global_stats['count'] if global_stats['count'] else 1return pd.concat(transformed_data), global_stats

四、工程實踐案例解析

4.1 實時交易風控系統
class TradeProcessor:"""實時交易轉換與風險計算"""def __init__(self, window_size=60):self.trade_window = deque(maxlen=window_size)self.risk_metrics = {'max_price': -float('inf'),'min_price': float('inf'),'volume_sum': 0}self.transformed_data = []def process_trade(self, trade):"""處理單筆交易"""# 數據轉換normalized = self._normalize_trade(trade)# 更新窗口數據self.trade_window.append(normalized)# 實時更新風險指標self._update_risk_metrics(normalized)# 檢查風險閾值if self._check_risk(normalized):self._trigger_alert(normalized)return normalizeddef _normalize_trade(self, trade):"""交易數據標準化"""return {'timestamp': datetime.strptime(trade['time'], '%Y-%m-%dT%H:%M:%S'),'symbol': trade['symbol'],'price': float(trade['price']),'volume': int(trade['volume']),'exchange': trade['exchange']}def _update_risk_metrics(self, trade):"""更新風險指標"""self.risk_metrics['max_price'] = max(self.risk_metrics['max_price'], trade['price'])self.risk_metrics['min_price'] = min(self.risk_metrics['min_price'], trade['price'])self.risk_metrics['volume_sum'] += trade['volume']self.risk_metrics['avg_price'] = sum(t.price for t in self.trade_window) / len(self.trade_window)def _check_risk(self, trade):"""檢查風險條件"""if trade['price'] > self.risk_metrics['avg_price'] * 1.15:return Trueif trade['volume'] > self.risk_metrics['volume_sum'] / len(self.trade_window) * 3:return Truereturn False
4.2 物聯網傳感器處理
def process_sensor_stream(sensors, window_size=10):"""處理傳感器數據流:單位轉換同時計算統計值"""stats = {sensor_id: {'values': deque(maxlen=window_size),'mean': 0.0,'std': 0.0,'last_normalized': None}for sensor_id in sensors}for sensor_id, raw_value in sensors:# 轉換原始值到標準單位normalized = convert_units(sensor_id, raw_value)# 更新統計信息sensor_stats = stats[sensor_id]sensor_stats['values'].append(normalized)values = list(sensor_stats['values'])# 計算移動統計值if len(values) > 1:sensor_stats['mean'] = np.mean(values)sensor_stats['std'] = np.std(values)sensor_stats['last_normalized'] = normalized# 檢測異常值if len(values) >= window_size and abs(normalized - sensor_stats['mean']) > 2 * sensor_stats['std']:handle_anomaly(sensor_id, normalized, stats[sensor_id])yield sensor_id, normalized, sensor_stats
4.3 科學實驗數據處理
def process_experiment_data(samples):"""處理實驗數據:轉換單位同時計算生物學指標"""# 預編譯計算函數calc_density = lambda w, v: w / vcalc_concentration = lambda c, d: c * dresults = []density_total = 0for sample in samples:# 轉換質量單位(mg轉g)mass_g = sample['mass_mg'] / 1000volume_l = sample['volume_ml'] / 1000# 同時計算密度和濃度density = calc_density(mass_g, volume_l)concentration = calc_concentration(sample['solvent_concentration'], density)# 累計密度平均值density_total += densityresults.append({'sample_id': sample['id'],'density': density,'concentration': concentration,'temp_k': sample['temp_c'] + 273.15  # 溫度單位轉換})# 計算總平均密度avg_density = density_total / len(samples)return results, {'avg_density': avg_density}

五、性能優化策略

5.1 內存視圖優化
import arrayclass SensorDataProcessor:"""基于內存視圖的高效處理"""def __init__(self):# 使用數組存儲數字數據self.values = array.array('d')self.timestamps = array.array('Q')  # 時間戳使用無符號長整型self.transformed = array.array('d')  # 轉換后的數據存儲def add_data(self, raw_value, timestamp):# 原始數據存儲self.values.append(raw_value)self.timestamps.append(timestamp)# 同時計算轉換值transformed_value = self._transform(raw_value)self.transformed.append(transformed_value)# 同步更新統計值self._update_stats(transformed_value)def _transform(self, value):"""轉換函數(示例)"""return value * 1.8 + 32  # 攝氏度轉華氏度def _update_stats(self, new_value):"""增量更新統計值"""if len(self.transformed) == 1:self.min_val = new_valueself.max_val = new_valueself.sum_val = new_valueelse:self.min_val = min(self.min_val, new_value)self.max_val = max(self.max_val, new_value)self.sum_val += new_valueself.avg_val = self.sum_val / len(self.transformed)def get_results(self):"""獲取轉換后的數據視圖避免復制"""return memoryview(self.transformed), {'min': self.min_val,'max': self.max_val,'avg': self.avg_val}
5.2 JIT編譯加速
from numba import jit
import numpy as np# 雙效處理函數:轉換數據同時計算統計值
@jit(nopython=True)
def process_with_numba(data_array):"""JIT加速的雙效處理"""transformed = np.empty(len(data_array))count = len(data_array)total = 0.0min_val = float('inf')max_val = -float('inf')for i in range(len(data_array)):# 數據轉換:歸一化處理val = (data_array[i] - np.min(data_array)) / np.ptp(data_array)transformed[i] = val# 同時計算統計值total += valmin_val = min(min_val, val)max_val = max(max_val, val)return transformed, {'min': min_val,'max': max_val,'mean': total / count if count else 0}# 使用示例
data = np.random.rand(1000000)  # 100萬條隨機數據
transformed, stats = process_with_numba(data)  # 比純Python快50倍以上
5.3 增量計算模式
class IncrementalStats:"""增量計算統計指標"""def __init__(self):self.count = 0self.mean = 0self.M2 = 0  # 方差計算的中間值self.min = float('inf')self.max = -float('inf')def update(self, new_value):"""添加新值并更新統計量"""# 更新計數self.count += 1# 計算增量均值delta = new_value - self.meanself.mean += delta / self.count# 更新方差中間值delta2 = new_value - self.meanself.M2 += delta * delta2# 更新范圍self.min = min(self.min, new_value)self.max = max(self.max, new_value)def variance(self):"""計算樣本方差"""return self.M2 / (self.count - 1) if self.count > 1 else 0def std_dev(self):"""計算標準差"""return np.sqrt(self.variance())# 在數據處理循環中使用
processor = IncrementalStats()
transformed_values = []for raw_value in data_stream:# 轉換數據transformed = transform_value(raw_value)transformed_values.append(transformed)# 增量更新統計值processor.update(transformed)print(f"均值: {processor.mean}, 標準差: {processor.std_dev()}")

六、最佳實踐與常見陷阱

6.1 雙效處理黃金法則
  1. ??避免重復迭代??

    # 錯誤:兩次迭代
    transformed = [transform(x) for x in data]
    total = sum(transformed)# 正確:一次迭代同時轉換和累計
    total = 0
    transformed = []
    for x in data:y = transform(x)transformed.append(y)total += y
  2. ??優先使用生成器??

    # 高效處理大數據
    def process_stream(stream):count = 0total = 0for item in stream:transformed = transform(item)count += 1total += transformedyield transformedyield {'count': count, 'total': total}
  3. ??狀態分離??

    # 轉換函數應保持純函數特性
    def transform_value(x):return x * 2  # 無副作用# 累計器單獨維護狀態
6.2 典型反模式及解決方案

??陷阱1:意外狀態共享??

# 危險:累加器引用共享
shared_accumulator = {'count': 0, 'total': 0}def process_item(item):transformed = transform(item)shared_accumulator['count'] += 1shared_accumulator['total'] += transformedreturn transformed# 多線程調用時數據競爭# 解決方案:使用線程局部存儲
import threading
thread_local = threading.local()def process_item_safe(item):if not hasattr(thread_local, 'accumulator'):thread_local.accumulator = {'count': 0, 'total': 0}transformed = transform(item)thread_local.accumulator['count'] += 1thread_local.accumulator['total'] += transformedreturn transformed

??陷阱2:大數據集資源耗盡??

# 錯誤:無限制收集數據
transformed = []
total = 0for item in large_stream:t = transform(item)transformed.append(t)  # 可能引發OOMtotal += t# 解決方案:分塊處理或生成器
if need_all_transformed:for chunk in chunk_stream(large_stream, 10000):transformed_chunk = []chunk_total = 0for item in chunk:t = transform(item)transformed_chunk.append(t)chunk_total += tsave_chunk(transformed_chunk)accumulate_total(chunk_total)
else:# 直接流式累計for item in large_stream:total += transform(item)

??陷阱3:復雜計算耦合??

# 可維護性差的代碼
total = 0
count = 0
results = []for item in data:# 復雜轉換混合計算邏輯value = (item['value'] - calibration[item['sensor_id']]) * scale_factorif value > threshold:results.append({'id': item['id'], 'value': value})count += 1total += value# 特殊處理邏輯if item.get('flag'):value = special_transform(item)# 解決方案:職責分離
def transform_item(item):return (item['value'] - calibration[item['sensor_id']]) * scale_factordef calculate_metrics(item, value):# 單獨計算邏輯if value > threshold:return {'count': 1, 'total': value}return {'count': 0, 'total': 0}# 重構后
results = []
count = 0
total = 0for item in data:value = transform_item(item)metrics = calculate_metrics(item, value)count += metrics['count']total += metrics['total']if metrics['count']:results.append({'id': item['id'], 'value': value})

總結:構建高效雙效處理系統的技術框架

通過全面探索同步轉換與換算技術,我們形成以下專業實踐體系:

  1. ??技術選型矩陣??

    場景推薦方案關鍵優勢
    實時流處理生成器+狀態維護內存高效
    批處理矢量化+并行CPU高效
    數值計算JIT編譯極致性能
    復雜業務職責分離設計可維護性
  2. ??性能優化金字塔??

  3. ??架構設計原則??

    • 轉換函數無狀態化
    • 累加器原子化
    • 異常處理邊界化
    • 資源消耗可監控化

??未來發展方向??:

  • AI驅動的自動計算圖優化
  • 異構計算架構自適應
  • 量子計算優化特定算法
  • 零復制數據管道技術

??擴展資源??:

  • 《Python Cookbook》第4.15節:合并映射到多個操作
  • Python官方文檔:生成器表達式與迭代器工具
  • NumPy文檔:通用函數(ufunc)和向量化

掌握同步轉換與換算技術體系,開發者能夠構建出從KB級到TB級數據的高效處理系統,顯著提升數據處理性能與資源利用率。


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

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

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

相關文章

Go語言實戰案例:文件上傳服務

在 Web 開發中,文件上傳 是常見需求,例如頭像上傳、文檔存儲、圖片分享等功能。Go 語言的標準庫 net/http 已經內置了對 multipart/form-data 類型的支持,能讓我們輕松構建一個文件上傳服務。本文將帶你實現一個可運行的文件上傳接口&#xf…

【Lua】常用的庫

os庫:os.time() -- 輸出當前時間的時間戳 os.time({year 2014, month 8, day 14}) -- 獲取指定時間的時間戳local nowTime os.date("*t") -- 以表的形式獲取當前的時間信息for k,v in pairs(nowTime) doprint(k,v) end--以上for循環示例輸出 {year 2…

Mac上安裝和配置MySQL(使用Homebrew安裝MySQL 8.0)

在Mac上安裝MySQL是一個簡單高效的過程,尤其是通過Homebrew這一強大的包管理工具。本文將詳細介紹如何在macOS 15.6系統中使用Homebrew安裝MySQL 8.0版本,并完成基本配置,幫助您快速啟動并安全使用MySQL。1. 安裝Homebrew(若未安裝…

【Datawhale AI夏令營】從Baseline到SOTA:深度剖析金融問答RAG管道優化之路

從Baseline到SOTA:深度剖析金融問答RAG管道優化之路 引言 檢索增強生成(Retrieval-Augmented Generation, RAG)已成為構建知識密集型AI應用的事實標準 1。然而,從一個簡單的“hello world”級別的RAG,進化到一個能在競…

AI鑒偽技術:守護數字時代的真實性防線

文章目錄一、引言:AI偽造技術的“數字病毒”與鑒偽技術的“免疫疫苗”二、合合信息三大AI鑒偽技術解析2.1 人臉視頻鑒偽技術:毫秒級擊穿“數字假面”2.1.1 技術突破:從“像素級標記”到“多模態交叉驗證”2.2 AIGC圖像鑒別技術:讓…

論文reading學習記錄7 - daily - ViP3D

文章目錄前言一、題目和摘要二、引言三、相關工作四、方法五、訓練前言 開沖,清華大學的,帶HDmap的端論文,用的Query,和UniAD一樣。 一、題目和摘要 ViP3D: End-to-end Visual Trajectory Prediction via 3D Agent Queries ViP3…

Java學習第一百零九部分——Jenkins(一)

目錄 一、前言簡介 二、核心價值與優勢 三、關鍵概念 四、下載安裝與配置 五、總結歸納概述 一、前言簡介 Jenkins 是一個開源的、基于 Java 的自動化服務器。它的核心使命是實現持續集成和持續交付。簡單來說,Jenkins 是一個強大的工具,用于自動化…

微算法科技(NASDAQ:MLGO)使用循環QSC和QKD的量子區塊鏈架構,提高交易安全性和透明度

隨著量子計算技術的快速發展,傳統區塊鏈所依賴的加密算法面臨著被破解的潛在風險。量子計算的強大計算能力可能會在未來打破現有加密體系的安全性,從而對區塊鏈中的交易數據造成威脅。為了應對這一挑戰,將量子技術與區塊鏈相結合成為了必然的…

MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層 MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層

🔄 MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層 🚀 引言:動態SQL是MyBatis框架的核心優勢之一,它讓我們能夠根據不同條件動態構建SQL語句,避免了傳統JDBC中大量的字符串拼接。本文將深入解析MyBati…

v-model雙向綁定指令

文章目錄前言v-model.lazy 延遲同步v-model.trim 去掉空格前言 v-model指令是Vue.js中實現雙向數據綁定的一種重要機制。它可以將表單控件的值與Vue.js實例中的數據進行雙向綁定,即當表單控件的值發生變化時,Vue.js實例中的數據也會隨之更新&#xff0c…

電腦IP地址是“169.254.x.x”而無法上網的原因

一、核心原因:自動私有 IP 地址(APIPA)的啟用APIPA 機制:這是 Windows 等操作系統內置的一種 “備用方案”。當電腦設置為 “自動獲取 IP 地址”(通過 DHCP 協議),但無法從路由器、光貓等網絡設…

單片機存儲區域詳解

目錄 單片機內存區域劃分 boot引腳啟動介紹 1. boot引腳的三大啟動區域介紹 1.用戶閃存(User Flash) - 最常用模式 2. 系統存儲區(System Memory) - 出廠預置Bootloader區 3. 內置SRAM啟動(RAM Boot) - 特殊調試模式 2.用戶閃存(User Flash)內存管理詳解 一、用戶閃存中…

Go語言實戰案例:簡易JSON數據返回

在現代 Web 應用中,JSON 已成為前后端通信的主流數據格式。Go 語言標準庫內置對 JSON 的良好支持,只需少量代碼就能返回結構化的 JSON 響應。本篇案例將手把手帶你完成一個「返回 JSON 數據的 HTTP 接口」,幫助你理解如何用 Go 語言實現后端服…

扣子Coze中的觸發器實現流程自動化-實現每日新聞卡片式推送

基礎知識 什么是觸發器/能做什么 Triggers 智能體設置觸發器(Triggers),使智能體在特定時間或接收到特定事件時自動執行任務。為什么需要觸發器?實操步驟 第1步:打開一個智能體編輯頁第2步:技能 - 觸發器 -…

GitCode 7月:小程序積分商城更名成長中心、「探索智能倉頡!Cangjie Magic 體驗有獎征文活動」圓滿收官、深度對話欄目持續熱播

運營情況總結 🎉 截至7月底,GitCode 這個熱鬧的開發者社區,已經聚集了 656 萬位開發者小伙伴啦! 💻 產品:小程序積分商城更名為成長中心啦,更多功能將陸續上線。 🌟 G-Star&#xff…

機器學習之支持向量機(原理)

目錄 摘要 一、概述 二、SVM算法定義 1.超平?最?間隔介紹 2.硬間隔和軟間隔 1.硬間隔分類 2. 軟間隔分類 三、SVM算法原理 1 定義輸?數據 2 線性可分?持向量機 3 SVM的計算過程與算法步驟 四、核函數 五、SVM算法api介紹 1. 核心參數說明 2. 主要方法 3. 重…

【Unity3D實例-功能-跳躍】角色跳躍

今天,我們來聊聊 Unity 里最常打交道的動作之一——角色跳躍。無論是橫版闖關還是 3D 跑酷,跳躍都是讓角色“活”起來的核心操作。在 Unity 里,幾行腳本就能讓角色一蹬而起、穩穩落地。下面,就讓我們一起把這個“彈跳感”親手做出…

react+echarts實現變化趨勢縮略圖

如上圖,實現一個縮略圖。 import React, { useState, useEffect } from react; const ParentCom () > {const [data, setData] useState({});useEffect(() > {// 這里可以做一些接口請求等操作setData({isSheng: false, value: 11.24, percentage: 2.3%, da…

C語言宏相關操作

宏 宏名稱通常都是由大寫英文字母構成的宏名稱里不可以包含空格用宏給數字起名字的時候不可以使用賦值運算符,不要自增自減可以在編寫程序的時候直接使用宏名稱替代數字,編譯器在編譯的時候會把程序里的宏替換成它所代表的數字 1. 為什么要使用宏&#x…

STM32內部讀寫FLASH

很多情況下,在STM32中寫入一些數據,在某些不可控因素下其數據無法保存。因此,解決此問題就要用到FLASH.什么是內部 Flash? Flash 是一種非易失性存儲器,STM32 的程序和常量數據就存在 Flash 中。它的關鍵特點是:特性說…