从我的角度来看,我经历了一些奇怪的事情
我需要生成替代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)
在第一个代码片段中,您应该只在for-loop 外调用生成器一次,然后使用next调用来获取连续的yielded值:
g = generateFalseTrueRangesAlternatively(20)
for i in range(4):
print(next(g))
Run Code Online (Sandbox Code Playgroud)
另请注意,range如果它为零,则可以省略下限.
你的代码很好; 发电机的使用是错误的.
只需迭代它:
for i in generateFalseTrueRangesAlternatively(20):
print(i)
Run Code Online (Sandbox Code Playgroud)