无法使用Python生成正确的值

2024-10-01 17:40:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我需要交替生成TrueFalse值,如下所示:

False, True, False, False, True, True, False, False, False, True, True, True, False, False, False, False, True, True, True, True, ...

我需要得到一个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))

但我只得到False值:

False
False
False
False

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

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])

输出:

False
True
False
False
True
True

问题

我的generateFalseTrueRangesAlternatively函数有什么问题?你知道吗

如果不创建一个列表,它怎么能被修改成generateFalseTrueRangesAlternativelyInList的样子呢?你知道吗

yield用法上有什么我不懂的吗?你知道吗

实际上,我的好奇心需要通过回答这个基本问题来满足:为什么?你知道吗

(我的Python版本:3.5.4)


Tags: 函数infalsetrueforindexifnot
3条回答

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

g = generateFalseTrueRangesAlternatively(20)
for i in range(4):
    print(next(g))

另外请注意,如果range的下限为零,则可以忽略它。你知道吗

我建议使用这样一个简化的实现,因为它更容易理解,而且您原来的generateFalseTrueRangesAlternatively无法生成正确的值:

def alternate_trues_and_falses(limit):
    for i in range(1, limit + 1):
        for j in range(i):
            yield True
        for j in range(i):
            yield False

>>> list(alternate_trues_and_falses(2))
[True, False, True, True, False, False]

>>> for value in alternate_trues_and_falses(2):
...     print(value)
...
True
False
True
True
False
False

你的代码很好;生成器的用法是错误的。你知道吗

迭代一下:

for i in generateFalseTrueRangesAlternatively(20):
    print(i)

相关问题 更多 >

    热门问题