空的

时间:2018-01-26 23:56:53

标签: python generator iterable

我有一个相当基本的代码来测试生成器函数和生成器表达式。它就像一个魅力,但我无法弄清楚如何让生成器表达式genPairs在达到最终值时停止打印。我尝试使用for i in range (0, xyz)使xyz成为许多不同的len()调用,但是当我尝试使用生成器表达式的大小时,我发现了一个错误。为了节省您的时间,我的问题是关于python代码的最后3行。

代码:

import re
def genLetters(string):

    for letter in string:
        yield letter


letterTable = {}
print("Input your string")
regex = re.compile('[^a-zA-Z]')
inStr = input()
newString = regex.sub("",inStr).lower()
test = genLetters(newString)

for i in range(0,len(newString)):
    temp = next(test)
    if temp  not in letterTable:
        letterTable[temp] = 1
    else:
        letterTable[temp] +=1


letterTable = iter(sorted(letterTable.items()))

genPairs = (item for item in letterTable)
while genPairs:
    print(next(genPairs))

输出:

    Input your string
porkpork
('k', 2)
('o', 2)
('p', 2)
('r', 2)
Traceback (most recent call last):
  File "hw2-1.py", line 27, in <module>
    print(next(genPairs))
StopIteration

如果不打印traceback...stop iteration废话,我该怎么办? 有没有办法限制

2 个答案:

答案 0 :(得分:2)

for循环将耗尽生成器并为您捕获StopIteration

for element in genPairs:
    print(element)

使用代码while genPairs没有意义,因为生成器表达式本身将始终是真实的。

答案 1 :(得分:0)

似乎有大量不必要的代码和生成器不会产生任何好处。我已经为你清理过了。

此解决方案不再需要迭代生成器,并包含collections.Counter来为您执行计数。

else {
    JScrollBar horizBar = scroller2.getHorizontalScrollBar();
    DefaultBoundedRangeModel currentModel = (DefaultBoundedRangeModel) horizBar.getModel();
    int extent = currentModel.getExtent();
    int min = currentModel.getMin();
    int max = currentModel.getMax();
    int value = currentModel.getValue();

    DefaultBoundedRangeModel newModel = new DefaultBoundedRangeModel(value, extent, min, max);
    horizBar.setModel(newModel);
}