我可以打破python生成器吗?

时间:2017-10-12 21:09:52

标签: python

考虑以下字符串

long_string = '#' * 4 + 'a' * 10 + '#' * 4

print(long_string)

####aaaaaaaaaa####

我想循环浏览并获得前几个字符,直到该字符 a '#'

我可以迭代并获得'#'

''.join(x for x in long_string if x.startswith('#'))

'########'

这太多了。

我想做这样的事情

def gen_break(long_string, mychar):
    i = iter(long_string)
    s = next(i)
    while s == mychar:
        yield s
        s = next(i)

''.join(gen_break(long_string, '#'))

'####'

当遇到要破坏的条件时,这会停止迭代。有没有办法在(this for this in that)语法中更优雅地执行此操作?

注意:
这是一个人为的例子,以突出我提出的问题。我没有找到解析这个示例字符串的方法。我正在寻找一种以优雅的方式突破迭代的方法,最好使用理解语法。

1 个答案:

答案 0 :(得分:5)

您可以使用a plugin功能:

from itertools import takewhile

''.join(takewhile(lambda x:x == '#','#### foo bar ### qux'))

然后生成:

>>> ''.join(takewhile(lambda x:x == '#','#### foo bar ### qux'))
'####'

因此只要满足takewhile的谓词(第一个参数),它就会迭代迭代(第二个参数)。从谓词不满意的那一刻起,takewhile就会停止。它不会耗尽可迭代/迭代器的剩余部分。

据我所知,你不能用list comprehension / generator / ...语法来做到这一点。