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

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Какая-то из переменных price, name, url приходит из парсера со значением None. Чтобы ошибки не было, надо предварительно проверять каждую переменную на None, либо перехватывать ошибку и обрабатывать (так прямее).
    Ответ написан
    Комментировать
  • Бот не считает формулу. Как исправить?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Как я понял, когда бот начинает работать, он обрабатывает зарегистрированные в нем хэндлеры, и ваш хэндлер lake перехватывает всё, кроме явно start и help, поэтому дальше него и не проходит. Я глубоко не вникал, возможно этот момент я неправильно понял.
    Но, в принципе, можно обойтись и этим одним хндлером, просто правильно обрабатывать то, что в него приходит. А приходить в него должно либо выбор кнопки, либо число.
    При выборе кнопки фиксируем номер кнопки и ждем число. Если пришло число - вычисляем, возвращаем, сбрасываем номер кнопки и всё сначала.

    lake_number = 0
    
    
    @dp.message_handler()
    async def lake(message: types.Message):
        global lake_number
        if message.text == 'Бассейн №1':
            await bot.send_message(message.from_user.id, 'Введи расстояние до воды №1.')
            lake_number = 1
        if message.text == 'Бассейн №2':
            await bot.send_message(message.from_user.id, 'Введи расстояние до воды №2.')
            lake_number = 2
        if bool(lake_number) and message.text.isdigit():
            b = int(message.text)
            if lake_number == 1:
                h = 8 - b
                v = (h / 3)
                level = v / 16000 * 100  # тут в формуле где-то ошибка, поэтому я ее просто убрал
                await bot.send_message(message.from_user.id,
                                       str("Количество:" + str(v) + "м3. Глубина:" + str(h) + "м. Наполнение: " + str(
                                           level) + "%"))
            if lake_number == 2:
                h2 = 5 - ((b - 1) * float(0.7))
                s2 = (90 - (b * 0.52)) * (100 - (b * 0.52)) / 2
                n = sqrt(2500 * s2)
                s1 = 1
                g = s1 + n + s2
                v2 = (h2 / 3) * g
                level2 = v2 / 17000 * 100
                await bot.send_message(message.from_user.id,
                                       str("Количество:" + str(v2) + "м3. Глубина:" + str(h2) +
                                           "м. Наполнение: " + str(level2) + "%"))
            lake_number = 0
            await bot.send_message(message.from_user.id, "Попробуй еще...")
    Ответ написан
    4 комментария
  • Как записывать информацию в CSV каждый раз с новой строки?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Добавьте в конец строки \n

    Снова и снова говорю вам: найдите и проработайте «Изучаем Python». Там всё разжёвано.
    Ответ написан
    Комментировать
  • Как правильно добавить индекс?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    images = ['a', 'b', 'c']
    for c in "educative":
        print(f'perehodim_k_sled_bukve {c}')
        for number, image in enumerate(images):
            print(f'буква {c} цикл {number} image {image}')
    Ответ написан
    Комментировать
  • Pytelegrambotapi name 'a' is not defined, почему?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Потому что в глобал оно не объявлено.
    Ответ написан
  • Почему python не понимает selenium?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    попробуйте так:
    by = 'XPATH'
    value = '//*[@id="sf_url"]'
    video_input = browser.find_element(by=by, value=value)

    Для последней версии selenium оно вроде так работает.
    Ответ написан
  • Как построить график по массиву с данными?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Мне кажется, вы плохо искали. Первое, что попалось в гугле, по-моему, вполне подходит.
    Ответ написан
    Комментировать
  • Можно ли прочитать сразу все элементы в json?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В общем, Влад Григорьев прав.
    Надо хотя бы читать документацию по тем библиотекам, которые вы подключаете, и методам, которые используете.

    json это в некотором роде аналог словаря в Python, и json.loads возвращает словарь. Сам словарь это ключи и значения ключей. Могут быть вложенные в значения другие структуры.
    Соответственно, чтобы получить значение, надо обратиться к словарю по ключу
    print(my_dict[“key_name”])
    Если попытаться итерировать словарь в лоб, то будут перебираться ключи. Надо их как-то применять.
    for key in my_dict:
        print(my_dict[key])


    У вас будут возвращаться словари нижнего уровня, вложенные в значения основного словаря. Соответственно, там надо «погружаться» глубже.
    Ответ написан
    Комментировать
  • Как сделать перебор более эффективным(чтоб быстрее выдавало результат)?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    from random import randint
    import time
    
    target_pass = str(randint(1000, 10 ** 4)) #. Генерирую случайный целевой пароль длиной 4 цифры. 
    start_time = time.time()
    int_pass = int(target_pass)
    result = None
    for next_pass in range(10 ** len(target_pass)):
       if next_pass == int_pass:
          result = next_pass
          break
    print(result)
    print(time.time() - start_time)
    
    #  Далее твой код, но без печати (с печатью вообще не дождаться). 
    start_time = time.time()
    password = target_pass
    words = [
       1, 2, 3, 4, 5, 6, 7, 8, 9, 0
    ]
    end_password = ''
    old = []
    length = len(words) - 1
    
    
    def func():
       global end_password
       while end_password != password:
          for i in range(1_0_0_0_0):
             end = ''
             for letter in range(len(password)):
                guess = words[randint(0, length)]
                end += str(guess)
             if end not in old:
                old.append(end)
    
                if end == password:
                   end_password = end
                else:
                   pass
                # print(f'{end}')
          # print(end,end=' ')
    
    
    func()
    print(f'\n\n\n\n\n\tHack : {end_password}    | {(time.time() - start_time)}(sec);')
    Ответ написан
    Комментировать
  • Как сделать чтобы программа после выдачи результата выполнялась повторно?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    def get_repl_txt():
        LAT_TXT = "qwertyuiop[]asdfghjkl;'zxcvbnm,."
        RUS_TXT = 'йцукенгшщзхъфывапролджэячсмитьбю'
        return dict(zip(LAT_TXT, RUS_TXT))
    
    def repl(txt, repl_txt):
        txt = txt.lower()
        for lat in repl_txt.keys():
            txt = txt.replace(lat, repl_txt[lat])
        return txt
    
    repl_txt = get_repl_txt()
    next_str = ' '
    while bool(next_str):
        next_str = input()
        print(repl(next_str, repl_txt))
    Ответ написан
    Комментировать
  • Как записать в файл json именно таким образом?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Во-первых, json.loads принимает на вход строку или байты, а не объект файла. Поэтому надо делать jf_file = json.loads(jfr.read())

    Во-вторых, json.loads возвращает словарь, а у словаря нет метода append, есть метод update. Если вместо append вписать update, будет работать.

    В-третьих, внимательно с отступами - второй with не должен быть внутри первого.
    Ответ написан
  • Как проверить наличие строки в файле?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Попробуйте 'r+'
    вместо а+
    P.s. И не забывайте добавлять в конце строки \n если там его нет.
    Ответ написан
    Комментировать
  • Как сравнить генератор со списком?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В общем случае можно проделать всякие логические штуки с множествами:
    def my_generator(number):
        while number > 0:
            yield number
            number -= 1
            
    gen = my_generator(5)  # теперь в gen генератор от 1 до 5
    my_list = [0, 1, 3, 5]
    print(type(gen))
    set_gen = set(gen) # разворачиваем генератор в множество (если, конечно, влезет)
    set_my_list = set(my_list)
    print(f'gen {set_gen}')
    print(f'list{set_my_list}')
    print(set_gen - set_my_list)
    print(set_my_list - set_gen)
    print(set_gen & set_my_list)
    print(set_my_list & set_gen)
    print(set_gen | set_my_list)
    print(set_my_list | set_gen)
    Ответ написан
    2 комментария
  • Как сделать так, чтобы два числа сравнивались по отношению к третьему числу с помощью цикла while и оператора if-else-elif?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Ваша задача навела меня на следующее
    послеобеденное баловство
    from random import randint
    
    start = 0
    end = 100
    first = randint(start, end)
    print(f'Сгенерировано первое число между {start} и {end-1} включительно')
    second = None
    third = None
    counter = 0
    while not second == third == first:
        counter += 1
        print(f'Попытка {counter}')
        try:
            second = int(input('Введите второе число:'))
            third = int(input('Введите третье число:'))
            print('\n')
            if second >= first:
                print('Второе больше или равно')
            elif second <= first:
                print('Второе меньше или равно')
                
            if third >= first:
                print('Третье больше или равно')
            elif third <= first:
                print('Третье меньше или равно')
        except ValueError:
            print('Ошибка. Повторите ввод.')
        finally:
            print('\n') 
    print(f'Найдено за {counter} попыток.')


    Формально оно соответствует ответу на ваш вопрос, если не слишком придираться.
    Пример же под вашу задачу такой:
    target = 135
    if abs(first - second) == target:
        print("Oh yes!")
    else:
        print("Oh no…")
    Ответ написан
  • Что возвращает sql запрос, если поле пустое?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Измерить длину списка, который возвращает cursor.execute. Если длина вернувшегося списка - ноль, значит курсор в базе ничего не нашёл и перебирать в цикле нечего.
    Ответ написан
  • Как получить в f-строке актуальное значение переменной?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    total_sum = 0
    
    
    def check_string(string):
        try:
            result = eval(string)
            return result
        except SyntaxError:
            while True:
                need_fix = input(f'Обнаружена ошибка в строке: {string}\tХотите исправить? ').lower()
                if need_fix == 'да':
                    string = input('Введите исправленную строку: ')
                    result = check_string(string)
                    return result
                elif need_fix == 'нет':
                    break
                else:
                    print('Ответ не распознан, повторите ввод.')
                    continue
    
    
    with open('calc.txt', 'r') as tasks:
        for line in tasks:
            task = line[:-1] if '\n' in line else line
            task_result = check_string(task)
            if not task_result:
                continue
            total_sum += task_result
        print()
        print(f'Сумма результатов: {total_sum}')

    Замечу в скобках
    Но мне в принципе не нравится такая структура программы, я бы делал по-другому. Рекурсивный вызов функции не оправдан и усложняет понимание.
    Функцию надо бы разбить минимум на две, лучше три маленьких.
    Не люблю все эти break и циклы while True.
    Вечерком попробую сделать, сейчас занят.
    Ответ написан
  • Почему не работает else в пайтоне?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Вместо walrus := поставьте всюду сравнение ==
    Ответ написан
    Комментировать
  • В чем проблема с обновлением переменных?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    О какой именно функции идёт речь, их там три.
    Впрочем, функция updateData вообще не вызывается, а функция rscr объявлена после функции, из которой вызывается, и не доступна из той функции. Вызовет ошибку not defined. До неё просто дело не дошло. Её надо объявить до той функции, из которой вызывается.

    каждый вызов я ее личные переменные приравниваю к общим, изменяю так же

    Этого не происходит нигде. Функция updateData не вызывается в принципе.

    Что касается собственно ошибки, тут есть тонкость.
    С одной стороны, вроде бы функция должна видеть переменную isLogin, объявленную в глобальном пространстве имён.
    isLogin = 0
    r = 1
    def testf():
        print(isLogin)
        
        if isLogin == 0:
            print(1)
    testf()

    Но ты вроде как объявляешь в области видимости функции другую переменную с тем же именем. И она формально перекрывает глобальную внутри функции.
    Но фокус в том, что ты объявляешь локальную переменную после того, как обращаешься к ней. Об этом и ошибка сообщает.

    Не, даже не так. Ты объявляешь наличие локальной переменной, но ветка с этим объявлением не выполняется; поэтому она вроде есть; но дело до неё не дошло. Глобальная перекрыта, а до локальной не дошло.
    .
    isLogin = 0
    r = 1
    def testf():
        if r == 0:
            isLogin = 1  # тут ты объявляешь внутреннюю переменную, которая перекрывает глобальную. 
        if isLogin == 0:
            print(1)
    testf()

    Надо так:
    r = 1
    def testf():
        isLogin = 0
        if r == 0:
            isLogin = 1 
        if isLogin == 0:
            print(1)
    testf()

    или хотя бы так:
    isLogin = 0
    r = 1
    def testf():
        global isLogin
        if r == 0:
            isLogin = 1
        if isLogin == 0:
            print(1)
    testf()
    Ответ написан
  • Как на питоне проверять наличие файла и считать его название?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Если тупо в лоб: считываем список файлов в папке, храним в списке, проводим операцию, создающую новый файл, вновь считываем список файлов в папке и сравниваем с предыдущим состоянием.

    Если процесс создания нового файла длительный (большой файл долго готовится и долго качается и пишется), можно усложнить: во-первых, дождаться изменения, во-вторых, после изменения (создан временный файл) делаем паузу и ещё раз проверяем. Если временный файл уже переименован системой в финальное название, делаем еще паузу и ещё проверку. Если изменений больше не произошло, считаем последнее имя нового файла за искомое.
    Ответ написан
    Комментировать
  • Как вызывать отдельный объект из списка Pyhton?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Если не заморачиваться с Pythonway и делать в лоб, как в школе учили, то можно как-то так:
    my_list = ['a', 'b', 'c']
    answer = None
    while answer not in ['y', 'n']:
        answer = input('Печатать весь список? (y/n)')
    if answer == 'y':
        for l in my_list:
            print(l)
    else:
        while answer not in range(len(my_list)):
            try:
                answer = int(input(f'Какой элемент списка напечатать? (0-{len(my_list)-1})'))
            except ValueError:
                print('Попробуй еще раз')
        print(my_list[answer])

    и - не надо использовать имя list, его использует сам Python.
    Ответ написан