from itertools import cycle, islice
letters = "abcdefghijklmnopqrstuvwxyz"
height = 6
width = height*2-1
it = cycle(letters)
for count in range(1, width+1, 2):
print(''.join(islice(it, count)).center(width, '-'))
此解决方案使用itertools模块。
该cycle
函数创建了一个迭代器,它无限地重复我们的字母序列,并islice
用于count
每次从中获取下一个字母(因为它们被逐个字符地吐出,我们用 将它们变成一个字符串)。所以我们有下一行,但没有破折号。剩下的很简单:就是它。''.join(...)
center
另一个非常相似的解决方案,只是没有itertools:
letters = "abcdefghijklmnopqrstuvwxyz"
height = 6
width = height*2-1
buf = ""
def next_letters(n):
global buf, letters
while len(buf)<n:
buf += letters
ret, buf = buf[:n], buf[n:]
return ret
for count in range(1, width+1, 2):
print(next_letters(count).center(width, '-'))
( buf
buffer) 变量将保存序列中的下一个字母。该next_letters
函数将检查其中是否有足够的字母并根据需要对其进行扩展,然后返回其第一个n
字母并“删除”它们。
让我们看看它如何与“调试版本”一起工作:
letters = "abcdefghijklmnopqrstuvwxyz"
height = 6
width = height*2-1
buf = ""
def next_letters(n):
global buf, letters
print("Requested {} letters. Buffer is '{}'".format(n, buf))
while len(buf)<n:
buf += letters
print("Buffer was extended to '{}'".format(buf))
ret, buf = buf[:n], buf[n:]
print("Returned '{}'; buffer is now '{}'".format(ret, buf))
return ret
for count in range(1, width+1, 2):
print(next_letters(count).center(width, '-'))
要求 1 封信。缓冲区是 ''
缓冲区被扩展为 'abcdefghijklmnopqrstuvwxyz'
返回 'a'; 缓冲区现在是 'bcdefghijklmnopqrstuvwxyz'
-----a-----
请求 3 个字母。缓冲区是 'bcdefghijklmnopqrstuvwxyz'
返回 'bcd'; 缓冲区现在是 'efghijklmnopqrstuvwxyz'
----bcd----
请求 5 个字母。缓冲区是 'efghijklmnopqrstuvwxyz'
返回 'efghi';缓冲区现在是 'jklmnopqrstuvwxyz'
---efghi---
请求 7 个字母。缓冲区是 'jklmnopqrstuvwxyz'
返回 'jklmnop'; 缓冲区现在是 'qrstuvwxyz'
--jklmnop--
请求 9 个字母。缓冲区是'qrstuvwxyz'
返回'qrstuvwxy';缓冲区现在是“z”
-qrstuvwxy-
请求了 11 封信。缓冲区为 'z'
缓冲区已扩展为 'zabcdefghijklmnopqrstuvwxyz'
返回 'zabcdefghij'; 缓冲区现在是 'klmnopqrstuvwxyz'
zabcdefghij