迭代地在Python中绘制'领结'

时间:2014-09-06 02:45:08

标签: python function for-loop

我正在尝试制作一个能够用给定输入绘制领结的代码。

领结:

 *        *
 ***    ***
 **********
 ***    ***
 *        *

我正在研究两种方法。任何人都可以告诉我,如果我在正确的道路上?我好像迷路了......

num = int(input("Enter an odd number greater than 4: "))

row = 1
row_space = row*2-1
space_tot = num*2 - row_space*2
stars = int((num*2 - space_tot)/2)

space = ""

for x in range(num):
    print("*"*stars+" "*space_tot+"*"*stars)
    row += 1
    space_tot -= 2


def triangle(n):
   for x in range(n,0,2):
        print ('*'*x)
   for x in range(n,0,-2):
        print ('*'*x)
        n -= 1


triangle(num)

3 个答案:

答案 0 :(得分:3)

num = int(input("Enter an odd number greater than 4: "))
center = (num - 1)//2
for row in range(num):
    nspaces = 2*abs(row - center)
    nstars = num - nspaces
    print nstars*'*' + 2*nspaces*' ' + nstars*'*'

如何运作

让我们看一下案例num=5所需的输出(添加行号):

0 *        *
1 ***    ***
2 **********
3 ***    ***
4 *        *

让我们将其视为左半部分和右半部分。观察每一半的中心行有num个星星。中心行中的空格数为零。对于我们离开中心的每一行,每一半的空间数增加两个。以数学方式表达:

nspaces = 2*abs(row - center)

每一半都是num列宽。因此,如果一半有nspaces个空格,那么这一半中的星数是:

nstars = num - nspaces

计算了这两者之后,只需将其全部打印出来:

print nstars*'*' + 2*nspaces*' ' + nstars*'*'

每行都执行一次。

答案 1 :(得分:1)

当你学习Python时,最好查看它的库函数。在Python中,一切都是对象。每个对象都有方法。以下是您需要了解的有关Python中string的所有信息的链接。

https://docs.python.org/2/library/string.html

您将在此处获得与您的问题直接相关的许多功能。你在Python中使用对象越熟悉,你在Python编程中就越好。这适用于任何语言。如果您想要在特定语言中变得更好,请了解其具体细节。

对于您的问题,您可以了解方法ljust()rjust()join()。你是如何使用它们的?

In [126]: '[' + 'abcd'.ljust(10) + ']'
Out[126]: '[abcd      ]'

In [127]: '[' + 'abcd'.rjust(10) + ']'
Out[127]: '[      abcd]'

In [134]: '-][-'.join(['A', 'list', 'of', 'strings'])
Out[134]: 'A-][-list-][-of-][-strings'

当然,您可以将'abcd'替换为'*'。在这种情况下,你有,

In [129]: ('*'*3).ljust(5) + ('*'*3).rjust(5)
Out[129]: '***    ***'

现在,您只需将3替换为您选择的计数器即可。请注意,您的数字会以2s递增。在你这样做之前,我希望你知道列表理解。如果没有,你可以在这里了解它:

https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

In [132]: [('*'*i).ljust(5) + ('*'*i).rjust(n)  for i in range(1, n+2, 2)]
Out[132]: ['*        *', '***    ***', '**********']

现在让我们将其保存在变量中,并将它们连接在一起......

    In [135]: l = [('*'*i).ljust(5) + ('*'*i).rjust(n)  for i in range(1, n+2, 2)]

    In [137]: print '\n'.join(l)
    *        *
    ***    ***
    **********

当然,你也需要另一半。为此,您需要使用几乎上面创建的所有列表l。注意:

In [138]: l # Original list
Out[138]: ['*        *', '***    ***', '**********']

In [139]: l[:-1] # Original list - the last value in the list
Out[139]: ['*        *', '***    ***']

In [140]: l[:-1][::-1] # reverse that one
Out[140]: ['***    ***', '*        *']

In [141]: l + l[:-1][::-1] # join the reversed list to the original list
Out[141]: ['*        *', '***    ***', '**********', '***    ***', '*        *']

最后,我们可以加入这两个列表并组成bwotie:

In [143]: print '\n'.join(l + l[:-1][::-1])
*        *
***    ***
**********
***    ***
*        *

总而言之,你需要3行打印领结:

n = 5 # Or a user input here ...
l = [('*'*i).ljust(5) + ('*'*i).rjust(n) for i in range(1, n+2, 2)]
print '\n'.join(l + l[:-1][::-1])

希望你能看到用Python完成文档是值得的。您将能够获得许多有用的方法,这可以使编码变得非常容易。使用Python库的人越熟悉,编码就越好。大多数这些库都针对特定系统进行了微调,因此也很难超越它们的效率。所以你获得两倍的优势,同样的努力:)。

祝你的节目顺利。

答案 2 :(得分:0)

def triangle(n):
   for x in range(n,0,2):
        print ('*'*x)
   for x in range(n,0,-2):
        print ('*'*x)
        n -= 1