可以简化环路很多:
def next_code(code):
code = list(code)
for i, let in enumerate(code):
if let != 'z':
code[i] = chr(ord(let) + 1)
break
code[i] = 'a'
return ''.join(code)
如果目标是刚刚产生的所有值一个接一个,从'aaa',itertools.product可用于制作发电机:
from future_builtins import map # Only on Python 2
from itertools import product
def allcodes():
# You want the left side to vary faster, so reverse before joining
return map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3)))
for code in allcodes():
print(code)
或者您可以根据需要调用该函数以获取序列中的下一个代码,而不必将其用作迭代器:
nextcode = allcodes().__next__ # .next on Py2
如果发电机应为无穷大(所以从zzz换到aaa),只是改变allcodes要么:
# Avoid cycle if storing all 26**3 codes in memory is a bad idea
def allcodes():
while True:
yield from map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3)))
# On Py2, change yield from line to:
# for code in map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3))): yield code
或更高的存储成本,而且更简单:
from itertools import cycle
def allcodes():
return cycle(map(''.join, map(reversed, product(string.ascii_lowercase, repeat=3))))