Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2017 01:08:32

Valgard
Зарегистрирован: 2017-07-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу понять код из 3х строчек

Добрался до 5ой задачи, и на ней сдался и подсмотрел решение:

Решение:

 import pickle
input = open('banner.p', 'rb')
obj=pickle.load(input)
print(type(obj[0]))
 
for lines in obj:
    line=[ch * count for ch, count in lines]
    print ("".join(line))

Программа выводит вот это:

               #####                                                                      ##### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
               ####                                                                       #### 
      ###      ####   ###         ###       #####   ###    #####   ###          ###       #### 
   ###   ##    #### #######     ##  ###      #### #######   #### #######     ###  ###     #### 
  ###     ###  #####    ####   ###   ####    #####    ####  #####    ####   ###     ###   #### 
 ###           ####     ####   ###    ###    ####     ####  ####     ####  ###      ####  #### 
 ###           ####     ####          ###    ####     ####  ####     ####  ###       ###  #### 
####           ####     ####     ##   ###    ####     ####  ####     #### ####       ###  #### 
####           ####     ####   ##########    ####     ####  ####     #### ##############  #### 
####           ####     ####  ###    ####    ####     ####  ####     #### ####            #### 
####           ####     #### ####     ###    ####     ####  ####     #### ####            #### 
 ###           ####     #### ####     ###    ####     ####  ####     ####  ###            #### 
  ###      ##  ####     ####  ###    ####    ####     ####  ####     ####   ###      ##   #### 
   ###    ##   ####     ####   ###########   ####     ####  ####     ####    ###    ##    #### 
      ###     ######    #####    ##    #### ######    ###########    #####      ###      ######
Это слово ‘channel’ - ответ на загадку.

В чём состояла задача: скачать файл banner.p, загрузить сериализованный объект и понять, что с ним делать дальше.

Цитата из решебника:
После изучения стало понятно, что мы имеем дело со списком, состоящим из 23 списков, которые в свою очередь состоят из пар символ:цифра, причем цифра показывает сколько раз необходимо печатать символ.
Для вывода на экран я воспользовался следующей конструкцией.


 for lines in obj:
line = [ch * count for ch, count in lines]
print "".join(line)

Сериализованный объект имеет вот такой вид:

[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', ... ] 
Вопрос: Что это вообще за магия и как это работает. Особенно не понимаю вот эту строчку
line = [ch * count for ch, count in lines]
что это за магия?

Не вижу в коде обращения ко второму элементу вложенного списка - цифре показывающей сколько раз печатать символ. Как это вообще работает?

P.S. Питон изучаю вторую неделю и пришёл в него из php

Отредактировано Valgard (Июль 1, 2017 01:09:51)

Офлайн

#2 Июль 1, 2017 05:51:20

Toony
Зарегистрирован: 2017-07-01
Сообщения: 1
Репутация: +  1  -
Профиль   Отправить e-mail  

Не могу понять код из 3х строчек

 line = [ch * count for ch, count in lines]
Это не магия, а распаковка.
Начнем с “for ch, count in lines”. Он из списка lines берет 2 значения ch и count это и есть (' ', 95) из сериализованного элемента. А потом перемножает “ch * count”. Благодаря квадратным скобочкам , он формирует новый список и сохраняет его в line. А на счет как он строит такую картинку, возьмем (' ‘, 15) он пробел умножает на 15, получается строка из 15 пробелов, дальше (’#', 4), умножает символ # на 4 и получает список из ####, и после этого строит общую картину через объединение всех строк “”.join(line)

Офлайн

#3 Июль 1, 2017 20:34:25

Valgard
Зарегистрирован: 2017-07-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу понять код из 3х строчек

Спасибо, доходчиво. Погуглил, оказалось это такая штука как генератор, я с ними раньше не был знаком.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version