如何让我的生成器无限调用函数

问题描述

我是生成器的新手,我正在尝试使下面的代码工作,其中我的生成器应该向我的函数发送一个随机数并检查它是否与目标匹配并返回计数以进行匹配,当我运行时它只是停止迭代的代码,我哪里出错了?

def generator(min_val: int,max_val: int) -> Iterator[int]:
    

    yield random.randint(min_val,max_val)


def find_target(target: int,min_val: int=0,max_val: int=10,max_attempts: int=100):
    
    i=1
    cnt=1

    g =  generator(0,10)
    while i<100:
        a = next(g)
        if g==target:
            return cnt
        else:
            cnt+=1
        i+=1
    if i >=100:
        return None

解决方法

如果你希望你的生成器是无限的,那就写一个无限循环。最简单的可能是:

def generator(min_val: int,max_val: int) -> Iterator[int]:
    while True:
        yield random.randint(min_val,max_val)
,

你似乎有很多问题。

(但从@Blckknght 窃取开始)

import random

def generator(min_val,max_val):
    while True:
        yield random.randint(min_val,max_val)


def find_target(target,min_val=0,max_val=10,max_attempts=100):
    cnt = 0

    g = generator(min_val,max_val)  # pass params onto generator
    for _ in range(max_attempts):    # loop around max_attempts times
        a = next(g)
        if a == target:              # if a result is the target
            cnt += 1                 # increment the count
    return cnt

print(find_target(5))

示例输出:

11
,

要制作无限生成器,您需要有一个无限循环 yielding 值。然而,这并不是您代码的唯一问题 — find_target() 有多个错误(并忽略传递给它的一些参数)。

以下内容也纠正了这些问题,并展示了如何对 find_target() 函数的返回值进行类型提示。

import random
from typing import Iterator,Optional


def generator(min_val: int,max_val)

def find_target(target: int,min_val: int=0,max_val: int=10,max_attempts: int=100) -> Optional[int]:
    g = generator(min_val,max_val)
    for cnt in range(max_attempts):
        if next(g) == target:
            return cnt+1
    else:
        return None


print(find_target(42,100,1000))