Найти - Пользователи
Полная версия: Не могу понять код из 3х строчек
Начало » Python для новичков » Не могу понять код из 3х строчек
1
Valgard
Добрался до 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
Toony
 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)
Valgard
Спасибо, доходчиво. Погуглил, оказалось это такая штука как генератор, я с ними раньше не был знаком.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB