1. 程式人生 > >python學習第一天---生成器表示式

python學習第一天---生成器表示式

複習:

  迭代器和生成器

  迭代器:

    魔法方法__iter__()很少直接呼叫的方法,一般情況下是通過其他方法觸發的

    可迭代的 -- 可迭代協議  含有__iter__的方法 __iter__ in dir(obj)

    迭代器協議: 含有__iter__ __next__方法

    迭代器一定可迭代,可迭代的通過呼叫__iter__方法就能得到一個迭代器

    迭代器特點:

      很方便使用,一個迭代器只能取所有的資料一次

      節省記憶體空間

  生成器(本質是迭代器):

    生成器的表現形式:

      生成器函式

        含有yield關鍵字的函式就是生成器函式

        特點:

          呼叫函式的時候函式不執行,返回一個生成器

          呼叫__next__()方法的時候會取到一個值

          知道取到最後一個之後,會丟擲錯誤

def wahaha():
    for i in range(20):
        yield 'wahaha%s' % i

g = wahaha()
list(g) # 資料型別的強制轉化(佔記憶體) g.
__next__() # 每次執行就是從生成器中取值,預示著生成器函式中的程式碼繼續執行
count = 0 for i in g: num += 1 if num > 50: break print(i)

        生成器中取值的幾個方法:

          next

          for

          資料型別的強制轉化 

     生成器函式進階

      

def generator():
    print(123)
    yield 1
    print(456)
    yield 2
    print(789)  # 沒有yield函式會繼續執行,最後丟擲錯誤

g = generator()
ret 
= g.__next__() print(ret)
ret = g.send(None) # send的效果和next一樣 ret
= g.__next__() print(ret) ret = g.__next__() print(ret)

def generator():
    print(123)
    content = yield 1
    print('====',content)
    print(456)
    yield 2
    print(789)  # 沒有yield函式會繼續執行,最後丟擲錯誤

g = generator()
ret = g.__next__()
print(ret)
ret = g.send(‘hello’)  # send的效果和next一樣
ret = g.__next__()  
print(ret)
ret = g.__next__()
print(ret)

# send的獲取下一個值的效果和next基本一致,
# 在獲取的下一個值得時候,給上一值的位置傳遞一個數據

    send的注意事項:

      第一次使用生成器的時候,是用的next獲取第一個yield的值

      最後一個yield不能接受外部的值,