我任务的目标是无限期地生成列表元素。 所以我这样做了:
SERVERS = ['APP1', 'APP2', 'APP3']
#SERVERS = ['APP1', 'APP2', 'APP3', 'APP4', 'APP5', 'APP6']
length = len(SERVERS)
def get_server():
current_server = SERVERS.pop(0)
SERVERS.append(current_server)
return current_server
if __name__ == '__main__':
for i in range(9):
print get_server()
解决方案如下:
^{pr2}$两种情况下的输出相同:
codewingx@CodeLair:~/repo/python$ python load_balancer.py
APP1
APP2
APP3
APP1
APP2
APP3
APP1
APP2
APP3
那么,发电机的功能有什么好处呢?在
在这种情况下,列表是它自己的生成器:
如果你想要一个无限的发电机,@MikeMüller的
^{pr2}$itertools.cycle
最好不要重新发明轮子。如果你必须自己动手:但不要这样做,它效率较低,并且需要更多代码读取器的内存。在
使用
itertools.cycle()
生成器在这里没有添加任何有用的内容。我会尽量避免
pop(0)
,因为它每次都会触发整个服务器列表的重建。在我建议itertools.cycle():
输出:
^{pr2}$我们包装在一个函数中以匹配您的用法:
输出:
^{pr2}$编写你自己的生成器函数
为了说明生成器的意义,利用其存储stet的能力的变体可能更有用:
虽然这很好地说明了您使用
index
的状态,但是使用以下方法可以更容易地实现相同的效果:这样可以避免修改
SERVERS
的列表。结果是一样的:输出:
^{pr2}$发电机的工作原理
一个简单的生成器函数:
举个例子:
使用
next
获得yield
返回的下一个值:继续前进:
现在它已经耗尽了:
您可能会想到在生成器函数中移动的光标。每次调用
next()
时,它都会移动到下一个yield
。因此,将yield
放在while True
循环中可以生成一个无限的生成器。只要不调用close()
,它就会给你一个带有yield
的新值。另外,你在生成器中有状态。这意味着您可以在调用next()
之间执行递增计数器之类的操作。在相关问题 更多 >
编程相关推荐