【问题标题】:Iteratively Drawing a 'Bow Tie' in Python在 Python 中迭代地绘制“领结”
【发布时间】:2014-09-06 02:45:07
【问题描述】:

我正在尝试编写一个代码,用给定的输入绘制领结。

领结:

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

我正在这里研究 2 种方法。谁能告诉我我是否走在正确的道路上?我好像迷路了……

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)

【问题讨论】:

  • 首先,感谢您自己尝试并在昨天之后回来发帖。现在,预期的结果是什么,你看到了什么,两者有何不同?
  • 我不确定您期望什么输出。也许您可以发布输入 5 所期望得到的内容?
  • @name 嘿,不要删除问题。 stackoverflow 的重点是有一个有用的问题和答案库,没有问题,答案是没有用的。
  • 我已经回滚了编辑。以后请听从 John1024 的建议。

标签: python function for-loop


【解决方案1】:
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*'*'

每行执行一次。

【讨论】:

  • @John1024 是的,关于你为什么在这个答案中执行特定操作的一些问题对于尝试做同样事情的其他用户来说会很好。
【解决方案2】:

在学习 Python 时,最好浏览一下它的库函数。在 Python 中,一切都是对象。每个对象都有方法。这是您需要了解的有关 Python 中 strings 的所有信息的链接。

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' 替换为'*'s。在这种情况下,你有,

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

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

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 库越熟悉,你的编码就越好。这些库中的大多数都针对特定系统进行了微调,因此也很难超越它们的效率。所以你得到了两倍的优势,同样的努力:)。

祝你编程顺利。

【讨论】:

    【解决方案3】:
    def triangle(n):
       for x in range(n,0,2):
            print ('*'*x)
       for x in range(n,0,-2):
            print ('*'*x)
            n -= 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-26
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2014-06-02
      • 2021-04-03
      相关资源
      最近更新 更多