• Что возвращает 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 := поставьте всюду сравнение ==
    Ответ написан
    Комментировать
  • Geopy преобразует из координат адрес. Как убрать лишнюю информацию из адреса и выводить все до информации о городе?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Сходу не нашёл встроенного механизма; возможно, надо покопаться. Но первое, что пришло в голову:
    Если получить данные raw, там будут ключи типа индекса, страны и всякое такое. И можно тупо в строке полного адреса эти значения найти и удалить. Останется то, что не индекс, не страна, не штат и т.п. - т.е. город, улица и дом.
    Ответ написан
    Комментировать
  • В чем проблема с обновлением переменных?

    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.
    Ответ написан
  • Можно ли упростить эту конструкцию try-except?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Не люблю я эти ваши брейки…
    n = None
    while n is None:
      try:
        n = int(input('N = '))
      except ValueError:
        pass
    print(n)
    Ответ написан
    1 комментарий
  • Как сделать последовательный генератор seed фразы?

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

    То, что показано у вас в коде, делается примерно так:
    words = ['abandon', 'ability', 'able', 'about', 'above', 'absent', 'absorb', 'abact', 'absurd', 'abuse']
    
    number = 12
    index = 0
    seed = ' '.join([words[index]] * number)  # повторяет n раз указанный элемент списка через пробел
    print(seed)


    но возможно вы хотели что-то такое:
    words = ['abandon', 'ability', 'able', 'about', 'above', 'absent', 'absorb', 'abact', 'absurd', 'abuse']
    
    import random
    
    start = 0
    length = 12
    stop = start + length
    seed = words[start: stop]
    random.shuffle(seed)
    seed = ' '.join(seed)
    print(seed)
    Ответ написан
  • Почему после спящего режима перестал запускаться компьютер?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Первое, что надо делать - проверять каждый компонент по-отдельности на заведомо исправном оборудовании. При этом надо иметь ввиду, что некоторые неисправные компоненты могут и заведомо исправное оборудование вывести из строя. Поэтому после каждой проверки надо заведомо исправное оборудование тоже проверять.
    Второе - половина проблем с компами проистекает из плохих блоков питания. В своё время я этого не понимал и много проблем с этого имел. Рекомендую приобрести хороший, надежный блок питания, дорогой и как минимум сертифицированный 80 PLUS Bronze - с такими проблем будет минимум. Сам по себе сертификат не даёт гарантии качества, но «дешманские» блоки такую сертификацию не получат. Так что косвенно сертификат существенно повысит вероятность качества.
    Ну и, к сожалению, даже проверка на исправном стенде всех компонентов не даёт гарантии, что они вместе будут корректно работать. Надо проверять, добавляя компоненты по одному.
    Всё это долго и муторно и недёшево, но разумной альтернативы не знаю.
    Ответ написан
    3 комментария
  • Как проверить слово, которое пользователь написал в сообщении в телеграме, на наличие его в базе данных?

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

    Надо сделать по-другому:
    словарь надо индексировать, а именно - получить для каждого слова индекс его на алфавите, отображающий количество каждой буквы алфавита в слове.
    Затем берёте целевое слово, считаете для него индекс и затем из словаря выбираете слова с аналогичным индексом. Создание первичного индекса займёт время, зато потом всё будет почти мгновенно.
    Ответ написан
  • Почему код парсится не полностью Python (selenium)?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Так прокрутите chromedriver-ом страницу до низу. Есть много вариантов - да хоть в цикле жать кнопку pagedown, например, пока всё не прогрузится.
    Ответ написан
    Комментировать
  • Не понимаю, где ошибка при вставке значений в БД программой на Python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Надо привести line, которое у вас есть dict, к типу tuple, например:
    line = {'1': '1_value', '2': '3454358', '3': '3_value', '4': '313123','5':'5_value'}
    data = tuple(line.values())
    print(data)

    и уж полученный кортеж передавать в execute

    ну или так, если брать вашу попытку:
    line = {'1': '1_value', '2': '3454358', '3': '3_value', '4': '313123','5':'5_value'}
    data =(line["1"],line["2"],line["3"],line["4"],line["5"])
    print(data)
    Ответ написан
    4 комментария
  • Как сделать, чтоб в моем компьютере и телефоне не лазили посторонние?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    От этого не избавиться. Вообще. Надо просто принять это и постараться не обращать внимания. Наплевать. Пусть хоть облазятся. И так и гугль и яндекс всё про вас знают. Одним больше, одним меньше… плевать. Пусть подавятся. Им в конце концов надоест, если вы реально плюнете и разотрете.
    Ответ написан
  • Почему отсутствует модуль discord.ext?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Видимо, вы поименовали какой-то ваш файл именем discord.py, а в нём нет объектов по имени ext. Переименуйте ваш файл (например, my_discord.py). Или папка с таким именем есть…
    Ответ написан
  • Как из базы данных выбрать данные и отправить на почту?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Одно из двух: либо добавить в базу поле datetime, либо порядковый номер с автоинкрементом. Первое для вас будет чуток проще.
    Ну а как написать, например, select с sort by и limit, и полученные им данные отправить в почту, это вы уж как-то нагуглите, чтоль.
    Ответ написан
    1 комментарий
  • Как условно (значение в столбце) искать подстроки в другом столбце в цикле python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Я тут накропал
    велосипедик на костылях
    import pandas as pd
    
    
    def get_pairs(keys: list, data: list) -> dict:
        """
        Подготовительная функция
        Раскладывает значения из data по ключам из key в порядке, как в key
        :param keys: ['foo', 'spam', 'foo', ...]
        :param data: [('foo', 'bar'), ('foo', 'baz'), ('spam', 'ham'), ...]
        :return: {'foo': ['bar', 'baz'], 'spam': ['ham'], ...}
        """
        inter_pairs = dict([(key, []) for key in set(keys)])
        while bool(len(data)):
            key, value = data.pop(0)
            inter_pairs[key].append(value)
        return inter_pairs
    
    
    def prepare_next_attr(key: str, value: str, descr: list) -> tuple:
        """
        Служебная функция
        Готовит очередной комплект атрибутов
        для вычисления следующего результата
        :param key:
        :param value:
        :param descr:
        :return: next_key, next_pair, next_descr
        """
        descr = [i.lower() for i in descr]
        next_key = f'{key.lower()}, '
        next_pair = f'{next_key}{value.lower()}'
        next_descr = descr.pop(0)
        return next_key, next_pair, next_descr
    
    
    def get_next_res_item(key: str, value: str, descr: list) -> str:
        """
        Служебная функция
        Готовит результат, сравнивая по Descr
        (тут подгонка if-ами под задание)
        :param key:
        :param value:
        :param descr:
        :return: результат для помещения в список результатов
        """
        next_key, next_pair, next_descr = prepare_next_attr(key, value, descr)
        if next_pair == next_descr:
            res_item = f'{key}: {value};'
        elif next_key in next_descr:
            res_item = f'{key};'
        else:
            res_item = f'{key}'
        return res_item
    
    
    def make_result(keys: list, inter_pairs: dict, descr: list) -> pd.Series:
        """
        Перебирает ключи, получает для каждого очередной результат,
        складывает результаты в pd.Series
        :param keys:
        :param inter_pairs:
        :param descr:
        :return: pd.Series с результатами
        """
        intermedia_result = []
        for key in keys:
            value = inter_pairs[key].pop(0)
            intermedia_result.append(
                get_next_res_item(key,
                                  value,
                                  descr)
            )
        return pd.Series(intermedia_result)
    
    
    if __name__ == '__main__':
        df1 = {
            'Descr': ["VALVE, PRESSURE", "pump ttf", "Valve, electrical", "Geeku, electrical",
                      "VALVE, OVERBOARD, BUTTERFLY"],
            'N_Product': ["VALVE", "PUMP", "VALVE", "GEEKU", "VALVE"],
        }
        df2 = {'N_Product': ["VALVE", "VALVE", "VALVE", "PUMP", "GEEKU"],
               'M_Product': ["PRESSURE", "qwerty", "", "", "ELECTRICAL"],
               }
        target = {
            'Descr': ["VALVE, PRESSURE", "pump ttf", "Valve, electrical", "Geeku, electrical", "VALVE, OVERBOARD, "
                                                                                               "BUTTERFLY"],
            'N_Product': ["VALVE", "PUMP", "VALVE", "GEEKU", "VALVE"],
            'Result': ["VALVE: PRESSURE;", "PUMP", "VALVE;", "GEEKU: ELECTRICAL;", "VALVE;"], }
        df1 = pd.DataFrame(df1)
        df2 = pd.DataFrame(df2)
        df_target = pd.DataFrame(target)
    
        df2_list = list(zip(df2['N_Product'], df2['M_Product']))
        pairs = get_pairs(df1['N_Product'], df2_list)
        result = make_result(df1['N_Product'], pairs, df1['Descr'])
        df1['Result'] = result.values
    
        print(df1)
        print(all(df1 == df_target))

    Он вроде формально решает задачу... но опять же формально это не ответ на вопрос, а подгонка под целевое задание, причем совсем не pandas-way. Ну, чем могу...
    Ответ написан
    Комментировать
  • ПО для компьютерных клубов 2022?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Кстати, знавал я одного товарища, у него было несколько клубов и он написал ПО для своих клубов, потом стал продавать его. Уже лет 20 как его ПО развивается и работает.
    Поищите по названию astalavista.
    Ответ написан
    Комментировать
  • Как переделать код в двумерный массив?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Можно вот так:
    def make_row(size):
        global k
        old_k = k
        k = old_k + size
        return [*range(old_k, k)]
    
    
    if __name__ == '__main__':
        size = int(input('введите размерность массива:'))
        k = 0
        print([make_row(size) for i in range(size)])
    Ответ написан
    Комментировать