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

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Смотрите модуль random ( https://docs.python.org/3/library/random.html ). Если не очень с английским, используйте Google Translate. Или найдите статьи о модуле random на русском.

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

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Исходники видеоредактора Pitivi:
    https://gitlab.gnome.org/GNOME/pitivi

    Инструкция по подготовке окружения для работы над проектом тут, но при беглом чтении непонятно какие использованы зависимости и как их поставить отдельно:
    https://developer.pitivi.org/HACKING.html?gi-langu...

    Зависимости проекта указаны немного странно тут (см. конец файла):
    https://gitlab.gnome.org/GNOME/pitivi/-/blob/maste...

    В ClassicDependency обёрнуты зависимости от Python пакетов (matplotlib и numpy), а как ставить остальное кажется надо смотреть где-то тут:

    Ну или гуглить инструкцию по установке зависимостей запросами, вроде:
    GstVideo + Python


    Хотя для простого проекта (вроде курсовой) использование GTK+ 3 и пр. может быть избыточно.
    Ответ написан
    Комментировать
  • Ошибка интерпритатора python'a или моего мозга?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Кажется Вы неправильно поняли как работает оператор global.

    Для начала, прочитайте про LEGB в Python.

    Если к именам из глобальной области ниже происходит обращение на чтение -- использовать оператор global не имеет смысла.

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

    Аналогично с объёмлющими (англ. enclosed) областями -- для них предусмотрен оператор nonlocal.

    Касательно вашего кода, попробуйте изменить так:
    import pyautogui
    import keyboard
    from threading import Thread
    from time import sleep
    
    
    switch = False
    
    
    def Run():
        global switch
        i = 0
        while switch:
            pass
    
    def Click():
        global switch
        while switch:
            pyautogui.click()
            sleep(1)
    
    def Switch():
        global switch
        while True:
            if keyboard.is_pressed('End'):
                if switch:
                    switch = False
                    pyautogui.keyUp('shift')
                else:
                    switch = True
                    pyautogui.keyDown('shift')
    
    
    thread1 = Thread(target=Switch)
    thread2 = Thread(target=Run)
    thread3 = Thread(target=Click)
    
    thread1.start()
    thread2.start()
    thread3.start()
    
    thread1.join()
    thread2.join()
    thread3.join()
    Ответ написан
  • Как отдать управление из цикла python asyncio?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Сохранить в файл и запустить (значения sleep выставлены на 0.2 и 0.8 секунды для наглядности):
    import asyncio
    
    
    async def hello():
      while True:
          await asyncio.sleep(0.2)
          print('hello')
    
    async def world():
      while True:
          await asyncio.sleep(0.8)
          print('world')
    
    async def asynchronous():
        tasks = [asyncio.ensure_future(hello()), asyncio.ensure_future(world())]
        await asyncio.wait(tasks)
    
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asynchronous())
    Ответ написан
    Комментировать
  • Как разделить список на список список списков?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Как-то так:
    l = [1, 2, 3, 4, 5, 6]
    l = [[l[i], l[j]] for i, j in zip(range(0, len(l) - 1, 2), range(1, len(l), 2))]
    print(l)


    Update. По наводке aRegius о срезах, вариант с zip() можно сократить так:
    l = [1, 2, 3, 4, 5, 6]
    l = [[i, j] for i, j in zip(l[0::2], l[1::2])]
    print(l)
    Ответ написан
    Комментировать
  • Как исправить проблемы с передачей аргументов в функцию?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Попробуй так:
    import threading
    def whilt(text):
        print(text)
    t = threading.Thread(target=whilt, args=('text larger than one character',))
    t.start()
    Ответ написан
    Комментировать
  • Как спарсить подгружаемый контент с помощью python?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    С помощью Selenium.

    Установка производится так:
    pip install selenium

    Скудная документация есть по ссылке.

    Так же есть серия статей на Хабре "Selenium для Python" от 2015 года:


    Дальше сам.
    Ответ написан
    Комментировать
  • Python, добавить словарь в список?

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

    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
    Ответ написан
    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.
    Ответ написан
    Комментировать
  • Как сделать так чтобы каретка не переходила на новую строку в тернарном операторе?

    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)]
    Ответ написан
    5 комментариев
  • Как преобразовать список с именами методов в список методов в 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
    Ответ написан
    4 комментария
  • Как скачать файлы с сайта?

    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.
    Ответ написан
    5 комментариев
  • Как округлить число в этом коде?

    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/
    Ответ написан
    5 комментариев
  • Как набить руку на 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 -- фреймворк преимущественно для мобильной разработки.

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