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
(缓冲液)的变量将保持从序列中的下一字母。 next_letters
函数将检查其中是否有足够的字母并根据需要进行扩展,然后返回其第一个字母并“删除”它们。
让我们来看看它是如何工作的一个 “调试版本”:
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
如果你真的想学习,然后第一次尝试自己的东西。 –
有很多关于SO的提示,例如,请看[Python中的星号pyramid Pyramid](http://stackoverflow.com/q/4911341)。 –
谢谢,我实际上在发布之前阅读过。我真正的问题是如何在那里获得破折号。如果我所要做的只是带有正确字母的线条,我可以轻松地做到这一点,但我也需要用金字塔正确对齐金字塔。 – JackD