Вопрос об автоматизации скучных вещей: глава 4

Я новичок в программировании, и у меня есть вопрос об автоматизации скучных вещей: Глава 4. Есть практический проект, в котором вам нужно определенным образом переформатировать сетку. Ниже приведен мой код:

grid = [['.', '.', '.', '.', '.', '.'],
    ['.', 'O', 'O', '.', '.', '.'],
    ['O', 'O', 'O', 'O', '.', '.'],
    ['O', 'O', 'O', 'O', 'O', '.'],
    ['.', 'O', 'O', 'O', 'O', 'O'],
    ['O', 'O', 'O', 'O', 'O', '.'],
    ['O', 'O', 'O', 'O', '.', '.'],
    ['.', 'O', 'O', '.', '.', '.'],
    ['.', '.', '.', '.', '.', '.']]

for i in range(0, len(grid[0])):
    for j in range(0, len(grid)):
        print(grid[j][i], end = "")
    print("")

Выход:

..OO.OO..
.OOOOOOO.
.OOOOOOO.
..OOOOO..
...OOO...
....O....

Я понимаю, как упорядочить этот код с помощью циклов for. Однако я смущен тем, почему вы должны включить 'end = "" ', чтобы добиться этого. Мне также интересно, почему вы должны включить последний оператор «print («»)», чтобы сделать это.


person Louiscage22    schedule 28.04.2020    source источник
comment
Попробуйте исключить эти элементы, и вы увидите, что они делают. Если вам не нравятся циклы, но вы читаете документы, попробуйте: print('\n'.join(map(''.join, zip(*grid))))   -  person schwobaseggl    schedule 28.04.2020


Ответы (2)


По умолчанию функция print() добавляет новую строку ко всему, что печатает.

Вы можете отключить это поведение, передав ему ключевое слово end, которое позволяет вам установить то, что он печатает вместо новой строки. Это может быть запятая, пробел, несколько новых строк, что угодно — или это может быть пустая строка, означающая, что она ничего не печатает.

Это единственный способ напечатать несколько элементов в одной строке, так как (очевидно), если вы каким-то образом не избавитесь от «автоматического перехода на новую строку», все появится на отдельной строке, а это не то, что вам нужно.

Затем вы снова вызываете print() либо без аргумента, либо с пустой строкой, и позволяете ему добавлять новую строку в качестве поведения по умолчанию.


В случае, если это поможет проиллюстрировать, следующее функционально эквивалентно:

print()
print('')
print('', end='\n')
print('\n', end='')

В каждом случае они печатают одну новую строку и больше ничего.

person Green Cloak Guy    schedule 28.04.2020

В циклах for вы печатаете не каждую строку, а каждый символ. Обычный оператор печати по умолчанию имеет значение end='\n' или новую строку. Например, если я запускаю:

mylist = ['this', 'list', 'right', 'here']
for item in mylist:
    print(item)

Вывод будет:

this
list
right
here

Что делает ключевое слово end, так это изменяет то, как оператор печати завершает каждую печать. в моем же примере, если бы я вместо этого добавил end = '-', он добавил бы дефис между каждым элементом в списке.

this-list-right-here-

Обратите внимание, что он также добавляет дефис к последнему слову. каждый раз, когда вызывается оператор печати, он печатает то, что вы спрашиваете, а затем то, что вы указали как «конец».

Поскольку вы добавляете пустую строку в качестве конца, каждый символ печатается сразу после предыдущего, но затем переходит на новую строку. Почему? Когда ваш код завершает строку из 'j', он переходит к следующему индексу строк - или i. Когда он делает это, вы печатаете пустую строку, но вы делаете это с конечным значением по умолчанию, которое равно end='\n'. Было бы понятнее, если бы в примере вы явно выписали эту часть. Здесь важно не то, что вы печатаете, а то, что к этому добавляется концом по умолчанию — новой строкой. Таким образом, вы просматриваете каждый символ, распечатываете его, а затем продолжаете без новой строки, пока не дойдете до конца строки, после чего вы печатаете новую строку и продолжаете.

Вы также можете заменить этот окончательный print("") на print("\n", end="") и получить тот же результат.

person Kyle Alm    schedule 28.04.2020
comment
Спасибо, это действительно помогает. Тем не менее, для этого последнего оператора print(), печатает ли он его в этом конкретном месте, подключается ли он к «циклам for»? то есть он выведет ровно 9 символов перед переходом на новую строку, потому что он связан с циклами? - person Louiscage22; 28.04.2020
comment
Да, так что это на самом деле между циклами for. У вас есть две петли, поэтому вы делаете одну петлю на каждой петле другой. Большая петля и маленькая петля. После каждого маленького цикла вы печатаете() перед переходом к следующему большому циклу. Ваши большие циклы находятся в списке списков, а ваши маленькие циклы — в каждом списке внутри этого списка списков. - person Kyle Alm; 28.04.2020
comment
Хорошо, большое спасибо. Есть ли название для такого рода вещей? Просто интересно, потому что я не знал, что такая идея существует. - person Louiscage22; 28.04.2020