用生成器模拟输入

mocking input with a generator

以下代码不模拟输入,有没有办法用生成器来模拟输入?

    inputlist = [5,1,2,3,4,5,6]

    def mock_input(dummy_prompt=">>> "):
        global inputlist
        for u in inputlist:
                yield str(u)

    __builtins__.input = mock_input

    l=[]
    x= input()
    for u in range(int(x)):
        l.append(int(input()))

    if l==inputlist[1:]:
        print("bravo")

错误是 x 是生成器而不是字符串。

我是否必须使用全局变量创建自己的生成器,或者我在语法中遗漏了某些内容。

您正在将生成器分配给 __builtins__.input,而不是使用生成器进行迭代并返回一个值,这就是它不起作用的原因。

相反,使用 iter 创建一个生成器并使用 next(..)

对其进行迭代
inputlist = [6,1,2,3,4,5,6]
gen = iter(inputlist)

def mock_input(dummy_prompt=">>> "):
    return str(next(gen))

__builtins__.input = mock_input

l=[]
x= input()
for u in range(int(x)):
    l.append(int(input()))

if l==inputlist[1:]:
    print("bravo")

PS:我将列表的第一个数字修改为 6 否则你会遗漏一个项目并且 bravo 没有打印

好的,谢谢你,我错过了实例化生成器的那一刻。

def gg(l):
    for u in l:
            yield str(u)


def mockinput(thelist):
    bob = gg(thelist)
    __builtins__.input = lambda prompt="toto":  str(next(bob))


inputlist = [6,1,2,3,4,5,6]
mockinput(inputlist)

l=[]
for u in range(int(input())):
    l.append(int(input()))
    print(l)

if l==inputlist[1:]:
    print("bravo")

所以我需要分两步完成,因为我不需要任何全局变量