【问题标题】:Missing print task when generator is invoked调用生成器时缺少打印任务
【发布时间】:2017-09-22 03:25:53
【问题描述】:

我编写了以下代码来为三种不同的高度生成类似帕斯卡三角形的图案。每次都使用不同的字符来获取模式。我可以得到带有“*”和“&”的那些,但是第二次使用“=”打印的调用永远不会被调用。因此,屏幕上缺少相应的图案。尝试通过在三个调用之间交错 input() 语句进行调试,但无济于事。请帮忙。

def draw_triangle(pattern_values):

    def draw(ht, ch):
        for i in range(1, ht+1):
            print('{txt:^{wid}}'.format(txt=i*(ch+' '),wid=2*ht))

    draw(pattern_values[0], pattern_values[1])
    yield pattern_values

    while True:
        pattern_values = yield pattern_values
        draw(pattern_values[0], pattern_values[1])

pattern_series = draw_triangle([10, '*'])
next(pattern_series)
pattern_series.send([12, '=']) # This does not produce any output
pattern_series.send([14, '&'])

【问题讨论】:

  • 您应该知道 yield 的作用类似于 return。除了一件事:它返回生成器而不是结果。所以你的第一次收益之后的代码永远不会运行
  • 没有。那么,我不应该得到一个印有“&”的三角形。但是,除了带有“*”的开头之外,我确实得到了这个。要无限生成一系列奇数,您可以使用 next 语句,然后使用 send。生成器将有一个简单的产量,然后是一个无限循环内的产量(当 True)来完成此操作。

标签: generator python-3.6 pascals-triangle


【解决方案1】:

所以你可以只使用这个函数作为没有初始值的生成器。

def draw_triangle(pattern_values=""):

    def draw(ht, ch):
        for i in range(1, ht+1):
            print('{txt:^{wid}}'.format(txt=i*(ch+' '),wid=2*ht))

    while True:
        pattern_values = yield pattern_values
        draw(pattern_values[0], pattern_values[1])

pattern_series = draw_triangle()
next(pattern_series)
pattern_series.send([10, '*'])
pattern_series.send([12, '=']) # This does not produce any output
pattern_series.send([14, '&'])

【讨论】:

  • 是的,它会产生所需的输出。但是,我可以知道 next(pattern_series) 和相应的 yield 语句会发生什么吗?为什么我没有得到与此相对应的 print() 语句的输出?
  • @SeshadriR, This 很好地解释了这种行为。
猜你喜欢
  • 2017-02-23
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多