以flatten()函數爲例講解生成器



若有幫助到你,記得點贊哦!

# -*- coding: utf-8 -*-
"""
Created on Fri Mar 30 20:53:08 2018

@author: Lelouch_C.C
"""

"""
任何包含yield語句的函數稱爲生成器。
yield語句不像return那樣返回值,而是每次產生多個值;
每次產生一個值時,函數就會被凍結,即函數停在那個點等待被重新喚醒。
"""

"""
nested=[[1,2],[3,4],[5]]

#簡單生成器(只處理兩層嵌套)
def flatten(nested):
    for sublist in nested:
        for element in sublist:
            yield element
print(list(flatten(nested)))
#輸出:[1, 2, 3, 4, 5]
#"""

"""
nested=[[[1],2],3,4,[5,[6,7]],8]

#遞歸生成器(處理任意層嵌套)
def flatten(nested):
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested
        #上述每次遞歸的盡頭都是一個整形數字,賦給nested,
        #由於整形數字不可以迭代,會進行報錯,而我們令報錯會輸出yield nested
        #也就正好把每個數字進行輸出,這說的已經不能再細了。
print(list(flatten(nested)))
#輸出:[1, 2, 3, 4, 5, 6, 7, 8]
#"""
nested=['foo',['bar',['baz']]]
#遞歸生成器(處理任意層嵌套且可以處理字符串)
def flatten(nested):
    try:
        ###########判斷是否是字符串,若是字符串,報錯############
        try:nested+''
        except TypeError:pass
        else:raise TypeError
        #######################################################
        for sublist in nested:
            for element in flatten(sublist):     #遞歸recursion很巧很神奇
                yield element
    except TypeError:
        yield nested      
        #上述每次遞歸的盡頭都是一個字符串,賦給nested,經判斷,報錯,而我們令報錯會輸出yield nested
        #也就正好把每個字符串進行輸出,這說的已經不能再細了。
print(list(flatten(nested)))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章