【问题标题】:Printing X-type pattern in Python 2.7在 Python 2.7 中打印 X 型图案
【发布时间】:2013-05-14 18:50:48
【问题描述】:

我正在尝试在 Python 中打印此模式:

    *............*
    .**........**
    ..***....***
    ...********
    ...********
    ..***....***
    .**........**
    *............*

并想出了完成这项工作的代码:

for row in range(1,5):
    print "." * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*"
for row in range (0,4):
    print("." * (3-row)+ "*" *(4 -row) + row * 4 * "." +"*" *(4 -row))

我的问题:是否可以在不使用两个循环的情况下做到这一点?顺便说一句,这不是家庭作业,我只是在玩 V. Anton Spraul 的“像程序员一样思考”中的一些练习,并用 Python 而不是 C++ 实现解决方案。

提前致谢。

【问题讨论】:

    标签: python python-2.7 text newline


    【解决方案1】:

    无需更改任何其他内容,您只需在两个范围内进行循环:

    for row in range(1,5)+range(4,0,-1):
        print "." * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*"
    

    因为您可以将列表添加在一起:

    In [8]: range(1,5)
    Out[8]: [1, 2, 3, 4]
    
    In [9]: range(4,0,-1)
    Out[9]: [4, 3, 2, 1]
    
    In [10]: range(1,5) + range(4,0,-1)
    Out[10]: [1, 2, 3, 4, 4, 3, 2, 1]
    

    顺便说一句,你可以用空格去掉前面的点:

    for row in range(1,5)+range(4,0,-1):
        print " " * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*"
    
    *............*
     **........**
      ***....***
       ********
       ********
      ***....***
     **........**
    *............*
    

    更优雅的做法可能是构建一个字符串列表:

    X = []
    for row in range(1,5):
        X.append(" " * (row -1) + row * "*" + (16 - row * 4) * "." + row * "*")
    

    现在,通过反向复制上半部分来添加下半部分:

    X = X + list(reversed(X))
    

    但是当我们打印它时,我们会看到一个列表:

    print X
    #['*............*', ' **........**', '  ***....***', '   ********', '   ********', '  ***....***', ' **........**', '*............*']
    

    所以我们可以用换行符将它们连接在一起:

    print '\n'.join(X)
    
    *............*
     **........**
      ***....***
       ********
       ********
      ***....***
     **........**
    *............*
    

    【讨论】:

    • 谢谢。我不知道你可以像这样将范围相加。但正如你所说,既然你可以添加列表,这是有道理的。
    • 实际上,所有的“.”都应该是空格,我只是用它们来跟踪空格。
    • 你可以,它解释了为什么[1,1] + [2,2] 不是[3,3]。另请参阅我的更新,了解如何反转和添加列表。
    【解决方案2】:

    这里有一个while循环的答案

    def star(size=14): ##size for the star in your post
        asterisk=1;
        space=0;
        def func(x):
            x+=1
            return x
        def decrement(x):
            x-=1
            return x
        while (asterisk > 0):
            line=''
            line+=' '*space
            if((size-(2*space)-(2*asterisk))<=0):
                line+='*'*(size-(2*space))
            else:
                line+='*'*asterisk
                line+=' '*(size-(2*space)-(2*asterisk))
                line+='*'*asterisk
            print ''.join(line)
            if((size-(2*space)-(2*asterisk))<=0):
                func=decrement ### switch to decreasing number of asterisks after we cross the middle of the star
                print ''.join(line)
            space=func(space);
            asterisk=func(asterisk);
    
    for i in range(20): ##whee
        star(i)
    

    【讨论】:

      【解决方案3】:

      我喜欢 askewchan 的优雅方法,它注意到顶部和底部之间的对称性。还有左右对称。这是一个利用这一点的尝试(虽然它确实有两个循环):

      stars = [" "*(row-1) + "*"*row + " "*(8-row*2) for row in range(1,5)]
      for line in stars + list(reversed(stars)):
          print line + line[::-1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 2012-07-25
        • 2013-08-29
        • 2016-12-03
        • 2012-03-08
        • 2017-01-04
        • 2018-04-24
        相关资源
        最近更新 更多