Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编写一个程序来打印类似于图中所示的空心菱形图案?_Python_Python 3.x - Fatal编程技术网

Python 如何编写一个程序来打印类似于图中所示的空心菱形图案?

Python 如何编写一个程序来打印类似于图中所示的空心菱形图案?,python,python-3.x,Python,Python 3.x,例如:如果给定的数字是5,则模式应该包含9行9列,如下所示 A B B C C D D E E D D C C B B A A B B C C B B A 如果给定的数字是3,则模式应包含5行和5列,如下所示 A B B C C D D E E D D C C B B A A B B C C B

例如:如果给定的数字是5,则模式应该包含9行9列,如下所示

    A
   B B
  C   C
 D     D
E       E
 D     D
  C   C
   B B
    A
   A
  B B
 C   C
  B B
   A
如果给定的数字是3,则模式应包含5行和5列,如下所示

    A
   B B
  C   C
 D     D
E       E
 D     D
  C   C
   B B
    A
   A
  B B
 C   C
  B B
   A

我们需要考虑2件事。假设给出的数字是30,这意味着字母应该循环并重复。当我们遇到这种情况时,我们需要一个在python中为%的模

另一件事是我们如何使弦居中?在python中,有一个名为center的string方法,它接受一个指定居中字符串长度的整数,还有一个可选参数,该参数设置为空格,这正是我们所需要的

看看你在问题中的钻石,我们可以观察到一种模式。最大长度是第N个奇数,可通过以下公式找到:第N个奇数=N*2-1

这与每行中2个字符之间的空格数相同

我们如何获得角色?我们可以使用chr函数轻松地实现这一点,该函数将ascii字符值转换为实际字符。查看ascii表,大写字母以代码65开头。使用它,我们可以创建用于处理字母表的代码。chrn%26+65

下面是代码:

行=输入':' n=行*2-1字符串居中的长度。 钻石上半部 对于rangerow中的i: 如果i==0:如果是第一次迭代,则只打印1个字符 打印“A”。中心 继续跳过此迭代。基本上跳过后一个代码。 character=chri%26+65用于侧面的字符。 printf{character}{''*2*i-1}{character}.centern打印行本身。如果您不知道,可以将字符串与整数相乘,以使该字符/字符串重复整数次。 钻石的下部。与上面相同,但镜像。 对于范围0中的i,第1行[:-1]: 如果i==0: 打印“A”。中心 持续 字符=chri%26+65 printf{character}{''*2*i-1}{character}.centern
就这些!快乐编码

在垂直方向上,您希望按顺序浏览字母,然后按相反的顺序浏览字母,而不是重复最后一个字母

当L=ABCDE时,这对应于L+L[-2::-1]=ABCDEDCBA

在水平方向上,您是以L[::-1]+L[1:][]=EDCBABCDE的相反方式执行此操作的

通过将列表中的水平和垂直字母相交,可以得到一个包含菱形图案的列表,然后可以逐行打印,而嵌套列表的字符之间没有分隔

L = "ABCDE"

lines  = [[(' ',c)[c==s] for s in L[::-1]+L[1:]] for c in L+L[-2::-1]]
for line in lines:
    print(*line,sep="")


    A    
   B B   
  C   C  
 D     D 
E       E
 D     D 
  C   C  
   B B   
    A 
对于L+L[-2::-1]中的c,根据c中每个字符的垂直顺序,每个字符垂直生成一行 对于L[::-1]+L[1:]中的s,运行水平模式以构建每行嵌套列表 '',c[c==s]为水平模式中与行字母不匹配的每个字符选择空格。 这将形成lines变量中的列表列表 for line in lines通过这些行进行打印 print*line,sep=打印字符之间不带分隔符的当前行 如果希望打印速度更快,可以将嵌套列表中的字母连接到可以直接打印的字符串:

print(*map("".join,lines),sep="\n")

你对哪一部分有困难?我向后翻了翻。如果你有一个全新的问题,那就是一个新问题。请不要编辑问题并用全新的问题替换。欢迎使用堆栈溢出。请阅读。你不能把你的问题陈述扔在这里,指望我们帮你解决。如果您对ascii部分(包括扩展的部分)感到困惑,那么不妨阅读和中的主题。如果用户不提供自己的代码,请不要为他们编写代码。我们不是来为人们做家庭作业或工作的。我们来这里是为了帮助他们学习,提供盲目复制和粘贴的代码并没有帮助。至少你的回答解释了它是如何工作的,但问题本身是离题的。哦,好的。我不知道。谢谢通知!下次我回答时,我会跟着他们说:如果用户不提供自己的代码,请不要为他们编写代码。我们不是来为人们做家庭作业或工作的。我们来这里是为了帮助他们学习,提供盲目复制和粘贴的代码并没有帮助。至少你的回答解释了它是如何工作的,但问题本身是离题的,而且是错误的。