Ответы пользователя по тегу Python
  • Python, добавить словарь в список?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    • Метод append() у типа list ничего не возвращает, так как это логично. Это метод списка и этот метод называется "добавить" -- что он должен возвращать? Ничего;
    • Для обозначения ничего в Python предусмотрен объект-одиночка None (на русский так и переводится -- "ничего").
    Ответ написан
  • Как сделать так, чтобы код заработал?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    В Python 3, print должен быть функцией, а не оператором:
    def binary_search(list, item):
          # ...
          print(binary_search(my_list, 3)) # => 1
          print(binary_search(my_list, -1)) # => None

    Update. Ещё я бы заменил деление / на деление без остатка //:
    mid = (low + high) // 2
    Ответ написан
  • На каких интернет-ресурсах новичку можно разместить исходники для code review?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    1. Регистрируешься на github.com;

    2. Создаёшь репозиторий;

    3. Устанавливаешь себе на машину Git;

    4. Настраиваешь Git:
    git config --global user.name "Твоё имя латинницей"
    git config --global user.email твой_email

    5. Клонируешь репозиторий с GitHub в какую-нибудь папку:
    git clone https://ссылка_на_репозиторий.git

    6. Переносишь исходники в созданную git`ом папку (в ней ещё лежит файл .gitignore и папка .git).

    7. Внутри папки с исходниками выполняешь последовательность команд:
    git add --all
    git commit -m 'update'
    git push origin master

    8. Проверяешь, что исходники появились в репозитории на GitHub.

    9. Делишься ссылкой на репозиторий с желающими почитать твой код.

    Если что-то непонятно, в Интернете полно вопросов и ответов, пошаговых руководств, видео уроков, и других учебных материалов по теме.
    Ответ написан
  • Можно ли на python создавать мобильные приложения?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Kivy -- Cross-platform Python Framework for NUI Development.

    Kivy runs on Linux, Windows, OS X, Android, iOS, and Raspberry Pi. You can run the same code on all supported platforms.
    Ответ написан
  • Linux ради Python?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Плюсы Linux для веб-разработки на стеке Python/Django следующие:
    • Есть Python пакеты, разработчики которых официально не поддерживают Windows (например, Pillow). Хотя часто можно найти сторонние сборки таких пакетов под Windows;
    • Даже если разработчики пакета поддерживают Windows, но пакет не так хорошо тестируется под Windows и мало кем используется под Windows -- можете столкнуться с проблемами на которые сложно нагуглить готовые решения;
    • Если Django проект разворачивается на Linux сервере, логично иметь под рукой похожую среду исполнения;
    • Меньше неврозов и седых волос.
    Ответ написан
  • Как сделать так чтобы каретка не переходила на новую строку в тернарном операторе?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    [[print(exit(0) if int(i) > 100 else i if int(i) >= 10 else '', end=(exit(0) if int(i) > 100 else '\n' if int(i) >= 10 else '')) for i in [input()]] for _ in range(1000)]
    Ответ написан
  • Как преобразовать список с именами методов в список методов в Python3?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    class MyClass:
        def __init__(self):
            self.methods = []
            for name in dir(self):
                attr = getattr(self, name)
                if callable(attr) and not name.startswith("__"):
                    self.methods.append(attr)
    
        def print_hello(self):
            print("Hello!")
    
    
    test = MyClass()
    test.methods[0]()


    UPDATE

    Доработанный вариант:
    class MyClass:
        def __init__(self):
            """Тут не должно быть много логики"""
            self.my_attr = 'my attribute'
    
        @property
        def methods(self):
            """Динамическое получение списка методов
            Зачем так?
            1) мы убрали логику из __init__
            2) узнаем о методе, даже если добавили его потом с помощью setattr
            """
            result = []
            for name in dir(self):
                # добавлена проверка name != 'methods',
                # чтобы избежать бесконечной рекурсии
                if name != 'methods' and not name.startswith("__"):
                    attr = getattr(self, name)
                    if callable(attr):
                        result.append(attr)
            return result
    
        @property
        def my_property(self):
            """это property, а не метод"""
            pass
    
        def my_method_1(self):
            """а вот это метод"""
            print("my method 1")
    
        def my_method_2(self):
            """и это не метод"""
            print("my method 2")
    
    test = MyClass()
    print('Всего методов:', len(test.methods))
    for method in test.methods:
        method()
    
    # Получим в выводе две строки:
    # Всего методов: 2
    # my function 1
    # my function 2
    Ответ написан
  • Как скачать файлы с сайта?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Ну вот эта функция, что возвращает ссылку для загрузки файл:
    function load_ai(id){
    	$.post('GetBLOB.htm', {
    		ID : id,
    		TABLE: "T_ANALYTICAL_INFORMATION"		
    	}, function(data) {
    		window.location.href=data;
    	});
    }

    Полный url для HTTP запрос с POST параметрами:
    https://analytic.nalog.ru/portal/GetBLOB.htm

    Пробуем сделать загрузку одного файла с помощью Python библиотеки requests:
    import requests
    
    data = {
        'ID': 1,
        'TABLE': 'T_ANALYTICAL_INFORMATION',
    }
    load_url = 'https://analytic.nalog.ru/portal/GetBLOB.htm'
    response = requests.post(load_url, data, verify=False)
    file_name = response.text.replace('files/', '')
    file_url = 'https://analytic.nalog.ru/portal/files/{}'.format(file_name)
    response = requests.get(file_url, verify=False)
    with open(file_name, 'wb') as file:
        file.write(response.content)

    Список документов вроде подгружается на страницу с помощью JavaScript, но так как документов немного (не более 136) можно как-то так:
    import requests
    
    for i in range(200):
        try:
            data = {
                'ID': i,
                'TABLE': 'T_ANALYTICAL_INFORMATION',
            }
            load_url = 'https://analytic.nalog.ru/portal/GetBLOB.htm'
            response = requests.post(load_url, data, verify=False)
            file_name = response.text.replace('files/', '')
            file_url = 'https://analytic.nalog.ru/portal/files/{}'.format(file_name)
            response = requests.get(file_url, verify=False)
            with open(file_name, 'wb') as file:
                file.write(response.content)
        except Exception as error:
            print(type(error), error)

    Если надо не угадывать ID методом тыка, а получить валидный список, можно посмотреть в сторону Selenium. С помощью Selenium можно получить контент веб-страницы, генерируемый через JavaScript.
    Ответ написан
  • Равны ли два условия?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    1. Чем является условие if start: # Что этов приведенном ниже коде?

    1. В общем виде, выражение вида if variable: по-умолчанию заменяет примерно такую конструкцию:
    if (
        variable is not None  # ни ничего
        and variable is not False  # ни ложь
        and variable != 0  # ни ноль
        and variable != ''  # ни пустая строка
        and variable != []  # ни пустой список
        and variable != {}  # ни пустой словарь
        and variable != tuple()  # ни пустой кортеж
        and variable != set()  # ни пустое множество
    ):

    В лекциях и литературе, это порой называют термином falsy -- логичный набор значений для встроенных типов, которые в выражении if variable: эквивалентны False. В качестве наглядного примера, if my_list: для проверки на пустой список [] писать гораздо удобнее, чем if len(my_list) != 0:.

    В вашем случае, условие if start: исключает срабатывание вложенного кода, как при пустой строке '', так и при None.

    2. Соответственно что передается при вводе пустого Enter?

    2. Передаётся пустая строка '', что затем "присваивается" переменной start. И так как условием выполнения цикла while является start != '', то в данном коде ввод пустой строки является способом выхода из цикла.

    3. Чем является пустая строка, ведь она ни False, ни True, ни None

    3. Пустая строка '' имеет тип str. Однако, см. выше про falsy значения.

    В общем, выражение if start: покрывает и проверку if start != '':, и ряд других проверок, описанных в пункте 1.
    Ответ написан
  • Как округлить число в этом коде?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    В двух местах Вы пытаетесь вызвать float как функцию, передавая туда аргумент:
    VIGOD(str)
    NEVIGOD(str)

    Просто не делайте так.
    Ответ написан
  • Как установить python 3.8 на другой диск?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Может быть как-то так:
    • Установить на флешку;
    • Проверить и, при необходимости, изменить пути в реестре Windows, чтобы python и pip искались на диске H.


    UPDATE
    Кажется Вадим Шаталов прав, в Windows 10 путь редактируется в переменных среды. Тут же нагуглил инструкцию про пути к Python в Windows 10: https://datatofish.com/add-python-to-windows-path/
    Ответ написан
  • Как набить руку на Python разработку и сисадминистрирование за 2 месяца?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Веб-разработка и администрирование сетевых ресурсов более востребованы, поэтому я бы рекомендовал изучить следующее:
    • основы и стандартная библиотека Python -- навык лучше прокачивается написанием скриптов и программ для решения неучебных задач. И если основной навык миддла -- это гуглить (полу)готовые решения, то основной навык джуна -- уметь писать свои "велосипеды". Разработчик, который по-максимуму использует и полагается на готовое -- столь же неэффективен, как и предпочитающий использовать готовое по-минимуму;
    • веб-фреймворк Django -- пилите небольшой проект, получаете общие представления о веб-разработке и практику ООП, но о Python этот веб-фреймворк расскажет мало, делает слишком много работы за программиста, а в его исходном коде можно заплутать, так и не поняв как он работает;
    • система контроля версий Git -- обязательно для разработчика и желательно для сисадмина;
    • wsgi-сервер uWSGI (или Gunicorn) -- см. ниже;
    • http-сервер Nginx -- см. ниже;
    • GNU/Linux -- пробуете развернуть проект с использованием предыдущих двух пунктов;
    • веб-фреймворк Flask -- просто пощупайте или сделайте ещё один небольшой веб-проект, по исходникам этого веб-фреймворка проще понять как работают другие веб-фреймворки и как писать поддерживаемый код, к тому же на Flask часто пилят всякие API / бэкенды;

    Настольные приложения и мобильная разработка на Python кажется менее развита и менее востребована, но когда-нибудь можете пощупать:
    • Python GTK+ 3 (или PySide2) -- Python обёртки над GUI инструментариями для разработки настольных приложений;
    • Kivy -- фреймворк преимущественно для мобильной разработки.

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

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Варианты решения:
    1. Через цикл. Объявляете новый пустой список, итерируетесь по старому списку со строками через цикл for, в теле цикла переводите строки в числа с помощью встроенного класса int и добавляете в новый список, ну и присваиваете a новый список. Всего четыре строчки.
    2. Через генератор списков (англ. list comprehensions). Аналогично, но без объявления нового списка. Всё в одну строчку.
    Ответ написан
  • Как установить pygame_sdl2 для python3, если в системе несколько версий python?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Для начала, попробуйте следовать официальной документации:
    Ubuntu:
    sudo apt-get install build-essential python-dev libsdl2-dev \
        libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev \
        libjpeg-dev libpng12-dev virtualenvwrapper

    Open a new shell to ensure virtualenvwrapper is running, then run:
    mkvirtualenv pygame_sdl2
    pip install cython

    Change into a clone of this project, and run the following command to modify the virtualenv so pygame_sdl2 header files can be installed in it:
    python fix_virtualenv.py
    Finally, build and install pygame_sdl2 by running:
    python setup.py install

    Если библиотека не будет доступна для импорта в Python3, попробуйте заменить в выше процитированной инструкции вызовы python на python3 и pip на pip3. И попробуйте ещё раз.

    Так же есть подозрение, что в инструкции не хватает:
    git clone https://github.com/renpy/pygame_sdl2
    Ответ написан
  • Как в цикле выводить сообщение один раз?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    def recv():
        last_id = 0
        while True:
            file = vk.messages.getHistory(user_id=93084902, rev=0, count=1)
            for i in file['items']:
                if i['id'] > last_id:
                    last_date = i['id']
                    print(i['text'])
    
    
    variable = Thread(target=recv, args=())
    variable.start()


    Update. Заменил i['date'] на i['id']. Если сообщения пишут очень часто, так правильнее и надёжнее. Мне показалось, что id сообщений имеют случайный характер, но edward_freedom ткнул меня носом в мою невнимательность))
    Ответ написан
  • Почему не устанавливается vk_api (Python 3.4.0)?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Желательно приводить в вопросе полный трэйсбэк ошибки.

    Скорее всего, проблема в версии пакета vk_api или в версиях его зависимостей (beautifulsoup4, requests, websocket-client, six), чьи разработчики могли отказаться от поддержки Python 3.4.

    Попробуйте скачать vk_api архивом с GitHub, распаковать, явно указать совместимые с Python 3.4 версии зависимостей в requirements.txt и установить пакет вручную python setup.py install.

    Как вариант, если не торопитесь, оформите issue в репозитории проекта.
    Ответ написан
  • Как проверить, встречаются ли какие-либо символы из одной строки в другой строке?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Лучше использовать регулярные выражения, см. модуль re стандартной библиотеки.

    Но если сложно, можете использовать такую функцию:
    def check_password_for_chars(password, chars):
        for char in chars:
            if char in password:
                return True
        return False

    Ну и для каждой проверки вызываете её 4 раза, указывая в качестве chars свои наборы символов.

    Если потребуется проверять, что в пароле больше 1 символа из chars. Убираете return True из тела цикла. Добавляете в функцию третий аргумент, скажем min_count (минимальный счёт), и перед циклом добавляете локальную переменную, скажем count (счёт), со значением 0. Тогда в теле цикла, при каждом обнаружении искомого символа в пароле, Вы увеличиваете count на 1. И в конце проверяете, что count больше или равно min_count, чтобы вернуть True или False.

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

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Python часто называют "лучшим вторым языком для большинства задач". Написание графических приложений -- не исключение. Особенно, если нет задачи защитить исходный код приложения от изучения посторонними.

    Библиотек для создания графических приложений много.

    Из того, что более-менее на слуху:
    • GTK+ 3
      • Python GTK+ 3 (зависит от PyGObject) -- рекомендую. Во-первых, тулкит Gtk проще в освоении, чем монструозный Qt. Во-вторых, есть приличная по объёму официальная документация для Python (хотя и не полная). Приложений с большим количеством окон и виджетов пока не писал.

    • Qt5
      • PyQt5 -- несколько лет назад пробовал PyQt4 и PyQt5. Для написания чего-то сложнее "Hello world!" надо курить много документации к оригинальному Qt, а изложено там всё в контексте языка C++. Например, пару дней пытался разобраться как обойтись без Qt-шных классов для работы с СУБД (чтобы не извращаться с голым SQL) и подружить Qt-шные виджеты для таблиц с SQLAlchemy -- в итоге понял, что Qt не для меня.
      • PySide2 -- не пробовал. Лучше PyQt5 по части лицензий (есть под LGPL, что позволяет бесплатное использование и в проприентарных проектах) и, если не ошибаюсь, PySide2 лучше дружит с питоновскими типами. В остальном, тот же Qt5.

    • wxWidgets
      • wxPython -- не пробовал. Говорят проще PySide2 / PyQt5. Однако, тулкит не дотягивает по популярности до GTK+ 3, так что вероятно и инфы по нему меньше. Как я понял, стабильной версии под Python3 до сих пор нет, находится в разработке под названием Phoenix.

    • Tk
      • Tkinter -- пробовал. Собственно исходный тулкит Tk кажется морально устаревшим. Добиться более-менее приличного оформления приложений затруднительно. Для реализации сложных вещей надо писать заметно больше кода, чем в вышеупомянутых тулкитах.

    • Kivy -- фреймворк больше ориентирован на разработку мобильных приложений под Android и iOS, но можно писать приложения и под Linux системы.

    Так же, в некоторых случаях, есть смысл смотреть в сторону веб-фреймворков (Django, Flask и др.). Веб-приложение может и локально запускаться на конкретной машине, взаимодействуя с операционной системой и другими веб-приложениями в сети организации.
    Ответ написан