1. 程式人生 > >day 12、13、14 :summary、homework、面試題

day 12、13、14 :summary、homework、面試題

一、summary 總結

迭代器:
    可迭代協議 —— 含有iter方法的都是可迭代的
    迭代器協議 —— 含有next和iter的都是迭代器
    特點
        1、節省記憶體空間
        2、方便逐個取值,一個迭代器只能取一次。
生成器 —— 迭代器
    生成器函式:含有yield關鍵字的函式都是生成器函式
        生成器函式的特點:
            1、呼叫之後函式內的程式碼不執行,返回生成器
            2、每從生成器中取一個值就會執行一段程式碼,遇見yield就停止。
            3、如何從生成器中取值:
                for :如果沒有break會一直取直到取完 (不能啟用生成器)
next :每次只取一個 (能啟用生成器) send :不能用在第一個,取下一個值的時候給上個位置傳一個新的值(不能啟用生成器) 資料型別強制轉換 :會一次性把所有資料都讀到記憶體裡(能啟用生成器) 生成器表示式: (條件成立想放在生成器中的值 for i in 可迭代的 if 條件)

二、homework

3.處理檔案,使用者指定要查詢的檔案和內容,將檔案中包含要查詢內容的每一行都輸出到螢幕
def check_file(fliename,aim):
    with open(fliename,'r',encoding='utf-8') as f:
        for i in f:
            if aim in i:
                yield i

g = check_file('1.複習.py','生成器')
for i in g:
    print(i.strip())
4.寫生成器,從檔案中讀取內容,在每一次讀取到的內容之前加上‘***’之後再返回給使用者。
def check_file(filename):
    with open(filename,encoding='utf-8') as f:   #控制代碼 : handler,檔案操作符,檔案控制代碼
        for i in f:
            yield '***'+i

for i in check_file('1.複習.py'):
    print(i.strip())

三、面試題

栗子:讀程式,寫輸出:

def demo():
    for i in range(4):
        yield i

g=demo()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g))
print(list(g1))
print(list(g2))




輸出:
[0, 1, 2, 3]
[]
[]

同一個生成器的取值是:下一次取值的位置是接著上一次取值的位置

栗子:讀程式,寫輸出:

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)

print(list(g))

看到for巢狀生成器時,就把for的情況寫出來

這個程式在執行到print(list(g))之前,生成器都沒有啟用。只有執行到print(list(g))時,才會返回上一步n=10時,尋找g

for n in [1,10]:
    g=(add(n,i) for i in g)
print(list(g))

就可以寫成:

n = 1
g=(add(n,i) for i in g)
n = 10
g=(add(n,i) for i in (add(n,i) for i in g))
print(list(g))
n = 10
g=(add(10,i) for i in (add(10,[0,1,2,3]) )
n = 10
g=(add(10,i) for i in [10,11,12,13] )
n = 10
g=([20, 21, 22, 23] )

改編題:

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10,5]:
    g=(add(n,i) for i in g)

print(list(g))




[15, 16, 17, 18]

n = 1
g=(add(n,i) for i in test())
n = 10
g=(add(n,i) for i in (add(n,i) for i in test()))
n = 5
g=(add(5,i) for i in (add(5,i) for i in (add(5,i) for i in [0,1,2,3])))
 =(15,16,17,18)