Ответы пользователя по тегу Python
  • Как задать переменной константу?

    @fireSparrow
    В том коде, который вы привели, нужно после каждого вызова переменной добавить приращение на единицу:

    value += 1

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

    Или ещё можно взять итератор count из стандартной библиотеки itertools, и обращаться к нему через next().

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

    @fireSparrow
    Курсы полезны, но только чтобы получить общее представление и базовые навыки.
    Потом всё равно нужно будет нарабатывать опыт на реальных задачах.
    Ответ написан
  • Как работает позднее связывание в Python?

    @fireSparrow
    Чтобы такого не происходило можно сделать так:

    def multipliers():
      return [lambda x, i=i: i * x for i in range(4)]
        
    print([m(2) for m in multipliers()]) # [0, 2, 4, 6]


    или так

    def multipliers():
      return (lambda x: i * x for i in range(4))
        
    print([m(2) for m in multipliers()]) # [0, 2, 4, 6]


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

    @fireSparrow
    pythonworld.ru - совсем основы
    programming086.blogspot.ru/2015/12/python-2015.html - хороший курс лекций для тех, кто уже программировал на других языках
    https://habrahabr.ru/post/205944/ - большая подборка хороших статей
    Ответ написан
    Комментировать
  • Почему filter работает не так как ожидается?

    @fireSparrow
    Написал ответ и только потом заметил, что вы немного изменили вопрос. Но решил ответ не менять.

    В третьей строчке (где фильтруется source), я обернул фильтр в list().
    Вот так:

    source = list(filter(lambda x: x in caps, source))

    И у меня всё заработало.

    Не уверен, но сильно подозреваю, что дело вот в чём:

    filter() сам по себе возвращает не список, а объект типа "фильтр". То есть там пока ещё не сама отфильтрованная последовательность, а только инструкции о том, что и как фильтровать.
    И после этого вы меняете caps, который участвует в фильтрации. Соответственно, фильтрация будет происходить уже по-другому.

    Я немножко погонял фильтр на похожих примерах - похоже, моя догадка верна.
    Если в фильтре в лямбде мы проверяем присутствие переменной в списке, а потом меняем список, то фильтр будет работать уже по-другому.
    Ответ написан
    1 комментарий
  • Какая разница между строковыми методами в Python с двойным подчеркиванием и без?

    @fireSparrow
    Методы с двойным подчёркиванием не предназначены для непосредственного вызова. То есть сделать так можно, но особого смысла в этом нет.

    Эти методы (их называют "волшебными") в основном служат для переопределения стандартного поведения объектов на уровне классов.
    Более подробно можно легко загуглить по запросу "волшебные методы python".
    Ответ написан
    Комментировать
  • Бесплатные он-лайн курсы по Python для начинающего, есть ли достойные?

    @fireSparrow
    Мне очень нравится вот этот цикл лекций:
    https://habrahabr.ru/company/spbau/blog/280426/

    А чтобы они проще укладывались в голове, можно предварительно прочитать вот это:
    pythonworld.ru/samouchitel-python
    там кратко и ёмко даны основы для совсем уж начинающих
    Ответ написан
    Комментировать
  • Почему Python оборачивает элементы списка в кортежи?

    @fireSparrow
    В первых трёх строках запятые не нужны.

    Перевод строки - уже достаточный разделитель инструкций.
    А запятая для разделения инструкций не используется, только для разделения элементов в разных последовательностях. Её следует применять внутри скобок (либо круглых, либо квадратных, либо фигурных). Если вы используете запятую без скобок, то интерпретатор считает, что подразумеваются круглые скобки (т.е. кортеж).

    Т.е. писать нужно так:

    fio = {}
    age = {}
    date = {}
    diagnoz = {}

    Кстати, переменная diagnoz - это вы какую-то медицинскую систему пишите? Я просто сам в медицинском центре работаю :))
    Ответ написан
    1 комментарий
  • Как передать список в качестве аргумента функции?

    @fireSparrow
    Звёздочка в данном случае - это распаковка. Её нужно использовать в противоположной ситуации - когда нужно передать не сам список, а его элементы в качестве отдельных аргументов.

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

    @fireSparrow
    Это не баг, так и должно быть.
    Советую вам почитать про типы данных в питоне - иначе вы регулярно будете натыкаться на такие "баги".

    Суть в том, что все типы данных делятся на изменяемые и неизменяемые, и они при присваивании будут вести себя по-разному.

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

    То есть, если вы делаете так:

    a = {какой_то_словарь}
    b = a

    то и b, и a будут ссылаться на одну и ту же область памяти, и когда вы меняете один из этих словарей, второй будет меняться точно так же. Потому что на самом деле это один и тот же словарь, просто под двумя разными именами.

    С методом append это работает аналогично - то есть он не делает копию словаря, добавляя её в список, а просто ТОТ ЖЕ словарь зачисляет в список.

    Как уже написали выше, нужно принудительно делать копию словаря, а потом уже её вставлять в список.
    Но, имхо, надёжнее использовать не copy(), а deepcopy().
    Ответ написан
    Комментировать