以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)))

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