• В чем суть self?

    @fireSparrow
    Если кратко и по простому, то дело обстоит так:

    Обычно класс создают для того, чтобы потом создать некоторое количество экземпляров этого класса.
    При написании класса нужно как-то указать, что какие-то манипуляции нужно производить именно над конкретными экземплярами, а не над самим классом.

    Для этого в функциях (кроме некоторых исключений) первым аргументом пишут имя (по традиции это как раз слово "self", хотя на самом деле там можно указать любое корректное имя). В результате, когда в функции интерпретатор видит имя self, он понимает, что речь идёт именно об одном конкретном объекте класса.

    Пример:
    class A:
      
      # У класса есть атрибут "x"
      x = 1
      
      def change_one(self, value):
        # Эта функция меняет атрибут "x" только у того экземпляра класса,
        # для которого она вызвана
        self.x = value
      
      def change_all(self, value):
        # Эта функция меняет атрибут "x" у самого класса
        # Изменение отразится на всех экземплярах, у которых нет своего атрибута "x"
        A.x = value
    
    
    a1 = A()
    a2 = A()
    a3 = A()
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 1 1 1
    # На самом деле, у экземпляров пока нет своего атрибута "x",
    # но они получают его значение из класса
    
    a1.change_one(5)
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 5 1 1
    # Теперь у а1 есть свой атрибут x, потому что функция change_one через self
    # создала его только для того экземпляра, для которого её вызвали
    # a2 и a3 по прежнему не имеют своего атрибута "x" и получают его значение из класса
    
    a2.change_all(2)
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 5 2 2
    # Изменился атрибут класса, и поэтому значение изменилось для всех элементов,
    # которые не имеют своего атрибута "x", а вынуждены брать его из класса
    
    a1.change_all(7)
    
    print(a1.x, a2.x, a3.x)
    # Выведет: 5 7 7
    # Совершенно всё равно, из какого экземпляра вы запускаете change_all.
    # В этой функции не используется self (в отличие от change_one),
    # а значит результат её вызова никак не связан с конкретным экземпляром
    Ответ написан
    1 комментарий
  • Как отправить через telegram bot практическое любое изображение?

    @fireSparrow
    Вы здесь вообще какую-то ерунду пытаетесь делать.

    Функция open ожидает в качестве аргумента конкретную строку. Функция re.compile возвращает скомпилированное регулярное выражение, которое строкой ВООБЩЕ не является. И даже не унаследовано от нее.

    Строковое представление этого результата соответствует выражению, которое его породило.

    cartoon = re.compile(".jpg")
    
    print(str(cartoon))
    
    # Выведет: re.compile('.jpg')


    Файловая система не умеет работать с таким. Ей нужна нормальная строчка с конкретным именем файла.

    Соответственно, вам нужно поступать так:
    1. Получаете список имеющихся файлов в заданной директории.
    2. Находите там один подходящий файл.
    3. Передаёте его имя в явном и конкретном виде в функцию open.
    И регулярные выражения здесь могут использоваться только на этапе 2, но никак не на этапе 3.
    Ответ написан
    Комментировать
  • Как на Python отправить email с mail.ru?

    @fireSparrow
    Попробуйте поменять порт на 465.

    Этот порт указан на официальном сайте mail.ru:
    https://help.mail.ru/mail-help/mailer/popsmtp
    Ответ написан
    1 комментарий
  • Как научиться реализовывать алгоритмы?

    @fireSparrow
    0. Практика.
    1. Читай про ООП и паттерны проектирования.
    2. Изучай чужие хорошие архитектурные решения.
    3. Изучай приёмы рефакторинга и практикуйся рефакторить свой и чужой код.
    Например, очень ясно и подробно про рефакторинг написано здесь:
    https://refactoring.guru/ru/refactoring/what-is-re...
    Ответ написан
    1 комментарий
  • Как реализовать такое на Python?

    @fireSparrow
    dct = {
            'Женя': {'Брюнетка', 'Толстая', 'Умная'},
            'Лера': {'Блондинка', 'Худая', 'Глупая'},
            'Даша': {'Блондинка', 'Худая', 'Умная'},
    }
    
    
    def search(string):
      res = set()
      str_set = string.replace(' ', '').split(',')
      for name, features in dct.items():
        if any([f in str_set for f in features]):
          res.add(name)
      return ', '.join(list(res))
    
    
    print(search('Худая, Блондинка'))
    print(search('Умная'))
    Ответ написан
    2 комментария
  • Алгоритм поиска паттерна в неупорядоченной последовательности?

    @fireSparrow
    С учётом вашего комментария к ответу x67:
    В этом случае можно попробовать проверять только каждый пятый байт. Если там ноль - от него шагаем по одному символу влево до тех пор пока не наткнёмся на не ноль. После чего отходим ещё на пару символов влево и уже с этого символа проверяем вхождение паттерна.
    Теоретически можно получить экономию почти в пять раз.
    Но это будет хорошо работать только если в массиве мало нулей, не являющихся частью паттерна. Если же в массиве много посторонних нулей - то может получится даже хуже, чем при линейном поиске.
    И всё-таки рекомендую попробовать реализовать этот вариант и замерить время работы по сравнению с линейным поиском.
    Ответ написан
    Комментировать
  • Как правильно сформировать?

    @fireSparrow
    У вас в коде две ошибки.

    Во-первых, перед if не нужен отступ.

    Во-вторых, нужно либо вводимое число приводить к int
    variant = int(input("= "))

    либо в исходных словарях ключи оформить как строки (обратите внимание на кавычки)
    actdam = {'1': self.damagetohead, '2': self.damagetobody, '3': self.damagetoheand, '4': self.damagetolegs}


    И ещё - когда спрашиваете совета, подробно объясняйте, в чём состоит проблема.
    Если программа демонстрирует не такое поведение, какого вы ожидали - подробно описывайте, чем отличается реальность от вашего ожидания.
    Если программа выдаёт ошибку - копируйте полный текст ошибки.

    В противном случае многие просто не будут разбираться в вашем вопросе.
    Ответ написан
    1 комментарий
  • Как выводить по 5 значений из листа?

    @fireSparrow
    Можно написать вот такой класс:

    class FivePrintList(list):
    
        def __init__(self, *args):
            super(FivePrintList, self).__init__(args)
            self.cursor = 0
    
        def print_five(self):
            cursor = self.cursor
            next_cursor = cursor + 5
            print(self[cursor:next_cursor])
            self.cursor = next_cursor


    Теперь вы можете создавать особый список вот таким образом:

    users = FivePrintList('lol', 'lol', 'lol', 'lol', 'lol', 'lol', 'lol', 'lol', 'lol')


    Этот особый список обладает методом print_five(), при вызове которого будут напечатаны очередные 5 элементов. Вызов метода можно повторять сколько угодно раз, пока все элементы не будут исчерпаны.

    users.print_five()
    users.print_five()
    users.print_five()
    users.print_five()
    
    # Напечатает:
    # ['lol', 'lol', 'lol', 'lol', 'lol']
    # ['lol', 'lol', 'lol', 'lol']
    # []
    # []
    Ответ написан
    1 комментарий
  • Как распределить числа в случайном порядке в матрицу?

    @fireSparrow
    Ну, решение "в лоб" - использовать Counter.

    from collections import Counter
    
    cntr = Counter({"A": 7, "B": 8, "C": 7, "D": 8, "E": 7, "F": 8})


    Теперь у вас есть счётчик cntr.
    Вы можете проверить, остались ли в нём пункты для определённого ключа:

    x = "A"
    if cntr[x]:
        # Условие выполнится, только если счётчик для "А" больше нуля


    А когда вы один раз использовали какую-то букву, вы можете вычесть из её счётчика один пункт:
    x = "A"
    cntr.subtract( {x: 1} )    # Счётчик для "A" уменьшится на единицу


    Ещё множество примеров по работе с Counter вы легко найдёте в гугле. Это очень полезный класс. Когда вы его освоите, вы довольно часто захотите его применять.
    Ответ написан
    Комментировать
  • Как сделать перебор элементов многомерного списка?

    @fireSparrow
    l = [ 1, [ 2, 3 ], [ 4, [ 5, 6 ] ] ]
    
    f = lambda a: list(map(f, a)) if isinstance(a, list) else 2*a
    
    print(f(l))
    Ответ написан
    Комментировать
  • Как найти в место в коде которое отвечает за переход по страницам?

    @fireSparrow
    Там тупо ссылки вида <a href="/recipes/~5/">5</a>

    Сам блок переключения страниц содержится в <div class="paginator">, можете поиском найти.

    В нормальных браузерах легко посмотреть код любого элемента, который вы видите.
    Например в Chrome можно просто навести курсор на элемент, щёлкнуть правой кнопкой и в контекстном меню выбрать "Просмотреть код".
    Ответ написан
    Комментировать
  • Есть ли хороший онлайн самоучитель по Python, который хорошо показовал бы его работу на примерах?

    @fireSparrow
    pythontutor.ru

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

    @fireSparrow
    Можно сделать вот так, чтобы функция работала для произвольного числа аргументов:

    def build_graph(x, *arg):
        for a in arg:
            # Цикл отработает столько раз, сколько передано аргументов после x
            # перебирая их по одному
            # и подставляя каждый из них в качестве 'a'
            plt.plot(x, a)
        #Всякие украшательства, подписи осей, легенда для графика и проч.
    Ответ написан
    1 комментарий
  • Как можно фиксировать отказ потребителя?

    @fireSparrow
    1. Просматривать записи выборочно. Чаще делать это для тех менеджеров, по поводу которых есть подозрения. Регулярно доводить до сведения менеджеров, что запись ведётся. Если есть нарушения - устраивать показательную порку, чтобы неповадно было. Если нет нарушений - находить любые мелочи и устраивать их публичные разборы.
    Если менеджеры будут постоянно помнить, что большой брат следит за ними, этого уже может быть достаточно.

    2. Что-то не очень понял из описания - каким образом происходит оплата, что менеджер может её себе забрать. Можете пояснить?
    Ответ написан
    Комментировать
  • Как сделать необязательное выполнение команды python?

    @fireSparrow
    Попробуйте так:

    try:
        driver.find_element_by_link_text("Submit").click()
    except:
        pass
    
    # Код, который должен идти после вашей строчки.
    Ответ написан
    2 комментария
  • Кто может поделиться "красивым" кодом?

    @fireSparrow
    Я некоторое время назад задавал такой вопрос:
    Где найти тексты Python-программ для совершенствования навыков понимания чужого кода?

    Мне больше всего понравилось предложение читать исходные коды стандартных библиотек - во первых практика чтения кода, во-вторых лучше начинаешь понимать, что происходит под капотом в стандартных классах и функциях.
    Сейчас вот читаю исходный код модуля collections.

    Все коды стандартных библиотек лежат в папке, где установлен питон, в подпапке Lib.
    У меня, например, это C:\Program Files\Python35\Lib
    Ответ написан
    1 комментарий
  • Как двигаться по матрице для заполнения по спирали вправо?

    @fireSparrow
    Можно обойтись без максимального-минимального элемента.

    Сначала создайте матрицу нужного размера, у которой все элементы будут None.
    И при каждом проходе двигайтесь вперёд до тех пор, пока следующий элемент None (ну и проверяйте, чтобы индексы за пределы массивов не выскакивали).

    И, кстати, можно делать не четыре раза while, а немножко поизящнее.
    Вот тут я уже разбирал код для такой же задачи: ссылка.
    Там пролистайте вниз до моего комментария.
    Ответ написан
  • Как осуществить поиск по ключевому слову в файле всех строк где оно присутствует?

    @fireSparrow
    Регулярные выражения - очень мощный инструмент, а у вас совсем простая задача.

    Для вашего случая вместо re.findall лучше использовать проверку на вхождение подстроки с помощью ключевого слова in.

    with open(filename,"r") as myfile:
        for line in myfile:
            if var1 in line:
                print(line)


    Здесь вместо filename вставляете путь и имя к вашему файлу, а вместо var1 - что нужно искать.
    Ну и вместо print(line) можете делать с найденной строкой line всё, что вам нужно - например, куда-то сохранить.
    Ответ написан
    Комментировать
  • Что за ошибка модуля Datetime?

    @fireSparrow
    Модуль datetime сам по себе не содержит свойства day.

    Он содержит класс, который также называется datetime и к которому, соответственно, нужно обращаться datetime.datetime.
    Он, в свою очередь, содержит функцию now(), которая возвращает временной идентификатор настоящего момента. И вот он уже имеет свойство day.

    Соответственно, вам нужно делать так:
    datetime.datetime.now().day

    То же самое для month и year.
    Ну или можно сделать так:
    now = datetime.datetime.now()
    date_li = [now.day, now.month, now.year]
    Ответ написан
    Комментировать