Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用Python生成正确的值_Python_Python 3.x - Fatal编程技术网

无法使用Python生成正确的值

无法使用Python生成正确的值,python,python-3.x,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, ... 我需要得到一个假,一个真,然后两个假,两个真,然后三个假,三个真,等等 在我看来,在函数中使用yield关键字是实现这一点的好方法: def

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

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

False, True, False, False, True, True, False, False, False, True, True, True, False, False, False, False, True, True, True, 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
问题

我的
generateFalseTureRange交互式
函数有什么问题

如何修改它,使其行为类似于
generatefalstruerangesalternativelyinlist
,但不创建列表

yield
用法和什么方面是否有我不了解的地方

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


(我的Python版本:3.5.4)

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

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

另请注意,如果
范围的下限为零,则可以忽略它。

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

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

另请注意,如果
范围的下限为零,则可以忽略该下限。

您的代码没有问题;发电机的使用是错误的

只需迭代即可:

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

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

只需迭代即可:

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

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

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

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

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

旁注:@cᴏʟᴅsᴘᴇᴇᴅ 很遗憾,您删除了您的答案,因为它似乎比我的代码更像Python。谢谢你的建议侧注:@cᴏʟᴅsᴘᴇᴇᴅ 很遗憾,您删除了您的答案,因为它似乎比我的代码更像Python。谢谢你的建议哇,真不敢相信我这么笨!哈哈,谢谢你,哇,真不敢相信我这么笨!哈哈,非常感谢。这是正确的答案,但只比被接受的答案慢一分钟,谢谢!这是正确的答案,但只比公认的答案慢一分钟,谢谢!我会用
range(1,limit+1)
显式跳过
I==0
(本质上是一个无操作)。我会用
range(1,limit+1)
显式跳过
I==0
(本质上是一个无操作)。