Ответы пользователя по тегу Python
  • Как сделать "AJAX-подобный" сайт на Tornado?

    @fireSparrow
    Всё равно для этого понадобится чтобы страница с клиентской стороны совершала запросы. Т.е. без js не получится.

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

    @fireSparrow
    signs=('.','!','?')
    sign = lambda a: bool(set(a) & set(signs))
    Ответ написан
    Комментировать
  • Как присвоить нескольким классам одинаковое значение переменной внутри?

    @fireSparrow
    Похоже, вы не очень понимаете, как работают классы.

    Если вы создаёте аттрибут self.color - то это аттрибут экземпляра, а не класса. Вы не сможете обратиться к значению этого аттрибута через класс, это значение будет разное для каждого экземпляра.
    Ответ написан
    Комментировать
  • Перебор Элементов списка в Python?

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

    Благодаря им ту же задачу можно решить гораздо изящнее:
    arr = [1, 2, 3]
    arr = [2*i for i in arr]
    print(arr)


    Так и писать код проще, и тот, кто потом его будет читать сразу понимает, что здесь происходит, и выполняться это будет быстрее.
    Ответ написан
    Комментировать
  • Поиск в многомерном списке по нескольким условиям?

    @fireSparrow
    D = [['Параметр', 'a', 'a', 'a', 'b', 'b', 'b'],
         ['От', '1', '11', '51', '1', '31', '45'],
         ['До', '10', '50', '99', '30', '44', '60'],
         ['00', '01', '02', '03', '04', '05', '06']]
    
    zipped_D = list(zip(*D))[1:]
    
    fltr_1 = lambda lst: lst[0] == 'b'
    fltr_2 = lambda lst: int(lst[1]) <= 40 <= int(lst[2])
    
    result = [
              item[3]
              for item in zipped_D
              if fltr_1(item) and fltr_2(item)
              ]
    
    print("Искомое:", *result)
    Ответ написан
    Комментировать
  • Как в функции сослаться на переменную другой функции?

    @fireSparrow
    В такой форме - никак.
    Переменные, объявленные внутри функции, существуют только для этой функции и только на время её выполнения.

    Соответственно, нужно либо объявление переменных вынести за пределы функции - в какое-то пространство имён, общее для обеих функций. Либо возвращать переменные в качестве результата функции, и вызывать эту функцию, чтобы получить её результат.
    Ответ написан
    1 комментарий
  • Насколько важно ООП в Python?

    @fireSparrow
    ООП совершенно необходимо, если вы собираетесь писать что-то большее, чем скрипты на 30 строк.

    Учить ООП через мобильное приложение я бы не стал. Я пробовал приложение от SoloLearn по SQL, несколько минут в него повтыкал и удалил. Это баловство, серьёзную тему так изучить нельзя. Неудивительно, что вы ничего не поняли.
    Читайте книги и пишите свой код.

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

    @fireSparrow
    Запускать скрипт планировщиком, добавив ему запоминание того, какие картинки он уже постил.
    Ответ написан
    Комментировать
  • Стоит ли иди в программирование, будучи инженером?

    @fireSparrow
    Я вот из техподдержки/администрирования недавно перешёл в программисты (тоже Python).
    Первую работу действительно найти трудновато.
    Но если потратить на поиски 2-3 месяца, то в итоге найдёшь место, где будут смотреть не на прошлый опыт, а на то, что ты знаешь и умеешь сейчас. И тут уж от тебя зависит.
    Сейчас у меня з/п 70 тр (это уже чистыми), после окончания испытательного срока обещают 80. Для первой работы в новой области - имхо, очень даже неплохо.

    Но знания уже должны быть, совсем нулевого человека не возьмёт никто.

    В первую очередь стоит выучить Python, SQL, sqlalchemy, git.
    Очень хорошо, если есть опыт работы с Linux на уровне продвинутого пользователя.
    Ну и мониторьте вакансии на hh по слову Python - посмотрите, что там ещё чаще всего пишут в требованиях. Совсем всё учить не нужно, лучше остановиться на нескольких самых частых пунктах, но их-то освоить нормально.

    Не стесняйтесь отправлять резюме на вакансии, даже если не под все из указанных требований подходите. Я пришёл на работу не зная трёх фреймворков, которые были указаны в требованиях, а уже через несколько дней нормально писал код под них, хоть и не очень быстро, переодически сверяясь с документацией и разбираясь, что откуда берётся.

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

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

    @fireSparrow
    Глобальные переменные крайне не рекомендуется использовать там, где можно обойтись без них.

    Используйте функции-генераторы. Информацию о них легко нагуглить, поискав "yield питон".

    Вот пример простого кода, в котором функция запоминает значение счётчика между итерациями:

    def func():
        counter = 0
        while True:
          for elem in range(3):
              # do something
              counter += 1
          yield counter
    
    current_func = func()        
    for i in range(5):
      print(next(current_func))
    Ответ написан
    Комментировать
  • В чем суть 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 комментарий
  • Как реализовать такое на 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
    У вас в коде две ошибки.

    Во-первых, перед 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))
    Ответ написан
    Комментировать
  • Есть ли хороший онлайн самоучитель по Python, который хорошо показовал бы его работу на примерах?

    @fireSparrow
    pythontutor.ru

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

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

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