无法使用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
(本质上是一个无操作)。