{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "01CjUc4lG-U9",
"outputId": "6304f65e-0751-491a-beef-d60e45e8ab0b"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Function 'filter_data' called 1 times. Execution time: 0.0000 seconds.\n",
"Function 'transform_data' called 1 times. Execution time: 0.0000 seconds.\n",
"Processed Data: 102, Running Average: 102.00\n",
"Processed Data: 104, Running Average: 103.00\n",
"Processed Data: 106, Running Average: 104.00\n",
"Processed Data: 108, Running Average: 105.00\n",
"Processed Data: 110, Running Average: 106.00\n",
"Processed Data: 112, Running Average: 107.00\n",
"Processed Data: 114, Running Average: 108.00\n",
"Processed Data: 116, Running Average: 109.00\n",
"Processed Data: 118, Running Average: 110.00\n",
"Processed Data: 120, Running Average: 111.00\n",
"Processed Data: 122, Running Average: 112.00\n",
"Processed Data: 124, Running Average: 113.00\n",
"Processed Data: 126, Running Average: 114.00\n",
"Processed Data: 128, Running Average: 115.00\n",
"Processed Data: 130, Running Average: 116.00\n",
"Processed Data: 132, Running Average: 117.00\n",
"Processed Data: 134, Running Average: 118.00\n",
"Processed Data: 136, Running Average: 119.00\n",
"Processed Data: 138, Running Average: 120.00\n",
"Processed Data: 140, Running Average: 121.00\n",
"Processed Data: 142, Running Average: 122.00\n",
"Processed Data: 144, Running Average: 123.00\n",
"Processed Data: 146, Running Average: 124.00\n",
"Processed Data: 148, Running Average: 125.00\n",
"Processed Data: 150, Running Average: 126.00\n",
"Processed Data: 152, Running Average: 127.00\n",
"Processed Data: 154, Running Average: 128.00\n",
"Processed Data: 156, Running Average: 129.00\n",
"Processed Data: 158, Running Average: 130.00\n",
"Processed Data: 160, Running Average: 131.00\n",
"Processed Data: 162, Running Average: 132.00\n",
"Processed Data: 164, Running Average: 133.00\n",
"Processed Data: 166, Running Average: 134.00\n",
"Processed Data: 168, Running Average: 135.00\n",
"Processed Data: 170, Running Average: 136.00\n",
"Processed Data: 172, Running Average: 137.00\n",
"Processed Data: 174, Running Average: 138.00\n",
"Processed Data: 176, Running Average: 139.00\n",
"Processed Data: 178, Running Average: 140.00\n",
"Processed Data: 180, Running Average: 141.00\n",
"Processed Data: 182, Running Average: 142.00\n",
"Processed Data: 184, Running Average: 143.00\n",
"Processed Data: 186, Running Average: 144.00\n",
"Processed Data: 188, Running Average: 145.00\n",
"Processed Data: 190, Running Average: 146.00\n",
"Processed Data: 192, Running Average: 147.00\n",
"Processed Data: 194, Running Average: 148.00\n",
"Processed Data: 196, Running Average: 149.00\n",
"Processed Data: 198, Running Average: 150.00\n",
"Processed Data: 200, Running Average: 151.00\n",
"Processed Data: 202, Running Average: 152.00\n",
"Processed Data: 204, Running Average: 153.00\n",
"Processed Data: 206, Running Average: 154.00\n",
"Processed Data: 208, Running Average: 155.00\n",
"Processed Data: 210, Running Average: 156.00\n",
"Processed Data: 212, Running Average: 157.00\n",
"Processed Data: 214, Running Average: 158.00\n",
"Processed Data: 216, Running Average: 159.00\n",
"Processed Data: 218, Running Average: 160.00\n",
"Processed Data: 220, Running Average: 161.00\n",
"Processed Data: 222, Running Average: 162.00\n",
"Processed Data: 224, Running Average: 163.00\n",
"Processed Data: 226, Running Average: 164.00\n",
"Processed Data: 228, Running Average: 165.00\n",
"Processed Data: 230, Running Average: 166.00\n",
"Processed Data: 232, Running Average: 167.00\n",
"Processed Data: 234, Running Average: 168.00\n",
"Processed Data: 236, Running Average: 169.00\n",
"Processed Data: 238, Running Average: 170.00\n",
"Processed Data: 240, Running Average: 171.00\n",
"Processed Data: 242, Running Average: 172.00\n",
"Processed Data: 244, Running Average: 173.00\n",
"Processed Data: 246, Running Average: 174.00\n",
"Processed Data: 248, Running Average: 175.00\n",
"Processed Data: 250, Running Average: 176.00\n",
"Processed Data: 252, Running Average: 177.00\n",
"Processed Data: 254, Running Average: 178.00\n",
"Processed Data: 256, Running Average: 179.00\n",
"Processed Data: 258, Running Average: 180.00\n",
"Processed Data: 260, Running Average: 181.00\n",
"Processed Data: 262, Running Average: 182.00\n",
"Processed Data: 264, Running Average: 183.00\n",
"Processed Data: 266, Running Average: 184.00\n",
"Processed Data: 268, Running Average: 185.00\n",
"Processed Data: 270, Running Average: 186.00\n",
"Processed Data: 272, Running Average: 187.00\n",
"Processed Data: 274, Running Average: 188.00\n",
"Processed Data: 276, Running Average: 189.00\n",
"Processed Data: 278, Running Average: 190.00\n",
"Processed Data: 280, Running Average: 191.00\n",
"Processed Data: 282, Running Average: 192.00\n",
"Processed Data: 284, Running Average: 193.00\n",
"Processed Data: 286, Running Average: 194.00\n",
"Processed Data: 288, Running Average: 195.00\n",
"Processed Data: 290, Running Average: 196.00\n",
"Processed Data: 292, Running Average: 197.00\n",
"Processed Data: 294, Running Average: 198.00\n",
"Processed Data: 296, Running Average: 199.00\n",
"Processed Data: 298, Running Average: 200.00\n",
"Processed Data: 300, Running Average: 201.00\n",
"Processing stopped after 100 items.\n"
]
}
],
"source": [
"import time\n",
"\n",
"# 裝飾器:記錄函數使用次數和執行時間\n",
"def logger(func):\n",
" \"\"\"記錄函數的使用次數和執行時間\"\"\"\n",
" usage_count = 0 # 用來計算函數被調用的次數\n",
" def wrapper(*args, **kwargs):\n",
" nonlocal usage_count\n",
" usage_count += 1\n",
" start_time = time.time() # 記錄函數開始執行的時間\n",
" result = func(*args, **kwargs) # 執行被裝飾的函數\n",
" end_time = time.time() # 記錄函數結束執行的時間\n",
" print(f\"Function '{func.__name__}' called {usage_count} times. Execution time: {end_time - start_time:.4f} seconds.\")\n",
" return result # 返回函數的執行結果\n",
" return wrapper\n",
"\n",
"# 數據過濾生成器\n",
"@logger\n",
"def filter_data(data_stream, threshold):\n",
" \"\"\"\n",
" 過濾數據流中小於或等於閾值的數據\n",
" :param data_stream: 數據流生成器\n",
" :param threshold: 閾值\n",
" :yield: 大於閾值的數據\n",
" \"\"\"\n",
" for data in data_stream:\n",
" if data > threshold:\n",
" yield data\n",
"\n",
"# 數據轉換生成器\n",
"@logger\n",
"def transform_data(data_stream, transform_func):\n",
" \"\"\"\n",
" 對數據流中的每個數據進行轉換\n",
" :param data_stream: 數據流生成器\n",
" :param transform_func: 用於轉換數據的函數\n",
" :yield: 轉換後的數據\n",
" \"\"\"\n",
" for data in data_stream:\n",
" yield transform_func(data)\n",
"\n",
"# 運行平均值計算(閉包)\n",
"def running_average():\n",
" \"\"\"\n",
" 計算運行平均值的閉包函數\n",
" :return: 可用於更新並返回當前平均值的函數\n",
" \"\"\"\n",
" total = 0 # 累積總和\n",
" count = 0 # 數據個數\n",
" def avg(new_value):\n",
" nonlocal total, count\n",
" total += new_value\n",
" count += 1\n",
" return total / count # 返回當前平均值\n",
" return avg\n",
"\n",
"# 數據生成器:模擬實時數據流\n",
"def data_stream():\n",
" \"\"\"模擬生成連續數據流\"\"\"\n",
" for i in range(1, 1000): # 數據範圍從1到999\n",
" yield i\n",
"\n",
"# 數據處理管道\n",
"def data_pipeline(threshold, transform_func, max_items):\n",
" \"\"\"\n",
" 數據處理管道,整合數據過濾、轉換與即時平均值計算\n",
" :param threshold: 過濾的閾值\n",
" :param transform_func: 數據轉換函數\n",
" :param max_items: 最大處理數據個數\n",
" \"\"\"\n",
" avg_calc = running_average() # 初始化運行平均值閉包\n",
" processed_count = 0 # 已處理數據計數\n",
" for transformed_data in transform_data(filter_data(data_stream(), threshold), transform_func):\n",
" # 顯示處理後的數據和當前運行平均值\n",
" print(f\"Processed Data: {transformed_data}, Running Average: {avg_calc(transformed_data):.2f}\")\n",
" processed_count += 1\n",
" if processed_count >= max_items: # 當處理數據達到max_items時停止\n",
" print(f\"Processing stopped after {processed_count} items.\")\n",
" break\n",
"\n",
"# 主程式\n",
"if __name__ == \"__main__\":\n",
" # 設定閾值為50,數據轉換為乘以2,最多處理100筆數據\n",
" data_pipeline(threshold=50, transform_func=lambda x: x * 2, max_items=100)\n"
]
}
]
}