【发布时间】:2019-08-27 17:27:32
【问题描述】:
我尝试用here 描述的函数解决一个中文难题(这是最后一个练习)。我的代码包含问题的描述,所以你可以看看。无论如何,我发现,当我使用两个生成器进行双重迭代时,第二个 for 循环会耗尽第二个生成器,我无法通过删除它并重置它来重新启动它,因为生成器的基本特性。如果不将生成器在迭代中进一步推动,然后通过执行以下操作将其重置为之前的位置,则无法检查生成器是否已耗尽:
generator1 = (bla1 for bla1 in Bla1)
generator2 = (bla2 for bla2 in Bla2)
for bla1 in generator1:
for bla2 in generator2:
if next(generator) == StopIteration:
generator2 = (bla2 for bla2 in Bla2)
我知道,我必须通过再次创建生成器来重新初始化它,但看起来我无法将生成器放入变量中并成功进行两次迭代。生成器显然必须在“for i in...”行中指定,以便在每次进入循环时动态创建。我的问题是,我想在一行上创建一个生成器,将它放在一个变量中,然后随意重置它,这样我就可以进行双重迭代,因为我使用的一些生成器很长。
'''
Question:
Write a program to solve a classic ancient Chinese puzzle:
We count 35 heads and 94 legs among the chickens and rabbits in a farm.
How many rabbits and how many chickens do we have?
Strategy: Double iteration. Keep the number of one animal constant and
add more of the other until you either hit 94 legs or overshoot.
'''
def Chinese_puzzle(heads,legs):
if legs%2 != 0:
return 'There are no crippled animals on this farm.'
for rabbits, r_legs in enumerate((leg*4 for leg in range(round(legs/4)))):
for chickens, c_legs in enumerate((leg*2 for leg in range(round(legs/2)))):
leggs = r_legs+c_legs
hedds = rabbits+chickens
if leggs == legs and hedds == heads:
return {'Chickens':chickens,'Rabbits':rabbits}
elif leggs > legs or hedds > heads:
break
return 'No permutation of rabbits and chickens exists for this number of legs and heads'
print(Chinese_puzzle(35,94))
我能否以某种方式摆脱我的 for 循环中的这些巨大的生成器以提高可读性?
enumerate((leg*4 for leg in range(round(legs/4))))
正如我所说,做
Rabbits = enumerate((leg*4 for leg in range(round(legs/4))))
不适用于双重迭代。
【问题讨论】:
-
这实际上并不能回答您的问题,但是您的双重迭代是解决此问题的效率极低的解决方案。如果你遍历一种动物的可能数量,那么只有两种数量的另一种动物是甚至可以想象的解决方案:一种是正确的头数,另一种是正确的腿数。如果这两个数字相同且有效(不是负数),那么这就是您的解决方案,根本不需要内部循环。
-
是的,我知道这是一个蛮力解决方案:D 并没有考虑太多,因为我是出于无聊才这样做的。不过在此过程中遇到了一个意想不到的问题。
-
"
if next(generator) == StopIteration好吧,这并不像您期望的那样工作。next没有返回StopIteration,它引发 它,所以你必须使用异常处理,但这种方法一开始就很糟糕,因为在循环中使用next至少可以说是有问题的。你真的想要做的是:“我能否以某种方式摆脱我的 for 循环中的这些巨大的生成器以提高可读性?”。好吧,在这种情况下,使用函数这几乎总是“如何能我让我的代码更有条理和可读性”。
标签: python python-3.x loops generator