摘抄于騰訊技術(shù)知乎專欄:https://zhuanlan.zhihu.com/p/68128557
該篇僅做個(gè)人復(fù)習(xí)查詢使用,對(duì)該內(nèi)容感興趣的朋友,請(qǐng)去原文鏈接閱讀學(xué)習(xí)。
使用函數(shù)修飾被循環(huán)對(duì)象本身,可以改善循環(huán)體內(nèi)的代碼
itertools 里面有很多工具函數(shù)都可以用來改善循環(huán)
使用生成器函數(shù)可以輕松定義自己的修飾函數(shù)
循環(huán)內(nèi)部,是一個(gè)極易發(fā)生“代碼膨脹”的場(chǎng)地
請(qǐng)使用生成器函數(shù)將循環(huán)內(nèi)不同職責(zé)的代碼塊解耦出來,獲得更好的靈活性
##對(duì)于這種需要嵌套遍歷多個(gè)對(duì)象的多層循環(huán)代碼,我們可以使用函數(shù)來優(yōu)化它。
##`product()`可以接收多個(gè)可迭代對(duì)象,然后根據(jù)它們的笛卡爾積不斷生成結(jié)果。
from itertools import product
def find_twelve_v2(num_list1, num_list2, num_list3):
for num1, num2, num3 in product(num_list1, num_list2, num_list3):
if num1 + num2 + num3 == 12:
return num1, num2, num3
## 使用takewhile 替代break,為true則繼續(xù)執(zhí)行循環(huán),false跳出
from itertools import takewhile
for user in takewhile(is_qualified, users):
# 進(jìn)行處理 ... ...
#使用生成器函數(shù)解耦循環(huán)體
def gen_weekend_ts_ranges(days_ago, hour_start, hour_end):
"""生成特定時(shí)間區(qū)域時(shí)間戳"""
for days_delta in range(days_ago):
"""省略代碼"""
yield ts_start, ts_end
def award_active_users_in_last_30days_v2():
"""發(fā)送獎(jiǎng)勵(lì)積分"""
for ts_start, ts_end in gen_weekend_ts_ranges(30, hour_start=20, hour_end=23):
for record in LoginRecord.filter_by_range(ts_start, ts_end):
send_awarding_points(record.user_id, 1000)