Как этот код создает "мишень" numeri c? - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь выучить Python уже пару месяцев. Я выполнял практические упражнения на edabit.com и постоянно выполнял «сложные» и «очень сложные» задачи. Я решил, что попробую «Эксперт», просто чтобы посмотреть, во что я ввяжусь. Мне была поставлена ​​задача создать квадратную «мишень» из списка целых чисел, указав только длину.

Здесь можно найти упражнение: https://edabit.com/challenge/Kv8DMmwfuKTLyZD5E

Результат должен выглядеть так:

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

I ' Я просматривал это больше часа, но не могу понять, КАК этот код работает. Я признаю, что существует бесчисленное количество Python концепций, функций и синтаксиса, которые я до сих пор не понимаю, но я действительно хочу (например, .format () по-прежнему является для меня совершенно новой функцией и все еще не Я полностью понимаю это).

Не мог бы кто-нибудь так любезно рассказать, что именно происходит в этом коде? Что действительно сбивает меня с толку, так это строки 4 и 6.

Я ценю любое время, которое вы готовы дать мне, и благодарен, что вы даже нашли время, чтобы прочитать это.

* Я хочу поблагодарить пользователей edabit Джошуа Сеньорон и zatoichi49 за создание и решение проблемы соответственно.

1 Ответ

1 голос
/ 20 июня 2020

Например, мы делаем мишень размером (5), результат должен быть:

>>> make_dartboard(5)
[11111, 12221, 12321, 12221, 11111]

Давайте посмотрим на код построчно:

for i in range(n, 0, -2): - > for i in [5, 3, 1]

row += int('{:0^{}}'.format('1'*i, n))

^ in string formatting означает:

Принудительное центрирование поля в пределах доступного пространства .

'{:0^{}}'.format('1'*i, n)), это дает строку длиной n с i числами '1' в центре, заполняется '0' снаружи. Подробнее о string.format().

  1. с, i = 5 и n = 5, это дает '11111'.
  2. с, i = 3 и n = 5, это дает '01110'
  3. with, i = 1 и n = 5, это дает '00100'

В пределах forl oop , row равно его кумулятивной сумме в int (чтобы ее можно было сложить):

  1. с, i = 5 и n = 5, row -> 11111
  2. с, i = 3 и n = 5, row -> 12221
  3. с, i = 1 и n = 5, row -> 12321

row добавляются к top по порядку, остальная часть кода предназначена для создания того же списка в обратном порядке bottom. Наконец, верните объединенный список из top и bottom

bottom = top[::-1][1:] if n%2 else top[::-1] #code [::-1] reverses the list bottom копирует список top снизу вверх. Если n четное, копирование выполняется с самого низа. Если n нечетное, как вы могли заметить, есть один уникальный центр row, который нужно пропустить при concat bottom до top.

Сообщите мне, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...