Ответы пользователя по тегу Python
  • Почему DB browser for sqlite и питон выдают разные результаты запроса?

    Maksim_64
    @Maksim_64
    Data Analyst
    контекстный менеджер делает commit но не закрывает базу. То есть ты должен закрывать соединение самостоятельно close(). https://docs.python.org/3/library/sqlite3.html#sql...
    например
    import sqlite3
    con = sqlite3.connect("tutorial.db")
    cur = con.cursor()
    cur.execute("CREATE TABLE movie(title, year, score)")
    cur.execute("""
        INSERT INTO movie VALUES
            ('Monty Python and the Holy Grail', 1975, 8.2),
            ('And Now for Something Completely Different', 1971, 7.5)
    """)
    #con.commit()
    print(cur.execute("SELECT * FROM movie").fetchall())

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

    То есть у тебя только один commit (не явный посредством контекстного менеджера коммитит все что в теле контекстного менеджера) и два insert (второй то вне тела контекстного менеджера), соответственно последний insert не записывается в базу.

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

    Maksim_64
    @Maksim_64
    Data Analyst
    выполнять до те пор пока:
    l не равно k или l не равно km или lm не равно k или lm не равно km
    То есть если хотя бы одно из вышеперечисленных условий истинно выхода не произойдет.
    сделай print каждой переменной и посмотри, как минимум одно из твоих условий истинно, и выхода из цикла не происходит.

    если у тебя в твоих условиях или (or) и в списке хоть один True, то общее выражение будет True.
    Ответ написан
    1 комментарий
  • Как быстро распарсить много json файлов на python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну во первых, pandas read_json и json_normalize (для вложенных json). Затем этот фрейм или подсет фрейма отправляешь в базу, методом to_sql если все делаешь правильно с точки зрения pandas (весь код будет без единого цикла) то это ускорит очень серьезно. Еще больше можно ускорить библиотекой polars она имеет схожий синтакс с pandas у ней куда меньший функционал по манипуляции данных, но она фокусируется на скорости в том числе и чтения файлов.

    Думаю скорости pandas будет достаточно, если нет то polars. Начать лучше с pandas документация очень хорошая, да и кода всего ничего будет.
    Ответ написан
    1 комментарий
  • Как накинуть несколько эффектов MoviePy на видео?

    Maksim_64
    @Maksim_64
    Data Analyst
    Несколько странный кусок кода у вас, отступ за чем-то в принципе должен давать ошибку и не работать. С библиотекой я не работал не разу, но глянув документацию, вот что она говорит.
    класс CompositeVideoClip, это для создания из нескольких видео одного. Если же говорить о наложении эффектов на видео то.
    from moviepy.editor import *
    clip = (VideoFileClip("myvideo.avi")
            .fx( vfx.resize, width=460) 
            .fx( vfx.speedx, 2) 
            .fx( vfx.colorx, 0.5))
    то вот пример из документации для применения нескольких эффектов к видео. Вместо этих эффектов, поставьте ваши или добавьте по необходимости. Думаю код предельно понятный.

    Все эффекты и трансформации на видео доступны здесь https://zulko.github.io/moviepy/getting_started/ef...
    Ответ написан
    Комментировать
  • Список из кортежей в словаре - как это понимать?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри объявлять таким образом словарь не нормально, это не удобно.А вот если у тебя в результате каких то действий сначала создался объект список с кортежами где длинна кортежа обязательно два (содержит два элемента) то dict(мой список с кортежами), создаст из этого списка с кортежами словарь и это абсолютно нормально.

    Сам код откуда ты его взял, взят для демонстрации создания словаря из популярной структуры данных список с кортежами. У тебя есть ассоциации например l1 = [1,2,3] создаст список, для создания не пустого словаря требуется и ключи и значения, по этому ты либо создаешь его явно d1 = {'A':1,'B':2} либо нужна структура из которой python сможет понять что будет ключами, а что значениями. И список с кортежами (где длинна каждого кортежа обязательно два) такая структура.
    Ответ написан
    Комментировать
  • Как исправить ошибку в работе с turtle?

    Maksim_64
    @Maksim_64
    Data Analyst
    Код абсолютно рабочий. Проверяй, не знаю может, когда ты писал square(bob) ты каким то образом использовал русскую 'о' или когда объявлял. Или может файл, когда писал после какого то запуска, когда ты добавил эту переменную то забыл сохранить изменения.
    Ответ написан
    Комментировать
  • Как в Python можно изменить запись в CSV?

    Maksim_64
    @Maksim_64
    Data Analyst
    Нет ничего проще для такой задачи чем использовать pandas.
    Вот сделал игрушечный пример, сначала создаю csv в первой части для демонстрации, потом обновляю любые подсеты данных, при вводе пользователя.
    import pandas as pd
    # Первая часть создание файла
    df = pd.DataFrame({
        'Name':['Petr','Maks','Aleksandr'],
        'Age':[30,40,50],
        'Salary':[500,700,600]
    })
    df.to_csv('data.csv', index=False)
    
    # Вторая часть обновление
    name = input('Введите Имя, чьи данные хотите изменить?  ')
    fields_to_change = input('Какие данные Вы хотите изменить? например Age, Salary: ').split(',')
    data_to_update = {}
    for field in fields_to_change:
        data_to_update[field] = input(f'Введите {field}: ')
    
    df = pd.read_csv('data.csv').set_index('Name')
    df.loc[name, fields_to_change] = data_to_update
    df.to_csv('data.csv')
    print('Спасибо, данные обновлены')

    Вторая часть это непосредственно код который будет обновлять. То есть та часть которая тебя интересует.
    Ответ написан
    2 комментария
  • Как исправить код? Что я делаю не так?

    Maksim_64
    @Maksim_64
    Data Analyst
    Попробуй другой распознаватель речи не google.
    Вот глянь код https://github.com/Uberi/speech_recognition/blob/m... там используются разные распознаватели в том числе и google. Поработай с ним, если начало что то получаться, то тогда начинай настраивать уже под свои нужды.
    Ответ написан
  • Поиск по большим файлам python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если файл 2гб чем pandas то не устраивает, можно еще и pandas ускорить использовать polars, у него схожий синтакс c pandas но поддерживает параллельное выполнение. Что для pandas что для polars такие выборки это будет одна коротенькая строчка кода.

    2гб не проблема в память загрузить, но и если бы файл был на много больше и pandas и polars поддерживают чтение файлов по частям. Вообще если нужна серьезная скорость, polars ,будет номер один там не numpy массив, а Rust Arrow. Не факт что тут polars нужен, ну вот глянь https://www.makeuseof.com/pandas-vs-polars-which-i... на сколько pandas быстрый, но polars выборка рядов по условию в 5 раз быстрее, а например применение функции, к столбцу или фрейму в 30 раз быстрее.
    Ответ написан
    Комментировать
  • Как получить доступ к свойству объекта JSON не зная его название?

    Maksim_64
    @Maksim_64
    Data Analyst
    Можно использовать pandas. Нормализовать json, кода всего ничего будет.
    import requests
    import json
    import pandas as pd
    response = requests.get(url="https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=Apple")
    info = json.loads(response.text)
    df = pd.json_normalize(info)
    print(df.iloc[:,-1][0])


    Более правильный способ будет брать колонку не iloc а regex выраженим в pandas так можно, потому что, название колонки будет содержать весь путь до extract и заканчиваться на exctract. То есть возможна более сложная и стабильная выборка. То есть вот так
    print(df.filter(regex='extract$',axis=1).iloc[0,0])
    Результат идентичный, но так на много надежнее, мы не надеемся что нужная нам колонка последняя, а находим ее независимо от ее положения.
    Ответ написан
    Комментировать
  • Правильно ли я понимаю устройство классов в python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Нет у тебя абсолютно не правильное представление по все пунктам. Написание хорошего ответа на каждый вопрос потребует дней, при том что на все эти темы можно разговаривать на совершенно разных уровнях. Если хоть как-то в двух словах.
    1. OOP одна из парадигм в программировании в том числе поддерживаемая python.

    2. Объект это python абстракция для данных, все данные в python представлены в виде объектов или взаимоотношений между объектами. Отсюда и выражение все в python является объектом.

    3. В python каждый класс не явно наследуется от object класс. Да даже если мы не переопределим явно __init__ то он там есть. Например
    class MyClass:
        pass
    my_instance = MyClass()
    print(dir(my_instance))
    Там будет в том числе __init__ хотя мы его явно не определяли. __init__ это конструктор класса там могут быть заданы атрибуты которые будут в области видимости экземпляра класса, с которыми будут оперировать методы экземпляра класса, он выполнится при создании экземпляра класса.

    4. По скольку, ты еще совсем новичок, понятия "приватных" и "защищенных" атрибутов обсуждать совсем бессмысленно, к тому же их "приватность" она в ковычках, в python нет способа создать настоящий приватный атрибут, но это все совершенно лишнее для тебя сейчас и в обозримом будущем.

    5. В зависимости от того является ли определенный метод методом класса или методом экземпляра класса, то первый позиционный параметр метода это класс или экземпляр класса. Между программистами python их принято называть cls - для класса, self - для экземпляра класса. Так как ты в начале пути будешь работать с методами экземпляра класса, да и необходимость создавать методы класса она значительно реже.

    Не думаю что тебе хоть что то стало понятней. По этому бери и изучай понимание будет приходить медленно и со временем, а не пытайся понять все вопросы на раз два.
    Ответ написан
    3 комментария
  • Почему не получается передать значение в экземпляр класса?

    Maksim_64
    @Maksim_64
    Data Analyst
    А почему он должен? Где ты объявил screen? У тебя есть self.screen, вот его и передавай.
    Ответ написан
    Комментировать
  • Как можно удалить фон или получить координаты кругов?

    Maksim_64
    @Maksim_64
    Data Analyst
    Очевидно нужно играть с параметрами. Например для первой картинки
    detected_circles = cv2.HoughCircles(gray_blurred,
                                        cv2.HOUGH_GRADIENT, 1, 45, param1=75,
                                        param2=25, minRadius=8, maxRadius=36)

    Даст улучшение в обнаружении, для первой картинки.
    param2 - чем меньше тем больше False окружностей он обнаружит. param1 - что то очень специфическое и каких то либо паттернов при увеличении или уменьшении я не заметил, ну остальное вроде понятно. Стало интересно, глянул так же в интернете, собственно везде приблизительно одно и тоже подбор параметров.
    Ответ написан
    Комментировать
  • Является ли данный код решением задачи о рюкзаке?

    Maksim_64
    @Maksim_64
    Data Analyst
    Смотря в чем задача конкретно, задача рюкзака это общее название.
    У тебя код осуществляет попытку найти максимальную ценность предметов при условии, что в рюкзак можно положить 4 кг. На твое тестовом сете он работает правильно, если я изменю тестовый сет то нет. Например если я сделаю
    =[(4000,4), (2500,1),(2000,3), (8000, 2), (9000, 4), (7000,2)]
    То я ожидаю ценность 15000, а он дает все равно 10500.
    Я бы рекомендовал тебе статью https://www.geeksforgeeks.org/0-1-knapsack-problem... там несколько имплементаций в том числе и рекурсивный, и оптимизированный динамический, и на нескольких языках.

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

    Maksim_64
    @Maksim_64
    Data Analyst
    Когда требуется вернуть несколько значений то их собирают в коллекцию например список, кортеж и возвращают. Например return img, gray перед возвращением будет создан объект кортеж и затем возвращен туда откуда была вызвана функция.
    инструкция return означает выход из функции, при условии что функция не рекурсивная (там return может останавливать рекурсию, но не обязательно выходить из функции). Твоя функция обычная и в ней есть два return

    То есть по идее ты хочешь сделать два альтернативных условия выхода из функции при этом в ней нет не каких условий. Он дойдет доreturn lab_gray при чем первый раз он и цикл то не выполнит весь если там больше одного элемента вернет значение и выйдет из функции. При условии что объект по которому ты итерируешься не пуст, иначе он пропустит цикл и вернет return img, gray

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

    Сама конструкция твоей функции выглядит бессмысленной, так что изучай python. Просто простой python.
    Ответ написан
  • Как вывести строку из csv файла без лишних символов на python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну если оставить всю твою логику, то можно просто отфильтровать, пустые строки из результатов которые он находит.
    matching_rows.append([x for x in row if x])
    Ответ написан
    Комментировать
  • Задачка про строки, индексы в Python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Как в Python найти индекс введенного числа без учета регистра
    Какие у чисел регистры?
    Если же речь про буквы. То метод lower надо применить и к строке в которой ты ищешь.
    a = 'Hello World'
    b = input().lower()
    print(a.lower().find(b))
    Ответ написан
    2 комментария
  • Рекурсивный вызов в цикле?

    Maksim_64
    @Maksim_64
    Data Analyst
    x - равняется 0 в твоем коде. Перенеси print(x) в самый верх и увидишь. Рекурсия это бесконечный цикл вызова функцией самой себя, до тех пор пока базовое состояние не прервет его (одно или несколько). None ты в конце видишь потому что это printтебе его возвращает, у тебя уже есть print внутри функции.
    def f(x):
        print(x)
        if x==0:
            return 
        else:
            f(x-1)         
    f(3)
    . В твоем случае он тоже выйдет и return 0 он выполняет, замени return на pass и получишь бесконечную рекурсию.

    Насчет None у тебя вот такая ситуация print(print(1))

    ОТРЕДАКТИРОВАНО После дискусии с Zzzz9, выяснилось, что я не прав насчет None. Базовый кейс в рекурсии останавливает рекурсию, но не выходит из функции. Что бы мы вернули значение базового кейса нам нужно добавить return к рекурсивному случаю. Например
    def f(x):
        if x==0:
            return 100
        else:
            f(x-1)
    print(f(3))

    Вот так выход из рекурсии настает, но рекурсивный кейс не имеет return и функция вернет None а вот в такой вариации
    def f(x):
        if x==0:
            return 100
        else:
            return f(x-1)
    print(f(3))
    Функция вернет 100. Насчет print я полную глупость написал, он возвращает None и я подумал, что это имеет место. Глупость полная. если мы добавляем return к рекурсивному кейсу то выведет то что возвращает базовый кейс. А базовый кейс только останавливает рекурсию но не выходит из функции.

    Насчет цикла если мы добавим return к рекурсивному кейсу то for цикл выполнится только один раз, потому что базовый кейс остановит рекурсию а рекурсивный кейс имеет return соответсвенно, функция напечатает изменение x + один добавочный 0, который возвращает return в базовом кейсе. Например
    def f(x):
        print(x)
        if x==0:
            return 'Конец'
        for i in range(10):
            return f(x-1)
    print(f(3))
    Цикл выполнится лишь раз и затем выход из функции.
    Ответ написан
  • Как сделать оформление словаря в txt файле и вычитывание значений из этого файла?

    Maksim_64
    @Maksim_64
    Data Analyst
    Когда мы храним информацию в файлах, то эта информация имеет определенную структуру. Вот это RPG = Dragon_Age, The_Elder_Scrolls_Skyrim Плохая структура, которая потребует парсинга, сами себе создаем проблемы.

    Мы можем использовать например json для создания хранения.
    import json
    data = {
        "RPG": ["Dragon_Age", "The_Elder_Scrolls_Skyrim"],
        "Action": ["Grand_Theft_Auto_V", "Watch_Dogs"],
        "MMORPG": ["Lineage_2", "Aion"],
        "Shooter": ["Bulletstorm", "Splinter_Cell"],
        "Racing":["Need_For_Speed_Payback", "Blur"]
    }
    
    with open("data.json", "w") as f:
        json.dump(data, f)

    Здесь, мы создаем файл определенной структуры. Из которого нам будет легко извлекать информацию.

    with open('data.json', 'r') as f:
        json_object = json.load(f)

    Все вся наша информация в словаре. С которым нам удобно работать.

    Теперь по поводу случайного выбора. Вы мало информации представили, по этому поводу. Выборка может происходить с заменой Выбрав элемент, я его возвращаю обратно и он может быть выбран снова. без замены Выбрав элемент он больше не может быть выбран снова. Информации как вы хотите осуществлять выборку вы дали мало. Например я могу использовать shuffle (перемешать элементы) и выбирать элемент c нулевым индексом всегда.
    from random import shuffle
    genres = list(json_object.keys())
    shuffle(genres)
    genre = genres[0]
    print(f'Вам выпал жанр: {genre}')
    games = json_object[genre]
    shuffle(games)
    game = games[0]
    print(f'Вам выпала игра: {game}')

    Это будет выборка с заменой. Мы можем использовать вместо выборки по индексу метод pop у списка и получим эффект выборки без замены (Но надо понимать объект json_object будет изменяться). Можно пойти и вашим путем. Осуществлять выборку индекса и выбирать по индексу, тоже нормальное решение.

    В общем основная проблема это не верно выбранная структура.
    Ответ написан
    Комментировать
  • Какие проекты можно сделать для повышения уровня в Пайтоне?

    Maksim_64
    @Maksim_64
    Data Analyst
    Знание данных функций (при чем ставить их в один ряд не стоит lambda это инструкция для объявления безымянной функции, в то время как другие имеют вполне конкретные предназначения) вряд ли приблизит вас к освоению python, map, zip возвращают итераторы. Уметь применить zip или map это одно, а вот понимать это уже совершенно другое.

    Вам нужна книга по python, какая именно так на этот вопрос здесь отвечали уже много раз. Книга будет иметь структурность, и во время изучения, если какая то тема вызывает трудности, то можно почитать отдельно статьи или задавать вопросы.

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