【问题标题】:How to stop a generator once target is matched?一旦目标匹配,如何停止生成器?
【发布时间】:2021-01-18 21:50:12
【问题描述】:

尝试创建一个生成器,该生成器在指定范围内生成一组随机数字,然后在生成指定目标数字后停止。将打印达到该数字的尝试次数。如果在指定的尝试次数内未生成该数字,则用户将获得单独的提示。到目前为止,这是我所拥有的:

try:
    min_value = int(input("Enter the minimum value for your random generator: "))
    max_value = int(input("Enter the maximum value for your random generator: "))
    target = int(input("Enter the target value you are trying to find: "))
    max_attempts = int(input("Enter the maximum number of attempts to find the target before stopping generation: "))
except ValueError:
    print("Please enter an integer value for your input!")

def find_target(target: int, min_value: int, max_value: int, max_attempts: int) -> Optional[int]:
    # Start counter for number of attempts
    j = 0
    while j in range(max_attempts):
        #Increment the attempts counter
        j += 1
        for k in range(min_value, max_value):
            if not target:
                yield k

gen = find_target(target, min_value, max_value, max_attempts)

while True:
    print(next(gen))

一旦找到目标,理想情况下会发生这样的事情:

# Stop the generator
print("Target acquired! It only took ", j, "tries to find the target!")
gen.close()

if find_target(target, min_value, max_value, max_attempts) is None:
    print("Could not find target within the max number of attempts. Maybe better luck next time?")

现在生成器立即停止(我猜它与if not target 的指定方式有关)。我怎样才能得到这个工作的逻辑?

【问题讨论】:

  • 不是所要求的,但我在发布的代码中看不到任何随机内容。 range 是一个序列生成器(如果有的话)。

标签: python random generator


【解决方案1】:

如果你想返回目标,你只需在 if 语句后面加上 yield。

import random

def gen(low, high, attempts, target):
    for j in range(1, attempts+1):
        guess = random.randint(low, high)
        yield guess
        if guess == target:
            print()
            print("Target acquired! It only took ", j, "tries to find the target!")
            break
    else:
        print()
        print("Could not find target within the max number of attempts. Maybe better luck next time?")

low, high = 0, 10
attempts = 10
target = 5

for el in gen(low, high, attempts, target):
    print(el, end=' ')

输出:

7 0 0 3 3 5 
Target acquired! It only took  6 tries to find the target!

#or

4 2 0 6 1 4 3 6 1 6 
Could not find target within the max number of attempts. Maybe better luck next time?

【讨论】:

  • 我能够修复错误,但现在它会在每个生成的值之后打印Could not find target 消息。我怎样才能让它只在最后打印?这些数字在控制台中垂直打印,而不是在代码中水平打印
  • D'oh 我的 else 缩进不正确,让它工作,非常感谢你的帮助!
猜你喜欢
  • 2018-07-06
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多