1. 主页 > 小妙招

Python生成器使用详解:从基础到高效应用实例


鈥?strong>鈥嬧€滀负浠€涔堝埆浜虹殑浠g爜鑳藉鐞嗙櫨涓囩骇鏁版嵁锛屼綘鐨勭▼搴忎竴璺戝氨鍗℃锛熲€濃€?/strong>鈥?br/> 杩欎釜闂鎵庡績浜嗗惂锛熶粖澶╁挶浠氨鏉ヨ亰鑱奝ython閲屼竴涓兘璁╀綘浠g爜鐬棿鍙橀珮鏁堢殑绁炲櫒鈥斺€旂敓鎴愬櫒銆傛斁蹇冿紝灏辩畻浣犳槸鍒氬叆闂ㄧ殑灏忕櫧锛岀湅瀹岃繖绡囦篃鑳界帺杞畠锛?/p>


涓€銆佺敓鎴愬櫒鍒板簳鏄暐锛熷拰鍑芥暟鏈夊暐鍖哄埆锛?/h3>

锛堟暡榛戞澘锛夌敓鎴愬櫒鍙笉鏄粈涔堢巹瀛︽蹇点€傗€?strong>鈥嬬畝鍗曟潵璇达紝瀹冨氨鏄釜鈥滀細鏆傚仠鐨勫嚱鏁扳€濃€?/strong>鈥嬨€傛櫘閫氬嚱鏁颁竴鎵ц灏遍潪寰楄窇鍒皉eturn鎵嶇舰浼戯紝鐢熸垚鍣ㄥ嵈鑳藉湪涓€斿枈鈥滃仠鍋滃仠锛岀瓑鎴戝枬鍙f按鍐嶇户缁€濄€?/p>

涓句釜渚嬪瓙浣犲氨鎳備簡锛?/p>

python澶嶅埗
# 鏅€氬嚱鏁?/span>
def 鍋氬寘瀛?/span>():
    return "涓€绗肩儹姘旇吘鑵剧殑鑲夊寘"

# 鐢熸垚鍣?/span>
def 娴佹按绾垮仛鍖呭瓙():
    for _ in range(5):
        yield "姝e湪鍒朵綔绗瑊}涓寘瀛?..".format(_+1)

鐢ㄦ櫘閫氬嚱鏁颁竴娆″彧鑳芥嬁鍒颁竴绗煎寘瀛愶紝鐢熸垚鍣ㄥ嵈鑳借浣犺竟鍋氳竟鎷裤€傗€?strong>鈥媦ield杩欎釜鍏抽敭璇嶅氨鏄紑鍏斥€?/strong>鈥嬧€斺€斾氦鍑哄綋鍓嶅€硷紝鐒跺悗鎸傝捣寰呭懡銆?/p>


浜屻€佷负浠€涔堥潪瑕佺敤鐢熸垚鍣紵鍐呭瓨鏉€鎵媀S鍐呭瓨绠″

鍓嶄袱澶╂湁涓鍛橀棶鎴戯細鈥滆€佸笀锛屾垜鐢ㄥ垪琛ㄥ瓨浜?0涓囨潯鏁版嵁锛岀粨鏋滅數鑴戦鎵囩媯杞紒鈥濊繖灏辨槸鍏稿瀷鐨勫唴瀛樻潃鎵嬫渚嬨€傛潵瀵规瘮涓嬩袱绉嶅啓娉曪細

python澶嶅埗
# 鏅€氬垪琛?/span>
data = [x**2 for x in range(100000)]  # 鐬棿鍚冩帀76MB鍐呭瓨

# 鐢熸垚鍣?/span>
data_gen = (x**2 for x in range(100000))  # 鍙崰鍑犵櫨瀛楄妭

鈥?strong>鈥嬬敓鎴愬櫒灏卞儚鑷姪椁愬巺鐨勪紶閫佸甫鈥?/strong>鈥嬶紝浣犺鍚冨摢涓彍灏辨嬁鍝釜锛屼笉鐢ㄦ妸鏁存鑿滈兘绔埌闈㈠墠銆傚疄娴嬪鐞嗙櫨涓囩骇鏁版嵁鏃讹紝鐢熸垚鍣ㄨ兘鍑忓皯90%浠ヤ笂鐨勫唴瀛樺崰鐢紒


涓夈€佸洓澶у疄鎴樺満鏅紝鐪嬪畬灏辫兘鐢?/h3>

鍦烘櫙1锛氬ぇ鏂囦欢澶勭悊缁濇椿

鍋囪瑕佸鐞?0G鐨勬棩蹇楁枃浠讹細

python澶嶅埗
def 璇诲ぇ鏂囦欢(filename):
    with open(filename, 'r') as f:
        while line := f.readline():
            yield line.strip()

# 鐢ㄧ殑鏃跺€欏儚鎶界焊涓€鏍蜂竴寮犲紶鎶?/span>
for line in 璇诲ぇ鏂囦欢("瓒呭ぇ鏃ュ織.log"):
    鍒嗘瀽鏃ュ織(line)

杩欐牱灏辩畻鏂囦欢姣斾綘瀹舵埧瀛愯繕澶э紝鍐呭瓨涔熶笉浼氱垎鐐搞€?/p>

鍦烘櫙2锛氭棤闄愬簭鍒楃敓鎴愬櫒

鎯冲仛涓案杩滄暟涓嶅畬鐨勮鏁板櫒锛?/p>

python澶嶅埗
def 鏃犻檺璁℃暟鍣?/span>():
    num = 0
    while True:
        yield num
        num +=1

counter = 鏃犻檺璁℃暟鍣?)
print(next(counter))  # 0
print(next(counter))  # 1
# ...鑳戒竴鐩磏ext鍒板ぉ鑽掑湴鑰?/span>

鍥涖€侀珮鎵嬮兘鍦ㄧ敤鐨勮繘闃舵妧宸?/h3>

鎶€宸?锛氱粰鐢熸垚鍣ㄥ彂娑堟伅

寰堝浜轰笉鐭ラ亾鐢熸垚鍣ㄨ繕鑳藉弻鍚戦€氫俊锛?/p>

python澶嶅埗
def 鏅鸿兘璁℃暟鍣?/span>():
    total = 0
    while True:
        x = yield total
        if x == 'reset':
            total = 0
        else:
            total +=1

gen = 鏅鸿兘璁℃暟鍣?)
next(gen)  # 婵€娲荤敓鎴愬櫒
print(gen.send(None))  # 0
print(gen.send('reset')) # 0

杩欎釜鈥?strong>鈥媠end()鏂规硶鈥?/strong>鈥嬪氨鍍忕粰鐢熸垚鍣ㄥ彂寰俊锛屾兂鎬庝箞鎸囨尌灏辨€庝箞鎸囨尌銆?/p>

鎶€宸?锛氱敓鎴愬櫒绠¢亾

鎶婂涓敓鎴愬櫒杩炶捣鏉ョ敤锛屽儚娴佹按绾夸竴鏍峰鐞嗘暟鎹細

python澶嶅埗
def 鍒囪彍():
    vegetables = ["馃","馃ガ","馃尪锔?]
    for veg in vegetables:
        yield f"鍒囧ソ鐨?span>{veg}"

def 鐐掕彍(鍘熸枡):
    for item in 鍘熸枡:
        yield f"鐖嗙倰鍚庣殑{item}"

# 缁勮鐢熶骇绾?/span>
澶勭悊娴佺▼ = 鐐掕彍(鍒囪彍())
for dish in 澶勭悊娴佺▼:
    print(dish)

杩欑鍐欐硶璁╀唬鐮佸儚涔愰珮绉湪涓€鏍峰彲浠ラ殢鎰忔嫾鎺ャ€?/p>


浜斻€佹柊鎵嬪父韪╃殑鍧戯紙琛€娉暀璁級

  1. 鈥?strong>鈥嬪繕璁版縺娲荤敓鎴愬櫒鈥?/strong>鈥嬶細鐩存帴璋冪敤gen.send()浼氭姤閿欙紝璁板緱鍏堢敤next(gen)婵€娲?/li>
  2. 鈥?strong>鈥嬮噸澶嶄娇鐢ㄧ敓鎴愬櫒鈥?/strong>鈥嬶細鐢熸垚鍣ㄧ敤瀹屼竴娆″氨绌轰簡锛屽氨鍍忓枬瀹岀殑鍙箰缃?/li>
  3. 鈥?strong>鈥嬫互鐢ㄧ敓鎴愬櫒琛ㄨ揪寮忊€?/strong>鈥嬶細绠€鍗曞満鏅敤(x for x in data)锛屽鏉傞€昏緫杩樻槸鑰佽€佸疄瀹炲啓鍑芥暟

涓汉瑙傜偣鏃堕棿

鐢ㄤ簡杩欎箞澶氬勾Python锛屾垜鍙戠幇鐢熸垚鍣ㄥ氨鍍忔櫤鑳界數楗叢鈥斺€斿緢澶氫汉鍙細鐢ㄧ叜楗姛鑳斤紝鍏跺疄瀹冭繕鑳界叢姹ゃ€佸仛铔嬬硶銆傗€?strong>鈥嬪崈涓囧埆鎶婄敓鎴愬櫒灞€闄愬湪鍐呭瓨浼樺寲杩欎竴涓敤閫斾笂鈥?/strong>鈥嬶紝瀹冨湪寮傛缂栫▼銆佺姸鎬佹満瀹炵幇绛夋柟闈㈤兘鏄殣钘忛珮鎵嬨€?/p>

鏈€杩戝府涓€涓仛閲戣瀺鏁版嵁鍒嗘瀽鐨勫洟闃熶紭鍖栦唬鐮侊紝鐢ㄧ敓鎴愬櫒閰嶅悎绠¢亾妯″紡锛屾妸鍘熸湰瑕佽窇2灏忔椂鐨勪换鍔″帇缂╁埌15鍒嗛挓銆傝€佹澘杩樹互涓烘垜鍋峰伔鍗囩骇浜嗘湇鍔″櫒纭欢鍛紒锛堢瑧锛?/p>


鈥?strong>鈥嬫渶鍚庤鍙ュぇ瀹炶瘽鈥?/strong>鈥嬶細鐢熸垚鍣ㄧ殑姒傚康鐪嬪崄閬嶆暀绋嬩笉濡傚姩鎵嬪啓涓€娆°€傚缓璁綘鐜板湪灏辨墦寮€PyCharm锛屾妸鏂囦腑鐨勪緥瀛愰兘鏁蹭竴閬嶃€傞亣鍒版姤閿欏埆鎱岋紝璁颁綇缂栫▼鐣岀湡鐞嗏€斺€旇绠楁満姘歌繙涓嶄細閿欙紝鍙槸浣犺繕娌℃噦瀹冩兂璇翠粈涔堬紒

本文由嘻道妙招独家原创,未经允许,严禁转载