Category: Python

08
Май
2021

Предсказываение последовательности

Задача состоит в следующем: есть набор данных следующего вида [(1,1),(2,4),(3,6),…]
Нужно попытаться предсказать например для числа 4 предсказать её значение.
То есть пара (1,1) представляет пару x, y. Нужно на основе имеющихся наборах к…

08
Май
2021

Парсинг сайта Юла

Парсил сайт юла на языке python через requests и столкнулся с проблемой.
Если зайти на любое объявление, то там будут описание, местоположение и т.д.
Хотел их спарсить, но не получилось.
Посмотрел исходный код страницы, в нём тег div с id=…

07
Май
2021

Проблема в сайте

Появилась проблема.
Есть сайт на Python и index.html файл для запуска. Если сайт запустить через питон (localhost:8000), то все нормально и сайт работает корректно, а если запустить сайт через Open Server, то после регистрации ошибка 404. …

07
Май
2021

Python: Необходимость парсить 500 последних гос.контрактов по условиям с сайта zakupki.gov.ru

Нужно парсить 500 последних гос.контрактов по условиям с сайта zakupki.gov.ru. Например: Если условия (необходимый текст в htlm разметке страницы) подходят, то выдается список некоторых этих условий в эксель по столбцам. Итого: нажимаю shi…

07
Май
2021

Эффективная быстрая сортировка

Новичок, изучаю Python алгоритмы.
Задача.

Тимофей решил организовать соревнование по спортивному программированию, чтобы найти талантливых стажёров. Задачи подобраны, участники зарегистрированы, тесты написаны. Осталось придумать, как в к…

07
Май
2021

Что делать если вылезает ошибка EOL while scanning string literal, когда я хочу запустить код guess

# Эта игра по угадыванию чисел.
import random

guessesTaken = 0

print(‘Привет! Как тебя зовут?’)
myName = input()

print(‘Будешь играть в "Угадай число"?’)
answer = input()

number = random.randint(1, 20)
print(‘Что ж, давай нач…

07
Май
2021

Не понимаю как из базы данных передать данные в профиль пользователя telegram bot python

я хотел бы сделать то что в заголовке вопроса, но вот в чём подвох допустим: я создаю базу данных, хочу записать туда данные побед пользователя но не понимаю как это сделать, я хочу установить пользователю число побед в его профиле телегра…

07
Май
2021

Телеграм бот на пайтоне не отправляет фото больше 1ого раза. В первый раз идет текст и фото, а в последующий только текст

@anime.message_handler(content_types=[‘text’])
def get_text(message):
if message.text == ‘Eщеее’:
m = 0
while m<= 5:
anime.send_photo(message.chat.id, photo[m], reply_markup= knopkastart)
m+=1…

07
Май
2021

Терминал неадекватно реагирует на команду python manage.py runserver (выдаёт надпись Python, вместо запуска локального сервера)

Терминал странно реагирует на команду python manage.py runserver(такая проблема возникла при переносе фала с одного компьютера на другой с помощью флешки(до переноса данных на другой компьютер всё работало нормально

07
Май
2021

Как сделать расширяемый по нажатию кнопки виджет в PyQt5?

Ситуация такая:
Имеется QScrollArea c установленным Layout Vertically.
Внутри находятся несколько QWidget с установленными значениями minimumSize-Height.
Последним в scrollAreaWidgetContents находится Vertical Spacer, который не дает видже…

07
Май
2021

Интенсив «Профессия Data Scientist: учимся обработке и анализу данных за 3 дня»

Попробуете себя в роли Data Scientist: с нуля подготовите данные, построите модель и научитесь анализу и визуализации с помощью Python.
— Читать дальше «Интенсив «Профессия Data Scientist: учимся обработке и анализу данных за 3 дня»»

07
Май
2021

🐍 3 инструмента для отслеживания и визуализации выполнения кода на Python

Каждый хотел бы облегчить процесс дебаггинга и избавиться от головной боли. Решаем эту проблему с помощью инструментов для отслеживания выполнения кода на Python.

Перевод публикуется с сокращениями, автор оригинальной статьи Khuyen Tran.

Мотивация

Вы наверняка видели
вывод ошибок наподобие показанного ниже:

        2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
  File "loguru_example.py", line 17, in <module>
    divide_numbers(num_list)
  File "loguru_example.py", line 11, in divide_numbers
    res = division(num1, num2)
  File "loguru_example.py", line 5, in division
    return num1/num2
ZeroDivisionError: division by zero
    

и хотели, чтобы его было
немного легче понять:


Возможно, вам даже
захочется визуализировать, какие строки кода выполняются и сколько раз:


Если так, статья даст необходимые инструменты, чтобы достичь цели:

  • Loguru – вывод сработавших исключений;
  • snoop – печать строк кода, выполняемого в функции;
  • heartrate – визуализация выполнения программы в режиме реального времени.

Все, что нужно для использования
этих инструментов – одна строка кода!

Loguru

Loguru – это библиотека, которая сделает общение с системой журналов в Python приятнее. Она предоставляет много интересных функций,
но одна из них заслуживает отдельного внимания – возможность отлавливать
неожиданные ошибки и отображать, какое значение переменной приводит к сбою
кода.

Установить Loguru можно одной командой:

        pip install loguru
    

Чтобы понять, чем Loguru
может быть вам полезна, представьте, что есть 2 функции – division и divide_numbers, при этом функция divide_numbers сейчас выполняется.

        from itertools import combinations

def division(num1: int, num2: int):
    return num1/num2

def divide_numbers(num_list: list):
  """Division of 2 numbers in the number list """
  
    for comb in combinations(num_list, 2):
        num1, num2 = comb 
        res = division(num1, num2)
        print(f"{num1} divided by {num2} is equal to {res}.")


if __name__ =='__main__':
    num_list = [2, 1, 0]
    divide_numbers(num_list)
    

Обратите внимание, что
комбинации ([2,1,0], 2) возвращают [(2, 1), (2, 0), (1, 0)]. После выполнения
приведенного выше кода мы получим следующую ошибку:

        2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
  File "loguru_example.py", line 17, in <module>
    divide_numbers(num_list)
  File "loguru_example.py", line 11, in divide_numbers
    res = division(num1, num2)
  File "loguru_example.py", line 5, in division
    return num1/num2
ZeroDivisionError: division by zero
    

Из выходных данных становится
ясно, что возвращающая num1/num2 строка является местом возникновения ошибки,
но непонятно, какие значения num1 и num2 ее вызывают. Это можно легко
отследить, добавив декоратор Loguru.catch:

        from loguru import logger 
from itertools import combinations

def division(num1: int, num2: int):
    return num1/num2

@logger.catch # Add this to track errors
def divide_numbers(num_list: list):
    for comb in combinations(num_list, 2):
        num1, num2 = comb 
        res = division(num1, num2)
        print(f"{num1} divided by {num2} is equal to {res}.")


if __name__ =='__main__':
    num_list = [2, 1, 0]
    divide_numbers(num_list)
    

Вывод:


Добавив logger.catch исключения гораздо проще
понять: ошибка возникает при делении 2 на 0.

Snoop

Как быть, если в коде
нет ошибки, но мы хотим выяснить, что в нем происходит? В этом случае пригодится
snoop. Это пакет Python, который выводит на экран строки
выполняемого кода вместе со значениями каждой переменной, добавляя только один
декоратор.

Чтобы установить snoop,
введите следующую команду:

        pip install snoop
    

Представим, что у нас
есть функция под названием factorial,
которая находит факториал целого числа:

        import snoop 

def factorial(x: int):
    if x == 1:
        return 1
    else:
        return (x * factorial(x-1))
        
if __name__ == "__main__":
    num = 5
    print(f"The factorial of {num} is {factorial(num)}")
    

Вывод:

        The factorial of 5 is 120
    

Чтобы понять, почему результат factorial(5) равен 20, добавим декоратор snoop в функцию
factorial.

        import snoop 

@snoop
def factorial(x):
    if x == 1:
        return 1
    else:
        return (x * factorial(x-1))


if __name__ == "__main__":
    num = 5
    print(f"The factorial of {num} is {factorial(num)}")
    

Вывод:


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

Heartrate

Если необходимо
визуализировать, какие строки и сколько раз выполняются,
попробуйте heartrate.

Heartrate также создан разработчиками
snoop. Чтобы его установить, введите команду:

        pip install heartrate
    

Теперь добавим heartrate.trace(browser=True) в
предыдущий код. Это откроет отображающее визуализацию файла
окно браузера, в
котором была вызвана функция trace():

        import heartrate 
heartrate.trace(browser=True)

def factorial(x):
    if x == 1:
        return 1
    else:
        return (x * factorial(x-1))


if __name__ == "__main__":
    num = 5
    print(f"The factorial of {num} is {factorial(num)}")
    

При запуске приведенного
выше кода должен открыться новый браузер. Если нет, перейдите на http://localhost:9999
– вы должны увидеть показанный ниже результат:


Диаграммы подсвечивают искомые
строки: более длинные полосы означают больше попаданий, а светлые цвета – более свежее изменение.

На приведенной выше иллюстрации мы видим, как выполняется код:

  • if x==1 (5 раз)
  • return 1 (1 раз)
  • return (x * factorial(x-1)) (4 раза)

Вывод имеет смысл, так
как начальное значение
x равно 5, и функция вызывается повторно до тех пор,
пока
x не станет равным 1.

Теперь посмотрим, как визуализировать
выполнение в режиме реального времени с помощью
heartrate. Добавим sleep(0.5), чтобы программа работала немного медленнее, и
увеличим
num до
20.

        import heartrate 
from time import sleep

heartrate.trace(browser=True)


def factorial(x):
    if x == 1:
        return 1
    else:
        sleep(0.5)
        return (x * factorial(x-1))


if __name__ == "__main__":
    num = 20
    print(f"The factorial of {num} is {factorial(num)}")
    

Теперь мы можем в режиме реального времени видеть, какие
строки кода выполняются, и сколько раз отработала каждая из них.

Заключение

Мы изучили три инструмента
для отслеживания и визуализации выполнения кода в Python. Надеемся, что с ними отладка станет для вас менее болезненной. Поскольку эти инструменты
требуют только одной строки кода, почему бы не попробовать их в работе? Удачи в обучении!

Дополнительные материалы:

07
Май
2021

Регулярное выражение. Текст после шаблона. Python

Совсем недавно изучаю регулярные выражения.
Столкнулся т такой проблемой:
Задача: Есть тест, его нужно разбить по группам.
Пример:
(1) Для начала Вам нужно создать задачу. (2) После создания задачи Вам нужно написать письмо. (3) Тест письм…

06
Май
2021

Django: tzinfo в датах не совпадают, поэтому возникает ошибка

Я работаю в Django.
У меня в моделях есть поле:
deadline = models.DateTimeField(auto_now_add=False)

Здесь же я прописываю функцию для того, чтобы сравнить deadline с текущим временем и понять, прошёл уже дедлайн или нет:
def is_deadli…

06
Май
2021

Ошибка:ZeroDivisionError: float modulo

Задача: Напишите простой калькулятор, который считывает с пользовательского ввода три строки: первое число, второе число и операцию, после чего применяет операцию к введённым числам ("первое число" "операция" "втор…

06
Май
2021

Запуск окна на PyQt5 из Tkinter

Всем привет, подскажите в каком направлении искать. Есть Desktop приложение на tkinter, делаю окно для открытия и просмотра email, в tkinter только html получается просмотреть, а письмо в том виде в котором оно приходит приходится отправл…

06
Май
2021

Python Selenium import cookies

Здраствуйте, появился такой вопрос, возможно ли выгрузить из обычного браузера куки файл и засунуть его в браузер Selenium? Я не совсем представляю как такое написать поэтому спрашиваю тут.

06
Май
2021

Ошибка в telebot

Пытаюсь написать бота с помощью библиотеки Telebot но постоянно одна и таже ошибка
Traceback (most recent call last):
File
"C:/Users/User/Desktop/programir/python/bot/tg_1/main.py", line 6, in <module>
@bot.message_handler…

06
Май
2021

enumerate не работает с for

i=[]
for index, value in list(enumerate(‘pyjspy’)):
if value ==’py’:
i.append(index)
print(i)

Этот код должен добавлять индексы вхождения ‘py’ из строки ‘pyjspy’ в список i, после чего вывести i с помощью print .
Почему список…