Python 这段代码是如何创建一个数字“quot;“飞镖”吗;?

Python 这段代码是如何创建一个数字“quot;“飞镖”吗;?,python,Python,我已经尝试学习Python几个月了。 我一直在edabit.com上做练习,并且一直掌握着“难”和“非常难”的任务。我想我会给一个“专家”的问题一个机会,看看我会进入什么。 有人给我一个任务,只给我一个长度,从整数列表中创建一个正方形的“镖靶” 练习可以在这里找到: 输出应如下所示: make_dartboard(8) ➞ [ 11111111, 12222221, 12333321, 12344321, 12344321, 12333321, 12222221,

我已经尝试学习Python几个月了。 我一直在edabit.com上做练习,并且一直掌握着“难”和“非常难”的任务。我想我会给一个“专家”的问题一个机会,看看我会进入什么。 有人给我一个任务,只给我一个长度,从整数列表中创建一个正方形的“镖靶”

练习可以在这里找到:

输出应如下所示:

make_dartboard(8) ➞ [
  11111111,
  12222221,
  12333321,
  12344321,
  12344321,
  12333321,
  12222221,
  11111111
]
def make_dartboard(n):
    row, top = 0, []
    for i in range(n, 0, -2):
        row += int('{:0^{}}'.format('1'*i, n))
        top.append(row)
    bottom = top[::-1][1:] if n%2 else top[::-1]
    return top + bottom
果然,我真的被难倒了。将其视为一个学习练习,我向前看了看其他用户的解决方案,发现了以下代码:

问题代码:

make_dartboard(8) ➞ [
  11111111,
  12222221,
  12333321,
  12344321,
  12344321,
  12333321,
  12222221,
  11111111
]
def make_dartboard(n):
    row, top = 0, []
    for i in range(n, 0, -2):
        row += int('{:0^{}}'.format('1'*i, n))
        top.append(row)
    bottom = top[::-1][1:] if n%2 else top[::-1]
    return top + bottom
我已经看了一个多小时了,但还不清楚这段代码是如何工作的。我承认有无数的Python概念、函数和语法我仍然不理解,但我真的很想理解(例如,.format()对我来说仍然是一个全新的函数,仍然不完全理解它)

有没有人能很好地解释一下这段代码中到底发生了什么?真正让我感到困惑的是第4行和第6行

我很感激你愿意给我的任何时间,也很感激你花时间阅读了这篇文章


*我想感谢edabit用户Joshua Señoron和zatoichi49分别创建和解决了这个问题。

例如,我们正在制作一个5号的镖靶,输出应该是:

>>> make_dartboard(5)
[11111, 12221, 12321, 12221, 11111]
让我们逐行查看代码:

用于范围(n,0,-2)中的i:
->
用于[5,3,1]中的i

row+=int({:0^{})。格式('1'*i,n))

指:

强制将场集中在可用空间内

'{:0^{}'。格式('1'*i,n))
,它给出了一个长度为n的字符串,其中
i
'1'
个数在中间填充
'0'
。更多关于

  • 通过,
    i=5
    n=5
    ,它给出了“11111”
  • 通过,
    i=3
    n=5
    ,它给出了“01110”
  • 对于,
    i=1
    n=5
    ,它给出“00100”
  • 在forloop中,
    等于其在
    int
    中的累积和(因此可以将其相加):

  • 使用,
    i=5
    n=5
    ->11111
  • 带,
    i=3
    n=5
    ->12221
  • 使用,
    i=1
    n=5
    ->12321
  • 按顺序追加到
    顶部
    ,其余代码按与
    底部
    相反的顺序创建相同的列表。最后,返回
    top
    bottom

    bottom=top[:-1][1:]如果n%2否则top[:-1]#code[:-1]会反转列表
    bottom
    从下到上复制
    top
    列表。如果
    n
    为偶数,则从最底部复制。如果
    n
    是奇数,您可能会注意到,当concat
    bottom
    top
    时,需要跳过一个唯一的中心


    如果有帮助,请告诉我。

    这个问题可能适合我,谢谢你的提醒!实际上,我试图向那个社区提出一个单独的问题,但他们关闭了它,因为我没有编写代码。。。是否有一个好的社区可以询问现有代码,试图了解它在做什么?有时,谷歌在试图理解某些概念时会发现自己一无是处。再次感谢!这是难以置信的帮助,谢谢你花时间为我解释。@AustinEckel很乐意帮忙,我的朋友。如果你觉得我的答案有用的话,我很乐意投票接受。快乐编码!