无法通过Python产生正确的值

lau*_*hub 1 python python-3.x

从我的角度来看,我经历了一些奇怪的事情

我需要生成替代True和这样的False值:

False, True, False, False, True, True, False, False, False, True, True, True, False, False, False, False, True, True, True, True, ...
Run Code Online (Sandbox Code Playgroud)

我需要得到一个False,一个True,然后两个False,两个True,然后三个False,三个True

在我看来,yield在函数中使用关键字是实现这个目标的好方法:

def generateFalseTrueRangesAlternatively(limit):
    limitForChange = 0
    index = 0
    rv = True
    for i in range(0, limit):
        if index == limitForChange:
            rv = not rv 
            index = 0
            if not rv:
                limitForChange += 1
        index += 1
        yield rv

for i in range(0,4):
    g =  generateFalseTrueRangesAlternatively(20)
    print(next(g))
Run Code Online (Sandbox Code Playgroud)

但我只得到False价值观:

False
False
False
False
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,我编写了以下代码,它生成一个列表:

def generateFalseTrueRangesAlternativelyList(limit):
    limitForChange = 1
    index = 0
    rv = False
    out = []
    for i in range(0, limit):
        if index == limitForChange:
            rv = not rv 
            index = 0
            if not rv:
                limitForChange += 1
        index += 1
        out.append(rv)
    return out
l = generateFalseTrueRangesAlternativelyInList(6)
for i in range (0,6):
    print(l[i])
Run Code Online (Sandbox Code Playgroud)

哪个输出:

False
True
False
False
True
True
Run Code Online (Sandbox Code Playgroud)

问题

我的generateFalseTrueRangesAlternatively功能出了什么问题?

怎么可以修改为行为像generateFalseTrueRangesAlternativelyInList但没有创建列表?

有什么我不明白的yield用法和什么?

实际上,回答这个基本问题需要满足我的好奇心:为什么?

(我的Python版本:3.5.4)

Law*_*iro 5

在第一个代码片段中,您应该只在for-loop 外调用生成器一次,然后使用next调用来获取连续的yielded值:

g = generateFalseTrueRangesAlternatively(20)
for i in range(4):
    print(next(g))
Run Code Online (Sandbox Code Playgroud)

另请注意,range如果它为零,则可以省略下限.


Uri*_*iel 5

你的代码很好; 发电机的使用是错误的.

只需迭代它:

for i in generateFalseTrueRangesAlternatively(20):
    print(i)
Run Code Online (Sandbox Code Playgroud)