Ответы пользователя по тегу Python
  • Где взять задачник по python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Марк Лутц «Изучаем Python»
    Уж как там всё разжёвано с примерами и заданиями, наверно лучше и не найти. Сам сейчас изучаю по этой книге, хотя ранее все эти степики-курсы и официальные доки замучил до тошноты...

    Минусы:
    • Цена кусается, даже б/у. (Лайфхак: Не обязательно брать оба тома сразу)
    • Книжка толстенная и тяжеленная, не удобно пользоваться.
    • Шрифт мелковат.


    Но всё равно оно того стоит.
    Ответ написан
    5 комментариев
  • Как увеличить изображение x*2 и y*2 без интерполяции?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Не бейте, пожалуйста. Вот стырил исходный код с habra и накарябал как смог:
    spoiler
    from PIL import Image, ImageDraw  # Подключим необходимые библиотеки.
    
    image = Image.open("temp.jpg")  # Открываем изображение.
    width = image.size[0]  # Определяем исходную ширину.
    height = image.size[1]  # Определяем исходную высоту.
    pix = image.load()  # Выгружаем значения пикселей исходной картинки.
    
    imagemode = image.mode  # Получаем цветовой формат исходного изображения
    multiplicator = 2  # тут множитель, по-умолчанию 2
    newwidth = width * multiplicator  # вычисляем новую высоту
    newheight = height * multiplicator  # вычисляем новую ширину
    newimage = Image.new(mode=imagemode, size=(newwidth, newheight))  # создаем новую картинку
    newpix = newimage.load()  # загружаем новую картинку попиксельно
    draw = ImageDraw.Draw(newimage)  # создаем инструмент рисования
    
    if __name__ == '__main__':
        new_image_list = []  # создаем пустой массив строк нового изображения
        for i in range(width):
            new_line_list = []  # создаем пустой массив очередной новой строки
            for j in range(height):  # получаем цветность очередного пикселя исходной картинки
                newpixel = pix[i, j]
                for _ in range(multiplicator):  # лепим в конец массива новой строки нужное кол-во таких пикселей
                    new_line_list.append(newpixel)
            for _ in range(multiplicator):  # лепим в конец массива строк нужное кол-во вновь созданных строк
                new_image_list.append(new_line_list)
    
        for i in range(newwidth):  # рисуем построчно попиксельно новую картинку из массива строк нового изображения
            for j in range(newheight):
                pixel = tuple(new_image_list[i][j])
                draw.point((i, j), pixel)
    
    newimage.save("ans.bmp", "BMP")  # записываем всё это в файл (выбрал bitmap потому, что там явно получаются пиксели
    # как заказано, без дальнейшей оптимизации форматом jpg
    del draw
    image.close()
    newimage.close()


    Наверняка это можно было сделать гораздо красивее и оптимальнее, и быстрее в N раз. Но уж "чем удобряли, то и выросло"...
    Ответ написан
    Комментировать
  • Как допустить запись нескольких нулей перед неравным нулю числом?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В python есть специальная функция (или, наверно, метод?) zfill(), предназначенная именно для дополнения строки до нужной длины нулями слева. Т.е. при выводе легко восстановить нужную длину печатаемого числа, превратив его в строку и напустив на него zfill(кол-во знаков, до которого надо добить нулями).
    Ответ написан
    1 комментарий
  • Как подогнать уравнение для шифрования двойной перестановки?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Извини, код не фонтан, ну как умею.

    def getnumber(x, y):
        return 4*(int(y)-1)+(int(x)-1)
    
    def encode(text, xkeys, ykeys):
        counter = 0
        newtext = ['' for _ in range(len(text))]
        for y in ykeys:
            for x in xkeys:
                if counter < len(text):
                    newtext[getnumber(x, y)] = text[counter]
                    counter += 1
        return ''.join(newtext) #ТУТ ПОДГОНЯТЬ УРАВНЕНИЕ ТАК, ЧТОБЫ ПРИ ШИФРОВКИ "ПРИЛЕТАЮВОСЬМОГО" ПОЛУЧАЛОСЬ "ТЮАЕООГМРЛИПОЬСВ"
    
    def decode(text, xkeys, ykeys):
        return) ''.join(text[getnumber(x, y)] for y in ykeys for x in xkeys)
    Ответ написан
    6 комментариев
  • Использование длины списка Python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Поскольку в python индексы начинаются с нуля, а вы перебираете начиная с первого, то в конце цикла счетчик превысит максимальный индекс и будет ошибка.

    Кроме того, в текущем виде это не min, а max.
    Ответ написан
    1 комментарий
  • Как заставить эту программу посчитать число Лангранжа и вывести его?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Может, что-то такое:
    spoiler
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.array([-6, 7, 4, 3], dtype=float)
    y = np.array([-297, 249, 33, 9], dtype=float)
    
    
    def lagranz(x, y, t):
        z = 0
        for j in range(len(y)):
            p1 = 1;
            p2 = 1
            for i in range(len(x)):
                if i == j:
                    p1 = p1 * 1;
                    p2 = p2 * 1
                else:
                    p1 = p1 * (t - x[i])
                    p2 = p2 * (x[j] - x[i])
            z = z + y[j] * p1 / p2
        return z
    
    
    xnew = np.linspace(np.min(x), np.max(x), 100)
    ynew = [lagranz(x, y, i) for i in xnew]
    
    counter = 0
    step = 9
    for xx, yy, tex in zip(xnew, ynew, xnew):
        if counter % step == 0:
            t = plt.text(xx, yy, round(tex, 2), horizontalalignment='right' if xx < 0 else 'left', 
                     verticalalignment='center', fontdict={'color':'red' if xx < 0 else 'green', 'size':14}) 
        counter += 1
    
    plt.plot(x, y, 'o', xnew, ynew)
    plt.grid(True)
    plt.show()

    (Содрано в инфернете, кривовато допилено в части шага отображения).
    Ответ написан
    Комментировать
  • Почему при перестановке аргументов функции, аргументы принимают значения друг друг?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Потому, что внутри, в 4 строке, первому аргументу присваивается значение path + ..., а второму значение name. Поменяйте их там местами, всё должно заработать.
    Ответ написан
    1 комментарий
  • Как отправить информацию не отдельными сообщениями, а одним сообщением в Телеграм боте?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Я уже в прошлом вопросе сказал, как это сделать. Ты же не хочешь, чтобы тут всё за тебя сделали?
    Ответ написан
  • Как сортировать и вывести в список места по возрастанию смотря на дистанцию от геопозиции пользователя на python с помощью geopy?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Во-первых, у вас тут нет "словаря", из которого можно "отправить все места списком из словаря". У вас есть tuple - это не словарь. Это кортеж. Кортеж в обычном смысле не сортируется, он по сути своей неизменная структура. Хотя, конечно, если его содержимое переложить в структуру, которая может меняться, то переложенное содержимое отсортировать можно. Но, мне думается, так делать не нужно.

    Во-вторых, вы там получаете список дистанций distance. По-идее, индексы значений этого списка соответствуют индексам вашего кортежа, и можно перебирать значения дистанций от максимального к минимальному и по найденному следующему значению получать его индекс и использовать как индекс для получения значения из кортежа.
    Грубо говоря, находим максимальное значение в списке distance, считаем его текущим, находим индекс текущего значения, по нему получаем значение из кортежа. Это у вас уже реализовано. А затем ищем значение в списке distance, которое меньше текущего, но больше всех остальных. Считаем его текущим. Получаем его индекс, получаем по этому индексу значение из кортежа, повторяем цикл поиска следующего значения дистанции меньше текущего, пока существует значение дистанции меньше текущего.
    Ответ написан
    6 комментариев
  • Почему вылезает ошибка когда я двигаюсь?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Ошибка вылезает потому, что в строке, которая вызывает ошибку, используются два списка its и its2.
    Причем берется список its, в нем находится индекс некоторого значения new2, а затем в списке its2 ищется значение с этим индексом. Видимо, такого индекса там просто нет, и система сообщает об этом.
    Почему именно в вашем its2 нет такого индекса, а главное - должен ли он там быть? Вот в чем вопрос. У вас там выше по коду идет активная работа с its, в него и добавляются новые значения, и убираются оттуда значения. Соответственно, никакой гарантии, что длина списка its будет равна длине списка its2 или как-то с ним синхронизирована, нет.
    Поэтому в какой-то момент оказывается, что список its длиннее списка its2 и максимальное значение списка its имеет индекс, который больше самого большого индекса списка its2.

    Что с этим делать? Логику программы я не разбирал подробно, но наверно надо постоянно оба списка синхронизировать как-то, тогда по крайней мере длина у них будет одинаковая и ЭТА ошибка не будет возникать.
    Ответ написан
    Комментировать
  • Не могу разобраться с функциями в Python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    a = 0
    while a != 3:
        a = int(input())
    Ответ написан
    1 комментарий
  • Как организовать поиск по значениям словарей?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    может,
    if xr in cv():
            print(x)


    Вот если бы именовали переменные внятно - address, town, ну и т.п. - было бы виднее.
    Ответ написан
  • Не могу понять в чём дело? Решил написать скрипт для разшифровки своего шифра, но ругается на переменную PassMes5. Знающие люди смогут помочь?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Там у Вас в районе passmes4 скобка потерялась.
    Но вообще это замечательно. Шедеврально.
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку при парсинге?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Как я понимаю, страничка URL должна таки открываться и обычным браузером. У меня не открывается. Может, потому и ошибка?
    Вы попробуйте вместо этого вашего морталкомбата для начала открыть ченьть попроще.
    Ответ написан
  • Как скомпилить два файла в exe?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Эээ... два файла с каким содержимым? И что в итоге оно должно делать, полученное ехе?
    Ответ написан
    Комментировать
  • Как сделать чтоб код Python скачивал папку, и распаковывалась в директорию?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Код, написанный Вами, запрашивает конкретный файл, а не папку.

    В случае, если Вам надо просто скачать известный список файлов, пусть большой - проще взять готовую программу, например wget, подать ей на вход этот список в виде текстового файла, и wget скачает всё сам.

    Если список Вам не известен, то чтобы скачать содержимое папки, это содержимое надо увидеть. А для этого надо через какой-то конкретный api получить список файлов, потом перебирать список и формировать ссылки по типу:
    “путь к папке на сервере” + “имя очередного файла“

    И запрашивать по-очереди эти файлы, либо через стандартный http запрос, либо через api сервиса (в зависимости от сервиса). Либо опять же сложить ссылки в текстовый файл и скормить список wget-у.

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

    А конечная цель-то какая?
    Ответ написан
    1 комментарий
  • Как получить доступ к значению индекса в Python, сравнивая индекс с числом?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    описанная Вами задача как раз и решается именно так, как Вы описали:
    Есть некая константа K = 1.
    Есть список spisok, в котором в ячейке номер 1 лежит текст «b».
    spisok = [“a”, “b”, “c”]
    Если вы пишете:
    result = spisok[K]
    то переменная result станет равна значению ячейки с номером, равным K, т.е. spisok[1], т.е. «b».

    Или, может, Вы хотели обратную задачу - по значению ячейки номер ячейки?
    Ответ написан
    Комментировать
  • Как изменить наcтройки Python проекта "ProxyBroker" для парсинга и чека прокси и заставить его работать бесконечно?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Полистал github и доки проекта, сходу мне видится вот что:
    Прогу можно использовать несколькими разными способами.
    Как отдельную программу:
    Можно запускать и получать распечатку;
    Можно запускать и получать выгрузку в файл;
    Можно запустить как сервер прокси.
    Как модуль программы на python:
    Импортировать её в программу и оттуда вызывать с нужными параметрами и результат получать то же самое, что и в случае отдельной программы, но с возможностью менять параметры запросов и использовать полученные данные внутри программы.

    Не совсем понял, что значит «запустить скрипт на непрерывную работу». Он должен непрерывно дописывать новые прокси в конец списка? Или он должен регулярно выдавать новую десятку прокси взамен предыдущей? Или он должен сам начать безостановочно работать как один из цепочки прокси, которые он находит по своим каналам?
    Ответ написан
  • Как сделать скриншот окна выбранного процесса?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    А Вы что-либо гуглили? Пробовали из нагугленного?
    Мне первое, что выпало - pyscreenshot

    Как я понял, программа - обёртка для множества разнообразных способов получения скриншотов. Попробуйте, вдруг поможет.
    Ответ написан
    Комментировать
  • TypeError: 'in ' requires string as left operand, not tuple; как исправить?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    строка
    elif cmds["ctime"] in exersize:
    берет из словаря
    cmds = {
    "ctime": ('текущее время','сейчас времени', 'который час'),
    "radio": ('включи музыку', 'воспроизведи радио', 'включи радио'),
    "stupid1": ('расскажи анекдот', 'рассмещи меня', 'ты знаешь анекдот')
    }

    значение по ключу "ctime"
    Это значение представляет собой tuple (в круглых скобках - tuple), это не список, это именно tuple - кортеж. Это такая структура, она неизменная в отличие от списка.
    И получается, что строка
    elif cmds["ctime"] in exersize:
    пытается выяснить, присутствует ли кортеж в "exersize".
    Но метод in не умеет искать кортежи где-то, умеет только строки.
    Поэтому, видимо, надо брать кортеж, содержащий несколько отдельных строк, перебирать его элементы и каждый элемент искать в "exersize".
    Ответ написан