使用Python

时间:2017-10-19 22:59:54

标签: python python-3.x

从我的角度来看,我遇到了一些奇怪的事情

我需要像这样生成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)

3 个答案:

答案 0 :(得分:5)

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

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

另请注意,如果range为零,则可省略socket.gethostbyname(socket.gethostname()) 的下限。

答案 1 :(得分:5)

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

重复一遍:

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

答案 2 :(得分:0)

我建议使用这样的简化实现,因为它更容易理解,而原始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