Generator 迭代產生器 |
#Benefits - Memory Usage # 利用 list 迭代 range_num = 10 for i in [x*x for x in range(range_num)]: # do something pass # 利用 generator 迭代 for i in (x*x for x in range(range_num)): # do something pass #Memory Usage - by using generator import psutil before_used = psutil.virtual_memory().used # expressed in bytes after_used = 0 print("before:", before_used) ## 10458206208 range_num = 1000000 for i in (x*x for x in range(range_num)): # 第二種方法:對 generator 進行迭代 if i == (range_num - 1) * (range_num - 1): after_used = psutil.virtual_memory().used print("after:", after_used)## 10461298688 print("used memory:", (after_used - before_used)) ## 3092480
Module - os
import os # 顯示絕對路徑 os.path.abspath("session_1-ans.ipynb") # '/Users/felix/Python/session_1-ans.ipynb' # 將多個字串組合為路徑 '/'.join(['path', 'result', 'a.csv']) # 'path/result/a.csv' # 將多個字串組合為路徑 os.path.join('path', 'result', 'a.csv') # 'path/result/a.csv' # 檢查某路徑/資料夾是否存在 os.path.exists("python\session_1-ans.ipynb") # FalseQ1: 若某 k 位數的正整數,其所有位數數字的 k 次方和等於該數相等,則稱為阿姆斯壯數(Armstrong number)。 例如 1^3 + 5^3 + 3^3 = 153, 則 153 是一個阿姆斯壯數。 請創建一個 Generator 函式,找出 100 ~ 999 的所有三位數的阿姆斯壯數; 利用 yield 回傳數值,並且用多次呼叫此 Generator 函式,依序列印出所找到的阿姆斯壯數。
def armstrong_number(): for num in range(100, 1000): temp = num sum = 0 while temp > 0: digit = temp % 10 # 取餘數 取得當前 temp 的個位數 sum += digit ** 3 # 當前取得的位數 的三次方加入 sum temp //= 10 # 將當前 temp 往右位移一位 (以10為底 所以除10) if sum == num: # 如果 所有位數的3次方 和 等於該數 yield sum # 返回 此阿姆斯壯數 a = armstrong_number() try: while(True): print(a.__next__()) except StopIteration: print("The End")Q2: 透過 Generators 讀取一個純文字檔案 (Optional) hint 1. 利用 open("your_file_path", ""r) 來開啟檔案 hint 2. 需設定每次要讀取檔案的大小 hint 3. 利用迴圈存取,直到檔案讀取完畢為止
# Q2. def read_in_block(file_path): BLOCK_SIZE = 1024 with open(file_path, "r") as f: while True: block = f.read(BLOCK_SIZE) # 每次讀取固定長度到記憶體 if block: yield block else: f.close() return def batch_read(): file_path = "input_your_file_path" # 輸入檔案的路徑 for block in read_in_block(file_path): # do something print(block)
沒有留言:
張貼留言