第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開(kāi)發(fā)者教程

Python 進(jìn)階應(yīng)用教程

Python 進(jìn)階應(yīng)用教程
01 Python 的對(duì)象和類 02 Python 類屬性和實(shí)例屬性 03 Python類的構(gòu)造方法、析構(gòu)方法、實(shí)例方法 04 Python 類的私有屬性和私有方法 05 Python 類的繼承和多繼承 06 Python 類實(shí)戰(zhàn) 07 Python 中的迭代器實(shí)現(xiàn)原理 08 Python 中的迭代器趣味實(shí)踐 09 Python 中的生成器實(shí)現(xiàn)原理 10 Python 中的生成器趣味實(shí)踐 11 Python 中的錯(cuò)誤和異常 12 Python 中的異常處理 13 Python 中的模塊 14 Python 標(biāo)準(zhǔn)庫(kù)之 os 模塊 15 Python 標(biāo)準(zhǔn)庫(kù)之 sys 模塊 16 Python 標(biāo)準(zhǔn)庫(kù)之 math 模塊 17 Python 標(biāo)準(zhǔn)庫(kù)之 random 模塊 18 Python 標(biāo)準(zhǔn)庫(kù)之 Json 模塊 19 Python 標(biāo)準(zhǔn)庫(kù) datetime 模塊 20 Python 中的常用第三方模塊 21 Python 中的命名空間 22 Python 中的作用域 23 Python 中的文件 IO 操作 24 Python 基礎(chǔ)實(shí)戰(zhàn) 25 Python 內(nèi)置函數(shù) 26 Python 中使用正則表達(dá)式 27 使用 Python 操作 MySQL 數(shù)據(jù)庫(kù) 28 使用 Python 操作 Mongo 數(shù)據(jù)庫(kù) 29 使用 Python 操作 Redis 數(shù)據(jù)庫(kù) 30 使用 Python 發(fā)送一封郵件 31 threading 之 Thread 的使用 32 threading 之 Lock 的基本使用 33 Python 生產(chǎn)者消費(fèi)者模型 34 Python 的內(nèi)存管理與垃圾回收 35 Python 領(lǐng)域運(yùn)用:網(wǎng)絡(luò)爬蟲(chóng) 36 Python 領(lǐng)域運(yùn)用:Web 開(kāi)發(fā) 37 Python 領(lǐng)域運(yùn)用:自動(dòng)化運(yùn)維 38 Python 領(lǐng)域運(yùn)用:自動(dòng)化測(cè)試

Python 中的生成器趣味實(shí)踐

1. 遍歷文本文件中的單詞

假設(shè)存在文本文件 test.txt,內(nèi)容如下:

The Zen of Python

Beautiful is better than ugly

Simple is better than complex

注意文件包含有空行,要求完成如下任務(wù):

  1. 統(tǒng)計(jì)文件有多少個(gè)單詞
  2. 統(tǒng)計(jì)文件中每個(gè)單詞出現(xiàn)的頻率

2. 直接遍歷的方法

請(qǐng)參考詞條 “Python 中的迭代器趣味實(shí)踐” 的第 2 小節(jié),通過(guò)直接遍歷文件中單詞的方式實(shí)現(xiàn) “統(tǒng)計(jì)單詞的個(gè)數(shù)” 和 “統(tǒng)計(jì)單詞的出現(xiàn)頻率”。

2.1 優(yōu)點(diǎn)

直接遍歷的方式的優(yōu)點(diǎn)在于代碼簡(jiǎn)單,框架代碼如下:

file = open('test.txt')

while True:
    line = file.readline()
    if not line:
        break

    words = line.split() 
    for word in words:
        處理 word
  • 在第 4 行,讀取文件的每一行
  • 在第 8 行,將文件的一行分割為多個(gè)單詞
  • 在第 10 行,對(duì)當(dāng)前正在遍歷的單詞進(jìn)行處理

2.2 缺點(diǎn)

直接遍歷的方式的缺點(diǎn)在于代碼重復(fù),實(shí)現(xiàn) “統(tǒng)計(jì)單詞個(gè)數(shù)” 和 “統(tǒng)計(jì)單詞出現(xiàn)頻率” 這兩個(gè)功能需求時(shí),遍歷單詞的框架代碼是重復(fù)的。

3. 基于迭代器的方法

請(qǐng)參考詞條 “Python 中的迭代器趣味實(shí)踐” 的第 3 小節(jié)和第 4 小節(jié),通過(guò)基于迭代器的方式實(shí)現(xiàn) “統(tǒng)計(jì)單詞的個(gè)數(shù)” 和 “統(tǒng)計(jì)單詞的出現(xiàn)頻率”。

3.1 優(yōu)點(diǎn)

使用迭代器的方式的優(yōu)點(diǎn)在于遍歷單詞的代碼簡(jiǎn)單,使用如下代碼:

for word in IterateWord(file):
    處理 word

即可對(duì)文件中所有的單詞進(jìn)行遍歷。

3.2 缺點(diǎn)

使用迭代器的方式的缺點(diǎn)在于迭代器的實(shí)現(xiàn)較為復(fù)雜,相比之下,直接遍歷的框架代碼則非常簡(jiǎn)單直觀。在下面的小節(jié)中,我們基于生成器簡(jiǎn)化迭代器的實(shí)現(xiàn)。

4. 基于生成器的方法

4.1 實(shí)現(xiàn)生成器

本小節(jié)使用生成器實(shí)現(xiàn)遍歷文件中所有的單詞,代碼如下:

def generateWord(file):
    while True:
        line = file.readline()
        if not line:
            break

        words = line.split() 
        for word in words:
            yield word         
  • 在第 1 行,定義生成器函數(shù) generateWord,遍歷文件 file 中的單詞
  • 在第 3 行,讀取文件的一行
    • 在第 4 行,如果 not line 為真,則表示讀取文件結(jié)束,使用 break 退出
  • 在第 7 行,把 line 切割為多個(gè)單詞
  • 在第 8 行,遍歷列表 words
    • 在第 9 行,使用 yield 關(guān)鍵字返回當(dāng)前正在遍歷的單詞

4.2 統(tǒng)計(jì)單詞的個(gè)數(shù)

file = open('test.txt')

count = 0
for word in generateWord(file):
    print(word)
    count = count + 1
  • 在第 1 行,打開(kāi)文件 test.txt
  • 在第 2 行,變量 count 用于記錄文件中單詞的個(gè)數(shù)
  • 在第 4 行,遍歷文件中的每一個(gè)單詞
    • 在第 5 行,打印當(dāng)前遍歷的單詞
    • 在第 6 行,統(tǒng)計(jì)單詞個(gè)數(shù)

程序運(yùn)行輸出結(jié)果如下:

The
Zen
of
Python
Beautiful
is
better
than
ugly
Simple
is
better
than
complex
count = 14

4.3 統(tǒng)計(jì)單詞的出現(xiàn)頻率

file = open('test.txt')
dict = {}

for word in generateWord(file):
    if word in dict:
        dict[word] += 1
    else:
        dict[word] = 1

for word,count in dict.items():
    print('%s: %d' % (word, count)) 
  • 在第 1 行,打開(kāi)文件 test.txt,變量 file 標(biāo)識(shí)已經(jīng)打開(kāi)的文件
  • 在第 4 行,遍歷每一行文本的單詞
    • 在第 5 行,如果 word 已經(jīng)存在于 dict 中
      • 則在第 5 行,該單詞出現(xiàn)的次數(shù)加 1
    • 在第 7 行,如果 word 不存在于 dict 中
      • 則在第 8 行,該單詞出現(xiàn)的次數(shù)初始化為 1
  • 在第 10 行,打印 dict 的鍵和值

程序運(yùn)行輸出結(jié)果如下:

The: 1
Zen: 1
of: 1
Python: 1
Beautiful: 1
is: 2
better: 2
than: 2
ugly: 1
Simple: 1
complex: 1

結(jié)果表明:

  • 單詞 is better than 出現(xiàn)了 2 次
  • 其它單詞出現(xiàn)了 1 次

4.4 總結(jié)

與 “直接遍歷” 和 “通過(guò)迭代器遍歷” 這兩種方式相比,基于生成器的方法由如下優(yōu)點(diǎn):

4.4.1 實(shí)現(xiàn)生成器簡(jiǎn)單

實(shí)現(xiàn)生成器的函數(shù) generateWord 的邏輯簡(jiǎn)單直觀,代碼如下:

def generateWord(file):
    while True:
        line = file.readline()
        if not line:
            break

        words = line.split() 
        for word in words:
            yield word         
  • 首先,函數(shù)依次讀取文件的每一行
  • 然后,再把讀取的行切割成單詞
  • 最后,遍歷單詞

4.4.2 使用生成器簡(jiǎn)單

通過(guò) for 循環(huán)即可遍歷文件中的單詞,generateWord 隱藏了各種實(shí)現(xiàn)細(xì)節(jié),代碼如下:

for word in generateWord(file):
    處理 word