Вывод более одной переменной при помощи bot.send_message() aiogram
Пишу тг бота, возникла серьезная проблема. Мой вопрос прост: как отправить юзеру не одну, а несколько переменных при помощи bot.send_message()? Смущает именно синтаксис. Я попытался реализовать вывод данных из словаря так:
<code>
await bot.send_message(message.from_user.id, 'Фамилия: %s' % vlnt_data['surname'] ' Имя: %s' % vlnt_data['name'])
</code>
Выводит трейсбэк: неправильный синтаксис. Пожалуйста, помогите!

Выбирайте вариант. Все делают одно и то же:
<code>
vlnt_data = {'surname': 'Иванов', 'name': 'Иван'}

print('Фамилия: %s' % vlnt_data['surname'] + ' Имя: %s' % vlnt_data['name'])
print('Фамилия: %s Имя: %s' % (vlnt_data['surname'], vlnt_data['name']))
print('Фамилия: {} Имя: {}'.format(vlnt_data['surname'], vlnt_data['name']))
print(f"Фамилия: {vlnt_data['surname']} Имя: {vlnt_data['name']}")
</code>


нужно заменить ключ в словаре так, чтобы сохранить порядок Python
запарсил погоду на неделю и дни к которым эта температура относится, проблема в том что 3 слова не с тем окончанием что мне нужно, а именно - 'среда', 'пятница', 'суббота'. Нужно чтобы у этих ключей было окончание 'среду', 'пятницу', 'субботу'. вот код:
<code>
def weather(soup):
    weather = soup.find_all('div', class_='day-temperature')
    days = soup.find_all('div', class_='day-week')
    only_days = [d.text.lower() for d in days]
    only_int = [w.text for w in weather]
    w_week = {}
    for i in range(len(only_days)):
        w_week.update({only_days[i]: only_int[i]})

   print(w_week) #{'суббота': '+26°', 'воскресенье': '+26°', 'понедельник': '+28°', 'вторник': '+22°', 'среда': '+23°', 'четверг': '+21°', 'пятница': '+21°'}
</code>
данные в словаре динамические и меняются в зависимости от изменений на странице откуда производится парсинг, поэтому при замене ИМЕННО ЭТИХ СЛОВ они должны оказаться на том же месте где и были в словаре. Помогите пожалуйста, а то я уже буксую

Я решил так. Возможно не самый оптимальный вариант.
Поясню: Я запускаю цикл с копией словаря и на каждой итерации беру ключ и значение из словаря. Дальше проверяю, если ключ (в данном случае день недели) находится в списке для изменения, я вырезаю значение, сохранив его в буфер. Далее я просто создаю ещё один ключ в словаре с уже изменённым окончанием. Для остальных ключей, которые не нужно исправлять, просто повторяю операцию без изменения окончания (для того чтобы элементы остались на своих местах).
<code>
w_week = {'суббота': '+26°', 'воскресенье': '+26°', 'понедельник': '+28°', 'вторник': '+22°', 'среда': '+23°', 'четверг': '+21°', 'пятница': '+21°'}

for key, value in w_week.copy().items():
    bufer = w_week.pop(key)
    if key in ["среда", "пятница", "суббота"]:
        w_week[key[:-1]+"у"] = bufer
    else:
        w_week[key] = bufer
print(w_week)
</code>


как строку превратить в словарь
Есть такой код
<code>
ast = '{"default-offer":{"isCutPrice":false,"isDSBS":false,"isDigital":false,"isBnpl":true,"isCredit":false},"skuId":"100590525029","offerId":"F_fu7ZtYnIRnY0Nm3U0OMg","price":14660,"oldPrice":16289,"productId":14265117,"wareId":"F_fu7ZtYnIRnY0Nm3U0OMg","feedId":475690,"shopId":431782,"supplierId":431782,"isExpress":false,"isAnyExpress":false,"shop_sku":"7217","isBnpl":true,"isCredit":false,"isInstallments":false,"warehouseId":98615,"businessId":696611,"isFoodtech":0,"hasBadgeNew":false,"hasBadgeExclusive":false,"hasBadgeRare":false,"promos":[],"brandName":"yandex-market","hasAddress":0,"showUid":"16573804368590675893100001"}'
atr = eval(ast)
</code>
Пробовал превратить строку в словарь  через eval, ошибку получаю из за того что false  и true c маленькой буквы, мне нужно каждый раз их с большой буквы написать, как я могу это сделать?
от этого словаря мне нужно только одно значение price, если я получу это значение не надо даже превращать в словарь


Как отправить в FSM номер нажатой кнопки?
Как отправить в FSM номер нажатой кнопки?
Будет несколько шагов в FSM, и надо чтобы во всех шагах name1, name2 можно было прочитать переменную с номером нажатой кнопки.
<code>
class states(StatesGroup):
    name1 = State()
    name2 = State()

@dp.callback_query_handler(text='edit')
async def edit(query: CallbackQuery):
    sql_data = get('SELECT * FROM table ...')
    keyboard = InlineKeyboardMarkup()
    for i in len(sql_data):
        keyboard.add(InlineKeyboardButton('text', callback_data = i)) # здесь

    await query.message.edit_text('text', reply_markup=keyboard)
    await states.name1.set()

@dp.message_handler(state=states.name1)
async def name1(message: types.Message, state: FSMContext):
    ii = i # присвоить ii значение из i из предыдущего хэндлера
</code>

for i in len(sql_data):
    keyboard.add(InlineKeyboardButton(f'button {i}', callback_data = f"prefix:{i}"))

@dp.callback_query_handler(text_startswith="prefix:")
async def name_func(call: types.CallbackQyery, state: FSMContext):
    async with state.proxy() as data:
        data["pressed_button"] = call.data.split(":")[1]
    print(call.data.split(":")[1])
    # вот и номер кнопки


edit message caption handler python telebot

bot.edited_message_handler(func=lambda m: True) не работает при изменении описания файлов, фото, видео т.д., только при изменении текстовых сообщений. Как я могу реализовать handler для получения события изменения caption в telebot?

Думаю такой хендлер впитает всё
<code>
from telebot import TeleBot, types

import config

bot = TeleBot(config.BOT_TOKEN)

CONTENT_TYPES = ["text", "audio", "document", "photo", "sticker", "video", "video_note", "voice", "location", "contact",
                 "new_chat_members", "left_chat_member", "new_chat_title", "new_chat_photo", "delete_chat_photo",
                 "group_chat_created", "supergroup_chat_created", "channel_chat_created", "migrate_to_chat_id",
                 "migrate_from_chat_id", "pinned_message"]

@bot.edited_message_handler(content_types=CONTENT_TYPES)
def handle_edit(message):
    print(message)

bot.polling(none_stop=True)

if __name__ == '__main__':
    bot.infinity_polling(skip_pending=True)
</code>


Запуск файла, а затем его закрытие
Мне нужно, чтобы запустился аудиофайл и через некоторое время закрылся. Запускал через os.startfile, но через него нельзя сделать закрытие. Есть ли какая-нибудь альтернатива?

Смотрим через какую программу запускается аудиофайл. Например через
Groove Music.
Далее открываем Диспетчер задач --> Детали.
Открываем
Groove Music, смотрим что добавилось в колонке Имя.
У меня добавляется:
Music.UI.
Теперь мы знаем как называется файл играющий музыку.
Далее используем эту команду:

import os
os.system("TASKKILL /F /IM <имя процесса>.exe")

В моем случае это:

os.system("TASKKILL /F /IM Music.UI.exe")

Программа закрывается.


Как реализовать прибавление значения AioGram?
Есть телеграм бот написанный на Python и AioGram. Каждую секунду пользователю необходимо прибавлять некое число в базу данных.
Логика работы простая:

Бот забирает старое значение из БД.
Прибавляет к нему определенное число, например 1.
Записывает новое значение обратно в БД.
Как можно реализовать такой функционал? Чтобы это работало для каждого пользователя бота, их может быть 1000+. Думаю использовать Threading или Multiprocessing, но может быть есть более лучшее решение?

Можно использовать подход, который позволит избежать постоянного обновления баланса счета для многих пользователей.
Идея в том, чтоб храните последний баланс
balance и дату
last_balance_calc_time когда его считали. При чтении с БД вы всегда можете посчитать сколько времени прошло с
last_balance_calc_time  и сколько с тех пор денег должно добавиться. Т.е. вы не храните деньги числом, а расчитывайте из значения
balance,
last_balance_calc_time и текущего времени. При приходе/расходе пересчитывайте текущий баланс и сохраняйте его вместе с текущим временем.
Дополнительно, можно пересчитывать баланс регулярно. Если делать это раз в секунду, то получится то, что вы хотите (учтите только, что с запуском может быть задержка, так что лучше смотрите на время прошедшее от прошлого пересчета). Можно запускать реже или вообще только при изменениях баланса.
Собственно регулярный запуск потока для пересчета делайте, как описано тут ru.stackoverflow.com/a/1418626/218971.
Имеет смысл одним запросом сразу всем пользователям добавлять деньги запросом типа такого:

update user_money
   set balance = balance + rate * (current_time() - last_balance_calc_time),
       last_balance_calc_time = current_time()


Как сделать так,чтобы человек для одного ответа могу задавать несколько вопросов?
Мне нужно, чтобы кроме "таблица умножения" бот так же реагировал на "табличка умножения"(к примеру),какой метод использовать, ибо в моем выдает ошибку
<code>
elif message.text == 'Таблица умножения', 'Табличка умножения':
            photo1 = open('3ebc0dfa867e344cf30d81409cfd7558.jpg', 'rb')
            bot.send_photo(message.chat.id, photo1)
</code>

<code>
elif message.text in ['Таблица умножения', 'Табличка умножения']:
</code>
Допустим так


Sqlite3 Как проверить существование записи?
Когда перезапускаешь бота с команды старт то бот вылетает библиотека бота(pyTelegramBotAPI)
<code>
import sqlite3
import telebot
from telebot import types

token='Токен'
bot=telebot.TeleBot(token)
conn = sqlite3.connect('db/Database.db', check_same_thread=False)
cursor = conn.cursor()

def db_table_val(User_id: int, User_name: str, User_surname: str, Username: str):
     cursor.execute('INSERT INTO Users (User_id, User_name, User_surname, Username) VALUES (?, ?, ?, ?)', (User_id, User_name, User_surname, Username))
     conn.commit()

@bot.message_handler(commands=['start'])
def button_message(message):
     us_id = message.from_user.id
     us_name = message.from_user.first_name
     us_sname = message.from_user.last_name
     username = message.from_user.username
     db_table_val(User_id=us_id, User_name=us_name, User_surname=us_sname, Username=username)
     bot.send_message(message.chat.id,'Привет',reply_markup=markup)

bot.infinity_polling(none_stop=True)
</code>
Мне нужно:
сделать проверку на существование User_id в базе
Например:
Если получена команда /start то:
проверить существование данного пользователя в базе
если пользователя нет то:
Внести данные пользователя в базу данных
если пользователь существует в базе данных то:
Прислать ответ: вы уже есть в базе данных

Как насчёт через попытаться "достать" из бд юзера, и запихнуть ответ в переменную?
Например:
is_user = #обращаешься к бд, ищешь в ней юзера по айди
Если такой пользователь существует, в переменной будет некое значение. Если нет - False.
Затем просто выполнить проверку через if/else.
Например:
if is_user:
#отправляем сообщение "вы уже есть в бд"
else:
#добавляй данные в бд


Перечисление подсписков списка
Как можно уйти от принудительного перечисления строк массива? (z[0],z[1],z[2])
<code>
import itertools

z = [['A', 'B'], ['C', 'D', 'E'], ['G H', 'I', 'F H']]
r = []
for x in itertools.product(z[0],z[1],z[2]):
    r.append(list(x))
print(r)
</code>

Можно "распаковать" список с помощью оператора
*:

for x in itertools.product(*z):


Тип : словарь. Задать значение переменной в текстовом файле
Цель : хочу сделать значение переменной в текстовом файле.
Для этого я создал код и текстовый файл. В текстовом файле к примеру написано -
{"Ex":None} - затем, я "открываю" файл, и вывожу тип и содержимое.
Получая тип : str - что не удивительно, но мне необходимо получить тип : словарь.
Как это реализовать, если типы не сходятся?

Надо понимать, что текстовый файл хранит просто последовательность байт и он ничего знать не знает ни про какие типы, словари и т.п.
Если вы хотите сохранять питоновские объекты в файл, а потом получать их оттуда, то вам может помочь модуль
pickle.
Сначала из какого-то первого питоновского скрипта мы записываем объект в файл:

import pickle

data = {"Ex": None}

with open('example.txt', 'wb') as file:
    pickle.dump(data, file)

В результате у нас создаётся файл
example.txt, который хранит в себе ваш словарь. Словарь хранится в особом формате, поэтому просто так "глазами" прочитать его не получится. Если вы откроете этот файл, то вы увидите что-то такое:
�}q X   ExqNs.
Дальше вы можете это преобразовать обратно в ваш словарь вот так (это можно делать уже из совсем другого скрипта):

import pickle

with open('example.txt', 'rb') as file:
    readed_data = pickle.load(file)
    print(type(readed_data), readed_data)

# Напечатает: <class 'dict'> {'Ex': None}


Удаление столбца по условию numpy
Всем привет, я хочу удалить столбец в матрице nxm через условие, но есть проблемы с реализацией. думал, что таким образом сработает, но интерпритатор выдает ошибку:
<code>
a = a[a[:,[0,m-1]]%5 == 0]
</code>
можете подсказать, как решить эту проблему?
По заданию, необходимо найти элемент, кратный 5 и удалить столбец с ним

Удалить все столбцы, в которых есть числа кратные 5:

import numpy as np
arr=np.arange(24).reshape(3,8)

Имеем массив:

[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]]

Удаляем по заданному условию:

np.delete(arr,np.where(arr%5 == 0)[1],1)

Результат:

[[ 1  3  6]
 [ 9 11 14]
 [17 19 22]]

А вообще-то это описано в любой статье (не говоря уже о книге), где рассказывается о numpy.  Рекомендую с этого и начинать.


pandas расчет среднего количества значений в неделю по месяцам
Нужно посчитать среднее количество покупок в неделю по месяцам для каждого id. Каждая дата означает одну совершенную покупку.
Датафрейм:

df = pd.DataFrame({
    "id": [
        "01",
        "01",
        "01",
        "01",
        "02",
        "02",
        "02",
        "02"
    ],
    "date": [
        "2022-07-06",
        "2022-07-08",
        "2022-07-15",
        "2022-08-11",
        "2022-07-06",
        "2022-07-08",
        "2022-07-15",
        "2022-08-11"
    ]
})

Нужно получить:

id  month   week_mean
01  07      1.5
01  08      1
02  07      1.5
02  08      1

Мой ход решения такой. Даты, например, 2022-07-06 и 2022-07-08 относятся к одной неделе, т.е. внутри это недели эти даты (покупки) нужно сложить. Далее выводить среднее между всеми неделями месяца для каждого id.

df['date'] = pd.to_datetime(df['date']) # перевожу в формат даты
df['week'] = df['date'].dt.strftime('%U') # добавляю колонку с номером недели
df['date'] = df['date'].astype('str')
df['date'] = df['date'].str.split('-').str[0]+'-'+ df['date'].str.split('-').str[1] # привожу колонку к формату "год-месяц"

df1 = pd.merge(df, df.groupby(['id', 'week'], as_index = False).agg({'date':'count'})\
         .rename(columns={'date' : 'buy_count'}), on=('id','week')).drop_duplicates() # считаю количество заказов в каждую неделю и присоединяю колонку date

df1.groupby(['id', 'date'], as_index = False).agg({'buy_count':'mean'}) # считаю среднее по неделям

В результате получаю такой датафрейм:

    id  date    buy_count
0   01  2022-07 1.5
1   01  2022-08 1.0
2   02  2022-07 1.5
3   02  2022-08 1.0

И он вроде бы ок, но что, если одна из недель будет принадлежать сразу двум месяцам?
Датафрейм, например, будет такой:

df = pd.DataFrame({"id": ["01", "01", "01", "01", "02", "02", "02", "02"],
                      "date": ["2022-06-29", "2022-07-02", "2022-07-15", "2022-08-11",
                               "2022-07-06", "2022-07-08", "2022-07-15", "2022-08-11"]})

И тогда приведенный выше код будет давать неправильный результат:

    id  date    buy_count
0   01  2022-06 2.0
1   01  2022-07 1.5
2   01  2022-08 1.0
3   02  2022-07 1.5
4   02  2022-08 1.0

Что говорит о том, что мой подход с нумерацией недель не верный.

альтернативный вариант:
<code>
res = (df.groupby(['id',df['date'].dt.month,df['date'].dt.isocalendar().week]).
       count().
       groupby(level=[0,1])['date'].
       mean().
       rename('week_mean').
       reset_index())

print(res)
'''
   id  date  week_mean
0  01     7        1.5
1  01     8        1.0
2  02     7        1.5
3  02     8        1.0
</code>


How to check if user press the button? telegram bot python [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос закрыт, так как на Stack Overflow на русском вопросы принято задавать только на русском языке. Пожалуйста, переведите ваш вопрос на русский язык или воспользуйтесь Stack Overflow на английском.

Закрыт 1 год назад.

                        Улучшить вопрос

Easy task, but I can't figure out how to do it.
I'd like to check if user press the button 'Add variants' to add next messages from user to list
variants. I tried to do it using
if message.text == 'Add variants', but it just adds to list text 'Add variants' one time and that's it. Is there any way to check if user click the button and after that add next messages from user to list?

variants = []

@bot.message_handler(commands=['start', 'welcome'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item_1 = types.KeyboardButton('Random🎲')
    item_2 = types.KeyboardButton('TradingView💸')
    item_3 = types.KeyboardButton('Weather🌤')
    item_4 = types.KeyboardButton('Other')
    item_5 = types.KeyboardButton('Back🔙')
    markup.add(item_1, item_2, item_3, item_4, item_5)

    bot.send_message(message.chat.id, 'Choose', reply_markup = markup)

@bot.message_handler(content_types=['text'])
def bot_message(message):

    if message.chat.type == 'private':
        if message.text == 'Random🎲':

            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            item_1 = types.KeyboardButton('Add variants')
            item_2 = types.KeyboardButton('Back🔙')
            markup.add(item_1, item_2)

            bot.send_message(message.chat.id, 'Choose', reply_markup = markup)

@bot.message_handler(commands=['start', 'welcome'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item_1 = types.KeyboardButton('Random🎲')
    item_2 = types.KeyboardButton('TradingView💸')
    item_3 = types.KeyboardButton('Weather🌤')
    item_4 = types.KeyboardButton('Other')
    item_5 = types.KeyboardButton('Back🔙')
    markup.add(item_1, item_2, item_3, item_4, item_5)

    bot.send_message(message.chat.id, 'Choose', reply_markup=markup)

@bot.message_handler(chat_types="private", func=lambda msg: msg.text == "Random🎲")
def bot_message(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item_1 = types.KeyboardButton('Add variants')
    item_2 = types.KeyboardButton('Back🔙')
    markup.add(item_1, item_2)

    bot.send_message(message.chat.id, 'Choose', reply_markup=markup)

@bot.message_handler(chat_types="private", func=lambda msg: msg.text == "Add variants")
def func_name(message):
    ...
    # some code


После нажатия кнопки не выполняет переход на другую кнопку,что делать?
После нажатия Алгебра, должен перейти на Таблицу умножения ,чего она и не делает, не пойму где ошибка, кидаю кусок кода:
<code>
        if message.text == 'Поддержать разработку💸':
            bot.send_message(message.chat.id, mess1)
        if message.text =='Быстрый поиск🔎:':
                markup = types.ReplyKeyboardMarkup(resize_keyboard = True, row_width=2)
                algebra = types.KeyboardButton('Алгебра🔢')
                geoma = types.KeyboardButton('Геометрия♾')
                nazadbistr = types.KeyboardButton('Вернуться в главное меню⬅')
                markup.add(algebra, geoma, nazadbistr)
                bot.send_message(message.chat.id, 'Быстрый поиск🔎:', parse_mode = 'html', reply_markup = markup)
        if message.text =='Алгебра🔢:':
            markup = types.ReplyKeyboardMarkup(resize_keyboard = True, row_width=2)
            tableumnoz = types.KeyboardButton('Таблица умножения')
            markup.add(tableumnoz)
            bot.send_message(message.chat.id, 'Алгебра🔢:', parse_mode = 'html', reply_markup = markup)
</code>

if message.text =='Алгебра🔢:':

Замените на

if message.text =='Алгебра🔢':


Алиасы в SQLAlchemy
В прошлом вопросе реализовал запрос к БД.

all_rows = db.session.query(
                    TABLE_1.field1,
                    TABLE_1.field2,
                    TABLE_2.field3
                ).join(
                    TABLE_2, TABLE_1.id == TABLE_2.table1_id
                ).filter(
                    TABLE_1.field1== obj_el.value1,
                    TABLE_1.field2== obj_el.value2,
                    TABLE_2.field3 == obj_el.value3
                ).all()

Теперь возник вопрос, а как сюда добавить алиас? Например такого вида:

all_rows = db.session.query(
                    ......
                    TABLE_2.field4 * 10 as 'nameAlias'
                ).join(....

Разобрался. Может кому поможет:
<code>
all_rows = db.session.query(
                    ......
                    (TABLE_2.field4 * 10).label("nameAlias")
                ).join(....
</code>


Join в SQLAlchemy
Делаю join 2уx таблиц (зависимость (TABLE_1 : TABLE_2)  =>>  (1:M) ):

all_rows = db.session.query(
    TABLE_1
    ).filter(
            TABLE_1.field1 == value1,
            TABLE_2.field2 == value2
    ).join(
           TABLE_2
    ).filter(
             TABLE_2.field3 == value3
    ).all()

Потом хочу распечатать результат:

for rows in all_rows :
    print('*', rows )

Выдает почему-то только 1 строку и то только данные TABLE_1
Что я не так сделал?

Во-общем, решил логику MySQl подключить и разобрался. Не знаю на сколько это верный вариант, но работает:

all_rows = db.session.query(
                    TABLE_1.field1,
                    TABLE_1.field2,
                    TABLE_2.field3
                ).join(
                    TABLE_2, TABLE_1.id == TABLE_2.table1_id
                ).filter(
                    TABLE_1.field1== obj_el.value1,
                    TABLE_1.field2== obj_el.value2,
                    TABLE_2.field3 == obj_el.value3
                ).all()

Ну и печать самой выборки:

for row in all_rows :
    print('*', row.field1, row.field2, row.field3)


Что не так в запросе sql?
Написал следующий sql запрос к бд clickhouse, но получаю следующую ошибку:

clickhouse_driver.errors.ServerException: Code: 62.
DB::Exception: Syntax error: failed at position 82 ('f8e26d5aae7e6e40'): f8e26d5aae7e6e40. Expected one of: token, Dot, UUID, DoubleColon, MOD, DIV, NOT, BETWEEN, LIKE, ILIKE, NOT LIKE, NOT ILIKE, IN, NOT IN, GLOBAL IN, GLOBAL NOT IN, IS, AND, OR, QuestionMark, alias, AS, GROUP BY, WITH, HAVING, WINDOW, ORDER BY, LIMIT, OFFSET, SETTINGS, UNION, EXCEPT, INTERSECT, INTO OUTFILE, FORMAT, end of query. Stack trace:

Вот запрос:

        count_lines = self.client.execute('SELECT COUNT(DISTINCT client_id) as'
                                      ' con FROM {} WHERE client_id = {}'.format(table_name, tags[0][0]))

где
tags[0][0] = 'mc2-node1 f8e26d5aae7e6e40'
Что в нем не так?

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

tags = 'mc2-node1 f8e26d5aae7e6e40'
table_name = 'table'
sql = 'SELECT COUNT(DISTINCT client_id) as'
' con FROM {} WHERE client_id = {}'.format(table_name, tags)
print(sql)

Вывод:

SELECT COUNT(DISTINCT client_id) as
                                    ^^^^^^^^^ но где же остальная строка?!

Строка просто обрывается, и то, что вы пишете на следующей строке - это отдельная строка, а не продолжение предыдущей строки. Исправим это:

sql = 'SELECT COUNT(DISTINCT client_id) as' +\ # <-- теперь строка продолжается
' con FROM {} WHERE client_id = {}'.format(table_name, tags)

Вывод:

SELECT COUNT(DISTINCT client_id) as con FROM table WHERE client_id = mc2-node1 f8e26d5aae7e6e40
                                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Уже лучше, но
client_id явно нужно брать в кавычки. Итого код у вас должен быть видимо такой, чтобы не было ошибок:

    count_lines = self.client.execute('SELECT COUNT(DISTINCT client_id) as' +\
                                      ' con FROM {} WHERE client_id = \'{}\''.format(table_name, tags[0][0]))


Здравствуйте. Нужна помощь с выводом радарной диаграммы ботом в телеграм чат. В Python новичок - перепробовал многое
<code>
import telebot
import pygal

bot = telebot.TeleBot('**********************************')

def Radar():
  view = pygal.Radar()
  view.title = 'Радарная карта'
  view.add('A', \[31,56,34,67,34\])
  view.add('B', \[23,18,57,45,35\])
  view.add('C', \[14,45,76,34,76\])
  view.render_to_file('view.svg')

@bot.message_handler(commands=\["start"\])
def start(m, res=False):
    bot.send_message(m.chat.id, 'Бот запущен. Введите команду /graf для вывода графика')

@bot.message_handler(commands=\["graf"\])
def send_photo_file_id(message):
  bot.send_photo(message.chat.id, photo='view.svg', caption='График')

bot.polling(none_stop=True, interval=0)][1]][1]

</code>

Попробуйте так
<code>
bot.send_photo(message.chat.id, photo=open('view.svg', "rb"), caption='График')
</code>


SQLite3 не может найти значение в столбце!
Это функция для базы данных

class Panda_DataBase:
  def __init__(self, db_file):
     self.conn = sqlite3.connect(db_file, check_same_thread=False)
     self.cursor = self.conn.cursor()

  def CheckRegistr(self, UserId):
     with self.conn:
        result = self.cursor.execute("SELECT * FROM 'PandaDataBase' WHERE 'UserId' = ?",(UserId,)).fetchall()
#СРАВНИВАЕТ ВСЕ ID из базы данных с ID ЧЕЛОВЕКА

        print(bool(len(result))) # ВЫДАЁТ FALSE
        print(len(result)) # ВЫДАЁТ 0

        return bool(len(result))

Функция сверху принимает значение в виде ID пользователя.
Но почему-то когда пользователь с таким ID уже есть в БД "return bool(len(result))" всё равно выдаёт False!!
И дальше по коду добавляет его в БД(я это не вставил)

if not db.CheckRegistr(message.from_user.id):
    ....

Надеюсь понятно))

Уберите кавычки тут
'UserId', т.е. чтоб было без них
UserId = ?.
Значение в кавычках это строковый литерал, т.е. вы в условии сравниваете строку
UserId (а не значение колонки
UserId) с значением, которое передали в функцию. Понятно, что условие не выполняется ни для одной строки, поэтому все строки отсеиваются.


Модерация введенных пользователем данных в тг боте aiogram
Пишу тг-бота, возникла надобность реализовать аддминку, где модератор будет принимать или отклонять данные, введенные ранее пользователем. Модерация получилась, но еще ведь нужно уведомить о прохождении модерации юзера - с этим проблема. Айди юзера сохранить не представляется возможным, а значит нельзя отправить сообщение: машина состояний исключена (у меня в коде разветвление - модер пропускает или отклоняет данные), как записать в файл - не знаю, пользователей может быть несколько одновременно и достать из файла нужный айди, видимо, нельзя. Помогите, пожалуйста! Скинул два хэндлера - отправка строки данных юзеру и хэндлер успешного прохождения модерации, где надо отправить сообщение пользователю. Первый:

async def cmd_mod_vlnt_comfirmation(message: types.Message):
    await bot.send_message(message.from_user.id, 'Ваши данные отправлены на модерацию. Пожалуйста, ожидайте.')
    need_id = message.from_user.id
    with open('''C:/Users/vvvpe/Desktop/Connect/Data/vlnt_data.txt''', 'r') as mod_f:
        for line in mod_f:
            if str(need_id) in line:
                cur_mod_data = line
    await bot.send_message(айди модератора, cur_mod_data)

Второй:

async def cmd_mod_vlnt_comfirmed(message: types.Message):
    await bot.send_message(message.from_user.id, 'Это сообщение админу')
    await bot.send_message(message.from_user.id, 'Это сообщение - юзеру, вместо в первый аргумент send_message нужно указать айди пользователя, который непонятно как достать', reply_markup=kb_vlnt_main)

Вот примерно так это выглядит
<code>
# юзер отправил сообщение
@dp.message_handler()
async def start(message: types.Message):
    markup = InlineKeyboardMarkup()
    markup.add(InlineKeyboardButton("Принять", callback_data=f"moder:accept@id:{message.from_user.id}"),
               InlineKeyboardButton("Отклонить", callback_data=f"moder:decline@id:{message.from_user.id}"))
    await bot.send_message(chat_id=admin_id, text=message.text, reply_markup=markup)

@dp.callback_query_handler(text_startswith="moder")
async def moderation(call: types.CallbackQuery):
    type_call = call.data.split("@")[0].split(":")[1]
    user_id = call.data.split("@")[1].split(":")[1]
    if type_call == "accept":
        await bot.send_message(user_id, "...")
    else:
        pass
</code>


Как сделать код, чтобы он считал квадратные уравнения [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

Закрыт 1 год назад.

                        Улучшить вопрос

Чтобы бот ,заносил данные в переменную, делал действие и считал корень и дискриминант по кнопке в бота(делаю что-то наподобие калькуляторе). Как сделать такой код? То есть первое число в одну переменную, второе в о вторую и третье в третью.

Ну можно можно сделать 3 переменные для a,b,c. Сначала человек вписывает в перменную a значения, потом в b и так далее. Дальше остается правильно написать код, чтобы он мог правильно посчитать.


Как отправить спрятанный текст (спойлер) telebot
Всем привет! Есть тг-бот (библиотека pytelegrambotapi). Может ли он прислать пользователю скрытый текст? Или такое не поддерживается?
Я пытался сделать текст скрытым, благодаря спец. символам, но не работает:
<code>
bot.send_message(message.chat.id, "Описание: ||Привет||")
</code>

Да просто юзай MarkdownV2.
<code>
@bot.message_handler(commands=['start'])
def start(message: types.Message):
    bot.send_message(message.chat.id, f"Видно ||Не видно||", parse_mode='MarkdownV2')
</code>
Вот доп. инфа Ссылка


Как сделать чтобы функция открыла окно, дождалась ввода, закрыла окно и вернула введенное
Вот код:

from tkinter import *
def run(quest, typeOf='Any'):
    tkinp = Tk()
    tkinp.geometry('200x100')
    tkinp['bg'] = 'cyan'
    tkinp.resizable(0, 0)
    tkinp.title('Enter')

    var = StringVar(tkinp)
    entryIn = Entry(tkinp, textvariable=var)
    entryIn.place(x=10, y=70, width=180)

    Label(tkinp, text=f'{quest}:', bg='cyan').place(x=10, y=40)
    Label(tkinp, text=f'Тип: {typeOf}', bg='cyan').place(x=10, y=20)

    def end(event):
        varGet = var.get()
        return varGet

    tkinp.bind('<Return>', end)

    tkinp.mainloop()

print(run('Вопрос'))

Как сделать, чтобы эта функция вернула что-то, в данном случае для принта. Ничего не возвращается из-за того, что у tkinter запущено
mainloop, поэтому
return не работает (мне кажется так).

return во внутренней функции не делает выход из внешней функции. Тут нужно вручную убить окно, а во внешней функции ждать, пока окно существует с помощью метода
.wait_window(), потом из внешней функции вернуть результат (обычно это используется с дочерними окнами типа
Toplevel, но в главным окном тоже сработает):

from tkinter import *

def run(quest, typeOf='Any'):
    ...

    result = None
    def end(event):
        nonlocal result
        result = var.get()  # Записываем результат в переменную result внешней функции
        tkinp.destroy()  # Уничтожаем окно

    tkinp.bind('<Return>', end)
    tkinp.wait_window()  # Ждем уничтожения окна
    return result  # Возвращаем результат

print(run('Вопрос'))

На самом деле для главного окна (не
Toplevel) можно было бы использовать и
mainloop() вместо
wait_window() (
mainloop() тоже прекратит работу после уничтожения окна, и выполнится код, который идет в функции ниже, например тот же
return), но вариант с
wait_window() более универсальный.


Нужно расставить единицы в матрице, чтобы они не с соприкасались друг с другом
Вот условие:
Имеется двумерное игровое поле размером N x N (N - натуральное число, вводится с клавиатуры), представленное в виде вложенного списка:
P = [[0] * N for i in range(N)]
Требуется расставить в нем случайным образом M = 10 единиц (целочисленных) так, чтобы они не соприкасались друг с другом (то есть, вокруг каждой единицы должны быть нули, либо граница поля).
Вот код:
<code>
import random

random.seed(1)

N = int(input())
P = [[0] * N for i in range(N)]
M = 10

while M > 0:
    row = random.randint(0, N - 1)
    pos = random.randint(0, N - 1)
    if P[row-1][pos] + P[row - len(P) + 1][pos] + P[row][pos] + P[row][pos - len(P) + 1] + P[row][pos - 1] + P[row - len(P) + 1][pos - len(P) + 1] + P[row - len(P) + 1][pos - 1] + P[row - 1][pos - len(P) + 1] + P[row - 1][pos-1] == 0:
        P[row][pos] = 1
        M -= 1
    else:
        continue
</code>
В матрице 10х10 у меня все ок. Проблема в том что в матрице 7х7 тоже должно поместиться 10 единиц, но у меня влезает только 9 единиц, и дальше начинается бесконечный цикл, который ищет место для 10 единицы. У меня есть мысль что условие строгое, но я не уверен.

При случайной расстановке вариант с 10 единицами не гарантирован.
Например, имея квадрат с вертикальной нумерацией от A до F и горизонтальной от 1 до  7, мы можем получить ситуацию, при которой сначала будут заняты ячейки B2, B5, E2, E5, что полностью выведет из доступности квадрат 6x6 (A1-F6). Дальнейшая случайная расстановка может позволить ещё пять - B7, E7, G2, G5, G7. Итого гарантировано только 9.
В таком случае нужна проверка на зацикливание и потом перезапуск. Или вообще по-другому делать - см.комментарий Романа ниже.

Ваши псевдослучайные генераторы при всех прогонах выдают одинаковые последовательности. Надо убрать
random.seed (1).

Вы для каждого найденного элемента рассчитываете все девять "запретных" полей, хотя у граничных элементов их будет меньше. Да еще и неправильно рассчитываете. Даже если компонент (например) P[0][3] и будет разрешенным, то
P[row-1][pos] начнет проверять граничность с компонентом P[-1][3], что эквивалентно P[6][3], а этот элемент не имеет никакого отношения к P[0][3]. Вы какой-то тор реализовали, а не квадрат.
Надо правильную проверку сделать, убрав элементы с минусом
(добавить что-то вроде
row_c = row - 1 if row > 0 else 0,  а все индексы
row - 1 заменив на
row_c и аналогично с
pos)

else лучше убрать. Смысла он не несет, цикл и без
continue продолжится.


Telegram Bot не получается начать диалог первым
Telegram Bot API Changelog

December 7, 2021

Bot API 5.5

   Bots are now allowed to contact users who sent a join request to a chat where the bot is an administrator with the can_invite_users administrator right – even if the user never interacted with the bot before.

Еще в прошлом году добавили функцию, когда пользователь отправляет запрос подписки на канал, то бот может начать с ним диалог первым. Это точно работает, потому что это я увидел сегодня в другом канале. Я просто подал заявку и мне через пол секунды написал бот из этого канала и отправил какую-то рекламу.
Так вот пытаюсь это сделать так:

bot = telebot.TeleBot('TOKEN')

@bot.chat_join_request_handler()
def test(message):

    user_id = message.from_user.id
    bot.approve_chat_join_request(message.chat.id, user_id) # принимаю запрос
    bot.send_message(user_id, 'test message')

И вижу ошибку:

Forbidden: bot can't initiate conversation with a user

Так как мне это сделать? Пытался нагуглить и в других библиотеках, помимо pyTelegramBotAPI, но ничего не нашел.

Нашел решение, если вдруг кому поможет. Не получалось сделать это из-за того, что к каналу уже ранее был подключен другой бот, поэтому когда попытался подключить второго - телега этого сделать не давала


Как замедлить работу одной функции в цикле не затрагивая другие?
Я создаю игру где корабль должен уворачиваться от появляющихся пришельцев. В главном классе игры есть функция которая добавляет нового пришельца в группу. И я хочу замедлить эту функцию но когда я добавляю команду sleep замедляется весь цикл. Мне нужно чтобы пришельцы появлялись с заданным интервалом.

import sys

import pygame

from time import sleep

from settings import Settings

from rocket import Rocket

from bullet import Bullet

from alien import Alien

import asyncio

class Cosmos:
    """Главный класс игры Cosmos"""

    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.screen_rect = self.screen.get_rect()
        pygame.display.set_caption('Cosmos')
        self.fon_image = pygame.image.load('image/Fon.png')
        self.fon = self.fon_image.get_rect()
        self.settings = Settings()
        self.rocket = Rocket(self.screen, self.settings)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()

        self.alien = Alien(self.screen, self.settings)

    def key_event(self):
        """Обрабатывает нажатие клавиш"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    sys.exit()
                elif event.key == pygame.K_d:
                    self.rocket.move_RIGHT = True
                elif event.key == pygame.K_a:
                    self.rocket.move_LEFT = True
                elif event.key == pygame.K_w:
                    self.rocket.move_UP = True
                elif event.key == pygame.K_s:
                    self.rocket.move_DOWN = True
                elif event.key == pygame.K_SPACE:
                    new_bullet = Bullet(self.screen, self.settings, self.rocket)
                    self.bullets.add(new_bullet)
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_d:
                    self.rocket.move_RIGHT = False
                elif event.key == pygame.K_a:
                    self.rocket.move_LEFT = False
                elif event.key == pygame.K_w:
                    self.rocket.move_UP = False
                elif event.key == pygame.K_s:
                    self.rocket.move_DOWN = False

    def spawn_alien(self):
        """Добавляет пришельца в группу"""
        alien = Alien(self.screen, self.settings)
        self.aliens.add(alien)

    def bullet_sprite(self):
        """Рисует и обновляет спрайт снаряда"""
        for bullet in self.bullets.sprites():
            if bullet.rect.x < 5000 and bullet.rect.x > 0 and bullet.rect.y < 1500 and bullet.rect.y > 0:
                bullet.draw_bullet()
                bullet.update()
            else:
                self.bullets.remove(bullet)

    def hui(self):

    def run_game(self):
        """Обновляет события игры"""
        while True:
            self.screen.blit(self.fon_image, self.fon)
            self.key_event()
            self.rocket.update_rocket()
            self.bullet_sprite()
            self.rocket.draw_rocket()
            self.spawn_alien()
            self.aliens.draw(self.screen)
            print(self.aliens)
            pygame.display.flip()

game = Cosmos()
game.run_game()

import pygame

from pygame.sprite import Sprite

from random import randint

class Alien(Sprite):
    """Класс, представляющий одного пришельца"""

    def __init__(self, screen, settings):
        super().__init__()
        self.screen = screen
        self.settings = settings
        self.image = pygame.image.load('image/pixil-frame-1.png')
        self.rect = self.image.get_rect()
        self.rect.x = randint(0, 1800)
        self.rect.y = randint(0, 1000)

Проверяйте, что прошло достаточно времени для создания нового пришельца:

ALIENS_PER_SECOND = 1

class Cosmos:
    """Главный класс игры Cosmos"""

    def __init__(self):
        ...
        self.aliens_spawned = 0

    def spawn_alien(self):
        """Добавляет пришельца в группу"""
        alien = Alien(self.screen, self.settings)
        self.aliens.add(alien)
        self.aliens_spawned += 1

    def run_game(self):
        """Обновляет события игры"""
        while True:
            ...
            if self.aliens_spawned < ALIENS_PER_SECOND * pygame.time.get_ticks() / 1000:
                 self.spawn_alien()

Тут идет проверка, что пришельцев меньше чем должно быть исходя из прошедшего времени и скорости их генерация в единицу времени. И только если это так, то создаем нового. При
ALIENS_PER_SECOND = 1 будет создаваться один за секунду


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

Вот несколько самых простых способов на Python (скорее всего, легко портируются и для других языков).
Все их реально применил при решении мной вчера задачи на Stepik (там более сложные примеры, конечно, были, тут упростил для понимания читающих), да и в других случаях применял:
1) При проблеме с допустимой глубиной рекурсии, если не избавляться от самой рекурсии:*
надо добавить в код строку
sys.setrecursionlimit (50000) - параметр в скобках с таким большим значением во всех моих случаях решал вопрос (по умолчанию этот параметр равен 1000 или чуть менее, в первом примере ниже ошибка появится при
a = 998).
Требуется ещё
import sys,конечно.
Повторю, что было написано в начальном вопросе: "В реальной работе это будет означать медленную работу программы либо неэффективное использование ресурсов компьютера". Лучше это не применять без большой необходимости.
*встречавшиеся мне ошибки при превышении глубины рекурсии:

RecursionError: maximum recursion depth exceeded in comparison и

RecursionError: maximum recursion depth exceeded while calling a Python object
2) При рекурсивном вызове в конце функции:

def test (a):
    a -= 1
    if a > 0:
        print (a)
    else:
        return
    test(a)

if __name__ == '__main__':
    a = 997
    test (a)

переделать функцию можем просто с помощью
while True, уйдя от рекурсии:

def test (a):
    while True:
        a -= 1
        if a > 0:
            print (a)
        else:
            return

3) При варианте чуть сложнее с рекурсивными вызовами в середине функции:

def test(a, b):
    print ('test start, a, b', a, b)
    if a > 5:
        print('condition a')
        return test(a-1, b)
    if b < 5:
        print('condition b')
        return test(a, b+1)
    print ('test finish, a, b', a, b)

if __name__ == '__main__':
   a = 7
   b = 3

надо еще добавить
continue и
break, чтобы уйти от рекурсии, помимо
while True:

def test(a, b):
    while True:
        print ('test start, a, b', a, b)
        if a > 5:
            print('condition a')
            a -= 1
            continue
        if b < 5:
            print('condition b')
            b += 1
            continue
        print('test finish, a, b', a, b)
        break


Можно ли выключить "Переслано из" в Telethon
Здравствуйте уважаемые гуру.
Имеется данный код:
<code>
    from telethon import TelegramClient, events
from config import DESTINATION, API_ID, API_HASH, SESSION, CHATS, KEY_WORDS

client = TelegramClient(SESSION, API_ID, API_HASH)

if name == 'main':
    print("Программа запущена...")

    @client.on(events.NewMessage(chats=CHATS))
    async def new_order(event):
        try:
            print('Найдена новая новость...')
            contain_key_word = False

            for key_word in KEY_WORDS:
                if key_word in event.message.message:
                    contain_key_word = True

            if contain_key_word:
                await client.forward_messages(DESTINATION, event.message)

        except Exception as ex:
            print(f'Exception: {ex}')

    client.start()
    client.run_until_disconnected()
</code>
Данный код грабом по ключевым словам забирает новости с каналов телеграмм.
Можно ли убрать при посте у себя на канале "Переслано из"?

С использованием
forward_messages - нельзя.
В сорцах клиента TelegramClient это явно указано:

Forwards the given messages to the specified dialog.
If you want to "forward" a message without the forward header
(the "forwarded from" text), you should use
send_message with
the original message instead. This will send a copy of it.

То есть рекомендуется использовать
send_message для этих целей.


Стоит ли использовать разные языки для первого проекта? [закрыт]

Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Закрыт 1 год назад.

                        Улучшить вопрос

Хочу сделать первый нормальный проект с целью обучения основам пайтон и вообще прогинга. Использовать стандартную библиотеку и консоль честно нет никакого желания(предлагали сделать тетрис, но порыскав в инете понял что стандартной библиотекой не обойтись), хочется что то более полезное хотя бы для себя. Ранее делал бота для дискорд, и даже была фича когда можно было писать от имени бота(с кучей костылей, но я очень был рад тому что спустя 4 часа смог это сделать). После решил похожее сделать на телеграм боте, где ждало разочарование в виде непонятной документации и отсутствия видео по основам API.
Сейчас решил уйти с питоном в WEB, ибо не знаю куда его ещё пихнуть. Придётся учить и другие языки, и я к этому готов, но стоит ли оно того, стоит ли идти в Web если до этого только HTML в школе учил? Мои знания пайтон дошли до знания структур данных и частично ООП(без проекта и практики вряд ли его можно выучить)

Смотря что ты имеешь ввиду под "идти в веб". Если хочешь стать фулстак разработчиком - без HTML, CSS, JS не обойтись.
Если просто бекенд - нужен только пайтон.
А если ты хочешь самостоятельно сделать простенький сайт в качестве пет-проекта(с бекендом и фронтендом), тебе хватит пайтон + HTML


Не срабатывает код при добавлении
 ...

изучаю Python, остановился на парсинге сайта, написал простую .html страницу вот часть кода:

...
    <div class='user__name' id='aaa'>
        <span>Djem</span>  <br>
    </div>
    <div class='user__birth__date'
        <span> Date of birthday </span>
        <span> 02.07.89 </span>
    </div>
...

при этом коде парсер срабатывает и выдает нужное значение, но если добавляю еще один элемент div:

    <div class='user__info'>
      <div class='user__name' id='aaa'>
            <span>Djem</span>  <br>
        </div>
        <div class='user__birth__date'
            <span> Date of birthday </span>
            <span>02.07.89 </span>
        </div>
    </div>

то код на Python:

...
    user_name = soup.find('div', {'class': 'user__name', 'id':'aaa'}).find('span').text
    print(user_name)

Не срабатывает, по ошибке nonetype' object has no attribute 'text'
Понимаю вопрос простой, но хочу понять суть проблемы
Благодарю за ответ

Использовал
html.parser и находит с
find, и через
select (css-селектором):

from bs4 import BeautifulSoup

text = """
    <div class='user__info'>
      <div class='user__name' id='aaa'>
            <span>Djem</span>  <br>
        </div>
        <div class='user__birth__date'
            <span> Date of birthday </span>
            <span class='value'> 02.07.89 </span>
        </div>
    </div>
"""

soup = BeautifulSoup(text, 'html.parser')
user_name = soup.find('div', {'class': 'user__name', 'id': 'aaa'}).find('span').text
print(user_name)
# Djem

user_name = soup.select_one('#aaa > span').text
print(user_name)
# Djem

Еще пример:

birth__date = soup.select_one('.user__info > .user__birth__date > .value').text.strip()
print(birth__date)
# 02.07.89

# По номеру элемента (при незакрытой скобке в user__birth__date элемент <span> Date of birthday </span> будет частью div, поэтому номер 1, если починить скобку, то будет номер 2)
birth__date = soup.select_one('.user__info > .user__birth__date > span:nth-child(1)').text.strip()
print(birth__date)
# 02.07.89


Двойная итерация это очень долго
Есть массив (DataFrame) данных. По нему идёт двойная итерация.

for i in range(0, data.shape[0], 1):
    if data['res1'][i] in range(1, 100, 1):
        for j in range(0, data.shape[0], 1):
            if data['col1'][j] == data['col1'][i] and data['col2'][j] == data['col2'][i]:
                data['res2'][j] = data['res1'][i]

Применить методы
pandas'a не удалось (сейчас это не обсуждается). Получился некрасивый, плохой, но корректно работающий код. Но всё очень долго.
Пишут, что сложность итерации коллекции =
O(n), а у нас двойная итерация, так что
O(n^2).
Вопрос: как можно такой ускорить код?

Линейная сложность. Создаётся словарь значений, затем значения расставляются по местам.
Возможно в Pandas есть подходящие механизмы, это решение сделано "на коленке":
<code>
d = {
    (t.col1, t.col2): t.res1
    for t in data.itertuples()
    if t.res1 in range(1, 100, 1)
}

data['res2'] = [d.get((t.col1, t.col2), t.res2) for t in data.itertuples()]
</code>


Можно ли в Python менять оператор сравнения в if через переменную?
Можно ли переменной присвоить знаки < или > и использовать их в if. Если нет, то как это можно сделать?
Нужно примерно так:
<code>
a = "<"
b = 0
c = 1
if c a b:
...
</code>

Оператор нельзя записать в переменную. В данном случае вместо операторов можно использовать функции, которые выполняют соответствующие операции. Функции можно записывать в переменные.
Т.е., для примера

def is_less(a, b):
    return a < b

a = is_less
b = 0
c = 1
if a(c, b):
    ...

Есть стандартный модуль
operator с функциями, соответствующими операторам. Оператору
< соответствует функция
operator.lt,
> -
operator.gt.

import operator

a = opertator.lt  # или operator.gt
b = 0
c = 1
if a(c, b):
    ...


Отправка на сервер кода 200 не используя return
Имеется вебсервер для приема POST, данный сервер часть огромного конвеера который выполняется 5+ минут взависимости от приходящего POST
Из-за этого FLASK возвращает 500 код, как это можно исправить?
КОД FLASK

@app.route("/gitlab-webhook", methods=['POST'])
def githubWebhook():
    def load_secret(TOKEN, key):
        try:
            # slack_message_pipe(step=f'I LOAD JSON')
            print(TOKEN, ' !!! ', key)
            if TOKEN == key:
                return 200
            else:
                return 404
        except Exception as e:
            slack_message_pipe(step=e)
    try:
        content = request.json
        data = request.headers
        print(type(data))
        key = data['X-Gitlab-Token']
        load_secret(TOKEN, key)
        commits_list = content['commits']
        json_dump_for_proj(data=commits_list)
    except Exception as e:
        slack_message_pipe(step=e)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8889)

ОШИБКА:

ERROR in app: Exception on /gitlab-webhook [POST]
Traceback (most recent call last):
File "python3.8/site-packages/flask/app.py", line 2070, in wsgi_app
response = self.full_dispatch_request()
File "python3.8/site-packages/flask/app.py", line 1516, in full_dispatch_request
return self.finalize_request(rv)
File "/python3.8/site-packages/flask/app.py", line 1535, in finalize_request
response = self.make_response(rv)
File "/python3.8/site-packages/flask/app.py", line 1698, in make_response
raise TypeError(
TypeError: The view function for 'githubWebhook' did not return a valid response. The function either returned None or ended without a return statement.
"POST /gitlab-webhook HTTP/1.1" 500 -

Прочитав ошибку, появилась мысль использовать make_response(), но я не нашел пока примеров или что-о из чтива на этот счет

Воплотил идею @insolor, но решил не мудрить
Вышло это
<code>
@app.route("/gitlab-webhook", methods=['POST'])
    def githubWebhook():
        my_resp = ''
        def load_secret(TOKEN, key):
            try:
                # slack_message_pipe(step=f'I LOAD JSON')
                print(TOKEN, ' !!! ', key)
                if TOKEN == key:
                    my_resp = 200
                    return my_resp
                else:
                    my_resp = 404
                    return my_resp
            except Exception as e:
                slack_message_pipe(step=e)
        try:
            content = request.json
            data = request.headers
            print(type(data))
            key = data['X-Gitlab-Token']
            load_secret(TOKEN, key)
            commits_list = content['commits']
            thread = Thread(target=json_dump_for_proj, args=(commits_list))
            thread.start()
            return my_resp
        except Exception as e:
            slack_message_pipe(step=e)

    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8889)
</code>


Разбить список по 3 элемента и сравнить со словарем
Имеется список.

df = data_frame_from_first_table['status_id'].astype(str).values.tolist()

На выводе имеется:

['2', '7', '0', '2', '7', '0', '3', '2', '7', '1', '7', '0', '3', '1', '7', '3', '1', '7', '1', '7', '0']

Есть словарь

dict_of_right_transitions = { '1': {'2','7','0'}, '2': {'7','2','3'}, '3': {'7','1','7'}, '4': {'1','3','7'}, '5': {'0','7','1'}, '6': {'7','1','3'} }

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

Поправил словарь на словарь кортежей. Из списка состояний выбираются последовательные не перекрывающиеся тройки и проверяются на принадлежность множеству "правильных" кортежей:
<code>
transitions = {
    '1': ('2','7','0'),
    '2': ('7','2','3'),
    '3': ('7','1','7'),
    '4': ('1','3','7'),
    '5': ('0','7','1'),
    '6': ('7','1','3')
}

states = ['2', '7', '0', '2', '7', '0', '3', '2', '7', '1', '7', '0', '3', '1', '7', '3', '1', '7', '1', '7', '0']

s = set(transitions.values())
for t in zip(*([iter(states)] * 3)):
    if t not in s:
        print(t)
        break
else:
    print('OK')
</code>


Проверка, является ли число квадратом целого числа
Учитывая целое число, определите, является ли оно квадратным числом:
В математике квадратное число или идеальный квадрат — это целое число, являющееся квадратом целого числа; другими словами, это произведение некоторого целого числа на самого себя.
Примеры:
-1: False, 0: True, 25 True | CodeWars
Первый вариант решения проходит все тесты, но не проходит по времени:

if n ==0:
    return True
else:
    for i in range(0,n):
        if i*i==n:
            return True
    else:
        return False

Второй вариант не проходит 3 теста (на 3, 26 и секретный):

if n == 0:
    return True
elif n<0:
    return False
else:
    if n ** 0.5 == 1: return False
    else: return True

Почему второй вариант не проходит данные тесты?
Нужен вариант, который занимает мало времени (не попадёт под ошибку
Execution Timed Out (12000 ms), а также не используются библиотеки.

Нет смысла делать цикл до
n. Это примерно 100500 лишних операций в среднем. Если
n равно 10001, то получится 9900 лишних итераций, ведь квадрат любого числа больше 100 уже больше 10000, так зачем их проверять. Нужно делать цикл до квадратного корня из
n

if n == 0:
    return True
else:
    for i in range(n + 1):
        i2 = i * i # квадрат очередного числа
        if i2 == n:
            return True
        elif i2 > n: # если квадрат больше n, то нет смысла проверять дальше
            break
return False # тут я убрал else и перенес строчку на уровень выше. Разницы никакой нет, а читаемость улучшилась.

Прибавление 1 позволяет убрать первую проверку на 0. Так что мы эту проверку лучше заменим на проверку отрицательных чисел:

if n < 0:
    return False
else:
    for i in range(n + 1):
        i2 = i * i
        if i2 == n:
            return True
        elif i2 > n:
            break
return False


Как переменную Translate_points сделать глобальной? [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 1 год назад.

Это сообщение было исправлено и отправлено на проверку 1 год назад, но повторное открытие сообщения провалилось:

Исходные причины закрытия не были исправлены

                        Улучшить вопрос

выдает такую ошибку name 'Translate_points' is parameter and global. счетчик не работает.
Как сделать результат работы функции доступным для считывания следующей функции?
<code>
    import random
     def V1_inputf1(Translate_points):
        print(Translate_1,'рандомный глагол')
        Infinitive_input=input("введите инфинитив ",)
        if Infinitive_input==Infinitive[index_Translate]:
            Translate_points += 1
            return Translate_points
        else:
            Translate_points -= 1
            return Translate_points
    def V2_inputf1(Translate_points):
        print(Translate_1,'рандомный глагол')
        Past_Simple_input=input("Введите вторую форму ",)
        global Translate_points
        if Past_Simple_input==Past_Simple[index_Translate]:
            Translate_points += 1
            return Translate_points
        else:
            Translate_points -= 1
            return Translate_points
     def THE_END():
       print("______________________________________________________________________________")
       print("______________________________________________________________________________")

while Translate_points<15:
    Translate = ['гнуть', 'строить', 'золотить', 'одалживать', 'отправлять', 'тратить', 'разгибаться']
    Infinitive = ["bend", "build", "gild", "lend", "send", "spend", "unbend"]  # Инфинитив
    Past_Simple = ["bent", "built", "gilt", "lent", "sent", "spent", "unbent"]  # Вторая форма
    Participle_2 = ["bent", "built", "gilt", "lent", "sent", "spent", "unbent"]  # Третья форма
    Translate_1=random.choice(Translate)
    print(Translate_1,'рандомный глагол')
    index_Translate=Translate.index(Translate_1)
    print(Infinitive[index_Translate],'-',Past_Simple[index_Translate],'-',Participle_2[index_Translate])

  print(V1_inputf1(Translate_points))
  print(V2_inputf1(Translate_points))
  THE_END()
  print(V2_inputf1(Translate_points))
  print(V1_inputf1(Translate_points))
  THE_END()
</code>

Выносите все определения функций
def из кода наружу. Они должны идти сразу после
import-ов, перед выполняемым кодом. Когда функции описываются прямо внутри кода, такой код невозможно читать.
Далее.

    def V2_inputf1(Translate_points):
                   ^^^^^^^^^^^^^^^^ параметр функции
        print(Translate_1,'рандомный глагол')
        Past_Simple_input=input("Введите вторую форму ",)
        global Translate_points
               ^^^^^^^^^^^^^^^^ глобальная переменная
        ...
  print(V2_inputf1(Translate_points))
                   ^^^^^^^^^^^^^^^^ передача параметра в функцию

Зачем вам глобальная переменная
Translate_points, если вы и так
Translate_points передаёте в функцию при её вызове в явном виде? Уберите просто
global Translate_points, вам это не нужно.
Единственное что нужно сделать - это принимать изменённое значение переменной, которое возвращает функция, и помещать обратно в эту переменную. Примерно так:

Translate_points = V2_inputf1(Translate_points)
print(Translate_points)

И так для всех функций, которые изменяют и возвращают.


Создание списка в словаре
заранее благодарю всех ответивших за помощь!
Я только начинаю изучать программирование и Python в частности по книге Эрика Мэтиза.
В одном из заданий столкнулся с проблемой, необходимо с помощью цикла
while создать словарь и вывести результат. Задание решено, код работает. Но я хочу чтоб при вводе нескольких значений с одинаковым ключом, значения создавали список а не меняли друг друга. Попытки использовать метод
append() увы успеха не дали, наверняка допускаю ошибку.
Буду рад любому совету, всего доброго!

responses = {}# начальный пустой словарь
polling_active = True # условие выполнения цикла

while polling_active:
    name = input("\nВаше имя? ") # ввод переменной key
    response = input("Какую страну вы хотели бы посетить?")# ввод переменной value

    responses[name]=response # присвоение значения ключу

    repeat = input("Будут еще желающие ответить?(да/ нет)")
    if repeat == 'нет':# условие завершения цикла
        polling_active = False

print("\n--- Poll Results ---")
for name, response in responses.items():# вывод результата
    print(f"{name} желает посетить {response}")

По идее можно использовать специальные словари типа
defaultdict, однако таковые нужно изначально импортировать и т.д., что не есть очень хорошо.
С другой стороны, если при каждом получении очередного ключа предположить, что туда можно поместить некоторое значение по умолчанию (т.е. если такого ключа в словаре нет, то мы подставим туда необходимое), то мы можем подставлять в
responses[name] список, если такой пары нет. Это прекрасно выполняется при помощи уже встроенной в Python функции
dict.setdefault() — надо всего лишь подставить задать всем полям пустые списки; если же очередное поле пустое, то оно гарантированно получит пустой список; а дальше можно легко добавлять при помощи
append() :)
Ну и ещё нужно будет распаковать получившийся список в строку, это выполняется при помощи
delim.join(lst).

responses = {}# начальный пустой словарь
polling_active = True # условие выполнения цикла

while polling_active:
    name = input("\nВаше имя? ") # ввод переменной key
    response = input("Какую страну вы хотели бы посетить? ")# ввод переменной value

    responses.setdefault(name, []) # по умолчанию задаём responses[name] как []
    responses[name].append(response) # добавление значения к ключу

    repeat = input("Будут еще желающие ответить?(да/ нет) ")
    if repeat == 'нет':# условие завершения цикла
        polling_active = False

print("\n--- Poll Results ---")
for name, response in responses.items():# вывод результата
    print(f"{name} желает посетить {', '.join(response)}")
    # список превращается в разделённые запятыми слова


Отправить каждые 30 минут комментарий вк
нужна программа (не для спама), которая в сообщество, под определенный пост отправляла бы раз в 30 минут слово стоп в комментарии
Я пытался написать её на python и все время не удачно
Помогите пожалуйста

От лица сообщества:

import vk_api
import schedule
import time

def com():

    vk_session = vk_api.VkApi(
        token='токен группы')

    vk = vk_session.get_api()
    vk.wall.createComment(owner_id='-id группы', post_id='id поста',
                          from_group='id группы от кого комментарий', message='стоп')
com()

schedule.every(30).minutes.do(com)

while True:
    schedule.run_pending()
    time.sleep(1)

Либо от лица пользователя:

import vk_api
import schedule
import time

def com():

    login, password = 'логин от аккаунта', 'пароль от аккаунта'
    vk_session = vk_api.VkApi(login, password)

    try:
        vk_session.auth(token_only=True)
    except vk_api.AuthError as error_msg:
        print(error_msg)
        return

    vk = vk_session.get_api()
    vk.wall.createComment(owner_id='-id группы', post_id='id поста', message='стоп')
com()

schedule.every(30).minutes.do(com)

while True:
    schedule.run_pending()
    time.sleep(1)


Как не прерывать внешний цикл, при остановке вложенного словом break (PYTHON)
господа программисты! Помогите пожалуйста решить проблему: есть внешний цикл, который позволяет начинать игру заново при определенном условии, и есть внутренний, который отвечает за логику игры. Собственно САМА ПРОБЛЕМА: логика была простая остановить внутренний цикл while с пом. break и продолжить выполнение внешнего цикла. Но при остановке внутреннего цикла, далее не выполняются инструкции внешнего цикла, и я полностью не понимаю почему. Погуглила, в интернетах подобной проблемы не нашла, навыки гугления у меня не очень хорошие. Заранее крайне благодарна за советы бывалых джедаев. А то я только начала этот нелегкий путь становления программистом
'''
<code>
count = 10
continue_var = 'yes'
round = 1
while continue_var == 'yes':
    while count > 0:
        print(f'РАУНД - {round}')
        print(f'Оставшееся количество полочек - {count}')
        p1_count = int(input(f'Первый игрок введите количество палочек на {round} круге: '))
        # Проверка на достоверность введенный данных
        while p1_count < 1 or p1_count > 3:
            print("Введите значение от 1 до 3")
            p1_count = int(input('Первый игрок введите количество палочек : '))
        count -= p1_count
        # Проверка на условие конца игры
        if count <= 0:
            print('Первый игрок проиграл')
            break
        p2_count = int(input(f'Второй игрок введите количество палочек {round}  круге: '))
        # Проверка на достоверность введенный данных
        while p2_count < 1 or p2_count > 3:
            print("***Введите значение от 1 до 3***")
            p2_count = int(input('Второй игрок введите количество палочек: '))
        count -= p2_count
        # Проверка на условие конца игры
        if count <= 0:
            print('Второй игрок проиграл')
            break
        round += 1
continue_var = input('Игра окончена, желаете продолжить? введите yes, если желаете продолжить: ')
</code>

Вы просто забыли перенести строку, спрашивающую о продолжении игры, внутрь внешнего цикла, и почему-то вынесли его вне цикла. Без этого внешний цикл выполнится вновь, но тогда внутренний цикл снова не сработает — потому что переменная
count останется нулём, а условие попросту не выполнится. Это же лечится переносом
count = 10 перед внутренним циклом. Плюс ещё не объединичится число раундов, хотя это тоже предполагается.
Таким образом, получаем примерно вот такой код:

continue_var = 'yes'
while continue_var == 'yes':
    count = 10
    round = 1
    while count > 0:
        print(f'РАУНД - {round}')
        print(f'Оставшееся количество полочек - {count}')
        p1_count = int(input(f'Первый игрок введите количество палочек на {round} круге: '))
        # Проверка на достоверность введенный данных
        while p1_count < 1 or p1_count > 3:
            print("Введите значение от 1 до 3")
            p1_count = int(input('Первый игрок введите количество палочек : '))
        count -= p1_count
        # Проверка на условие конца игры
        if count <= 0:
            print('Первый игрок проиграл')
            break
        p2_count = int(input(f'Второй игрок введите количество палочек {round}  круге: '))
        # Проверка на достоверность введенный данных
        while p2_count < 1 or p2_count > 3:
            print("***Введите значение от 1 до 3***")
            p2_count = int(input('Второй игрок введите количество палочек: '))
        count -= p2_count
        # Проверка на условие конца игры
        if count <= 0:
            print('Второй игрок проиграл')
            break
        round += 1
    continue_var = input('Игра окончена, желаете продолжить? введите yes, если желаете продолжить: ')


Как достать данные из списка словаря
у меня есть список
<code>
 res = [{1:{
                1: [ReservationData.Seat(id_coach=1, id_spot=1, text_from="0", text_to="5", text_special = 1)],
                2: [ReservationData.Seat(id_coach=1, id_spot=2, text_from="0", text_to="6", text_special = 2)],
                3: [ReservationData.Seat(id_coach=1, id_spot=3, text_from="0", text_to="11", text_special = 3)],
                4: [ReservationData.Seat(id_coach=1, id_spot=4, text_from="0", text_to="11", text_special = 4)],
                }}]
</code>
Мне надо достать данные второго словаря с ключом 1 и значением ReservationData то есть значение ключа 1 которые в квадратных скобках

res = [
      ^ список, первый элемент списка берём как [0]
       {1:
       ^ словарь, берём значение по ключу, т.е. [1]
          {1:
          ^ опять словарь, опять по ключу [1]
             [ReservationData...
             ^ список, первый элемент списка берём как [0]

Итого:

res[0][1][1][0]


Как удалить все строки, в столбце которой содержится определенное слово/фраза?
Всем привет, только недавно начал пользоваться и учить python. Хочу понять, как мне удалить все строки, в которых содержится слово 'реф' в столбце 'тип авто'. Удалить нужно до строки сортировки.
Код прикладываю:
<code>
import pandas as pd
data = pd.read_excel('PythonТарифы2.xlsx')
xl = pd.ExcelFile('PythonТарифы2.xlsx')
print(xl.sheet_names)
df1 = xl.parse('Лист3')
df1.sort_values(by=['прямой (руб без НДС) О', 'Дата действия от'], ascending=[True, False], inplace = True)
df1.drop_duplicates(subset='ОткудаКудаПаллет', keep="first", inplace = True)
df1.to_excel('МинимальныеТарифыPythonP2.xlsx')
</code>

Вот хочу вам помочь, читаю ваш вопрос "Хочу понять, как мне удалить все строки, в которых содержится слово
'реф' в столбце
'тип авто'." Покажите мне в вашем скрипте, где вы не то что работаете, а хотя-бы упоминаете  столбец 'тип авто'?   Долго думал над фразой
Удалить нужно до строки сортировки. И не мог понять, какая строка сортировки может быть в той таблице, из которой надо что-то удалять.  Вам не жаловаться надо,
"я только начинаю учить python, пожалейте меня". Вам надо учиться точно и аккуратно описывать проблему, если хотите получить помощь.
Отвечаю только потому, что это ваш первый вопрос на форуме, а к новичкам надо относиться (на первых порах) лояльно, нежно и трепетно.
В общем, поскольку вам лень аккуратно писать свой вопрос -  мне лень аккуратно писать на него ответ. Поэтому вот вам пример, как из датафрейма "удалить строки, в которых содержится слово
'реф' в столбце
'тип авто'"

df=pd.DataFrame({'A':[1,2,3,4,5,6,7],'тип авто':['qqq','ttt','реф','uuu','реф','sss','реф'],
                                                 'C':[i for i in np.random.random(7)]})

В датафрейме находиться

   A тип авто         C
0  1      qqq  0.962045
1  2      ttt  0.953155
2  3      реф  0.508149
3  4      uuu  0.565687
4  5      реф  0.298825
5  6      sss  0.261208
6  7      реф  0.859682

Удаляем
Вариант 1.

df=df.loc[df['тип авто'] != 'реф']

Вариант 2.

df.drop(np.where(df['тип авто'] == 'реф')[0],inplace=True)

Результат в обоих случаях, как и ожидалось, тождественен:

   A тип авто         C
0  1      qqq  0.962045
1  2      ttt  0.953155
3  4      uuu  0.565687
5  6      sss  0.261208

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


компиляция файла python на windows для mac os
Доброе утро , мне надо скомпилировать
python код для
mac-os , сам я на windows сижу , как мне можно это сделать ?

Можно скачать VirtualBox (здесь), установить macos, на мак python и скомпелировать, а от туда уже на свой. Это в кратце. У меня самого есть VirtualBox по этому я могу скомпелровать.


Что означает (visited.add(x) or False)?

nums = [1, 5, 2, 1, 4, 5, 1]

visited = set()
dup = [x for x in nums if x in visited or (visited.add(x) or False)]

print(dup)  # [1, 5, 1]

Здравствуйте,
меня интересует принцип работы алгоритма для нахождения повторяющихся значений списка.
Проблема заключается в 4 строке.
Не понимаю, зачем здесь
(visited.add(x) or False)?
Что означает этот код?

Тут используется особенность работы
or в питоне. Вопреки распостраненному мнению результатом работы
or является не значение типа
bool, а значение либо первого либо второго аргументов, а они могут быть и не
bool.

A or B, где
A и
B некие выражения работает таким образом:

вычисляется выражение
A. Результат обозначим
a. Если
a при приведении к типу
bool равно
True (еще по другому говорят значение является правдивым, англ. truthy), результатом
A or B будет
a. При этом, что важно отметить, значение выражения
B вообще не вычисляется.
Иначе (т.е. если
bool(a) == False, значение ложное или falsy) результатом
A or B будет значение выражения
B.

Примеры:

A or B
A
bool(A)
Результат
A or B
Пояснение

False or 1
False
False
1

[1] or False
[1]
True
[1]
непустой список - truthy

[] or 'abc'
[]
False
'abc'
пустой спискок - falsy

None or 12
None
False
12
bool(None) == False

'abc' or 12
'abc'
True
'abc'
непустая строка - truthy

'' or 55
''
False
55
непустая строка - falsy

Как же
or работает в
if если результатом является не
bool? Просто - значение всего вычисленного выражения приводится к
bool, т.е. скажем
if [] or 'abc' будет  истинно т.к.
bool('abc') == True.
Может возникнуть вопрос: зачем эти сложности?
Такая особенность работы
or используется для компактной записи условий. Вместо:

if x:
   y = x
else:
   y = z

Можно написать
y = x or z.
В примере из вопроса смысла в
or False в
visited.add(x) or False нет, так как выражение используется в
if и значит будет сделано неявное приведение к bool. Значением выражения
visited.add(x) является
None и при приведении к
bool все равно получится
False.
Вне булевого контекста (т.е. не в if) это имеет значение и следующие две строки работают по разному:

y = visited.add(x)            # y будет равно None
y = visited.add(x) or False   # y будет равно False


Нужно прибавить все значения из словаря
У меня имеется код для парсинга, выглядит он так:
<code>
Roman = {
        'I' : 1,
        'II': 2,
        'III':3,
        'V' : 5,
        'X' : 10,
        'L': 50,
        'C' : 100,
        'D' : 500,
        'M' : 1000
         }
def RomantoArabic(number):

      if len(number) == 1:
            print (Roman[number])

      elif len(number) == 2:
            if Roman[number[0]] < Roman[number[1]]:
               print (Roman[number[1]] - Roman[number[0]])
            if Roman[number[0]] >= Roman[number[1]]:
               print(Roman[number[1]] + Roman[number[0]])

      elif len(number) > 2 and Roman[number[0]] >= Roman[number[1]] and not Roman[number[-1]] > Roman[number[-2]]:
            Arabic = sum(Roman[blabla] for blabla in number)
            print(Arabic)
      elif len(number) > 2 and Roman[number[0]] <= Roman[number[1]] and not Roman[number[-1]] > Roman[number[-2]]:
            Arabic = (Roman[number[1]] - Roman[number[0]]) #Тут надо прибавить все оставшиеся числа
            print(Arabic)
</code>
В самой последней строке, где Arabic, я уже минусую число с первого индекса от
второго, однако, в резуьтате я должен получить общую сумму и я не знаю как мне прибавить все оставшиеся числа (которые должны браться из словаря, поскольку у меня приходят римские буквы на вход) Заранее спасибо!

Можно запоминать предыдущий символ и убирать его, если он меньше текущего
<code>
def RomantoArabic(number):
    res = 0
    prev = 2000
    for num in number:
        if Roman[num] > prev:
            res += - 2*prev
        res += Roman[num]
        prev = Roman[num]
    print(res)
</code>


Как не выводить значения 0 из sql таблицы? (Pytelegrambotapi)
Всем привет. Впервые начал изучать SQLite и создаю тг-бота с БД (библиотека pytelegrambotapi). Таблицу писал вручную (помог человек). Всё сделано на мобилке. Но проблема в том, что бот выводит значения с 0, которые пользователю абсолютно не нужны. Например, в столбце tree2 много 0. Да, у меня код вообще неудобный и всё такое, но я, пока что, учусь. Пытался сделать через if-else, но ничего не изменилось. Искал примеры в интернете, подставлял, тоже не получалось. Буду рад, если мне укажут мои ошибки! Заранее спасибо.
Вот кусочек кода:

def func(message):
    furniture_name = message.text
    with con:
        data = con.execute("SELECT name FROM furniture WHERE name=?", [furniture_name])
        data2 = con.execute("SELECT ctree FROM furniture WHERE name=?", [furniture_name])
        data3 = con.execute("SELECT tree FROM furniture WHERE name=?", [furniture_name])
        data4 = con.execute("SELECT ctree2 FROM furniture WHERE name=?", [furniture_name])
        data5 = con.execute("SELECT tree2 FROM furniture WHERE name=?", [furniture_name])
        data6 = con.execute("SELECT crude FROM furniture WHERE name=?", [furniture_name])
        data7 = con.execute("SELECT rude FROM furniture WHERE name=?", [furniture_name])
        data8 = con.execute("SELECT crude2 FROM furniture WHERE name=?", [furniture_name])
        data9 = con.execute("SELECT rude2 FROM furniture WHERE name=?", [furniture_name])
        imya = data.fetchone()
        countct = data2.fetchone()
        countt = data3.fetchone()
        countct2 = data4.fetchone()
        countt2=data5.fetchone()
        countcr=data6.fetchone()
        countr=data7.fetchone()
        countcr2=data8.fetchone()
        countr2=data9.fetchone()

        if not imya:
            bot.send_message(message.chat.id, '❗Прости, я не могу найти такой декор(( Возможно, ты сделал ошибку ❗')
        else:
            countr2em = countr2[0]
            countcr2em = countcr2[0]
            countrem = countr[0]
            countcrem = countcr[0]
            countt2em = countt2[0]
            countct2em = countct2[0]
            counttem = countt[0]
            countctem = countct[0]
            imyaem = imya[0]
            bot.send_message(message.chat.id, "Название мебели: " + "'" + str(imyaem) + "'\n\nДля этой мебели тебе потребуется: \n<b>" + str(countctem) + " " + str(counttem) + "\n" + str(countct2em) + " " + str(countt2em) + "\n" + str(countcrem) + " " + str(countrem) + "\n" + str(countcr2em) + " " + str(countr2em) +  "</b>\n", parse_mode='html')

@bot.message_handler(commands=['start'])
def start(message):
    msg = bot.send_message(message.chat.id, "Приветик! Введи название мебели")
    bot.register_next_step_handler(msg, func)

Пока что, бот выводит информацию вот так:

Пользователь: Диван
Бот: Название мебели: 'Диван'
Для этой мебели тебе потребуется:
4 Берёзы
0
0 Железа
0 Досок

Нулей быть не должно.
Я пытаюсь сделать в таком виде:

Пользователь: Диван
Бот: Название мебели: 'Диван'
Для этой мебели тебе потребуется:
4 Берёзы

Изменено:

    with con:
        furniture_name=message.text
        con.row_factory = sqlite3.Row
        row = con.execute("SELECT * FROM furniture WHERE name=?", [furniture_name]).fetchone()

        if not row:
            bot.send_message(message.chat.id, '❗Прости, я не могу найти такой декор(( Возможно, ты сделал ошибку ❗')
            return

        name = row['name']
        ctree = row['ctree']
        tree = row['tree']
        ctree2 = row['ctree2']
        tree2 = row['tree2']
        crude = row['crude']
        rude = row['rude']
        crude2 = row['crude2']
        rude2 = row['rude2']

        lines = [
            f'Название мебели: {name}',
            ' ',
            'Для этой мебели тебе потребуется:',
        ]
        if ctree:
            lines.append(f'ctree: {ctree}')
        if tree:
            lines.append(f'tree: {tree}')
        if ctree2:
            lines.append(f'ctree2: {ctree2}')
        if tree2:
            lines.append(f'tree2: {tree2}')

        bot.send_message(message.chat.id, str(lines)+ str(ctree) + str(tree) + str(ctree2) + str(tree2), parse_mode='html')```

Замечания:

Используйте один запрос, вернув нужные поля

Для удобства можно использовать
con.row_factory = sqlite3.Row, чтобы результатом был объект подобный словарю, тогда можно будет по названиям полей, а не их индексам, запрашивать значения

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

row = con.execute("SELECT name, ctree, tree FROM furniture WHERE name=?", [furniture_name]).fetchone()
...
name, ctree, tree = row

Вместо конкатенации строки может быть проще подготовить список строк, который будет объединен в текст:

Пример:

import sqlite3
...

with con:
    con.row_factory = sqlite3.Row
    row = con.execute("SELECT * FROM furniture WHERE name=?", [furniture_name]).fetchone()
    if not row:
        bot.send_message(message.chat.id, '❗Прости, я не могу найти такой декор(( Возможно, ты сделал ошибку ❗')
        return

    name = row['name']
    ctree = row['ctree']
    tree = row['tree']
    ctree2 = row['ctree2']
    tree2 = row['tree2']
    crude = row['crude']
    rude = row['rude']
    crude2 = row['crude2']
    rude2 = row['rude2']

    lines = [
        f'Название мебели: {name}',
        '',
        'Для этой мебели тебе потребуется:',
    ]
    if ctree:
        lines.append(f'ctree: {ctree}')
    if tree:
        lines.append(f'tree: {tree}')

    И так перечислить все поля...

    text = '\n'.join(lines)

    bot.send_message(message.chat.id, text, parse_mode='html')


Как вытащить имя рандомной картинки, отосланной пользователю в телеграмм боте
Я учитель математики и пытаюсь написать тг бота для детей. Суть - несколько папок с файлами по заданиям (1,2,3..), при вводе номера задания отсылается картинка с рандомным соответствующим заданием, подскажите, пожалуйста, как узнать имя того файла, который выпал, чтобы прописать ответы на задания и дети могли делать проверку? Заранее спасибо
<code>
from random import random
import telebot
from telebot import types
import random
import os

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start'])
def start(message):
    mess = f'Привет, {message.from_user.first_name}'
    bot.send_message(message.chat.id, mess, parse_mode='html')

@bot.message_handler(content_types=['text'])
def get_user_text(message):
    if message.text == "Задание 1":
        photo = open('1/' + random.choice(os.listdir('1')), 'rb')
        bot.send_photo(message.from_user.id, photo)

t.polling(non_stop=True)
</code>

Я не совсем понял как вы будете использовать такое название файла, но думаю разберетесь.
Делал со своего темплейта, игнорируйте мой токен.
Если есть вопросы задавайте
<code>
import os
import random
import time

from telebot import TeleBot, types

import config

bot = TeleBot(config.BOT_TOKEN)

@bot.message_handler(commands=['start'])
def start(message: types.Message):
    bot.send_message(message.chat.id, f"Приветствую, {message.from_user.first_name}\n"
                                      f"Начать тест?")

# тут я делаю фильтр на ввод от юзера
# он будет срабатывать только если юзер напишет да или Да
@bot.message_handler(func=lambda msg: msg.text.lower() == "да")
def start_test(message: types.Message):
    # лезем в папку с тестами
    tree = os.walk("tests")
    test = None
    for directory, folders, files in tree:
        # необязательно, но мне пришлось так как при каждом перезапуске
        # бота этот сид не менялся
        random.seed(time.time().real)
        # выбираем рандомно название файла
        test = random.choice(files)
        break
    # открываем файл
    with open(os.path.join("tests", test)) as f:
        data = f.read()

    bot.send_message(message.chat.id, f"Вот твое задание\n{data}")

if __name__ == '__main__':
    bot.infinity_polling(skip_pending=True)
</code>


Сделать накопительный столбец в датафрейме [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 1 год назад.

                        Улучшить вопрос

В датафрейм df Нужно добавить столбик с накоплением данных от другого столбца,
я его сейчас добавил вручную это quantity_sum. Он накапливает сумму от quantity
Как сделать это быстро и правильно? по Питоновски)) ?
<code>
        date    quantity    quantity_sum
0   2021-12-30  2  2
1   2021-12-31  1  3
2   2022-01-01  1  4
3   2022-01-02  3  7
4   2022-01-03  1  8
5   2022-01-04  1  9
6   2022-01-05  1  10
7   2022-01-06  1  11
8   2022-01-07  1  12
9   2022-01-08  1  13
10  2022-01-09  1  14
11  2022-01-10  1  15
12  2022-01-11  1  16
13  2022-01-12  1  17
</code>

<code>
 df['quantity_sum'] = df['quantity'].cumsum()
</code>
Для решения этой задачи, оказывается есть стандартный метод. Проще и быстрее быть не может


Сравнить элементы таблицы и словаря
Есть таблица. Она логирует историю перехода записи в таблице из статуса в статус

id
status_id
time_add

1
0
14-10

1
1
13-12

1
7
12-12

2
3
14-09

2
6
14-08

2
7
14-06

3
1
13-11

3
3
12-10

3
1
12-09

Таблица вытащенат с помощью пандас. Так же данные отсортированы по id и времени (время в порядке убывания.)

req_2 = pd.DataFrame(mobile_records_2)
Так же есть словарь допустимых переходов из статуса в статус по типу

dict_1 = {'1':'2', '2':'3', '1':'4', '2':'5', '5':'2', }
Переход из статуса в статус - комбинация рядом стоящих значений столбцыа status_id.
Т.е для id = 1, переходы из статуса в статус были следующие:
7 - 1 - 0
(0 - конечный и самый новый статус)
в 12 -12 запись с id(1) находилась в статусе(7)
затем в 13-12 изменила статус на (1)
и в 14-10 завершила переход и осталась со статусом(0)
Вот в чем вопрос, как можно сравнить соответствует ли переход из статуса в статус записей таблицы разрешенным переходам в словаре?

Ну вот как-то так. Только учтите, что у словаря не может быть больше одной записи с одинаковым ключом. Если вам такое нужно, вам придётся переделывать со словаря на список кортежей. И я поменял одну запись в словаре, чтобы хоть один переход был легальным:

import pandas as pd
import numpy as np

def func(series):
    for a, b in zip(series[1:], series):
        if dict_1.get(a) != b:
            print(f'Ошибочный переход: {a} -> {b} ({dict_1.get(a)})')

dict_1 = {'1':'2', '2':'3', '1':'3', '2':'5', '5':'2', }

data = """id    status_id   time_add
1   0   14-10
1   1   13-12
1   7   12-12
2   3   14-09
2   6   14-08
2   7   14-06
3   1   13-11
3   3   12-10
3   1   12-09""".split('\n')
data = list(map(str.split, data))
df = pd.DataFrame(data[1:], columns=data[0])

_ = df.groupby('id')['status_id'].agg(func)

Вывод:

Ошибочный переход: 1 -> 0 (3)
Ошибочный переход: 7 -> 1 (None)
Ошибочный переход: 6 -> 3 (None)
Ошибочный переход: 7 -> 6 (None)
Ошибочный переход: 3 -> 1 (None)

В скобках - значение словаря для такого ключа перехода, если ключа вообще нет в словаре, то будет
None.


Сделать ре-import библиотеки
Пишу код в
jupyter так как я аналитик данных, сталкиваюсь с такой проблемой, что когда что то добавляю в свою библиотеку, которую использую в текущем коде, она не обновляется в запущенном
jupyter блокноте, приходится перезапускать ядро. Уходит много времени на перезапуск ячеек, как можно решить эту проблему? Обновлять библиотеку не перезапуская все, если повторно запустить ячейку с
import, библиотека не обновляется.

Наверняка дубликат, мне лень искать. Обычно вот это вроде используется:
<code>
%load_ext autoreload
%autoreload 2
</code>
Взято с англоязычного СО


Ну, вот такое будет условие:

df['flag'] = (0 <= df['LMA']) & (df['LMA'] <= df['Volume'] * 10)

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


Как сделать выполнение циклов одновременным и ускорить код в разы?
У меня есть код, в котором
8 циклов. Каждые два цикла обрабатывают один словарь данных, в данном примере список.
Подскажите, как сделать так, чтобы каждая пара циклов вычислялась одновременно, при этом, чтобы каждая пара циклов выдавала результат одновременно, чтобы не было такого, что одна пара выдаёт результат раньше другой.
И второй момент.
Как ускорить код? Есть какие-то действенные способы. Я пробовал основы многопоточности, но код становился только медленнее. Скорее всего делал что-то не то.
Для примера даю простейшие циклы, мои рабочие циклы гораздо сложнее по вычислению, но их дать вам не могу. (конфиденциальность).

data1 = [5, 6, 7, 3, 5 , 8, 3]
for i in data1:
    if i == 3:
        data1[i] = 9
print(data1)
for i in data1:
    if i == 2:
        data1[i] = 5
print(data1)

data2 = [5, 6, 7, 3, 5 , 8, 3]
for i in data2:
    if i == 8:
        data1[i] = 9
print(data2)
for i in data1:
    if i == 5:
        data2[i] = 00
print(data2)

data3 = [5, 6, 7, 3, 5 , 8, 3]
for i in data3:
    if i == 5:
        data3[i] = 9
print(data3)
for i in data3:
    if i == 1:
        data3[i] = 5
print(data3)

data4 = [5, 6, 7, 3, 5 , 8, 3]
for i in data4:
    if i == 3:
        data4[i] = 5
print(data4)
for i in data4:
    if i == 2:
        data4[i] = 9
print(data4)

Заранее всем спасибо за потраченное на мой вопрос время.

Внимание: В примере у меня работа с
numpy.array, а с чисто питоновскими списками всё будет несколько сложнее. Но в любом случае вам лучше будет смотреть в сторону типизированных массивов для ускорения расчётов, родные типы питона довольно тормозные. Если только вам не нужно работать с бесконечными
int-ами, тогда у родного
int питона есть преимущество.

Если у вас обычные числа в списках и довольно простые ветвления и вычисления, то может помочь
Numba причём без особых усилий:

import numba as nb
import numpy as np

def process1(data1):
    for i in data1:
        if i == 3:
            data1[i] = 9
    for i in data1:
        if i == 2:
            data1[i] = 5
    return data1

data1 = np.random.randint(100, size=(10_000_000))
%time process1(data1)

p1 = nb.njit(process1)
%time p1(data1)

print()

Вывод:

CPU times: user 6.43 s, sys: 0 ns, total: 6.43 s
Wall time: 6.45 s
CPU times: user 224 ms, sys: 0 ns, total: 224 ms
Wall time: 224 ms

Список из 10 млн. элементов обычный питон обрабатывает 6 секунд, а после использования декоратора
numba.njit тот же список и тем же самым кодом обрабатывается 0.2 секунды, ускорение в 30 раз без малейших усилий. Причём, чем больше размеры списков, тем заметнее будет ускорение.
Но если вычисления будут не просто арифметические и условия будут не такие простые, то с
Numba возможно придётся ещё повозиться, чтобы она согласилась ускорять ваш код.


Aiogram, как вытащить переменную message.text. Входящее сообщение от пользователя
Aiogram, как вытащить переменную message.text. Входящее сообщение от пользователя.
Мне нужно вытащить текст входящего сообщения поместить его в переменную. И использовать далее.
При выводе print (message.text) после await работает правильно.
Но мне нужно именно вне данной функции.
Ошибка:
<code>
print (message.text) NameError: name 'message' is not defined

    @dp.message_handler(commands="avito")
async def cmd_avito(message: types.Message):
    await message.reply("Введите ссылку вашего товара")
    await bot.send_message(message.from_user.id, message.text)
</code>

Просто сделай переменную message глобальной


Проверка типа объекта и вывод соответствующего сообщения
Как реализовать проверку типа объекта и чтобы по результату выводилось соответствующее сообщение. Сказали через словарь сделать, добавить сначала все типы в словарь.
Нужно получить такой результат:

Пример 2:
Введите данные: {‘a’: 10, ‘b’: 20}
Тип данных: dict (словарь)
Изменяемый (mutable)
Id объекта: 1705205308536

Пробую так:

object_enterin = {'a': 10, 'b': 20}  # Здесь вводится любой объект
data_types = {
    int: 'целые числа',
    float: 'вещественные числа',
    str: 'строка',
    tuple: 'кортеж',
    bool: 'логический',
    list: 'список',
    dict: 'словарь',
    set: 'множество'
}

for i_type in data_types.keys():
    ...

Лучше делайте проверку через функцию isinstance(object, classinfo):

sample = 1
if isinstance(int, sample ):
    print(sample, '- тип int')

Ваш data_types - это не список, а словарь

Дополнение:
Если же все таки хотите в список вносить все типы и потом выводить название типа в зависимости от значения из списка то как вариант так:

list_data = [1, '2', 3.2]
lst_type = [int, float, str]
for element_data in list_data:
    for element_type in lst_type:
        if type(element_data) == element_type:
            print(f'Элемент: {element_data} имеет тип: {element_type.__name__}')
            continue

Выдаст:

Элемент: 1 имеет тип: int
Элемент: 2 имеет тип: str
Элемент: 3.2 имеет тип: float

И для сравнения аналогичный код, только с использованием ф-ции isinstance():

list_data = [1, '2', 3.2]
lst_type = [int, float, str]
for element_data in list_data:
    for element_type in lst_type:
        if isinstance(element_data, element_type):
            print(f'Элемент: {element_data} имеет тип: {element_type.__name__}')
            continue

Как по мне - последний вариант на много лучше...


как каждый элемент серии перевести в двоичную систему из шестнадцатиричной
подскажите, пожалуйста, как из 16й системы можно быстро перевести в двоичную.
Если по одному числу записывать, то всё ок, работает.
<code>
a = int('0x3AF4580', 16)
b = bin(a)
</code>
(где 3AF4580 число в 16й системе)
К серии применить не получается. В руку так перебирать 190 тыс шт. долго. Подскажите, пожалуйста, как ускорить процесс.

ну так пишите не по одному, а на все серию:
вот у вас есть pandas.Series s:

     0
0   16
1   22
2  512
3    1
4   69
5   86

далее просто делаете:

s = s.apply(bin)

теперь s:

              0
0       0b10000
1       0b10110
2  0b1000000000
3           0b1
4     0b1000101
5     0b1010110

Если же у вас серия с явной шестнадцатиричгой записью:

      0
0   0xa
1  0x10
2  0xc8
3   0x1
4  0x2d
5  0x38

то перевести в двоичную можно так:

s = s.apply(int, base=16).apply(bin)

получаете s:

            0
0      0b1010
1     0b10000
2  0b11001000
3         0b1
4    0b101101
5    0b111000


Как склеить массивы Numpy
У меня есть исходное изображение 640х480. Извлекаю из него вектора R, G, B. Потом нужно обратно склеить, чтобы восстановилось изображение с формой (480,640,3). У меня получается форма (3,480,640):
<code>
# Исходные вектора
r = np.arange(480*640)
g = np.arange(480*640)
b = np.arange(480*640)

    # Попытка 1
r_2 = r.reshape(480, 640)
g_2 = g.reshape(480, 640)
b_2 = b.reshape(480, 640)
img = np.hstack([r_2, g_2, b_2])
img = np.array(np.hsplit(img, 3))

    # Попытка 2
img = np.column_stack((r, g, b))
img = frame.reshape(480*640, 3)
img = np.array(np.vsplit(img, 480))
img = np.uint8(img)
cv2.imshow("img" , img) # Наблюдаю три изображения в окне
</code>

вам, вероятно. нужен метод dstack:
<code>
res = np.dstack((r,g,b))
print(res.shape)
</code>

(480, 640, 3)


Кнопка включения-выключения в Python [закрыт]

Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 1 год назад.

                        Улучшить вопрос

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

Нужен какой-то флаг включена ли музыка, например
is_music_plays.
И при нажатии на кнопку надо проверять этот флаг, то-есть код функции, зарегистрированной на нажатие кнопки, примерно такой:

if is_music_plays:
    # Выключить музыку
    is_music_plays = False
else:
    # Включить музыку
    is_music_plays = True


Является ли перевод в байт-код в python построчным?
Имеется код:

try:
    def f():
        print('hi')
        print('bye) # здесь намеренно пропущен закрывающий апостроф
except:
    pass

f()

Целью эксперимента было: выяснить, что произойдёт при вызове функции
f, построчное определение (def) которой в run-time провалилось. Предполагалось, что определение (def) как оператор провалилось, поэтому объект функции и ссылка
f на него не создадутся в глобальной области видимости модуля. Поэтому предполагалось, что вызов
f() приведёт к возбуждению исключения NameError.
В действительности оказалось, что при запуске выходит SyntaxError, и строка 'hi' не печатается. Думаю, что то ли блок
try не ловит исключение, то ли bite-code всего модуля не смог создаться, а потому не выполнился его запуск в принципе, и оператор
def даже не начинал работу (собственно как и последующий оператор вызова
f()).
Вопрос: Помогите, пожалуйста, разобраться, почему до вызова
f() дело не дошло. Возможно одно из моих предположений выше верно, тогда хотелось бы увидеть ссылки на документацию, подробно объясняющие происходящее.

Сначала исходник проходит фазу токенизации. Потом из токенов строится AST. Потом компилятор транслирует AST в байткод. Полученный байткод выполняет PVM. Перехват исключений, очевидно, может работать только в процессе выполнения байткода виртуальной машиной, на предыдущих этапах самого механизма исключений ещё не существует, поэтому SyntaxError перехватить нельзя. Конечно, если исключить варианты с парсингом в рантайме, типа выполнения инструкции
eval.


Модификация страницы редактирования записи в django
В джанго есть админка, которая позволяет редактировать записи в БД, она генерируется автоматически. В моей модели есть поле TextField, мне надо добавить markdown редактор на страничку с добавлением/редактированием записи для этого поля.
Как это возможно сделать? Видел только варианты полного изменения всей страницы, но хочется обойтись малой кровью
PS как добавить markdown editor в моем случае - добавить  на старницу

Добавить виджет редактора

pipenv install django-mdeditor
# or
pip install django-mdeditor

Зарегистрировать виджет

INSTALLED_APPS = [
    ...
    'mdeditor',
]

Добавить в
admin.py

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
formfield_overrides = {
    models.TextField: {'widget': MDEditorWidget}
}

Это сделает для всех полей типа
TextField модели
Post редактируемые поля в виде markdown редактора на основе ckeditor. Все это отсюда
Единственное, что там с русским языком не все ок, в некоторых местах китайский вылезает