Ответы пользователя по тегу Python
  • Почему переменную принимает как None?

    @antares4045
    метод fetchone меняет положение курсора: соответственно если, как вы и утверждаете, для любого id не более одной записи, выведя в консоль строку и не сохранив результат никуда вы, вызвав ещё раз fetchone, гарантировано получаете None

    надо так

    curr.execute(f'SELECT city FROM users WHERE user_id={id}')
    result = curr.fetchone() 
    print(result )
    if result  is None:
       await jam.answer('<b>Введи своє місто:</b> \n\n<i>Доступні міста: \nВінниця, Дніпро, Житомир, Запоріжжя, Івано-Франківськ, Київ, Кропивницький, Луцьк, Львів, Миколаїв, Одеса, Полтава, Рівне, Суми, Тернопіль,  Ужгород, Харків, Херсон, Хмельницький, Черкаси, Чернігів, Чернівці</i>', parse_mode='HTML')
       await Jammer.get_city.set()
    else:
       await jam.answer('Введи назву препарату: ')
       await Jammer.get_name_preparat.set()


    ну или не принтить
    Ответ написан
    Комментировать
  • Почему неправильно вычисляется значение?

    @antares4045
    не уверен, формулу вы не так прочитали, или таб не там поставили, но надо так:
    def func(n, b, y):
        result = 0
        for k in range(1, b+1):
            for j in range(1, n+1):
                result += (j**4-23*k**7)
        for k in range(1, b+1):
            result += ((71*y**3)**5-(56*k**3-y-y**2)**2)
        result = ('%.2E' % result)
        print(result)
        return result


    тогда с вашим ответом сходится
    Ответ написан
    Комментировать
  • Как писать правильнее?

    @antares4045
    первый вариант читабелнее (в терминальных случаях является безальтернативно верным)
    но он порождает новую переменную в контексте вызова, что сказывается как на времени так и на памяти: такой кейс вам приведу

    import datetime
    def fun(a,b):
        return a + b
    def fun2(arg1=1, arg2=2):
        return arg1 + arg2
    print("вариант 1")
    for j in range(10):
        start = datetime.datetime.now()
        for i in range(10000):
            a=fun(5, 6)
            fun2(arg2=a)
        end = datetime.datetime.now()
        print(end - start)
    print("===================")
    print("вариант 2")
    for j in range(10):
        start = datetime.datetime.now()
        for i in range(10000):
            fun2(arg2=fun(5, 6))
        end = datetime.datetime.now()
        print(end - start)

    вывод:
    вариант 1
    0:00:00.006048
    0:00:00.002219
    0:00:00.001937
    0:00:00.001955
    0:00:00.001893
    0:00:00.001886
    0:00:00.001879
    0:00:00.001891
    0:00:00.001895
    0:00:00.001887
    ===================
    вариант 2
    0:00:00.001541
    0:00:00.001551
    0:00:00.001551
    0:00:00.001546
    0:00:00.001564
    0:00:00.001535
    0:00:00.001537
    0:00:00.001546
    0:00:00.001516
    0:00:00.001704


    имеем в среднем раза в полтора разницу по скорости

    что вам важнее в данный момент сильно зависит от конкретной задачи
    Ответ написан
    1 комментарий
  • Как определить линию в python?

    @antares4045
    string = '''lalalala
    lalalaa1
    lalalaa2
    '''
    la = string.split('\n')[0]
    la1 = string.split('\n')[1]
    la2 = string.split('\n')[2]
    
    #ну или
    
    la, la1, la2, *_ = string.split('\n')
    Ответ написан
    1 комментарий
  • Как сделать проверку на присутствие ID?

    @antares4045
    row = collticku.find_one({'_id': guild.id})
    if not row or not ('channel_id' in row):
      return
    channel = guild.get_channel(row.get('channel_id'))
    Ответ написан
  • Как обновить данные psycorp2?

    @antares4045
    db_object.execute(f"UPDATE users SET first_name =? WHERE id =? ", [first_name, user_id] )

    Ну или в крайнем случае

    db_object.execute(f"UPDATE users SET first_name = '{first_name}' WHERE id = '{user_id}' ")

    Почитайте на досуге про sql инъекции: анекдот про студента по имени DROP DATABASE станет понятнее.

    Upd:
    Толи psycopg2, толи cx_Oracle три года назад требовал явно указать тип инжектируемого: тоесть возможно всесто знаков вопроса надо поставить %s
    Ответ написан
  • Как отсортировать массив из массивов по опрделенному элементу?

    @antares4045
    Посмотрите на параметр key у встроеной функций sort и sorted. Они сделаны в первую очередь для решения вашей проблемы.
    Ответ написан
    Комментировать
  • Почему не запускается программа в Google colab?

    @antares4045
    Имя функции -- это один литерал "run program" недопустимо. Исправьте на run_program.
    Ну и двоеточие после декоратора не нужно.
    Ответ написан
  • Keras. LSTM. Input 0 of layer sequential is incompatible with the layer: expected ndim=3, found ndim=2. Чаво?

    @antares4045
    Сразу отмечу, что с tesorfolw никогда не работал, и мой ответ может оказаться оторваным от реальности.

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

    @antares4045
    боты не имеют методов доступа к любой информации о каналах, они имеют хуки: тоесть всё что они могут получить должно отвечать на следующий вопрос: "с момента, когда вы последний раз интересовались, произошли следующие, относящиеся к вам события".
    Если ваш бот в принципе видит сообщения, то он может запоминать последнее, и когда вам надо, радостно его сообщать. Но в общем случае телеграм чуть ли не специально выстраивал api ботов так, чтобы ваша задача была не решаема, если владелец канала не заинтересован в содействии вам.

    Скорее вам надо обратить внимание в сторону полноценных телеграмм клиентов, выполняющихся от имени полноценных пользователей, как например Pyrogram.
    Ответ написан
    Комментировать
  • Как задать глобальное динамическое имя переменной?

    @antares4045
    вообще то кусок кода из вопроса полностью валиден и строчка
    globals()[VariableName] = VariableValue
    действительно создаёт глобальную переменную -- если у вас не работает, то вы не там ищете.

    Но, присоединюсь к Сергею: лучше создайте глобальный словарь и складывайте в него.

    ozonBrowsers = dict()
    @dp.message_handler(lambda message: message.text == "Авторизоваться")
    async def login(message: types.Message):
      user_id = message.from_user
      ozon_user = 'ozon_user_{0}'.format(user_id['id'])
      ozonBrowsers[ozon_user ] = browser.OzonBrowser(user_id['id'])
      markup = types.ReplyKeyboardRemove()
      await Form.login.set()
      await message.reply("Укажи логин для входа начиная 9", reply_markup=markup)
    Ответ написан
    Комментировать
  • Как подключить Python к Postgresql внутри Docker-а?

    @antares4045
    host = "172.22.0.2"
    Замените на
    server="db"
    Или
    host="db"
    (Точно пайкопгвский синтаксис не помню)
    И это вам не помешает, но явным созданием бридж сети и биндом сервисов к ней вы воспроизвели поведение по умолчанию, тоесть написали много всего лишнего.
    Ответ написан
    3 комментария
  • Как увеличить допустимое число вводимых знаков?

    @antares4045
    Возможно это не финал решения, но из нашего общения в коментариях я вынес предположение, что строка у вас хранится в виде

    "абвгдежзийклмнопрстуфхцчшщъыьэюя"

    дальше суть проблемы:
    position =alphabet.find('я') # 31
    newPosition = position + key # 36
    alphabet [newPosition] # ааааа! нет такой буквы

    предпологаю, что вы хотели забацать шифр соломона, в котором при переходе через край счёт начинается заново

    position =s.find('я') # 31
    newPosition = (position + key) % len(alphabet) # 4
    alphabet [newPosition] # д


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

    А из-за чего сдвиг шифра неправильный без понятия: скиньте ка свой алфавит.
    Ответ написан
    4 комментария
  • Так включается многопоточность?

    @antares4045
    у вас же не сработает -- попробуйте. такого параметра даже нет.
    Зато есть check_same_thread (который кстати позволит пойти по "пути А" из моего ответа на ваш предыдущий вопрос про sqlite)
    Ответ написан
    6 комментариев
  • Задача по Python с использованием словаря?

    @antares4045
    вопрос из серии какой цвет выбрать для обоев: сейчас получите от человека по способу.
    Я сегодня ленивый:
    marks = {
        'a' : [1,2,3],
        'b' : [0,1,2],
        'c' : [5,6,6],
        'd' : [4,4,4]
    }
    
    def mean(lst):
        return sum(lst) / len(lst)
    
    sortedIds = sorted(marks.keys(), key=lambda studentId: mean(marks[studentId]))
    
    print('лучший:', sortedIds[-1])
    print('худший:', sortedIds[0])

    Вывод:
    лучший: c
    худший: b
    Ответ написан
    3 комментария
  • Как заставить бота отправлять рандомную картинку из папки, Python Aiogram?

    @antares4045
    если список плоский, то os.listdir
    если с подпапками os.walk
    потом открываем файл папки как байтовый поток и с правильным mime пересылаем (этот пункт возможно сделать и проще, но так прозрачнее)
    Ответ написан
  • Как получить рабочую категорию Linux (Ubuntu)?

    @antares4045
    os.getcwd() -- это путь до места из которого была отдана команда на запуск скрипта
    что может совсем не совпадать с путём до скрипта
    я обычно юзаю os.path.dirname(__file__) -- ещё ни в одной os меня не подвело
    Ответ написан
    2 комментария
  • В чем заключается ошибка RecursionError в функции-декоратор?

    @antares4045
    в wrapper_1 должно вызываться func а не summator:
    у вас получилось, что сумматор заменён на враппер вокруг чего-то, что вызывает сумматор, который в свою очередь является враппером вокруг сумматора... и так до бесконечности
    Ответ написан
    Комментировать
  • Как чётко распознать текст с капчи?

    @antares4045
    61721e3575f7d636235081.png
    Вот эта нейрнока.
    Только конкретно эта сеть натаскана на китайский язык (даже не буду показывать, как она это прочитала). Это скорее доказательство работоспособности.
    Ответ: CTPN для обнаружения слов на картинке; CRNN для распознавания слов.
    Переучите на русский и будет вам счастье.
    Ответ написан
  • Как работать с общим списком в многопользовательском приложении?

    @antares4045
    Точка входа в приложение (запускаемый python-скрипт) должна быть одна: при входе или запуске пользователь вводит свой id (или он генерируется на основании неких косвенных признаков). Для хранения данных необходимо использовать базу данных. причём, учитывая что вы сразу захотели многопользовательское приложение, необходимо поднять полноценный сервер базы данных (простенький sqlite не прокатит).
    Если вы не знакомы с sql, рекомендую начать с знакомства с mongodb и способа взаимодействия с ним через python. Если всёже знакомы, то лучше будет поднять инстанс mysql/postgress/или что вы там знаете, вооружиться библиотекой pyodbc и начать постигать мир полноценного промышленного программирования.

    UPD: ответив решил исследовать, нельзя ли стандартный sqlite3 запустить в мультипроцесном режиме -- оказалось костыль есть.

    Подключение к базе блокирует другие подключения и они ждут, пока файл освоботится с задержкой timeout. так что если соединения постоянно открывать-зарывать, то сразу несколько процессов могут работать с одной базой (теоретически её можно коннект в picke положить, но это злая идея).
    Вот такой код по идее должен справляется с парой десятков пользователей (а главное: никакого сервера):
    import sqlite3
    import os
    import sys
    import random
    import time
    from datetime import datetime
    
    TIMEOUT_DELAY=10
    
    CURRENT_DIRECTORY = os.path.normpath(
        os.path.relpath(
            os.path.dirname(__file__),
            os.getcwd())
        )
    DB_PATH = os.path.normpath(os.path.join(CURRENT_DIRECTORY, './db/lists.db'))
    
    
    
    def initBase():
        with sqlite3.connect(DB_PATH) as connect:
            cursor = connect.cursor()
            cursor.execute("""
    CREATE TABLE lists(
        userid INTEGER primary key,
        value INTEGER
    )
    """)
            connect.commit()
    
    
    
    if not os.path.exists(DB_PATH):
        os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
        initBase()
    
    
    ID = None
    if len(sys.argv) > 1:
        ID = int(sys.argv[1])
    else:
        ID = int(datetime.now().timestamp() * 1000) % 10000 + 10000
        print(f'ID не передан. сгенерирован идентефикатор {ID}')
    
    
    while True:
        with sqlite3.connect(DB_PATH, timeout=TIMEOUT_DELAY) as connect:
            cursor = connect.cursor()
            cursor.execute("""SELECT userid, value FROM lists""")
            print(cursor.fetchall())
            x = random.randint(100, 999)
            cursor.execute("""
    INSERT INTO lists(value, userid)
    VALUES (?, ?)
    ON CONFLICT(userid) DO UPDATE SET
    value=?
    WHERE userid=?
    """, [x, ID]*2)
            connect.commit()
        time.sleep(1)


    открыл 3 консоли и запустил
    python3 __main__.py
    python3 __main__.py 1
    python3 __main__.py 2
    вроде работает):
    616e00f12619c652105096.png

    Но лучше всеравно так не делать, а использовать всёже нормальный сервер бд
    Ответ написан
    1 комментарий