Как использовать тип данных Literal в python?
Я хочу, чтобы моя функция принимала только две строки
'male' и
'female'. В библиотеке
tkinter в инициализации класса
Label есть параметр
justify: Literal['left', 'center', 'right'](принимает только эти три строки). Как мне использовать тип данных
Literal?

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

from typing import *

def example(justify: Literal['left', 'center', 'right']):
    return justify

def example2(justify):
    valid_list = ['left', 'center', 'right']
    if justify not in valid_list:
        raise TypeError(f'Некорректное значение аргумента: {justify}. Ожидалось {valid_list}')
    return justify

def example3(justify: Literal['left', 'center', 'right']):
    valid_list = ['left', 'center', 'right']
    if justify not in valid_list:
        raise TypeError(f'Некорректное значение аргумента: {justify}. Ожидалось {valid_list}')
    return justify

print(example('another'))  # аргумент подсвечивается в IDE и выдает хинт "Expected type 'Literal['left', 'center', 'right']', got 'Literal['another']' instead"
print(example2('another'))  # выбрасывает исключение с описанием ошибки
print(example3('another'))  # и подсвечивает аргумент и выбрасывает исключение

another
Traceback (most recent call last):
  File "C:\Users\Alex20\PycharmProjects\test\main.py", line 49, in <module>
    print(example2('another'))  # выбрасывает исключение с описанием ошибки
          ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Alex20\PycharmProjects\test\main.py", line 44, in example2
    raise TypeError(f'Некорректное значение аргумента: {justify}. Ожидалось {valid_list}')
TypeError: Некорректное значение аргумента: another. Ожидалось ['left', 'center', 'right']

Как видно, в 1 случае невалидный аргумент проходит обработку и функция возвращает значение. Во 2-м и третьем (совмещенном) вариантах выполнение кода останавливается и выводится сообщение об ошибке.


Запустить асинхронно функцию
Всех приветствую. Ради идеи хочу написать какой-нибудь консольный секундомер.
Есть

import os
import asyncio
import time
import logging

logging.basicConfig(filename = "mylog.log", level=logging.DEBUG)

class Timer():
    def __init__(self) -> None:
        self.minute = 0
        self.seconds = 0
        self.deciseconds = 0

    def add_deciseconds(self):
        self.deciseconds += 1

        if self.deciseconds >= 10:
            self.seconds += 1
            self.deciseconds = 0

        if self.seconds >= 60:
            self.seconds = 0
            self.minute += 1

    def get_time(self):
        return (self.minute, self.seconds, self.deciseconds)

async def tick(my_timer: Timer):
    my_timer.add_deciseconds()
    os.system("cls")
    m , s, ss = my_timer.get_time()
    print(f"{m} : {s} : {ss}")

async def main(tim):
    await tick(tim)

if __name__ == '__main__':

    my_timer = Timer()

    while True:

        start = time.time()
        logging.debug(start)

        asyncio.run(main(my_timer))

        time.sleep(1)

        end = time.time()
        logging.debug(end)
        logging.debug(end - start)
        logging.debug('------------------')

Логи и асинхрон - это уже попытки решить проблему.
Проблема:
time.sleep(1) ждёт больше 1 секунды. Ради проверки включал это приложение и через пару секунд включал секундомер на телефоне. Где-то ко второй минуте секундмер с телефона догонял.
Не особо знаю за асинхронное программирование, но я подумал, что код с выводом в терминал времени и повышения на единицу заставляет программу ещё ждать, поэтому попытылся сделать функцию асинхронной. Вдохновлялся шаблоном из документации
Логи при этом выглядят примерно так:

DEBUG:root:1699353460.6091332
DEBUG:asyncio:Using proactor: IocpProactor
DEBUG:root:1699353461.6302617
DEBUG:root:1.0211284160614014 # Разница между старт и стоп больше 1 секунды
DEBUG:root:------------------
DEBUG:root:1699353461.6313007
DEBUG:asyncio:Using proactor: IocpProactor
DEBUG:root:1699353462.666385
DEBUG:root:1.0350842475891113 # Разница между старт и стоп больше 1 секунды
DEBUG:root:------------------

Я почитал разные статьи, в том числе вопросы других людей с SO (Один из примеров). В них говорится о том, что погрешность - это допустимо, но там говорится о погрешности ~0.00001 и меньше.
Я попробовал запустить без всяких таймеров цикл:

while True:

    start = time.time()
    logging.debug(start)

    time.sleep(1)

    end = time.time()
    logging.debug(end)
    logging.debug(end - start)
    logging.debug('------------------')

И в этом случае цифры в логе уже были более точными

DEBUG:root:1699355102.4560356
DEBUG:root:1699355103.4560683
DEBUG:root:1.000032663345337
DEBUG:root:------------------
DEBUG:root:1699355103.457032
DEBUG:root:1699355104.4571276
DEBUG:root:1.0000956058502197
DEBUG:root:------------------

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

Вашу программу тормозит вызов
os.system("cls")  в первом случае и
logging.debug во втором.


Как сделать таймер который будет длится 10 секунд и обновлять сообщение, с функцией bot.wait_for (Discord.Py Python)
Хочу чтобы мой бот с функцией
bot.wait_for() обновлял свое сообщение Embed в течении 10 секунд, чтобы было видно сколько времени осталось до ответа. Как это сделать?

emb = discord.Embed(
    title='Угадайте страну по флагу!',
    description=f'Флаг: {flag}\nОсталось времени: {duration} секунд',
    color=discord.Colour.green()
)
msg = await ctx.send(embed=emb)

def check(m: discord.Message):

    if mode == 'private':
        return m.author.id == ctx.author.id and m.channel.id == ctx.channel.id
    elif mode == 'public':
        return m.channel.id == ctx.channel.id
    else:
        return m.channel.id == ctx.author.id and m.channel.id == ctx.channel.id

try:
    msg = await bot.wait_for('message', check = check, timeout = time)

Тут часть кода и мне надо обновлять Embed-сообщение (
переменная emb) примерно 10 секунд, т.е. чтобы он показывал сколько времени осталось до того, как кто-то ответит на сообщение бота.

Могу посоветовать что-то такое
<code>
emb = discord.Embed(
    title='Угадайте страну по флагу!',
    description=f'Флаг: {flag}\nОсталось времени: {duration} секунд',
    color=discord.Colour.green()
)
msg = await ctx.send(embed=emb)

def check(m: discord.Message):
    if mode == 'private':
        return m.author.id == ctx.author.id and m.channel.id == ctx.channel.id
    elif mode == 'public':
        return m.channel.id == ctx.channel.id
    else:
        return m.channel.id == ctx.author.id and m.channel.id == ctx.channel.id

async def update_embed():
    emb.description = f'Флаг: {flag}\nОсталось времени: {duration} секунд'
    await msg.edit(embed=emb)
while duration > 0:
    await update_embed()
    duration -= 1
    time.sleep(1)

try:
    msg = await bot.wait_for('message', check = check, timeout = time)
</code>


Выполняет некоторые части кода, а части с условиями не хочет выводить
<code>
import random

while 1:
    a = random.randint(1, 3)
    print(a)
    print("Выберите свой вариант")
    print("1.Камень")
    print("2.Ножницы")
    print("3.Бумага")
    b = input()
    if b == 1:
        print("Вы выбрали камень, все верно?")
        input()
        if a == 1:
            print("Камень | Камень - у вас ничья")
        if a == 2:
            print("Камень | Ножницы - у вас победа")
        if a == 3:
            print("Камень | Бумага - у вас проигрышь")
    if a == 2:
        if b == 1:
            print("Ножницы | Камень - у вас победа")
        if b == 2:
            print("Ножницы | Ножницы - у вас ничья")
        if b == 3:
            print("Ножницы | Бумага - у вас проигрышь")
    if a == 3:
        if b == 1:
            print("Бумага | Камень - у вас проигрышь")
        if b == 2:
            print("Бумага | Ножницы - у вас победа")
        if b == 3:
            print("Бумага | Бумага - у вас ничья")

</code>

Ошибка очень простая: вы сравниваете переменную
b типа
str с числом типа
int. Естественно, они никогда не будут равны. Правильно так:

import random

while True:
    a = randint(1, 3)
    print("1. Камень")
    print("2. Ножницы")
    print("3. Бумага")
    b = int(input("Выберите свой вариант: "))
    if b == 1:
        print("Вы выбрали камень, все верно?")
        if a == 1:
            print("Камень | Камень - у вас ничья")
        if a == 2:
            print("Камень | Ножницы - у вас победа")
        if a == 3:
            print("Камень | Бумага - у вас проигрыш")
    if b == 2:
        if a == 1:
            print("Ножницы | Камень - у вас победа")
        if a == 2:
            print("Ножницы | Ножницы - у вас ничья")
        if a == 3:
            print("Ножницы | Бумага - у вас проигрыш")
    if b == 3:
        if a == 1:
            print("Бумага | Камень - у вас проигрыш")
        if a == 2:
            print("Бумага | Ножницы - у вас победа")
        if a == 3:
            print("Бумага | Бумага - у вас ничья")

Еще в паре мест вы попутали
a с
b, я это исправил. Не используйте однобуквенные переменные, запутаетесь!
Код очень громоздкий, его можно значительно упростить:

from random import randint

table = [
        [0, 1, -1],
        [-1, 0, 1],
        [1, -1, 0]
        ]
d = {1: 'Камень', 2: 'Ножницы', 3: 'Бумага'}
d2 = {-1: 'проигрыш.', 0: 'ничья.', 1: 'выигрыш.'}
print("1. Камень.\n2. Ножницы.\n3. Бумага.")

while True:
    bot = randint(1, 3)
    you = int(input("Выберите свой вариант: "))
    print('Ваш соперник сходил "' + d[bot] + '".')
    print(d[you] + ' | ' + d[bot] + ' —  у вас ' + d2[table[you - 1][bot - 1]])

Код протестирован, работает нормально. Однако в вашем коде не предусмотрен выход из бесконечного цикла — его нет и здесь. Также не предусмотрен отлов ошибки в случае введения неправильного числа. Чтобы добавить эти функции, вставьте вместо строки
you... следующее:

try:
    you = int(input("Выберите свой вариант: "))
except ValueError:
    print('Ошибка!')
    continue
if you == 4:
    print('Пока!')
    exit()

Ну и в начале добавьте в строчку
'\n4. Выход.'.


Как прикрепить текст к фото отправленным с помощью file_id на Aiogram?
Нужно чтобы бот присылал фото через file_id, но к нему был прикреплен определенный текст. В документации покопался но ни к чему не пришел.

Плохо вы копались в документации. В методе send_photo есть caption, в котором вы указываете текст подписи
Будет выглядеть примерно так:
<code>
@dp.message(CommandStart())
async def cmd_start(message: Message, bot: Bot):
    await bot.send_photo(chat_id=message.from_user.id, photo=file_id, caption="Какой-то текст под фото")
</code>


Как сделать чтобы во время цикла работал punput?
Я хочу создать программу, похожую на автокликер. И когда пользователь нажмет клавишу
F1, она запустится, и наоборот.
Здесь я использовал
pynput, при необходимости я могу изменить его, только как заставить его выйти из функции, когда пользователь нажимает
F1?
Я хотел создать программу автокликера с биндами. Но я получил бесконечный цикл, когда нажал клавишу
F1.
Как это исправить?

from pynput.keyboard import Key, Listener
from time import sleep

class Logger:
    def __init__(self) -> None:
        self.is_active = False

    def pressed(self, key):
        if key == Key.f1:
            self.is_active = not self.is_active
            print(self.is_active)
            if self.is_active:
                while True:
                    print("Hello World!")
                    sleep(5)

if __name__ == '__main__':
    logger = Logger()
    with Listener(on_press=logger.pressed) as listener:
        listener.join()

Проблема в том, что цикл в функции pressed блокирует выполнение программы и не получится остановить его после его запуска.
Вместо бесконечного цикла внутри функции, вы можете использовать флаг для управления и остановки цикла.
Также нужно, чтобы цикл выполнялся в отдельном потоке, и затем использовать флаг для завершения этого цикла.
Цикл будет запускаться при первом нажатии F1 и останавливаться, если нажать снова.
Поток используется для выполнения цикла, а при повторном нажатии F1 поток останавливается и создаётся новый при следующем нажатии.
<code>
from pynput.keyboard import Key, Listener
import time
import threading

class Logger:
    def __init__(self) -> None:
        self.is_active = False
        self.thread = None

    def pressed(self, key):
        if key == Key.f1:
            self.is_active = not self.is_active
            print(self.is_active)
            if self.is_active:
                if not self.thread or not self.thread.is_alive():
                    self.thread = threading.Thread(target=self.run_loop)
                    self.thread.start()
            else:
                self.thread = None

    def run_loop(self):
        while self.is_active:
            print("Hello World!")
            time.sleep(5)

if __name__ == '__main__':
    logger = Logger()
    with Listener(on_press=logger.pressed) as listener:
        listener.join()
</code>


Код сортирует список кортежей по 2-му элементу. Подскажите, как в функцию b передаётся аргумент el если вызов этой функции без скобок?
<code>
athletes = [('Дима', 10, 130, 35), ('Тимур', 11, 135, 39), ('Руслан', 9, 140, 33), ('Рустам', 10, 128, 30), ('Амир', 16, 170, 70), ('Рома', 16, 188, 100), ('Матвей', 17, 168, 68), ('Петя', 15, 190, 90)]

def func(num):
    def b(el):  # el - кортеж, элемент списка.
        return el[num]
    return b

num = 1

athletes.sort(key=func(num))

for x in athletes:
    print(*x)
</code>

Метод
list.sort() в аргументе
key принимает функцию, которой он передаёт каждый элемент. А так как ваша функция
func возвращает функцию, принимающую на вход кортеж и возвращающую элемент из него:

>>> f = func(1)
>>> f(('Дима', 10, 130, 35))
10

то всё нормально.


Задача на динамическое программирование на Python
не могу решить задачу. я ещё совсем зелёный в программировании, не судите строго. скорее всего нужно использовать динамическое программирование, но алгоритм никак сложить не получается.
Условие: Задача денег. Ярослав и Мирослава имеют общую коллекцию из 𝑛 монет. Как символ своей дружбы они хотят отдельно хранить такую пару монет, что в сумме нарицательная стоимость этих двух монет дает особое число 𝑠. Подсчитайте количество разных способов выбрать нужную пару.
Технические условия: Программа Money читает с устройства стандартного ввода натуральные числа 𝑠 и 𝑛 не менее 2. Во второй строке 𝑛 натуральных чисел — номинальные стоимости монет из коллекции. Все числа (включая числа 𝑠 и 𝑛) не превышают 200000. Программа выводит на устройство стандартного вывода единственное число — количество способов выбрать две монеты с суммарной номинальной стоимостью 𝑠. Известно, что искомое количество не превышает 10^9.
пробовал написать код, получилась огромная нерабочая писанина, сам понимаю, что пошёл я не тем путём, ещё и запутался, пока писал. идея у меня была такая, что нужно отсортировать массив, и после выбирать первую и последнюю монету, но только в случаях, когда s - номинал первой монеты = номиналу последней, а для монет с одинаковым номиналом написал целый генератор, правда потом сломал его..) в своём коде я пытался ещё много нюансов учесть, но 100% там есть другое, удобное решение.
если интересно, то вот мой код (он не работает, но можно было бы доделать, но у меня уже нет сил):
<code>
s, n = map(int, input().split())
m = list(map(int, input().split()))
m.sort()
count = 0
sser = s - 1

while True:
    if count > sser:
        break

    minner = min(m)
    maxxer = max(m)

    if count != sser:

        minner = min(m)
        maxxer = max(m)

        if s - maxxer < minner:
            starter = minner

            reverser = s - starter
            poiskovik = len(m)
            mega_zapper = m[0]
            count += 1
            sser -= 1

            for i in reversed(m):
                if i > reverser:
                    poiskovik -= 1

                    if mega_zapper != i:
                        mega_zapper = i
                        count += 1
                        sser -= 1
                else:
                    break

            m = m[:poiskovik:]

            if count > sser:
                break

        elif s - maxxer > minner:
            starter = maxxer

            reverser = s - starter
            mega_zapper = m[-1]
            count += 1
            sser -= 1
            poiskovik = 0

            for i in m:
                if i < reverser:
                    poiskovik += 1

                    if mega_zapper != i:
                        mega_zapper = i
                        count += 1
                        sser -= 1
                else:
                    break

            m = m[poiskovik::]

            if count > sser:
                break

        else:
            if s % 2 == 0:
                if s / 2 == m[0]:
                    counter2 = 0
                    twos_count = 0

                    for num in m:
                        twos_count += 1
                        counter2 += twos_count - 1

                    count += counter2
                else:
                    counter_ch_1 = 0
                    counter_ch_2 = 0

                    zapper_1 = m[0]
                    zapper_2 = m[-1]

                    while True:
                        if m[0] == zapper_1:
                            counter_ch_1 += 1
                            m = m[1::]
                           if not m:
                                break
                        else:
                            break
                    while True:
                        if m[-1] == zapper_2:
                            counter_ch_2 += 1
                            m = m[:1:]
                            if not m:
                                break
                        else:
                            break

                    count += (counter_ch_1 * counter_ch_2)
            else:
                counter_ch_1 = 0
                counter_ch_2 = 0

                zapper_1 = m[0]
                zapper_2 = m[-1]

                while True:
                    if m[0] == zapper_1:
                        counter_ch_1 += 1
                        m = m[1::]
                        if not m:
                            break
                    else:
                        break
                while True:
                    if m[-1] == zapper_2:
                        counter_ch_2 += 1
                        m = m[:1:]
                        if not m:
                            break
                    else:
                        break

                count += (counter_ch_1 * counter_ch_2)

            count += 1
            sser -= 1

print(count)
</code>

Способ с сортировкой:
Левый индекс в начало, правый в конец
Считаете, сколько одинаковых элементов стоит слева (nl)
Правым идёте влево, пока не найдёте парное значение к левому элементу или не дойдёте до  меньшего, чем нужно, значения
В случае успешного нахождения пары считаете количество одинаковых элементов (nr), добавляете  nl*nr к количеству пар.
Сдвигаете левый индекс, и всё повторяете, пока индексы не сойдутся.
Способ со словарём:
Заполняете Counter значениями монет.
Для каждого key проверяете наличие парного s-key, добавляете к количеству пар произведение счётчиков.
<code>
import random, collections

n = 15
s = 8
a = [random.randint(1,7) for _ in range(n)]
print(a)
Cnt = collections.Counter(a)
print(Cnt)
res = 0
for k, v in Cnt.items():
    t = s - k
    u = v * Cnt[t] if t!=k else v*(v-1)
    res += u
    print(k, t, u)

print(res//2)

[6, 6, 5, 7, 4, 6, 5, 2, 5, 5, 6, 1, 3, 4, 2]
Counter({6: 4, 5: 4, 4: 2, 2: 2, 7: 1, 1: 1, 3: 1})
6 2 8
5 3 4
7 1 1
4 4 2
2 6 8
1 7 1
3 5 4
14
</code>


Где ошибка в моем решении? Задача Яндекс
Всем привет! Начинаю учить python, решаю задачу из Яндекса, выполняю в PyCharm - все работает, отправляю на проверку - получаю 0 баллов. Заранее простите за код.
На витрине магазина в один ряд выложены сладости с различными названиями, занумерованные с единицы слева-направо. Мимо витрины часто проходят дети и просят родителей купить им все сладости начиная с номера li и заканчивая номером ri. Директор магазина хочет составить отчет, в котором будут указаны названия всех купленных сладостей в том порядке, как их покупали. Сначала в списке должны быть перечислены сладости, купленные первому ребенку, затем второму и так далее. Для каждого ребенка сначала покупается сладость с номером li, затем li + 1 и так далее до номера ri.
Формат ввода
Первая строка ввода содержит целое число n — число различных типов сладостей (1 ≤ n ≤ 1000).
Следующие n строк названия сладостей, состоящие из строчных и прописных латинских букв, цифр и символов «_» и «.». Названия не превышают 100 символов.
Следующая строка содержит m — число покупок (1 ≤ m ≤ 1000).
Следующие m строк содержат по два целых числа li и ri — номер первой и последней сладости, купленной i-му ребенку (1 ≤ li ≤ ri ≤ n).
Формат вывода: Выведите список сладостей в отчете директора.
<code>
def get_number(list):
    i = 0
    for element in list:
        i = i + 1
    return i

def create_number_elements_in_list(list):
    new = []
    i = 0
    for element in list:
        new.append(i)
        i += 1
    return new

sladosti = []
n = int(input())

while n > get_number(sladosti):
    sladosti.append(input())
    get_number(sladosti)

while True:
    bought = int(input())
    if bought > 1 or bought < 1000:
        break
    else:
        continue

pokupki = []
i = 0
pod_i = 0

while bought != 0:
    new_pokupka = [int(input()), int(input())]
    pokupki.append(new_pokupka)
    i = i + 1
    bought -= 1

index = 0
for spisok in pokupki:
    spisok = pokupki[index]
    under_indx = 0
    for element in spisok:
        element = spisok[under_indx]
        element -= 1
        spisok[under_indx] = element
        under_indx += 1
    pokupki[index] = spisok
    index += 1

new_list = create_number_elements_in_list(sladosti)
index = 0
while get_number(pokupki) > index:         # цикл работы пока не переберутся все списки
    for spisok in pokupki:                  # перебираем списки внутри списка
        spisok = pokupki[index]             # присваиваем переменной список по порядку
        under_indx = 0                      # индекс для работы с елементами под списка
        for element in spisok:              # перебираем элементы списка
            ux_indx = 0
            element = spisok[under_indx]    # присваиваем переменной значение элемента списка
            for parts in new_list:          # перебираем элементы списка (представляющего собой порядковые номера конфет)
                parts = new_list[ux_indx]   # присваиваем переменной значение порядкового номера конфеты
                if parts == element:        # проверяем является ли купленый элемент 1, затем 2, затем 3 элементом списка
                    print(sladosti[parts])
                    ux_indx += 1
                else:
                    ux_indx += 1
                    continue
            under_indx += 1
        index += 1
</code>

Собираем сладости в список и потом по номерам выводим в консоль. Результат для данного примера как в Информационные технологии / IT 10-11 классы / 10th and 11th Grades A. Сладости / Task A. Candy

# имитация ввода данных
inp = """3
Chocolate
Lollipop
Cake
2
2 3
1 2""".split('\n')

def input():
    if inp: return inp.pop(0)
# конец имитации ввода данных

lst = [input() for _ in range(int(input()))]
for i in range(int(input())):
    li, ri = map(int, input().split())
    for p in range(li, ri + 1):
        print(lst[p - 1])

Lollipop
Cake
Chocolate
Lollipop


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

<?xml version="1.0"?>
<timetable>
    <lang> ru </lang>
    <day> Wednesday </day>
    <lessons>
        <lesson1>
            <teacher> Балакшин Павел Валерьевич </teacher>
            <time> 08:20-09:50 </time>
            <group> ИНФОРМ 3 </group>
            <room> Актовый зал </room>
            <place> ул.Ломоносова, д.9, лит. М </place>
            <subject> ИНФОРМАТИКА (ЛЕК): АКТОВЫЙ ЗАЛ</subject>
            <lesson-format> Очно-дистанционный </lesson-format>
        </lesson1>
        <lesson2>
            <teacher> Клименков Сергей Викторович </teacher>
            <time> 10:00-11:30 </time>
            <group> ОСН ПРОФ ДЕЯТ 1 </group>
            <room> Актовый зал </room>
            <place> ул.Ломоносова, д.9, лит. М </place>
            <subject> ОСНОВЫ ПРОФЕССИОНАЛЬНОЙ ДЕЯТЕЛЬНОСТИ (ЛЕК) : АКТОВЫЙ ЗАЛ</subject>
            <lesson-format> Очно-дистанционный </lesson-format>
        </lesson2>
    </lessons>
</timetable>

2. Нужно преобразовать его в файл формата YAML, чтобы программа создала новый файла с только что полученным YAML внутри:

timetable:
  lang: ru
  day: Wednesday
  lessons:
    lesson1:
      teacher: Балакшин Павел Валерьевич
      time: '08:20-09:50'
      group: ИНФОРМ 3
      room: Актовый зал
      place: 'ул.Ломоносова, д.9, лит. М'
      subject: 'ИНФОРМАТИКА (ЛЕК): АКТОВЫЙ ЗАЛ'
      lesson-format: Очно-дистанционный
    lesson2:
      teacher: Клименков Сергей Викторович
      time: '10:00-11:30'
      group: ОСН ПРОФ ДЕЯТ 1
      room: Актовый зал
      place: 'ул.Ломоносова, д.9, лит. М'
      subject: 'ОСНОВЫ ПРОФЕССИОНАЛЬНОЙ ДЕЯТЕЛЬНОСТИ (ЛЕК) : АКТОВЫЙ ЗАЛ'
      lesson-format: Очно-дистанционный

Сделать это нужно при помощи языка Python.
Что самое весёлое, нельзя  использовать  готовые  библиотеки,  в  том  числе  регулярные выражения в Python и библиотеки для загрузки XML-файлов. Встроенные модули разрешены!
Есть пример кода, который неправильно работает:

fin = open('schedule.xml', encoding='UTF-8')
fout = open('schedule_out.yaml', 'w+')
fout.write('---\n')

read = 0
word = ''
for line in fin:
    xml = line
    yaml = ''
    for i in range(len(xml)):
        if read != 2 and xml[i] == '\t' or xml[i] == ' ' or xml[i] == '\n':
            yaml = yaml + xml[i]
        elif xml[i] == '<':
            if xml[i + 1] != '/':
                read = 1
            else:
                read = -1
        elif xml[i] == '>':
            if read == 1:
                yaml = yaml + ': '
                read = 2
            elif read == -1:
                if word != '':
                    if not word.isnumeric():
                        yaml = yaml + '"' + word + '"'
                        word = ''
                    else:
                        yaml = yaml + word
                        word = ''
                read = 0
        elif read == 1:
            yaml = yaml + xml[i]
        elif read == 2:
            word = word + xml[i]
    fout.write(yaml)

fout.write('\n...')
fout.close()

Вывод такого недокода:

---
?xml version="1.0"?:
timetable:
lang:   "   ru"
    day:   "Wednesday"
    lessons:
lesson1:
teacher:     "                  БалакшинПавелВалерьевич"
            time:   "08:20-09:50"
            group:    "ИНФОРМ3"
            room:    "Актовыйзал"
            place:      "ул.Ломоносова,д.9,лит.М"
            subject:     "ИНФОРМАТИКА(ЛЕК):АКТОВЫЙЗАЛ"
            lesson-format:   "Очно-дистанционный"

        lesson2:
teacher:     "          КлименковСергейВикторович"
            time:   "10:00-11:30"
            group:      "ОСНПРОФДЕЯТ1"
            room:    "Актовыйзал"
            place:      "ул.Ломоносова,д.9,лит.М"
            subject:        "ОСНОВЫПРОФЕССИОНАЛЬНОЙДЕЯТЕЛЬНОСТИ(ЛЕК):АКТОВЫЙЗАЛ"
            lesson-format:   "Очно-дистанционный"

...

Буду признателен, если поможете!

Вот +- рабочий парсер, наверно с багами, надо тестить, но тот тест кейс, который вы прислали проходит

PUNCTUATION = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""

def get_open_tag_name(s: str) -> str:
    for i in range(len(s)):
        if s[i] == '>':
            return s[:i+1]

    raise ValueError('Key not found')

def get_close_tag_name(s: str) -> str:
    return s.replace('<', '</')

def get_text_without_tag(text: str, open_tag: str, close_tag: str):
    result = text.replace(open_tag, '').replace(close_tag, '').strip()

    if result:
        if not result.isalnum() or not result.isascii():
            result = f'\'{result}\''

    return result

def get_yaml_content(lines) -> str:
    open_tags = []

    yml_content = []
    for row in lines:

        tab_lenght = '\t' * len(open_tags)
        tmp_row = row.strip()

        if tmp_row[0] == '<' and tmp_row[1] not in PUNCTUATION:
            open_tag = get_open_tag_name(tmp_row)
            close_tag = get_close_tag_name(open_tag)
            text = get_text_without_tag(tmp_row, open_tag, close_tag)

            if tmp_row[-len(close_tag):] != close_tag:
                open_tags.append(close_tag)

            yml_content.append(f'{tab_lenght}{open_tag[1:-1]}: {text}')

        elif tmp_row[0] == '<' and tmp_row[1] == '/':
            if open_tags[-1] != tmp_row:
                raise ValueError('Bad XML file')
            open_tags.pop()

    if len(open_tags) != 0:
        raise ValueError('Bad XML file')

    return '\n'.join(yml_content)

def main():
    with open('test.xml', mode='r') as f:
        xml_lines = f.readlines()

    yaml_content = get_yaml_content(xml_lines)

    with open('test.yml', mode='w') as f:
        f.write(yaml_content)

if __name__ == '__main__':
    main()

Вывод

timetable:
    lang: ru
    day: Wednesday
    lessons:
        lesson1:
            teacher: 'Балакшин Павел Валерьевич'
            time: '08:20-09:50'
            group: 'ИНФОРМ 3'
            room: 'Актовый зал'
            place: 'ул.Ломоносова, д.9, лит. М'
            subject: 'ИНФОРМАТИКА (ЛЕК): АКТОВЫЙ ЗАЛ'
            lesson-format: 'Очно-дистанционный'
        lesson2:
            teacher: 'Клименков Сергей Викторович'
            time: '10:00-11:30'
            group: 'ОСН ПРОФ ДЕЯТ 1'
            room: 'Актовый зал'
            place: 'ул.Ломоносова, д.9, лит. М'
            subject: 'ОСНОВЫ ПРОФЕССИОНАЛЬНОЙ ДЕЯТЕЛЬНОСТИ (ЛЕК) : АКТОВЫЙ ЗАЛ'
            lesson-format: 'Очно-дистанционный'


Не могу найти в чем проблема. Ругается на отсутствие роутеров, хотя они есть

main.py

import asyncio
import logging
from aio_bot.config_reader import config
from aiogram import Bot, Dispatcher
from help_handlers.handlers import cmd_start, cmd_menu

async def main():
    logging.basicConfig(level=logging.INFO)
    bot = Bot(token=config.bot_token.get_secret_value(), parse_mode="HTML")
    dp = Dispatcher()
    dp.include_routers(cmd_start.handlers_router, cmd_menu.handlers_router)
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

help_handlers\handlers.py

from datetime import datetime
from aio_bot.bot.keyboards.kbs import kbs_menu
from aiogram.filters import CommandObject, Command, CommandStart
from aiogram import types, F, html, Router

handlers_router = Router()

@handlers_router.message(CommandStart)
async def cmd_start(message: types.Message):
    time_now = datetime.now().strftime('%H:%M, %d-%m-%Y')
    kb = types.InlineKeyboardMarkup(inline_keyboard=kbs_menu())
    await message.answer(f"Привет!\nСейчас <b>{time_now}</b>\nВыбери, что будем делать:",
                         reply_markup=kb,
                         )

@handlers_router.callback_query(F.data == "menu")
async def cmd_menu(callback: types.CallbackQuery):
    time_now = datetime.now().strftime('%H:%M, %d-%m-%Y')
    kb = types.InlineKeyboardMarkup(inline_keyboard=kbs_menu())
    await callback.message.answer(f"Привет!\nСейчас <b>{time_now}</b>\nВыбери, что будем делать:",
                                  reply_markup=kb
                                  )

Ошибка:

Traceback (most recent call last):
  File "C:\Users\Egor Irvin\Desktop\Projects\aio_bot\bot\main.py", line 18, in <module>
    asyncio.run(main())
  File "C:\Users\Egor Irvin\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "C:\Users\Egor Irvin\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Egor Irvin\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "C:\Users\Egor Irvin\Desktop\Projects\aio_bot\bot\main.py", line 12, in main
dp.include_routers(cmd_start.handlers_router, cmd_menu.handlers_router)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'function' object has no attribute 'handlers_router'

А для чего вы импортируете каждый хендлеров в отдельности?
Импорт будет таким:
<code>
import asyncio
import logging
from aio_bot.config_reader import config
from aiogram import Bot, Dispatcher
from handlers import help_handlers

async def main():
    logging.basicConfig(level=logging.INFO)
    bot = Bot(token=config.bot_token.get_secret_value(), parse_mode="HTML")
    dp = Dispatcher()
    dp.include_routers(help_handlers.handlers_router)
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())
</code>


В Pygame не получается во внутреннем цикле медленно и плавно выводить по одному квадратики, получается рывком (сразу строку) выводит
<code>
import pygame

clock = pygame.time.Clock()

pygame.init()
screen = pygame.display.set_mode([600, 600])
pygame.display.set_caption("MyExperiments")

WHITE = (255, 255, 255)
surf = pygame.Surface((500, 500))
surf.fill(WHITE)
h = 0
v = 0

keep_going = True
while keep_going:
    screen.blit(surf, (50, 50))

    for event in pygame.event.get():
        print(event)
        if event.type == pygame.QUIT:
            keep_going = False

    for h in range(0, 500, 25):
        pygame.draw.rect(surf, 'Red', (h, v, 25, 25), 1)

        pygame.display.flip()

        clock.tick(25)

    if v < 500:
        v += 25
</code>

Надо убрать внутренний цикл
for, и добавить несколько проверок.
Пояснения в коде:

import pygame

clock = pygame.time.Clock()

pygame.init()
screen = pygame.display.set_mode([600, 600])
pygame.display.set_caption("MyExperiments")

WHITE = (255, 255, 255)
surf = pygame.Surface((500, 500))
surf.fill(WHITE)
h = 0
v = 0

keep_going = True
while keep_going:
    screen.blit(surf, (50, 50))

    for event in pygame.event.get():
        print(event)
        if event.type == pygame.QUIT:
            keep_going = False

    if v <= 500:  # Проверяем не закончили-ли мы
        pygame.draw.rect(surf, 'Red', (h, v, 25, 25), 1)

        pygame.display.flip()

        if h < 500:
            h += 25  # Увеличиваем координату по x
        else:
            h = 0  # Обнуляем x-координату
            v += 25  # Увеличиваем координату по y

    clock.tick(25)


pandas конвертация нужного типа данных с игнорированием ненужных типов
Есть
.xlsx файл.
Первая колонка - нумерация строк (это ещё до считывания в
dataframe, я не путаю эти понятия). Первая строка - имена колонок.
Заполнен данными типа
hex,
int,
str либо
None (пустые клетки).
Надо:

считать данные
конвертировать
hex в
int
всё кроме
hex игнорируем (ставим пустую клетку, например)

Пока что делаю так:

df = pd.read_excel(file, sheet_name='first_sheet')
df1 = df.iloc[1:28,1:11].map(lambda x : int(x, 16))        # вручную выбрал блок данных, без первой строки и первой колонки
print(df1)

Сейчас облегчает задачу, то что нужные мне
hex данные стоят кУчно, но скоро таких файлов будут тысячи, и посмотреть на каждый лист каждого файла будет нереально. Конвертация
hex в
int это несложно, но для автоматической обработки многочисленных пустых клеток и ненужных
string надо написать лямбду побольше. И вот тут я немного потерялся.

Без образца данных сложно понять картинку.
По префиксу '0x' делаем булев массив (маску) и инвертируем: где ненужные данные, будет True. Меняем все эти ячейки на None. Преобразуем все данные в int по основанию 16 с помощью
.map() или
.applymap(), указав опциональный аргумент
na_action='ignore', чтобы не обрабатывать NaN (таким образом, производительность будет выше и не возникнет ошибок преобразования).

df = pd.DataFrame({'Col1': [7898, '123', None, 'aaa', '0x80'], 'Col2': [10, None, 'bbb', '0x123', 0]})
df[~df.apply(lambda x: x.str.startswith('0x', na=False))] = None
df = df.map(int, base=16, na_action='ignore')  # до версии Pandas 2.1.0 используйте .applymap()
print(df)

    Col1   Col2
0    NaN    NaN
1    NaN    NaN
2    NaN    NaN
3    NaN  291.0
4  128.0    NaN


Мне необходимо поменять все целые значения во вложенном списке [закрыт]

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

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

Закрыт 7 дней назад.

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

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

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

person = int(input("Введите кол-во людей"))
cook_book = [
  ['салат',
      [
        ['картофель', 100, 'гр.'],
        ['морковь', 50, 'гр.'],
        ['огурцы', 50, 'гр.'],
        ['горошек', 30, 'гр.'],
        ['майонез', 70, 'мл.'],
  ]]]

Здесь мне необходимо умножить все цифры из вложенного списка в person, то есть заданное пользователем число.(по возможности было бы супер, если бы как новичку объяснили)
Чтобы получить примерно такой результат если person = 5.

Салат:
картофель, 500гр.
морковь, 250гр.
огурцы, 250гр.
горошек, 150гр.
майонез, 350мл.

Заранее огромное спасибо!
Ранее примерный результат немного неправильно написал

Если я правильно понял суть вашей задачи, то у вас есть книга рецептов, и рассчитана она на одну порцию, а вы хотели бы рассчитать граммовки для приготовления блюда на N персон.Тогда вам скорее нужен словарь, а не список
<code>
N = int(input('>>>'))

cook_book = {
    'salat':

        [
            {
                "ingredient": "potato",
                "count": 10,
                "units": "gram"
            },
            {
                "ingredient": "carrot",
                "count": 20,
                "units": "gram"
            }
        ]

}

for dish in cook_book:
    for ingredient in cook_book[dish]:
        ingredient['count'] *= N

for dish in cook_book:
    print(dish)
    for information in cook_book[dish]:
        print(information['ingredient'], information['count'], information['units'])
    print()

</code>


Как в видеофайле найти пики громкости?
Есть видеофайлы, разбиты по суткам, там есть метки с камер датчика движения. По движению отмечаются некоторые точки, от которых в интервале 5 секунд видео считается активным. Объединяем все активные периоды, остальное вырезаем из файла.
И всё бы ничего, только там почти всегда что-то движется :) Т.е. итоговый файл длится около 23 часов. Видео файл со звуком, так вот интересующие нас события(а их всего около 200 в сутки) не плохо так шумят. Нужно как то понять по видео ряду в какие моменты времени амплитуда звукогого сигнала превышает заданную... Дальше я уже
ffmpeg, например, всё сам сделаю.
Желательно что-нить на
python или
java.
Но если есть какие-то решения бесплатные, от совета не откажусь.
Изначально формат видео
.flv, но тут сконвертнуть не проблема.

Наличие энергии в звуковом файле можно определить с помощью этих двух функций:
<code>
# мощность дискретного сигнала (пропорциональна энергии)
def power(signal):
    return np.dot(signal, signal) / signal.shape[0]

# величина SPL в децибелах
def spl(signal):
    rms = np.sqrt(np.dot(signal, signal) / signal.shape[0])
    spl = 20 * np.log10(rms / 0.00002)
    return spl
</code>
Сам звуковой сигнал в python можно получить с помощью библиотеки soundfile или librosa.


disnake discord бот непонятная ошибка
вот мой код бота
intents = disnake.Intents.all()

intents = disnake.Intents.all()

bot = commands.Bot(command_prefix="/", intents=intents)

@bot.event
async def on_ready():
    print(f"Bot {bot.user} is ready to work!")

@bot.event

async def on_member_join (member):
    channel = bot.get_channel ( 1168180239076180030 )

    role = disnake.utils.get (member.guild.roles, id=1168187960479469568)
    print ('user join the servers')
    await member.add_roles( role )
    await channel.send( embed = disnake.Embed( description = f'``{member.name}`` присоиединился', color = 0x0c0c0c))'

но постоянно выходит ошибка как вы видите intents стоят и в самом дискорд апи на сайте в боте тоже роль в дискорде тоже проставленна администратора но все равно такая ошибка я уже не знаю что делать

user join the servers
Ignoring exception in on_member_join
Traceback (most recent call last):
  File "C:\Users\damn\Desktop\whister\venv\Lib\site-packages\disnake\client.py", line 703, in _run_event
    await coro(*args, **kwargs)
  File "c:\Users\damn\Desktop\whister\main.py", line 40, in on_member_join
    await member.add_roles( role )
  File "C:\Users\damn\Desktop\whister\venv\Lib\site-packages\disnake\member.py", line 1034, in add_roles
    await req(guild_id, user_id, role.id, reason=reason)
  File "C:\Users\damn\Desktop\whister\venv\Lib\site-packages\disnake\http.py", line 409, in request
    raise Forbidden(response, data)
disnake.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions

Ошибка говорит сама за себя. У бота не хватает достаточно прав для того, чтобы изменить/добавить роли человеку. Попробуйте поднять права бота, или поставить его роль выше, чем роль, которую вы хотите выдать. Так-же, как и zrx, советую вам подучить уровень английского, чтобы понять ошибки, а также механики Discord-а.


Обработка исключений в методе __enter__ менеджера контекста
Есть задача - открыть json, прочитать его, закрыть, содержимое обработать и удалить файл. Во время обработки могут возникнуть исключения. Написал простой менеджер контекста:

class open_json:
    def __init__(self, file_path):
        self.file_path = file_path

    def __enter__(self):
        print('start enter')
        temp_file = open(self.file_path, 'r')
        return json.load(temp_file)

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('start exit')
        os.unlink(self.file_path)

with open_json(r'<path to>.json') as res:
    tree = [res]

Однако на этапе тестирования, когда я подсовываю json с заведомо недесериализуемым содержимым, то в
__enter__ возникает ошибка и
__exit__ не выполняется. Не могу понять почему. А мне в любом случае надо удалить файл, и, если возникла ошибка, то вывести ее как
Exception

Обработка ошибки внутри самого метода
__enter__ сама по себе не происходит:

class open_json:
    def __init__(self, file_path):
        self.file_path = file_path

    def __enter__(self):
        print('start enter')
        raise RuntimeError("test")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('start exit')

with manager(r'<path to>.json') as res:
    pass

Вывод:

start enter
Traceback (most recent call last):
  File "/home/user/Projects/test.py", line 13, in <module>
    with manager(r'<path to>.json') as res:
  File "/home/user/Projects/test.py", line 7, in __enter__
    raise RuntimeError("test")
RuntimeError: test

Вывода "start exit" нет, значит
__exit__ не сработал.
Хотя при вылете ошибки внутри блока
with метод
__exit__ срабатывает:

class manager:
    def __init__(self, file_path):
        self.file_path = file_path

    def __enter__(self):
        print('start enter')
        # raise RuntimeError("test")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('start exit')

with manager(r'<path to>.json') as res:
    raise RuntimeError("test")

Вывод:

start enter
start exit
Traceback (most recent call last):
  File "/home/user/Projects/test.py", line 14, in <module>
    raise RuntimeError("test")
RuntimeError: test

Поэтому внутри
__enter__ ошибку нужно обработать вручную: обернуть код в
try-except, в
except вызвать метод
__exit__, потом пробросить ошибку наружу:

class manager:
    def __init__(self, file_path):
        self.file_path = file_path

    def __enter__(self):
        print('start enter')
        try:
            raise RuntimeError("test")
        except Exception as ex:
            self.__exit__(type(ex), ex, ex.__traceback__)
            raise ex

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('start exit')

with manager(r'<path to>.json') as res:
    pass

Вывод:

start enter
start exit
Traceback (most recent call last):
  File "/home/user/Projects/test.py", line 17, in <module>
    with manager(r'<path to>.json') as res:
  File "/home/user/Projects/test.py", line 11, in __enter__
    raise ex
  File "/home/user/Projects/test.py", line 8, in __enter__
    raise RuntimeError("test")
RuntimeError: test

Удобнее реализовывать контекстные менеджеры через функции с декоратором
contextmanager.
Внутри функции весь код, который потенциально может вызвать ошибку (в том числе и передача данных наружу), нужно обернуть в
try-finally. В
finally нужно добавить тот код, который у вас должен выполняться при выходе из блока
with:

from contextlib import contextmanager

@contextmanager
def manager(file_path):
    try:
        print('start enter')
        raise RuntimeError("test")
        yield
    finally:
        print('start exit')

with manager(r'<path to>.json') as res:
    pass

Вывод:

start enter
start exit
Traceback (most recent call last):
  File "/home/user/Projects/test.py", line 13, in <module>
    with manager(r'<path to>.json') as res:
  File "/usr/lib/python3.10/contextlib.py", line 281, in helper
    return _GeneratorContextManager(func, args, kwds)
  File "/usr/lib/python3.10/contextlib.py", line 103, in __init__
    self.gen = func(*args, **kwds)
  File "/home/user/Projects/test.py", line 8, in manager
    raise RuntimeError("test")
RuntimeError: test

При возникновении ошибки сначала будет выполняться блок
finally, потом уже ошибка ошибка пробросится наружу, т.к. у нас
except нет. Дальше уже снаружи блока
with можно будет добавить обработку ошибки, но в данном случае главное, что несмотря на ошибку финальные действия у нас выполнились.
На вашем примере будет что-то такое:

import json
import os
from contextlib import contextmanager

@contextmanager
def manager(file_path):
    try:
        print('start enter')
        with open(file_path, 'r') as temp_file:
            yield json.load(temp_file)
    finally:
        print('start exit')
        os.unlink(file_path)


Python перезаписывает все предыдущие объекты словаря последним
Необходимо создать словарь из множеств, но при выполнение программы последнее полученное множество записывается во все предыдущие объекты
Вот код:

import random
a = set()
b ={}
for i in range(5):
    for j in range(5):
        x=random.randint(1,10)
        a.add(x)
    b[i]=a
    print(b)
    a.clear()

Вывод:

{0: {1, 2, 3, 7, 10}}
{0: {2, 1, 10, 3}, 1: {2, 1, 10, 3}}
{0: {3, 4, 7}, 1: {3, 4, 7}, 2: {3, 4, 7}}
{0: {8, 1, 2, 9}, 1: {8, 1, 2, 9}, 2: {8, 1, 2, 9}, 3: {8, 1, 2, 9}}
{0: {10, 3, 4, 6}, 1: {10, 3, 4, 6}, 2: {10, 3, 4, 6}, 3: {10, 3, 4, 6}, 4: {10, 3, 4, 6}}

a.clear()

Первое правило начинающего питониста: никогда (никогда-никогда) не используйте
clear. Всегда создавайте новый объект. О чём бы речь не шла, о какой бы коллекции.

# a.clear()
a = set()

И тогда у вас не будет во всех элементах словаря ссылка на одно и то же множество, а будут разные множества, как это и должно быть.


Почему при наложении (вставке) цветной картинки на картинку градиента серого в итоге обе картинки получаются серого градиента: pillow python?
Пытаюсь наложить одну картинку на другую через метод paste библиотеки pillow. Одну из картинок обрабатываю методом convert("L"), сохраняю под другим именем. Далее беру другую картинку (уже цветную) и через paste вставляю в первую, которая уже в градациях серого. В итоге результат получаю целиком черно-белый, а хотелось бы на сером фоне получить цветное изображение
<code>
with Image.open(filename) as img:
    img.load()
    img.show() # здесь изображение цветное

with Image.open(filename_2) as img_auto:
    img_auto.load()
    gray_image = img_auto.filter(ImageFilter.BoxBlur(7))
    gray_image_1 = gray_image.convert("L")
    gray_image_1.show() # здесь изображение в градациях серого
    gray_image_1.save(filename_3)

with Image.open(filename_3) as img_auto2:
    img_auto2.convert('RGB')
    img_auto2.paste(img, (50, 0), mask=img)
    img_auto2.show()   # здесь результат полностью черно-белый, а нужен серый фон и
                         поверх цветная картинка
</code>

img_auto2.convert('RGB')

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

img_auto2 = img_auto2.convert('RGB')


Типизация объекта класса в Python
У меня есть класс User и я сделал функцию, которая на вход принимает объект этого класса, вопрос как типизировать этот аргумент

class User:
    def __init__(self, *args): ...
    def something(self, user: ?): ...

Если поставить туда User то Python скажет:

NameError: name 'User' is not defined

Подскажите пожалуйста что делать? Заранее спасибо!

Вот несколько вариантов:

__future__:

from __future__ import annotations

class User:
    def __init__(self, *args): ...
    def something(self, user: User): ...

typing

from typing import TypeVar

t = TypeVar('User', bound='User')

class User:
    def __init__(self, *args): ...
    def something(self, user: t): ...

Просто строки:

class User:
    def __init__(self, *args): ...
    def something(self, user: 'User'): ...

Я бы рекомендовал использовать
__future__, потому что он был запланирован как стандартное включение, но пока что релиз в стандарт отложили дважды.


инструкции в python [закрыт]

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

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

Закрыт 8 дней назад.

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

Если инструкции - команды в Python.
То строка
print("Hello") тоже будет инструкцией?

print() - встроенная функция.
можно ли print назвать инструкцией.
столкнулась с понятием "инструкция if", поэтому возник данный вопрос.

Да, строка
print("Hello") является инструкцией.

Почему?
Согласно официальной документации The Python Language Reference, русский перевод Справочник по языку Python.

Подробнее:
Для этой документации, инструкциями (statements) являются

или простые инструкции (7. Простые операторы, 7. Simple statements),
или составные инструкции (8. Составные операторы, 8. Compound statements).

Все типы простых и составных инструкций в этой документации перечисленны.

К составным инструкциям относятся такие как
if,
while,
for - это не ваш случай.

Вызов функции в перечислении простых инструкций как отдельный тип не находится.

Но там находится тип «инструкция-выражение» (7.1. Операторы выражений, 7.1. Expression statements). Он определен так:

expression_stmt    ::= starred_expression
starred_expression ::= expression | (starred_item ",")* [starred_item]

причем в типе
expression (выражение, см. 6. Выражения, 6. Expressions) находится
primary (основный, см. 6.3. Праймериз, 6.3. Primaries), определенный как

primary ::=  atom | attributeref | subscription | slicing | call
atom    ::=  identifier | literal | enclosure
        ...
call    ::=  primary "(" [argument_list [","] | comprehension] ")"

К последнему принадлежит и ваш вызов функции
print("Hello").


Python форматирование строк через f-строки
Необходимо написать программу, которая будет считывать три числа и выводить их в определенном формате. Первое число целое, второе с плавающей точкой, третье целое неотрицательное. По примерам необходимо определить требуемый формат данных.
Формат выходных данных определен: +000000102 ######3.14 0000_0100_0110_0111 как int float binary
Был написан код:
<code>
integ = int(input())  # первое число
flot = float(input())  # второе число
intg_pos = int(input())  # третье число
print(f"{integ:0=+10}")  # с первым и вторым числами код работает
проблема началась с третьим числом
print(f"{round(flot,2):#>10}")  # +$$$3
res_current = (f"{(intg_pos):0>16b}")
res_current = str(res_current)
result = str(res_current)
result = (result[::-1])
print('_'.join(result[i:i+4] for i in range(0, len(result), 4))[::-1])
</code>
который не работает со второй тройкой примеров: -123.7 проблема в числе знаков после запятой. Необходимо иметь два знака после запятой в выходном числе. То есть, свободное место заполнить символом 0, а перед запятой свой заполнитель. Не получается сделать сразу оба заполнения. Срабатывает либо первое, либо второе. Пытался разными способами.

Попробуйте так
<code>
print(f"{flot:#>10.2f}")
</code>


у меня не выполняется print внутри условия
почему при запуске приведённого ниже кода система ничего не выводит в консоль, и как это исправить?
<code>
for N in range(1, 100):
    z = N - (N % 4)
    v = bin(z)[:2]
    i = v.count('1')
    t = v + str(i % 2)
    G = v.count('1')
    T = v+str(G % 2)
    R = int(T, 2)
    if R > 100:
        print(R)
        break
</code>

В команде

v = bin(z)[:2]

вы очевидно хотели избавиться от символов
0b в начале бинарного числа, но вместо того вы избавились от остальных символов, т.е. всех бинарных цифр.
Примените вместо того срез
[2:]:

v = bin(z)[2:]


Python pandas группировка части датафрейма по условию
Подскажите, пожалуйста, как сгруппировать в DataFrame в кварталы только те данные, в которых представлены все три месяца квартала?
<code>
     Контрагенты    Период    Год
0     Компания      Март  2022г
1     Компания    Апрель  2022г
2     Компания       Май  2022г
3     Компания      Июнь  2022г
4     Компания      Июль  2022г
5     Компания    Август  2022г
6     Компания  Сентябрь  2022г
7     Компания   Октябрь  2022г
8     Компания    Ноябрь  2022г
9     Компания   Декабрь  2022г
10    Компания      Март  2020г
11    Компания    Апрель  2020г
12    Компания      Июнь  2020г
13    Компания      Июль  2020г
14    Компания    Август  2020г
15    Компания  Сентябрь  2020г
16    Компания    Ноябрь  2020г
17    Компания   Декабрь  2020г
</code>

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

def fun(x):
    if x.shape[0] < 3:
        return x
    s = x.head(1)
    s.at[s.index[0], 'Период'] = f"{q[s.at[s.index[0], 'Период']]} кв."
    return s

df = pd.DataFrame({'Контрагенты': ['Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания', 'Компания'],
                   'Период': ['Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь', 'Март', 'Апрель', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Ноябрь', 'Декабрь'],
                   'Год': ['2022г', '2022г', '2022г', '2022г', '2022г', '2022г', '2022г', '2022г', '2022г', '2022г', '2020г', '2020г', '2020г', '2020г', '2020г', '2020г', '2020г', '2020г']})
q = {'Январь': 1, 'Февраль': 1, 'Март': 1, 'Апрель': 2, 'Май': 2, 'Июнь': 2, 'Июль': 3, 'Август': 3, 'Сентябрь': 3, 'Октябрь': 4, 'Ноябрь': 4, 'Декабрь': 4}
df = df.groupby([df['Период'].replace(q), 'Год'], as_index=False, sort=False).apply(fun).reset_index(drop=True)
print(df)

  Контрагенты   Период    Год
0    Компания     Март  2022г
1    Компания    2 кв.  2022г
2    Компания    3 кв.  2022г
3    Компания    4 кв.  2022г
4    Компания     Март  2020г
5    Компания   Апрель  2020г
6    Компания     Июнь  2020г
7    Компания    3 кв.  2020г
8    Компания   Ноябрь  2020г
9    Компания  Декабрь  2020г


Как передать в функцию аргументы в виде итерации цикла, tkinter [дубликат]

На этот вопрос уже дан ответ здесь:

Создание списка кнопок с разными параметрами обработчика нажатия

                                (1 ответ)

Закрыт 10 дней назад.

<code>
from tkinter import *

def is_zero(x):
    print(x)
    if x == 0:
        print(0)

root = Tk()
root.geometry('1000x100+500+0')

for i in range(10):
    but = Button(text=i, command=lambda: is_zero(i), font='a 25')
    but.place(width=100, x=i*100, height=100)

root.mainloop()
</code>
Программа выводит всегда число 9. Как сделать так чтобы аргументы кнопки передавались в функцию адекватно и не были одинаковыми?

Проблема в том что i глобальная. Её можно локализовать например так
<code>
from tkinter import *
def is_zero(x):
    print(x)
    if x == 0:
        print(0)

root = Tk()
root.geometry('1000x100+500+0')

def make_btn(i):
    but = Button(text=i, command=lambda: is_zero(i), font='a 25')
    but.place(width=100, x=i*100, height=100)

for i in range(10):
    make_btn(i)

root.mainloop()
</code>


Как вывести список простых чисел в одну строку сразу после "Простые числа от 1 до 50: "?
<code>
import random
n = random.randint(1,100)
print('Случайное число:', n)
print('Простые числа от 1 до %d:' %n)
num = 2
count = 0
while num <= n:
    i = 2
    while num % i:
        i += 1
    if i == num:
        print(num, end=' ')
        count += 1
    num += 1
print('\nВсего %d простых чисел' %count)
</code>
Результат:
Случайное число: 50
Простые числа от 1 до 50:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
Всего 15 простых чисел

Точно так же, как вы это делаете с выводом собственно самих простых чисел - указать
print не переводить строку с помощью параметра
end:

print('Простые числа от 1 до %d:' %n, end=' ')
                                    ^^^^^^^^^

В данном случае заменяем перевод строки на пробел. А можно заменять и на пустой символ, например.
И лучше используйте современное форматирование через f-строки:

print(f'Простые числа от 1 до {n}:', end=' ')


ПОмогите как написать бота чтобы отправлял сообщение
как написать бота который будет по кнопке отправлять написанное человеком другому человеку.
вот что есть покамисть. Использую pyTelegramBotAPI
<code>
from telebot import types

bot = TeleBot("")

TO_CHAT_ID = 2080813264

def response(message):
  print(message.text)
  bot.send_message(message.chat.id,message.text)

@bot.message_handler(commands=['start'])
def start(message):

  keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
  keyboard.row("Гайд","Жалоба")
  keyboard.row("Анкета на набор")
  bot.send_message(message.chat.id,'Типа приветствие',reply_markup=keyboard)

@bot.message_handler(content_types=['text'])

def start(message):
  if message.text  == "Гайд":
    bot.send_message(message.chat.id,"тут типа гайд росписаный")

  if message.text == "Жалоба":
    save = bot.send_message(message.chat.id,"Введите вашу жалобу")
    bot.register_next_step_handler(save,response)
def message(msg):
    if msg.text == "Жалоба":  # Условые пересылки сообщения
        bot.forward_message(chat_id=2080813264,  from_chat_id=msg.chat.id,
message_id=msg.message_id)

bot.polling(none_stop=True)
</code>

Не совсем понял, чего вы хотите. Но могу предложить что-то такое.
<code>
import telebot
from telebot import types

bot_token = "YOUR_BOT_TOKEN"
to_chat_id = 2080813264
bot = telebot.TeleBot(bot_token)

@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button = types.KeyboardButton("Send Message")
    markup.add(button)
    bot.send_message(message.chat.id, "Привет! Нажми на кнопку \"Send Message\", чтобы отправить сообщение", reply_markup=markup)

@bot.message_handler(func=lambda message: message.text == "Send Message")
def send_message(message):
    user_message = message.text
    bot.send_message(to_chat_id, user_message)  # Отправка сообщения другому пользователю с id равным to_chat_id

bot.polling()
</code>


scroll canvas.create_text
У меня есть главный
Canvas с изображение. Мне нужно добавить виджет с прокруткой, для добавления в него текст, но
ScrolledText мне не подходит так как мне нужно сделать фон задний, под текстом, полупрозрачный, чтобы проглядывалась картинка на
canvas. Поэтому я заготовил полу прозрачный
fon.png. Я понимаю что без canvas это не решить. Но проблема в том, что при создании виджета типа (Canvas, Frame, и т.д. для добавлния в них scroll функции) у них изначально есть задний фон и полупрозрачным его никак не сделать, если накладывать сверху после картинку, то видно же будет это стандартный фон под изображением.
Как решить эту делему? Мне нужен виджет, с полупрозрачным фоном, и чтобы я могу туда добавлять текст и у него была функция прокрутки.
код чисто с главным изображением, как дальше не знаю.

from tkinter import *
from PIL import ImageTk, Image

class game(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.canvas = Canvas(root, width=800, height=600)
        self.canvas.pack(fill="both", expand=True)

        self.background = Image.open('image.jpg'))
        self.img1 = ImageTk.PhotoImage(self.background)
        self.image1 = self.canvas.create_image(0, 0, anchor=NW, image=self.img1)

if __name__ == "__main__":
    root = Tk()
    app = test(root)
    root.mainloop()

я решил все так. добавив сам текст реакцию на прокрутку мыши. А самое главное весь текст добавлял в список

txtInfo = []
txtInfo.append('text1')
txtInfo.append('text2')
self.canvastext = self.canvas.create_text(self.width-302, 10, anchor=NW, text=self.scrollText(txtInfo), width=302, fill='white')
self.canvas.tag_bind(self.canvastext, '<Button-4>', lambda event: self.scrolling('+'))
        self.canvas.tag_bind(self.canvastext, '<Button-5>', lambda event: self.scrolling('-'))

далее добавил функции для обработки списка и движения колесика

def scrollText(self,txt=[]):
    lst = []
    # колич. записей
    if len(txt)>50:
        col = len(txt) - 50
        for cc in range(0, col):
            txt.remove(txt[col-cc])
    # отображение
    if len(txt)>15:
        self.ii = len(txt)-14
        self.jj = self.ii+14
        for rr in range(self.ii, self.jj):
            lst.append(txt[rr])
    else:
        lst = txt
    return ''.join(lst)

def scrolling(self,updown):
    lst = []
    if updown == '+':
        if self.ii-1 > -1:
            self.ii = self.ii-1
            self.jj = self.ii+14
            for rr in range(self.ii, self.jj):
                lst.append(txtInfo[rr])
            self.canvas.itemconfigure(self.canvastext, text=''.join(lst))
    else:
        if self.ii+15 < len(txtInfo)+1:
            self.ii = self.ii + 1
            self.jj = self.ii + 14
            for rr in range(self.ii, self.jj):
                lst.append(txtInfo[rr])
            self.canvas.itemconfigure(self.canvastext, text=''.join(lst))

возможно грубо, но главное работает


ошибка pickle: "EOFerror: ran out of input" при загрузке списка из файла
пытаюсь выгрузить из файла список в bytes-файле

with open(filename, 'rb') as f:
        if f.read() == '':
            debtList = []
        else:
            debtList = pcl.load(f)

уложенный здесь

with open(filename, 'wb') as f:
    pcl.dump(debtList, f)

я получаю ошибку
EOFError: Ran out of input при запуске, почему так происходит и что с этим делать?

with open(filename, 'rb') as f:
        if f.read() == '':
            debtList = []

В этот момент файл
f весь прочитан от начала и до конца, указатель установлен на конец файла. И я не очень понимаю, что и с чем вы тут сравниваете, работает ли нормально сравнение считанных байтов со строкой.

        else:
            debtList = pcl.load(f)

А здесь вы пытаетесь ещё раз прочитать уже прочитанный файл
f с указателем, установленным на конец файла. Естественно, ничего вы уже не можете прочитать.
Решением может быть, например, установка указателя обратно на начало файла перед повторным его чтением:

        else:
            f.seek(0)
            debtList = pcl.load(f)


Запись переменной в новую строку DataFrame
Есть переменная (в примере ниже - measurement), значение которой изменяется. Нужно записывать её каждое новое значение в новую строку датафрейма. Код
<code>
df = pd.DataFrame({'Measurement': [str(measurement.payload.decode("utf-8"))]})
print(df)
</code>
создает датафрейм, но он сохраняет только одну свою строку. С каждой новой переменной единственная строка датафрейма обновляется, а нужно, чтобы каждая новая переменная записывалась в новую строку того же датафрейма.

Для первого значения переменной создаем датафрейм так, как вы это уже сделали
(применить функцию
str() на строку не нужно; может быть вы хотели применить функцию
float()):

df = pd.DataFrame({'Measurement': [measurement.payload.decode("utf-8")]})

Затем для каждого следующего (нового) значение используем то же самое, что и на правой стороне, т.е.

     pd.DataFrame({'Measurement': [measurement.payload.decode("utf-8")]})

но добавим его к текущему датафрейму
df применением функции
pd.concat()

df = pd.concat((df,
                pd.DataFrame({'Measurement': [measurement.payload.decode("utf-8")]})),
                ignore_index=True)

Пример с конкретными значениами вместо вашего
measurement.payload.decode("utf-8"):

>>> df = pd.DataFrame({'Measurement': [7.62]})
>>> df

   Measurement
0         7.62

>>> df = pd.concat((df,
...                 pd.DataFrame({'Measurement': [3.14]})),
...                 ignore_index=True)
>>> df

   Measurement
0         7.62
1         3.14

>>> df = pd.concat((df,
...                 pd.DataFrame({'Measurement': [2.72]})),
...                 ignore_index=True)
>>> df

   Measurement
0         7.62
1         3.14
2         2.72


Как вывести строки, содержащие конкретную букву? Python
Помогите, пожалуйста, найти ошибку. Нужно вывести строки, содержащие букву "ё". При этом условия:

Разрешается ввод только через input.txt.
Используйте .filter() и lambda-функции.
Примените метод readlines().
Если буквы "ё" нет в строке - на экран ничего выводить не нужно.
Строку необходимо выводить ровно в том виде, в котором она находится во входном файле (заглавная буква остаётся заглавной, строчная - строчной).

Моё решение:

with open ('input.txt', 'r', encoding = 'UTF-8') as f:
  text = f.readlines()
  text2 = list(filter(lambda s: 'ё' in s.lower(), text))
  for i in text2:
      print(i)

Скорее всего, появились лишние пустые строки, как можно их убрать?
Текст, из которого нужно вывести строку:

input.txt

В лесу родилась ёлочка,
В лесу она росла,
Зимой и летом стройная, зеленая была.

Мне кажется лишних строк не появляется, а все дело в дополнительном переводе каретки.
Попробуйте вот так:

print(i, end='')

Грубо говоря, у вас идет два перевода каретки
\n\n

\n от чтения из файла.

\n от самого принта.

end='' - удалить лишний перевод каретки и вы получите ожидаемый результат.


Игнорируются буквы при поиске в строке
Всех приветствую. Есть такой кусок кода:

import random

ALL_SYMBOLS = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'

key = list(ALL_SYMBOLS)
random.shuffle(key)
key = ''.join(key)

message = 'Абрикосовый сок после - это лучшее, что может быть'
secret_message = ''

for letter in message:
    if key.find(letter):
        new_index = key.find(letter)
        secret_message += ALL_SYMBOLS[new_index]
    else:
        print(f'Не нашёл символ - {letter}')
        secret_message += letter

print(secret_message)

Пытаюсь зашифровать
message простым подстановочным шифром. На данном этапе пробелы игнорирую и ожидаю, что в зашифрованном сообщении они останутся на том же месте, что и в исходном сообщении. Всё шифруется вроде бы хорошо, но иногда проскакивает

Не нашёл символ - ь
зщЁгСЫЭЫфЦьяЭЫСяэЫЭцПяяяпжЫяцШЧЮППяяЧжЫяъЫчПжящЦжь

В данном случае пробелы заменились на символ "я" и почему-то не найден ь. Почему так происходит?

key.find(letter) возвращает index
key и -1 если не находит. Соответственно измените код на:

import random

ALL_SYMBOLS = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'

key = list(ALL_SYMBOLS)
random.shuffle(key)
key = ''.join(key)

message = 'Абрикосовый сок после - это лучшее, что может быть'
secret_message = ''

for letter in message:
    if key.find(letter) != -1:
        new_index = key.find(letter)
        secret_message += ALL_SYMBOLS[new_index]
    else:
        print(f'Не нашёл символ - {letter}')
        secret_message += letter

print(secret_message)


В калькуляторе реализовать запрет ввод символов кроме тех, что есть в калкьуляторе
Реализую калькулятор на Django. В нем будут кнопки, которые будут добавлять свой определенный символ в выражение, а также возможность пользователю самому написать выражение в строку. Подскажите, как мне реализовать проверку на то, ввел ли пользователь символы, которые запрещены? Я планировал сделать set, в котором содержатся все цифры, а также все возможные знаки (+ - * / sqrt ^ и др.). Как мне сделать так, чтобы программа проверяла выражение и если она находила символ, которого нету в сете, она выдавала ошибку? Слышал что то про проверку нахождения подмножества во множестве, но это же помоему не то, что мне нужно?

Ну, хотя сложно по описанию понять, но могу примерно объяснить, как такое делается.
В Python есть оператор членства
in, позволяющий проверить наличие переменной в списке/кортеже/сете/строке и т. п. C помощью него можно реализовать проверку наличия каки-либо других символов, кроме допустимых, в выражении, переданном калькулятору. Пример:

vyr_good = '1-5+3'
vyr_bad = '1+2/b'
s = '0123456789+-*/'
validate = lambda vyr: all([i in s for i in vyr])
print(validate(vyr_good))                            # Вывод: True
print(validate(vyr_bad))                             # Вывод: False

s — множество допустимых символов.
vyr_good и
vyr_bad соответственно, допустимое и недопустимое выражения. Функция
all проверяет, что все значения в переданном ей списке равны True. При помощи спискового включения мы создаем список, в котором все элементы будут равны True только если каждый член выражения будет в строке-валидаторе. Эта функция для удобства заключена в лямбду.


После input не работает if ,просто игнорируется и завершается код? [закрыт]

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

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

Закрыт 13 дней назад.

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

При вводе команды
input не работает
if
точнее его пропускает и завершается код без ошибок и причин
про то.
Что надо писать
int(input()) я знаю.
Проверил, что всё работает и там число написав принт перед
input, но всё мимо.\
main.py

x = int(input());
if x > 5
  print ('больше')
elif x < 5
  print ('меньше')

ты пропустил
:
после
if и
elif.
И убери кавычки
;.
Вот исправленный код:

x = int(input("Введите число"))
if x > 5:
  print ('больше')
elif x < 5:
  print ('меньше')


Как сделать чтобы из бд sqlite текст в html выводился в исходном форматировании (со всеми абзацами)?
Делаю сайт на Flask. Есть небольшая форма в которой есть тег textarea. Из textarea большой кусок текста добавляется в бд (sqlite). Всё работает нормально, но когда этот текст выводится из бд в html он теряет все абзацы. Например нужно так:

     Привет
     Как дела?

А выводится так:

     Привет Как дела?

Просто я новичок. Помогите пожалуйста(

Проблема заключается в том, что HTML игнорирует обычные символы переноса строки и пробелы, и для отображения текста с абзацами вам нужно использовать HTML-теги для разрыва строк. Для этого вы можете использовать тег
<p> для абзацев и тег
<br> для переносов строки.
Чтобы отобразить текст из базы данных SQLite с сохранением абзацев, вы можете использовать фильтр
Jinja2 safe в шаблоне Flask.


пытаюсь превратить код на питоне в однострочник
не могу засунуть это в одну строку (делаю это просто так), если это можно сделать, и если кто то знает как, помогите пожалуйста
<code>
import itertools as it

for i in it.permutations([int(i) for i in str(int(input()))]):
    print(''.join(list([str(a) for a in list(i)])))
</code>

Вот, вроде работает

import itertools as it
print('\n'.join(''.join(a for a in x) for x in (it.permutations(i for i in input()))))

P.S.  Не перевожу в
int. Нигде не формирую
list, без [] и так работает генератор


В чём отличие бага от исключения?
Подскажите, чем баг отличается от исключения в языке программирования Python?

Баг - необработанная ошибка в поведении программы, из за которой ты получаешь непредвиденное поведение или исключение. Например: Калькулятор на
5+5 отвечает
55, так как ты забываешь преобразовать строку к цифре. В данном случае представлено неожиданное поведение (ведь исключение не вызывается)
Исключение - внутренняя ошибка которая вызывается специально, и которую можно и нужно перехватить. Например: Пользователь ввёл имя файла для чтения, но сам файл отсутствует. Метод для чтения файла вызывает исключение
FileNotFoundException, но ты перехватываешь данное исключение и отправляешь сообщение пользователю, что введённый файл не существует.
Необработанное исключение - баг. Например: в калькулятор пользователь вводит
5/0, и операция деления вызывает исключение
ZeroDivisionError. Если ты его не обработаешь, то твоя программа просто крашнется. В данном контексте пофиксить баг - обработать это исключение - добавить метод для отлова данного исключения с помощью
try и
except что бы вывести пользователю сообщение об ошибки.


Как удалить часть из одной переменной (не из списка) в Python
У меня есть переменная в которой уже есть строка из кода одного сайта, мне нужно получить промокод из этой строки. То-есть я должен каким-то образом удалить часть до промокода и после. Как это сделать?
Сама переменная (при выводе в консоль):

<div data-title="Скопировать промокод" data-toggle="tooltip" id="promocodeBox" onclick="copy('2mRCAg2s9IClqJ8', 'Промокод скопирован')">
        2mRCA<span>-</span>g2s9I<span>-</span>ClqJ8
</div>

Предлагаю использовать регулярное выражение для поиска промика:

import re

# Ваша переменная (при выводе в консоль):
html_string = """
<div data-title="Скопировать промокод" data-toggle="tooltip" id="promocodeBox" onclick="copy('2mRCAg2s9IClqJ8', 'Промокод скопирован')">
        2mRCA<span>-</span>g2s9I<span>-</span>ClqJ8
</div>
"""

# Тут запишем регулярное выражение для поиска промика
promo_code = re.search(r"copy\('([A-Za-z0-9]+)',", html_string)

if promo_code:
    #Тут мы хотим получить первую группу совпадений (выраженную круглыми скобками в регулярном выражении)
    promo_code = promo_code.group(1)
    print("Найден промокод:", promo_code)
else:
    print("Промокод не найден")

Консоль:
Найден промокод: 2mRCAg2s9IClqJ8


найти непрерывную последовательность в списке на основании последовательности в другом списке Python
list1 = [1,5,6,7,8,9,0,9,8,7,6,5,4,3,2]
list2 = [9,8,7,6,5,4,3,2,1,0,3,5,2,5,7]
В списке list2 с начала массива идет последовательность (выделена жирным), точно такая же со сдвигом повторяется в списке list1 (выделена жирным). Мне достаточно 3-4 совпадений подряд, чтобы понять, что последовательность верная. Вернуть нужно правильные индексы из списка list1. Списки короткие для примера, в реальности они могут быть по 300-400 значений, сдвиг может быть на 100-200 индексов и значения могут быть пятизначными. Сами значения в списках в верной последовательности могут немного колебаться (примерно +3, -3), поэтому внутри сравнения надо еще проверять на эти колебания.  Подскажите, есть ли решения на Python для этого?

Не уверен насколько правильно я Вас понял, но возможно такой вариант подходит под такую задачу:

def find(list1, list2, tolerance=3, min_sequence_length=3):
    result_sequence = []
    current_sequence = []

    for i in range(len(list1)):
        for j in range(len(list2)):
            k = 0
            current_sequence = []

            while (i + k < len(list1) and j + k < len(list2) and
                   abs(list1[i + k] - list2[j + k]) <= tolerance):
                current_sequence.append(list1[i + k])
                k += 1

            if len(current_sequence) > len(result_sequence):
                result_sequence = current_sequence

    if len(result_sequence) >= min_sequence_length:
        return result_sequence
    return None

list1 = [1, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2]
list2 = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 3, 5, 2, 5, 7]

result = find(list1, list2)
if result:
    print("Последовательность в list1:", result)
else:
    print("Не найдено.")

>>> Последовательность в list1: [9, 8, 7, 6, 5, 4, 3, 2]

Если, к примеру, заменить 0 в первом списке на 12, то:

>>> Последовательность в list1: [12, 9, 8, 7, 6, 5, 4, 3, 2]


Как сделать так чтоби unittest не считал вивод через print(), а только то что виводится через return
Вот мой код програми

n = int(input('n = '))
n1 = n
i = 0
depth = 0
level = 0

def f(n):
    global depth
    global level

    if n == 1:
        k = 1
        level += 1
    elif n % 2 == 0:
        k = 2 * f(n / 2) - 1
        level += 1
    else:
        k = 2 * f(n - 1) + 1
        level += 1

    if depth < level:
        depth = level

    print("level = ", level)

    if k > n1:
        return n1
    else:
        return k

print("№", f(n), "  ", "depth = ", depth)

А вот код unittest:

import unittest
from LAB5_5 import f

class TestF(unittest.TestCase):
    def test_f(self):
        self.assertEqual(f(10), 5)  # add assertion here

if __name__ == '__main__':
    unittest.main()

Unit test берет за результат первый print(), а мне нужно чтобы он проверял return

Когда я запускаю Unit test в консоль вводиться n = то есть он запускает код за границами функции. Как мне сделать так, чтобы unit test запускал только фрагмент кода из функции.

Помогите, пожалуйста, заранее СПАСИБО!

Точно также, как во втором файле поместите всё, что не относится к функции в конструкцию
if __name__ == '__main__'::

def f(n):
    # здесь тело функции
    ...

if __name__ == '__main__':
    n = int(input('n = '))
    n1 = n
    i = 0
    depth = 0
    level = 0

    print("№", f(n), "  ", "depth = ", depth)

Тогда этот блок с
print при импорте не будет исполняться. Он будет исполняться только при прямом запуске этого файла.


Что означает запись типа "urllib3[socks]<3,>=1.26" в описании зависимостей модуля Python?
Пытаюсь установить в оффлайне модуль selenuim из скачанного файла. Он говорит, что ему не хватает
urllib3[socks]. Модуль urllib3 я установил ранее, в качестве модуля он импортируется под именем urllib. А вот запись с квадратными скобками и именем socks внутри них я не понимаю. Внутри whl-файла есть файл METADATA, и в нём есть именно такая запись:
urllib3[socks]<3,>=1.26. Установленная версия urllib3 подходит под эти рамки. Чего ему ещё надо от меня ?

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

pip install "urllib3[socks]" (лучше - с указанием ограничений по версии, раз они в метаданных указаны, т.е.
pip install "urllib3[socks]<3,>=1.26")
Чтобы понять, что за зависимости, нужно смотреть
setup.py или
pyproject.toml проекта, в данном случае -
pyproject.toml (
setup.py в проекте отсутствует). Смотрим раздел
[project.optional-dependencies]:

[project.optional-dependencies]
brotli = [
  "brotli>=1.0.9; platform_python_implementation == 'CPython'",
  "brotlicffi>=0.8.0; platform_python_implementation != 'CPython'"
]
zstd = [
  "zstandard>=0.18.0",
]
socks = [
  "PySocks>=1.5.6,<2.0,!=1.5.7",
]

Видим, что в группе
socks указан пакет
PySocks, значит нужно доустановить его.
В
setup.py опциональные зависимости передаются в виде словаря в параметр
extras_require функции
setup, т.е. было бы что-то такое:

...

setup(
   ...
    extras_require={
        "brotli": [
            "brotli>=1.0.9; platform_python_implementation == 'CPython'",
            "brotlicffi>=0.8.0; platform_python_implementation != 'CPython'",
        ]
        "zstd": ["zstandard>=0.18.0"],
        "socks": ["PySocks>=1.5.6,<2.0,!=1.5.7"],
    },
   ...
)

...


Как сделать автоматическую генерацию клавиатуры Python + aiogram 3
Хочу сделать reply клавиатуру, но не хочу писать каждую клавишу отдельно, как её сгенерировать автоматически?
Названия клавиш должны браться из наименования страниц файла Excel.

import openpyxl
wb = openpyxl.reader.excel.load_workbook(filename = "filenme", data_only = True)
@router.message(F.text.lower() == "Вывод")
async def command(message: Message):
   for i in wb.sheetnames:
      await message.answer(f"Кнопка - {i}", reply_markup = ?)

Это мой код на вывод наименований всех листов Excel таблицы. Как мне это перевести в кнопки? Кнопки требуются Reply.
Нашёл вот такой вариант, но это как понял aiogram 2 + inline

def gen_markup(quanity: int, prefix: str, row_width: int) -> InlineKeyboardMarkup:
markup = InlineKeyboardMarkup(row_width=row_width)
for i in range(quanity):
    markup.insert(InlineKeyboardButton(f"text {i}", callback_data=f"{prefix}:{i}"))
return markup

@dp.message_handler(commands=['start'])
async def bot_message(message: types.Message):
markup = gen_markup(30, "prefix", 5)
await message.answer("asd", reply_markup=markup)

Может кому пригодится, сам сделал.
<code>
from aiogram.utils.keyboard import ReplyKeyboardBuilder
from handlers.inventorization_commands import wb

def kb_inventory():
builder = ReplyKeyboardBuilder()
for item in wb.sheetnames:
    builder.button(text = item)
builder.adjust(3)
return builder.as_markup(resize_keyboard = True)
</code>


Как доделать сюда рассылку
<code>
from email import message
import config
import logging
import asyncio
from datetime import datetime

from aiogram import Bot, Dispatcher, executor, types
from sqlighter import SQLighter

# задаем уровень логов
logging.basicConfig(level=logging.INFO)

# инициализируем бота
bot = Bot(token=config.API_TOKEN)
dp = Dispatcher(bot)

# инициализируем соединение с БД
db = SQLighter('db.db')

# Команда активации подписки
@dp.message_handler(commands=['subscribe'])
async def subscribe(message: types.Message):
    if(not db.subscriber_exists(message.from_user.id)):
        # если юзера нет в базе, добавляем его
        db.add_subscriber(message.from_user.id)
    else:
        # если он уже есть, то просто обновляем ему статус подписки
        db.update_subscription(message.from_user.id, True)

    await message.answer("Вы успешно подписались на рассылку!\nЖдите, скоро выйдет актуальное расписание! =)")

@dp.message_handler(commands=['tbl'])
async def subscribe(message: types.Message):
    all_tbl = db.get_tbl()
    tbls = []
    for i in all_tbl:
        tbl = f'{i[0]}'
        tbls.append(tbl)
    await message.answer(text="\n".join(tbls))

@dp.message_handler(commands=['Monday'])
async def send_ph(message: types.Message):
 for s in subscriptions:
  await bot.send_photo(chat_id=message.chat.id, photo='AgACAgIAAxkBAANiZTeivUdrCN8WE8qn1inIjwrc2EkAAq7YMRtwnsFJikOvhsbhx1wBAAMCAAN5AAMwBA')

@dp.message_handler(commands=['Thursday'])
async def send_ph(message: types.Message):
 for s in subscriptions:
  await bot.send_photo(chat_id=message.chat.id, photo='AgACAgIAAxkBAANoZTevghT5xBWp77HCOY00WHEtOboAAj7ZMRtwnsFJQ9jUAfPsfiUBAAMCAAN5AAMwBA')

# Команда отписки
@dp.message_handler(commands=['unsubscribe'])
async def unsubscribe(message: types.Message):
    if(not db.subscriber_exists(message.from_user.id)):
        # если юзера нет в базе, добавляем его с неактивной подпиской (запоминаем)
        db.add_subscriber(message.from_user.id, False)
        await message.answer("Вы итак не подписаны.")
    else:
        # если он уже есть, то просто обновляем ему статус подписки
        db.update_subscription(message.from_user.id, False)
        await message.answer("Вы успешно отписаны от рассылки.")

@dp.message_handler(content_types=['photo'])
async def get_file_id_p(message: types.Message):
    await message.reply(message.photo[-1].file_id)

# получаем список подписчиков бота
subscriptions = db.get_subscriptions()

# запускаем лонг поллинг
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
</code>

Исходя из ваших ответов:
Боту что бы отправить сообщение всем юзерам, не обязательно от вас ловить команду. Так что-то можно сделать примерно так:
<code>
async def scheduled_message():
    while True:
        await asyncio.sleep(86400)  # Ожидание 24 часа (в секундах)

        # Отправка сообщения всем подписчикам
        for user_id in subscriptions:
            await bot.send_message(user_id, "Ежедневное сообщение!")

if __name__ == '__main__':
    dp.loop.create_task(scheduled_message())
    executor.start_polling(dp, skip_updates=True)
</code>


Как получить список всех встроенных функций python?
Есть ли способ получить список имен всех встроенных функций python?
Типа:
<code>
lst = [abs, all, any, ascii ... super, tuple, type, zip]
</code>
Причем не строк, а ссылок на функции, чтобы их можно было вызвать без eval().

Например, так:

>>> import builtins
>>> lst = [v for k, v in vars(builtins).items() if k[0].islower()]
>>> lst[0]
<built-in function abs>

Пояснения:

builtins - модуль со всеми встроенными объектами (в т. ч. функциями) (см. документацию);
встроенная функция
vars работает аналогично
dir, но возвращает словарь вида
{'идентификатор': значение};
мы перебираем этот словарь, и отбираем только те атрибуты модуля
builtins, которые начинаются с маленькой буквы.

Возможно, что этот способ не очень красив, но работает.


Изменить кнопку активации/деактивации кликера
В коде стоит сочетание клавиш ctrl + z мне нужно чтобы код приводился в действие одной лишь клавишей Z можно ли как то заменить сочетание ctrl + z на простую клавишу Z не загружая другую библиотеку?
<code>
import time
import mouse
import keyboard

isClicking = False
#функция
def set_clicker():
    global isClicking
    if isClicking:
        isClicking = False
        print("кликер отключен")
    else:    #иначе
        isClicking = True
        print("кликер включен")

keyboard.add_hotkey('ctrl+z',set_clicker)    #keyboard.add_hotkey
#Бесконечный цикл
while True:
    if isClicking:
      mouse.double_click(button="left")
      time.sleep(0.500)
</code>

Давайте попробуем вот так сделать:
<code>
import time
import mouse
import keyboard

isClicking = False

# функция
def set_clicker():
    global isClicking
    if isClicking:
        isClicking = False
        print("кликер отключен")
    else:
        isClicking = True
        print("кликер включен")

keyboard.add_hotkey('z', set_clicker)  # Изменили горячую клавишу на 'z'

try:
    while True:
        if isClicking:
            mouse.double_click(button="left")
            time.sleep(0.500)
except KeyboardInterrupt:
    print('\nПрограмма завершена.')
</code>


цикл while не выполняет условие
Пытаюсь написать правила для своей первой игры, но не понимаю почему итерации при вводе символа y или n повторяются постоянно.
<code>
from random import *
def game_alg(num1):
    lose_below  =['Ты не угадал, попробуй взять число побольше ;)', 'Бери выше!', 'Заданное число больше!']
    lose_above = ['Нет! Заданное число меньше!', 'Ого ты взял! бери меньше.', 'Попробуй ещё раз. Заданное число меньше.']
    plr_guess = -1
    while num1 != plr_guess:
        plr_guess = int(input('Можешь вводить число:'))
        if plr_guess > 100 or plr_guess < 1:
            print('Эй, так нечестно!')
        elif plr_guess > num1:
            print(choice(lose_above))
        elif plr_guess < num1:
            print(choice(lose_below))
        elif num1 == plr_guess:
            return('Ты победил! Игра окончена')

def present_rules(rules):
        cnt = 0
        x = str()
        if rules == 'Y'.lower() or rules == 'Y':
            print('Я загадываю число от 1 до 100. Твоей задачей является угадать число в заданном диапазоне.',
                 'Если угадываешь - ты выйграл.', sep = '\n')

        elif rules == 'N' or rules == 'n':
            print(f'Что ж, тогда начнем!')

        while x != 'N' or x != 'n' or x != 'Y' or x != 'y':
            if cnt >= 3:
                rules = input('ВВЕДИ Y или N!')
                x = rules
                return
            else:
                rules = input('Пожалуйста введите Y или N:')
                x = rules
                return
            cnt += 1

        if rules == 'y' or rules == 'Y':
                print('Я загадываю число от 1 до 100. Твоей задачей является угадать число в заданном                         диапазоне.','Если угадываешь - ты выйграл.', sep='\n')
        elif rules == 'N' or rules == 'n':
                print(f'Что ж, тогда начнем!')

print('Приветствую тебя в моем первом игровом проекте!')

rules = input('Игра называется "Числовая угадайка", хочешь узнать правила игры? Y/N:')

present_rules(rules)

num = randint(1, 100)
print(game_alg(num))
</code>
переменная rules не сохраняет значение или что?

Если я правильно понимаю проблему, то она возникает из-за того, что в вашем цикле while условие написано неверно.
Условие
x != 'N' or x != 'n' or x != 'Y' or x != 'y' всегда будет истинным.
Так что попробуйте использовать оператор
and вместо
or.

while x != 'N' and x != 'n' and x != 'Y' and x != 'y':


Создаю бота, который в Telegram генерирует QR-код. Мой код не работает
<code>
import pyqrcode
import telebot
import png

bot = telebot.TeleBot('')

@bot.message_handler(content_types=['text'])
def start_message(message):
    def make_qrcode(url):
        qrcode = pyqrcode.create(url)
        qrcode.png('QR CODE.png', scale=6)
        with open('QR CODE.png', made='rb') as file:
            bot.send_photo(message.chat.id, photo=file)
    if message.text.find == "/make" != 1:
        get_url = message.text.replace("/make ", "")
        make_qrcode(url=get_url)
    else:
        bot.send_message(message.chat.id, "Чтобы получить ваш QR CODE, попробуйте написать /make [ссылка]")

bot.polling(none_stop=True)
</code>

Идея мне показалась забавной, так что вот мои варианты фикса.

Вариант, QR - код сохраняется в файл и отправляется:

import pyqrcode
import telebot
import png

bot = telebot.TeleBot('!!!-ТОКЕН-!!!')

@bot.message_handler(content_types=['text'])
def start_message(message):
    def make_qrcode(url):
        qrcode = pyqrcode.create(url)
        with open('QR_CODE.png', 'wb') as file:
            qrcode.png(file, scale=6)
        with open('QR_CODE.png', 'rb') as file:
            bot.send_photo(message.chat.id, photo=file)

    if message.text.startswith("/make "):
        get_url = message.text.replace("/make ", "")
        make_qrcode(url=get_url)
    else:
        bot.send_message(message.chat.id, "Чтобы получить ваш QR CODE, попробуйте написать /make [ссылка]")

bot.polling(none_stop=True)

Вариант, через буфер:

import pyqrcode
import telebot
import io

bot = telebot.TeleBot('!!!-ТОКЕН-!!!')

@bot.message_handler(content_types=['text'])
def start_message(message):
    def make_qrcode(url):
        qrcode = pyqrcode.create(url)
        buffer = io.BytesIO()
        qrcode.png(buffer, scale=6)
        buffer.seek(0)
        bot.send_photo(message.chat.id, photo=buffer, caption='Ваш QR код')

    if message.text.startswith("/make "):
        get_url = message.text.replace("/make ", "")
        make_qrcode(url=get_url)
    else:
        bot.send_message(message.chat.id, "Чтобы получить ваш QR CODE, попробуйте написать /make [ссылка]")

bot.polling(none_stop=True)


Изменить значение после закрытия дочернего окна [закрыт]

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

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

Закрыт 2 дня назад.

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

Как выполнить действие только после закрытия дочернего окна.
Простой привер кода:
<code>
from tkinter import *

class test(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.a = Label(root, text='111')
        self.a.pack()
        two()
        self.a.config(text='222')

class two(Toplevel):
    def __init__(self):
        super().__init__()
        #какие-то действия
        pass

if __name__ == "__main__":
    root = Tk()
    app = test(root)
    root.mainloop()
</code>

Стандартный способ дождаться закрытия дочернего окна - метод
.wait_window(). В примере ниже показываю как получить какой-либо результат из дочернего окна, но это опционально.

from tkinter import *

class test(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.a = Label(root, text='111')
        self.a.pack()

        window_two = two(master=self)  # Создаем окно
        window_two.wait_window()  # Ждем его уничтожения

        # Выводим значение поля result из дочернего окна
        self.a.config(text=window_two.result)

class two(Toplevel):
    def __init__(self, master):
        super().__init__(master=master)

        # Результат по-умолчанию - None
        # Если окно будет закрыто через крестик, а не через OK, это будет значение результата
        self.result = None

        self.entry = Entry(self)
        self.entry.pack()

        Button(self, text="OK", command=self.on_ok).pack()

        # Три строки ниже нужны, чтобы пока существует второе диалоговое окно, основное окно блокировалось
        # (чтобы дочернее окно было модальным)
        self.transient(master)
        self.grab_set()
        self.focus_set()

    def on_ok(self):
        # При нажатии на OK текст из поля ввода записываем в поле result и уничтожаем окно
        self.result = self.entry.get()
        self.destroy()

if __name__ == "__main__":
    root = Tk()
    app = test(root)
    root.mainloop()

Более простой пример, без классов, с вызовом диалога через функцию и возврата результата из нее же (а не через поле объекта): Entry в Toplevel - как взять значение


Прибавляется лишнее значение в базу данных
У меня есть система статистики в телеграм боте telebot. При любом сообщении в группе - в столбцы со статистикой в базе данных sqlite3 прибавляется +1 в колонку
messages -
bot_stats(основная статистика бота),
users_stats(статистика пользователя в группе),
groups(статистика беседы). В
users_stats прибавляется
+1, а в остальных
+2. Почему прибавляется
+2, я просмотрел код на повторы занесения значения в
бд - их вроде нету?

@bot.message_handler(content_types=['text'])
def user_msg(message):
    group_type = message.chat.id
    group_id = message.chat.id
    user_id = message.chat.id
    user_nickname = message.from_user.username
    if message.text == '8714290712094521':
        bot.send_message(message.chat.id, text='1')
    elif group_type > 0:
        conn = sqlite3.connect('dba.db', check_same_thread=False)
        cur = conn.cursor()

        cur.execute('UPDATE bot_stats SET messages = messages+1 WHERE id=1')
        conn.commit()

        cur.close()
        conn.close()
    elif group_type < 0:
        conn = sqlite3.connect('dba.db', check_same_thread=False)
        cur = conn.cursor()
        cur.execute('SELECT group_id FROM groups WHERE group_id = ("%s")' % group_id)
        groups = cur.fetchall()
        if len(groups) == 0:
            cur.execute('UPDATE bot_stats set groups = groups+1 WHERE id=1')
            cur.execute('INSERT INTO groups (group_id) VALUES ("%s")' % group_id)
            conn.commit()
            bot.send_message(message.chat.id, text='Запись создана')
        else:
            cur.execute('UPDATE groups set messages = messages+1 WHERE group_id=("%s")' % group_id)
            conn.commit()
        if message.text == '3428905140234951':
            bot.send_message(message.chat.id, text='1')
        else:
            cur.execute('SELECT group_id, user_id FROM users_stats WHERE (group_id, user_id) = ("%s", "%s")' % (group_id, user_id))
            user_stats = cur.fetchall()
            conn.commit()
            if len(user_stats) == 0:
                cur.execute('INSERT INTO users_stats (group_id, user_id, nickname) VALUES ("%s", "%s", "%s")' % (group_id, user_id, user_nickname))
                cur.execute('UPDATE users_stats SET messages = messages+1 WHERE (group_id, user_id) = ("%s", "%s")' % (group_id, user_id))
                conn.commit()
            else:
                cur.execute('UPDATE users_stats SET messages = messages+1 WHERE (group_id, user_id) = ("%s", "%s")' % (group_id, user_id))
                conn.commit()
            cur.execute('UPDATE bot_stats SET messages = messages+1 WHERE id=1')
            cur.execute('UPDATE groups SET messages = messages+1 WHERE group_id=?', (group_id,))
            conn.commit()
        cur.close()
        conn.close()

<code>
elif group_type > 0:

    cur.execute('UPDATE bot_stats SET messages = messages+1 WHERE id=1')
    conn.commit()

elif group_type < 0:

    cur.execute('UPDATE groups set messages = messages+1 WHERE group_id=("%s")' % group_id)
    conn.commit()
</code>
Скорее всего, в этих строчках возникает ошибка.
Когда group_type равно 1, столбцы messages в таблицах bot_stats и groups обновляются. При любом сообщении в группе с group_type больше 0, будет прибавляться +2 к столбцу messages в базе данных (по одному для bot_stats и groups).


Можно ли как то получить значения элементов словаря без цикла for
Допустим есть словарь

dict1 = {'a' : 1234}

Можно ли как то присвоить значения элементов словаря ('a' и 1234) к переменным key и val не используя цикл for
У меня есть код, но он с циклом for

for key, val in dict1.items():
    print(key, val)

Если вы хотите распечатать словарь построчно, советую использовать что-то вроде:

import pprint
t = tuple(dict1.items())
pprint.pprint(t)

t — это преобразованный в кортеж словарь. С помощью функции
pprint вы можете красиво и построчно его распечатать. Если нужно без скобок — без
for или спискового включения вряд ли можно это сделать.
Если вы хотите присвоить переменным
key и
val все ключи и значения соответственно, воспользуйтесь методами
keys() и
values():

key, val = list(dict1.keys()), list(dict1.values())

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

key = [i[0] for i in dict1.items()]