从我的角度来看,我遇到了一些奇怪的事情
我需要像这样生成True
和False
个值:
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)
答案 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