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

res = pd.DataFrame() # результирующий датафрейм

for i, g in df.groupby(["brand", "article"]):
    if True in g["own"].values:
        r = g.loc[g["own"] == True].loc[(g["code"] == "МЦС") | (g["stock"] == g["stock"].max())]
        res = pd.concat([res, r]) #добавляем результат группы в итоговый фрейм
    # добавляем другие условия отбора
print(res)

    article  brand               name                          warehouse_id code   own              shipment_date   price  stock  total_stock
205   21001  AUGER  Энергоаккумулятор  23F7657D-FA9D-11E7-812E-0050568E1762  МЦС  True  2023-07-07T17:30:00+03:00  4134.0    2.0           33
221   21004  AUGER   Тормозная камера  23F7657D-FA9D-11E7-812E-0050568E1762  МЦС  True  2023-07-07T17:30:00+03:00  1765.0   11.0           22
227   21006  AUGER   Тормозная камера  23F7657D-FA9D-11E7-812E-0050568E1762  МЦС  True  2023-07-07T17:30:00+03:00  1786.4    2.0           24


Ошибка TypeError: 'list' object is not callable python
<code>
import telebot

bot = telebot.TeleBot('')

@bot.message_handlers(command=['start'])
def main(message):
    bot.send_message(message.chat.id, 'саламалейкум')
</code>

У меня была похожая ошибка, когда я начинал.
Дело в том, что вы перепутали bot.message_handler с bot.message_handlerS.
А еще вы задали неверный аргумент для декоратора command, а надо commands.
Будьте внимательны)
Рабочий код:
<code>
import telebot

bot = telebot.TeleBot('<Ваш токен>')

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.from_user.id, text='Привет')

bot.polling()
</code>


Можно ли зачеркнуть текст в коде pycharm?
Мне нужно зачеркнуть текст в коде в pycharm, подскажите пожалуйста может кто нибудь знает.

Зачеркнуть текст в PyCharm без каких-либо дополнений невозможно. Единственный подходящий для вас ответ это -- в intellij Idea перечеркнут метод


Выполнение бесконечного цикла без прерывания дальнейшего кода
<code>
import tkinter as tk
from tkinter import messagebox
import pyowm.commons.exceptions
from pyowm import OWM
from pyowm.utils.config import get_default_config
import psutil

config_dict = get_default_config()
config_dict['language'] = 'ru'
owm = OWM('3e8f1734c31354d3ae9df9282e1ba7fa')

root = tk.Tk()
root.title('Lenovo Live')
root.resizable(width=False, height=False)

# Создали canvas под размер окна
canvas = tk.Canvas(root, width=350, height=200, borderwidth=0)
# Заранее заготовили изображение
image = tk.PhotoImage(file='bg.png')
canvas.grid(column=0, row=0)

def build():
    # Очищаем на случай, если на холсте уже что то есть
    canvas.delete('all')
    canvas.create_image((-250, 0), anchor=tk.NW, image=image)  # Фон

    mgr = owm.weather_manager()
    try:
        observation = mgr.weather_at_place('Saint Petersburg, RU')
        w = observation.weather
        wind = w.wind()['speed']
        temperature = w.temperature('celsius')['temp']
        temperature_reformat = round(temperature, 1)

        # Добавление текста
        canvas.create_text(170, 20, font='Intro 15', fill='white',
                           text=f'Температура: {temperature_reformat} °С')
        canvas.create_text(170, 50, font='Intro 11', fill='white',
                           text=f'    Погода: {str.capitalize(w.detailed_status)}')
        canvas.create_text(180, 80, font='Intro 13', fill='white', text=f'Ветер: {wind} м/с')
        canvas.create_text(180, 110, font='Intro 12', fill='white',
                           text=f'Заряд батареи: {psutil.sensors_battery().percent}%')
        # canvas.create_text(180, 140, font='Intro 12', fill='white', text=f'Источник питания: {power}')
        # except на случай, если нет Интернета
    except pyowm.commons.exceptions.InvalidSSLCertificateError:
        tk.messagebox.showerror(title='Ошибка', message='Отсутствует подключение к Интернету, \n'
                                                       '        данные о погоде недоступны!')
        canvas.create_text(170, 20, font='Intro 15', fill='white',
                           text='Температура: ??? °С')
        canvas.create_text(170, 50, font='Intro 11', fill='white',
                           text='    Погода: ???')
        canvas.create_text(180, 80, font='Intro 13', fill='white', text='Ветер: ??? м/с')
        canvas.create_text(180, 110, font='Intro 12', fill='white',
                           text=f'Заряд батареи: {psutil.sensors_battery().percent}%')

build()
root.mainloop()
</code>
Мне нужно, чтобы программа постоянно смотрела, подключен ли АС источник питания, независимо от потока общего кода. Бесконечный цикл while True обрывает всю дальнейшую писанину, и программа не запускается (л-логика)

Самый простой вариант, это вызывать функцию внутри цикла

def check():
   pass

while True:
  check() #вызываем в начале, а не в конце тк могут быть continue
  ... #other code

но в графической оболочке лучше использовать таймеры

#tk
import tkinter
def check():
  pass

t=tkinter.Tk()
t.after(1000,check)#милисекунды, функция ; можно несколько
... #code
t.mainloop()

так же можно исспользовать модули multiprocessing theading

import multiprocessing
def td():
    while:
      pass
m=multiprocessing.Process(target=td)
m.start()
...
#обмен переменными
pout,pin=multiprocessing.Pipe()
pout.send('data')
var=pin.recv()

or

import threading
def td():
    while:
      pass
t=threading.Thread(target=td)
t.start()

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


как сделать ответы на сообщения в телеграмм боты в python aiogram
Мне нужно сделать так чтобы телеграмм бот на python aiogram отвечал на мои сообщения через handler
то есть

@dp.message_handler()
async def answer(message : types.Message):
    if message.text == "Привет":
        await bot.send_message(message.from_user.id, "И тебе привет!!!")

я написал такой код и он работал, но когда я добавил еще один handler он уже не работал

@dp.message_handler() #это первый handler
async def answer(message : types.Message):
    if message.text == "Привет":
        await bot.send_message(message.from_user.id, "И тебе привет!!!")

@dp.message_handler()
async def answer(message : types.Message):
    if message.text == "Пока":
        await bot.send_message(message.from_user.id, "До завтра")

И вот первый handler работает, а второй нет, все сообщения попадают в первый handler, и на все сообщения бот отвечает "Привет", а на "Пока" он отвечает. Как это исправить?
я пробовал исправить смотря документацию, но ничего не работает

В хэндлере добавьте вот так:

@dp.message_handler(lambda msg: msg.text.lower() == 'привет')
async def answer(message: types.Message):
    await message.answer('и тебе привет')

@dp.message_handler(lambda msg: msg.text.lower() == 'пока')
async def answer(message: types.Message):
    await message.answer('и тебе пока')

@dp.message_handler()
async def answer(message: types.Message):
    await message.answer('...')

таким образом первые 2 хэндлера будут ловить
привет и
пока, а третий все то, что не отловилось первыми двумя


Как получить владельца чата через Telethon?
Возможно ли узнать
id владельца чата через Telethon?

from telethon.tl.types import ChannelParticipantsAdmins
from telethon.tl.types import ChannelParticipantCreator
import typing

async def get_owner_id(
    chat_id: int  # id чата, в котором нужно получить владельца
) -> typing.Union[int, bool]:
    owner_id = False

    async for user in client.iter_participants(
        chat_id, filter=ChannelParticipantsAdmins
    ):
        if isinstance(getattr(user, 'participant', None),
                      ChannelParticipantCreator
        ):
            return user.participant.user_id

    return owner_id


Как отображать динамические данные в табличном виде?
Скрипт в цикле обрабатывает много файлов. Сейчас вывожу информацию о статусе построчно, отображаю много параметров. Хочу перейти на вывод только одного параметра для каждого файла : ОК и !ОК, при этом ограничить строку скажем на 20 значений. Следующие 20 значений отображать в новой строке. Но так как длина ОК и !ОК разная, то на экране не слишком красиво выходит. Пробовал Tabulate, но там вроде как только статика, т.е. сразу нужно написать в команду 20 значений, а хочется видеть постепенное появление ОК. "ОК" я взял для примера, скорее всего будут отображаться номера файлов, а они разной длины. Приводить к одной длине типа 0001,2001 пока не хочется. Какие есть варианты отображения значений в строку с фиксированным размером "ячейки" ?

Определяете максимальный размер данных после используете
center - для выравнивания по центру
ljust - выравнивания по правому краю или
rjust - выравнивания по левому краю:

import random
import time

data = [(i, random.random() < 0.5) for i in range(1000)]

num_length = 5
data_length = len('!OK') + 1

for i in range(0, len(data), 20):
    for j in range(i, i + 20):
        time.sleep(0.05)
        row = (f"{str(data[j][0]).center(num_length)}"
               f"{(['OK', '!OK'][data[j][1]]).center(data_length)}|")
        print(row, end='')
    print()

Для того чтобы выводить во время работы, вы можете использовать
curses (В pycharm нужно включить эмуляцию терминала):

import random
import time
import curses

def print_at(x_, y_, string):
    stdscr.addstr(y_, x_, string)
    stdscr.refresh()

stdscr = curses.initscr()

data = [(i, random.random() < 0.5) for i in range(50)]

num_length = 5
data_length = len('!OK') + 1
summary_length = (num_length + data_length + 1)

in_line = stdscr.getmaxyx()[1] // summary_length - 1
# Т.к. после перехода в обычный режим
# консоль очищается мы должны сохранить таблицу
result = ''

for i in range(0, len(data), in_line):
    for j in range(i, i + in_line):
        if j >= len(data):
            break
        x, y = (j - i) * summary_length, i // in_line + 1
        print_at(x, y, "Working...".center(summary_length))
        time.sleep(0.25)
        row = (f"{str(data[j][0]).center(num_length)}"
               f"{(['OK', '!OK'][data[j][1]]).center(data_length)}|")
        result += row
        print_at(x, y, row)
    result += '\n'

curses.endwin()

print(result)
# Продолжение кода


Фикс пути установки python3.10 в Ubuntu23.04
Пробовал поставить python3.10 на ubuntu23.04 с помощью этого мануала, но установился он не в /usr/bin/python3.10, а в /usr/local/bin/python3.10. Из-за этого система не видит второй поставленный python3.10 (родная версия - 3.11).
Как удалить установку из некорректной директории и поставить его корректно в нужную дирректорию?

Решил проблему путем прописывания /usr/local/bin в PATH (даже при условии, что такой путь там уже числился). Плюс повторно добавил альтернативу для системного питона.


Прерывание работы метода класса в Python
Имеется вопрос по Python. Тема Классы, вывод десятичного счетчика, который может увеличивать или уменьшать свое значение на единицу в заданном диапазоне.
В качестве примера привожу код. В нем, достигнув максимального значения диапазона, если продолжать вызывать my_count.increase() будет каждый раз выводиться 'Out of range'. Возможно ли  сократить вывод строки до одного раза, несмотря на последующие вызовы метода? Заранее благодарен.
<code>
class Counter:
    current=0
    def __init__(self, start=None, end=None):
        self.start = start
        self.end = end

    def increase(self):
        if self.current < self.end:
            self.current += 1
            return self.current
        else:
            return 'Out of range'

my_count=Counter(start=0, end=3)
print(my_count.increase())  # --> 1
print(my_count.increase())  # --> 2
print(my_count.increase())  # --> 3
print(my_count.increase())  # --> 'Out of range'
print(my_count.increase())  # --> 'Out of range'
print(my_count.increase())  # --> 'Out of range'
</code>

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

def increase(self):
    if self.current < self.end:
        self.current += 1
        return self.current
    else:
        raise IndexError('list index out of range')

Результат:

1
2
3
Traceback (most recent call last):
  File "/home/****/Documents/Develop/Local/PycharmProjects/pythonProject12/main.py", line 20, in <module>
    print(my_count.increase())  # --> 'Out of range'
          ^^^^^^^^^^^^^^^^^^^
  File "/home/****/Documents/Develop/Local/PycharmProjects/pythonProject12/main.py", line 13, in increase
    raise IndexError('list index out of range')
IndexError: list index out of range


Срабатывает одно условие Python и не выводит else
при входных данных 10, 20, -100, -50 должно вывести пустое множество, но по каким то причинам в консоли получаю код 0, не могу понять в чем дело
<code>
a1 = int(input())
b1 = int(input())
a2 = int(input())
b2 = int(input())

if (a1 < (b2 and a2)):
    if (b1 > (a2 and b2)):
        print(a2, b2)
    if (a2 < b1) and (b1 == b2):
        print(a2,b2)
    if (a1==a2 and b1==b2):
        print(a2, b2)

elif (a2 == a1):
    if (b2 > (b1 and a1)):
        print(a1, b1)
elif (b1 == b2):
    if (a2 < (a1 and b1)):
        print(a1, b1)
elif (a2 < a1 > b1 and b2):
    if (a2 and a1 < b1 < b2):
        print(a1, b1)

elif ((a1 and a2) < b1 < b2):
    if a1 < a2 > (b1 and b2):
        print(a2, b1)
elif (a2 and a1) < b2 < b1:
    if a2 < a1 < (b2 and b1):
        print(a1, b2)
elif (a2 > a1) and (b2 > b1):
    if (b1==a2):
        print(a2)
elif (a1 > a2 ) and (b1 > b2):
    if (a1==b2):
        print(a1)
else:
    print('пустое множество')

</code>

Очень странные условия...
Вот это к, примеру.

if (a1 < (b2 and a2))

Есть подозрение, что закладывалась логика если a1 меньше b2 и меньше a2
Но на самом деле оно работает не так.
Здесь получается что сначала выполняется операция в скобках. Но по сути a and b в результате возвращает a.
Если нужно условие если a1 меньше b2 и меньше a2, то надо писать

if (a1 < b2 and a1 < a2)


Права администратора для приложения
мне нужно чтобы при запуске программы запрашивались права администратора у пользователя. Как это сделать?Приложение написано на Python и скомпилировано в exe

Для этого в вашу сборку необходимо добавить файл манифеста с прописанными параметрами для UAC. Манифест - это обычный xml файл, который определяет требования и привилегии приложения.
Это может выглядеть так:
<code>
<?xml version="1.0" encoding="utf-8" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>
</code>


Рандомизация файлов, но с сохранением изначальных имен и расположений
Помогите пожалуйста, я хочу написать программу, которая будет случайно перемешивать файлы в директории, но с сохранением изначальных имен файлов.
Моя задача - перемешать все звуки в игре. У меня есть папка со всеми звуками, но они так-же расположены в разных папках. Каким образом мне перемешать их, при этом сохранив структуру.
Как мне собственно подойти ко всему этому?

Отсортировывать файлы в самой дирректории нет никакого смысла, это всего лишь визуальное представление, зависящее от конкретной системы.
Ваша игра использует путь к файлу и он не зависит от сортировки в папке, поэтому :

Для получения всех файлов/папок в директории в python можно использовать
os.listdir(), при этом какой-либо порядок файлов не гарантирован и может быть абсолютно произвольным и также зависит от системы. Вы можете получить список файлов в директории, например так:

files = []
for filename in os.listdir(folder_path):
    file_path = os.path.join(folder_path, filename)
    if os.path.isfile(file_path):
        files.append(file_path)

Затем с помощью метода
shuffle() из библиотеки
random перемешать случайным образом пути к файлам в списке затем уже использовать их.

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

file_list = os.listdir(folder_path) # Список путей к файлам в указанной папке

new_file_list = random.shuffle(file_list) # Перемешанный список с путями

for i, file_path in enumerate(file_list):
    new_file_path = os.path.join(folder_path, os.path.basename(new_file_list[i])) # Объединяем путь к папке и полученное имя файла, имя берем из перемешанного списка
    os.rename(os.path.join(folder_path, file_path), new_file_path) # Переименовываем файл


Почему функция Python не возвращает ожидаемое представление колонки Pandas?
Рассчитываю функцию поиска корня в уравнении
dichotomy() способом дихотомии и затем вывожу значения с помощью декоратора
print_dichotomy(). Полагаю, что в итоге увижу колонки корень - значение функции в корне - погрешность - сходимость. Однако на деле получаю так, что из столбцов ожидаемо выводятся лишь корень и значение функции, а две другие колонки некорректны. В них погрешность представлена лишь одним значением (остальные строки
NaN), а сходимость - все ее значения оказались в одной строке.
Я не стал расписывать суть функции
dichotomy(), поместив в нее списки псевдозначений для колонок Pandas.
В чем ошибка?
Мой код:

import numpy as np
import pandas as pd

def print_dichotomy(funcs):
    def wrapper(a, b, eps_func, eps_arg):
        *res, func, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg))
        func = list(map(lambda x: f'{f(x):.10f}', res))
        result_table = pd.DataFrame()
        result_table['Корни'] = pd.Series(res)
        result_table['Значения функции'] = pd.Series(func)
        result_table['Погрешность расчета'] = pd.Series(eps_list)
        result_table['Сходимость'] = pd.Series(prev_roots)
        print(result_table)
    return wrapper

def f(x):
    return 1.2 - np.log(x) - 4 * np.cos(2 * x)

@print_dichotomy
def dichotomy(a, b, eps_func, eps_arg):

    # 1. создаем переменную-список для хранения значений корня
    prev_roots = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
    # 2. создадим список для хранения погрешностей расчета
    eps_list = [0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
    # 3. создадим список для хранения корней
    roots = [0.03, 0.03, 0.03, 0.03, 0.03, 0.03]
    for i in roots:
        root = i
        # 4. возвращаем корень
        if root:
            yield root

    # 5. возвращаем значение погрешности расчета корня, сходимости
    yield eps_list, prev_roots

dichotomy(0.0001, 50, 0.000001, 0.000001)

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

Из
dichotomy() вы возвращали
yield eps_list, prev_roots, что эквивалентно
yield (eps_list, prev_roots), т.е. кортежу из двух списков. Эти списки вы потом и увидели в виде значений во фрейме. И, поскольку эти списки не "распаковались" в ячейки фрейма, то остальные значения стали NaN.
Во
wrapper() в выражении
*res, func, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg)) вы принимаете значения, возвращаемые функцией - генератором
dichotomy(), в переменные. Начиная с конца:

в
prev_roots передается вышеупомянутый кортеж
(eps_list, prev_roots) и заполняет 2 первые строки колонки "Сходимость" (ниже данных нет, поэтому NaN);
в
eps_listзаходит последнее (шестое) значение из списка
roots - 0.03, оно же и становится значением первой строки столбца
Погрешность расчета;
в
func заходит предпоследнее (пятое) значение из списка
roots - 0.03, но далее нигде не используется (пропадает);
оставшиеся 4 первых значения из списка
roots передаются в переменную
res и отображаются в четырех строках столбца
Корни.

Таким образом, результатом является фрейм, состоящий из 4, а не из 6, как ожидалось, строк, и данные в нем расположены неправильно.
Не углубляясь в причины выбранного подхода и не устраняя избыточность кода (например, преобразования
list(),
pd.Series()), минимально скорректировал код, чтобы выдавалось (надеюсь) желаемое:

def print_dichotomy(funcs):
    def wrapper(a, b, eps_func, eps_arg):
        *res, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg))
        func = list(map(lambda x: f'{f(x):.10f}', res))
        result_table = pd.DataFrame()
        result_table['Корни'] = pd.Series(res)
        result_table['Значения функции'] = pd.Series(func)
        result_table['Погрешность расчета'] = pd.Series(eps_list)
        result_table['Сходимость'] = pd.Series(prev_roots)
        print(result_table)

    return wrapper

def f(x):
    return 1.2 - np.log(x) - 4 * np.cos(2 * x)

@print_dichotomy
def dichotomy(a, b, eps_func, eps_arg):
    # 1. создаем переменную-список для хранения значений корня
    prev_roots = [0.011, 0.012, 0.013, 0.014, 0.015, 0.016]
    # 2. создадим список для хранения погрешностей расчета
    eps_list = [0.021, 0.022, 0.023, 0.024, 0.025, 0.026]
    # 3. создадим список для хранения корней
    roots = [0.03, 0.03, 0.03, 0.03, 0.03, 0.03]
    for i in roots:
        root = i
        # 4. возвращаем корень
        if root:
            yield i

    # 5. возвращаем значение погрешности расчета корня, сходимости
    yield eps_list
    yield prev_roots

dichotomy(0.0001, 50, 0.000001, 0.000001)

Вывод:

   Корни Значения функции  Погрешность расчета  Сходимость
0   0.03     0.7137557376                0.021       0.011
1   0.03     0.7137557376                0.022       0.012
2   0.03     0.7137557376                0.023       0.013
3   0.03     0.7137557376                0.024       0.014
4   0.03     0.7137557376                0.025       0.015
5   0.03     0.7137557376                0.026       0.016

Что поменял:

из
*res, func, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg)) убрал
func, чтобы не отъедалась последняя строка результата;

yield eps_list, prev_roots разбил на 2 строки, иначе возвращался кортеж в одну переменную, а надо два списка в две;
разнообразил тестовые значения
prev_roots и
eps_list для наглядности.


Как обойти ошибку получив None вместо результата "NameError: name '*' is not defined?"
На Python 3.10 пытаюсь передать значения, если они есть, но получаю ошибку
is not defined для не вызванных переменных:

def my_func_1():
   if a == True:
      b = 2
   else:
      c = 3

   my_func_2(param_a=a, param_b=b, param_c=c)

my_func_1()

на выходе ожидаю в функции my_func_2() похожие вариации вхождения:

param_a=True, param_b=2, param_c=None
param_a=False, param_b=None, param_c=3

Каким образом можно сделать заглушку, что бы если переменная не назначалась подставлять None?

Можно сделать так:

def my_func_1():
   b = None
   c = None

   if a == True:
      b = 2
   else:
      c = 3

   my_func_2(param_a=a, param_b=b, param_c=c)

my_func_1()

Или вообще так:

b = None
c = None

def my_func_1():
   global b
   global c
   if a == True:
      b = 2
   else:
      c = 3

   my_func_2(param_a=a, param_b=b, param_c=c)

my_func_1()

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


Хочу чтобы бот ответил на сообщение
я только учусь и я думаю что вопрос максимально простой,но я залез на кучу сайтов и если просто говоря не могу найти решение
использую telebot
кароч команда /truefalse
далее бот реагирует на команду,отправляет сообщение "введите вопрос"
тут я хочу чтобы пользователь мог вписать что угодно(мне не обязателен определенный вопрос)
после бот отправляет из списка рандомный ответ
<code>
@bot.message_handler(commands=['truefalse'])
def truefalse(message):
    bot.send_message(message.chat.id,'Ваш вопрос?')
# вот тут как я понимаю бот должен принимать сообщение
    bot.send_message(message.chat.id, random.choice(bingo))

bingo = ['Правда','ПиздGGGж','Отвечаю','Владосу осталось три дня']
</code>
не знаю как я искал но у меня либо бот ломался либо сразу отправлял и "введите вопрос" и ответ рандом

используйте:
<code>
import random
bingo = ['Правда','ПиздGGGж','Отвечаю','Владосу осталось три дня']

@bot.message_handler(commands=['truefalse'])
def truefalse(message):
    msg = bot.send_message(message.chat.id,'Введите свой вопрос')
    bot.register_next_step_handler(msg,test)

def test(message):
    bot.send_message(message.chat.id,f'{random.choice(bingo)}')
</code>
bot.register_next_step_handler() для ожидания ответа от пользователя и перехода к хенделеру test после ответ
Библиотека random для случайного выбора из списка методом choice()


Удаление строк из датафрейма, если значение встречается меньше или больше, чем N раз
Как удалить строки из df, если значение встречается меньше 3 или больше 3 раз в колонке match_id

match_id
player
win

111
1
0

111
2
0

111
3
0

112
1
1

112
2
1

113
1
0

113
2
0

113
3
0

113
4
0

113
5
0

113
6
0

Должно остаться только:

match_id
player
win

111
1
0

111
2
0

111
3
0

помогите, пожалуйста

Группируем по
match_id, считаем каждую группу через
transform('count'), делаем булев массив c
.eq(3) и отбираем нужные строки через
df[булев массив]

df = df[df.match_id.groupby(df.match_id).transform('count').eq(3)]

   match_id  player  win
0       111       1    0
1       111       2    0
2       111       3    0


Проблема с конструкцией if-elif-else
<code>
age = int(input("Сколько лет: "))
if age < 2:
    msg = 'Младенец'
elif age >= 2 < 4:
    msg = 'Малыш'
elif age >= 4 < 13:
    msg = 'Ребёнок'
elif age >= 13 < 20:
    msg = 'Подросток'
elif age >= 20 < 60:
    msg = 'Взрослый'
elif age >= 60:
    msg = 'Пожилой человек'
else:
    print('None')
print(f'Тебе {age} лет и ты у нас {msg}!')
</code>
Решаю задачу по Python и не могу понять почему при указании возраста ответ постоянно с первого elif ,берется при любой цифре за исключением if если указать число < 2

Потому что ваши
elif на самом деле выглядят так:

(age >= 2) < 4

а
age >= 2 это либо
1 либо
0 -> это всегда
<4.
Вот так работать будет:

elif 2 <= age < 4:

или вот так:

elif age >= 2 and age < 4:


Предобработка данных из базы данных, перед их выводом в HTML шаблон Django
Всем привет!

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

Окей, написать функцию, которая это все обработает - легко, но каким образом это дело передать в
context? Просто изначально я туда передаю все записи нужной мне таблицы:

records = IpcArchive.objects.all()
context = {
    "all_records": records,
}

Далее, уже в самом шаблоне, я через
for бегу по
all_records и вывожу нужные мне поля, но я не представляю, куда мне вставить обработчик для дат.

Подскажите, пожалуйста, как можно решить данную проблему... Есть идея, чтобы сразу через view рендерить HTML шаблон, но не будет ли это костыльно?

Во-первых, как указал @rpe4ka722, в
settings есть настройка
DATE_FORMAT (и ее
datetime-товарищ
DATETIME_FORMAT, которая задает формат дат во всей системе.
Синтаксис указан в документации.
Во-вторых, в самих шаблонах при использовании переменных вам доступны уже встроенные фильтры. Для вашего случая нам нужен фильтр date. (да, это та же страничка, что и выше. Встроенные фильтры умеют очень многое, советую пробежаться по ним, чтобы иметь примерное представление).
Таким образом, в нашем шаблоне это может выглядеть так:

{% for item in all_records %}
    {{item.somedate|date:"%d-%m-%Y"}}
{% endfor %}

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

records = IpcArchive.objects.all()
modified_records = []
for rec in records:
    new_record = ... # тут мы что-то считаем или преобразуем и т.д.
    modified_records.append(new_record)
context = {
    "all_records": modified_records,
}

Еще один доступный путь - через аннотации и агрегацию, но это скорее о преобразовании query, чем о том, что вам нужно.
Как видите, доступных способов много, можно выбирать то, что больше подходит и удобно вам.


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

class Test:
    def return_b(self) -> int:
        b = 5
        return b

    def a_plus_b(self, a, b=return_b) -> None:
        print(a + b)

В данном случае, в метод
a_plus_b в переменную
b передается адрес в памяти как значение по-умолчанию, соответственно, код в таком виде не работает. Вижу два варианта разрешения ситуации: первый - переписать функцию, явно задав значение
b:

def a_plus_b (self, a, b=return_b) -> None:
    b = self.return_b()
    print (a+b)

Второй вариант - работая непосредственно с объектом, передать значение функцией:

obj = Test()
obj.a_plus_b(3,obj.return_b())

Вопрос. Как возможно по-другому реализовать функцию
a_plus_b, чтобы она принимала аргумент по-умолчанию - как возвращенное значение функции
return_b?
Хотелось бы как-то так, но на второй self интерпретатор ругается:

def a_plus_b(self, a, b=self.return_b()) -> None:
    print(a + b)

P.S. только начал изучать ООП в Python, не кидайтесь тряпками =)
Большое спасибо!

Можно использовать "специальное значение" для неустановленных аргументов. В качестве такого значения, часто, используется None, но можно и другое значение, в зависимости от контекста задачи.
<code>
def a_plus_b (self, a, b = None) -> None:
    if b is None:
         b= self.return_b()
    print (a+b)
</code>


Как сделать окно активным? Python
У меня есть несколько (10-12) окон с одинаковым названием процесса.
Их айди я сохраняю в глобальный массив pid_list.
Далее мне нужно по очереди делать эти окна активными и выполнять там определенные задачи.
Как я могу сделать их активными через pid?
<code>
def main():
   for proc in psutil.process_iter():
        if proc.name() == MY_PROCESS_NAME:
            print(proc)
            pid = proc.pid
            pid_list.append(pid)
            activate_window_by_pid(pid)

def activate_window_by_pid(pid):
...
</code>

Для активации окна по его PID можно использовать библиотеку
win32gui и функцию
SetForegroundWindow. Вот пример кода:

import win32gui

def activate_window_by_pid(pid):
    try:
        hwnd = win32gui.FindWindow(None, None)  # Должно вернуть hwnd последнего активного окна
        while hwnd:
            cur_pid = win32gui.GetWindowThreadProcessId(hwnd)[1]
            if cur_pid in pid_list:
                win32gui.SetForegroundWindow(hwnd)
                break
            hwnd = win32gui.GetWindow(hwnd, win32con.GW_HWNDNEXT)
    except Exception as e:
        print("Ошибка:", e)

В этом примере мы используем функцию
FindWindow, чтобы найти hwnd последнего активного окна. Затем мы перебираем окна с помощью функции
GetWindow, начиная с этого hwnd, и проверяем, является ли PID окна из списка
pid_list. Если да, мы активируем его, вызывая функцию
SetForegroundWindow.
Убедитесь, что вы установили пакет
pywin32, чтобы использовать эту библиотеку. Вы можете установить его с помощью команды
pip install pywin32.


Определение максимальной суммы элементов при минимальной разнице сумм максимальных и минимальных подсписков
нужно выбрать подсписки при которых разница между
суммой максимальных и минимальных будет минимальна
например для такой пары подойдут оба:

[
[1, 3, 0],
[2, 1, 4]
]

max(1 + 2, 3 + 1, 0 + 4)−min(1 + 2, 3 + 1, 0 + 4) = 1
если бы мы взяли только одну, то вышло
max(1, 3, 0)−min(1, 3, 0) = 3, что не является минимальным, а значит не подходит
В данном примере

[
[0, 0, 5],
[0, 4, 0],
[0, 8, 0],
[2, 1, 0],
[3, 0, 0]
]

мы берем 1, 2, 4, 5 строки
max(0+0+2+3, 0+4+1+0, 5+0+0+0) − min(0+0+2+3, 0+4+1+0, 5+0+0+0) == 0 - является минимальным числом
в случае если есть несколько таких ситуаций, то нужно выбрать где сумма всех элементов будет больше
Конечно, условие возможно будет немного непонятным, но я попытался максимально расписать.

Теория
Задача решается полным перебором всех комбинаций. Быстрее нельзя, и вот почему:
Заменим задачу на более простую: для данного набора списков требуется ответить есть ли комбинация с нулевой разницей или её нет. Ясно что если вы умеете решать общую задачу (про поиск минимальной разницы), то и эту решите без труда.
Рассмотрим списки из двух элементов. Например:

[0, 5]
[4, 0]
[8, 0]
[1, 0]

Заметим что если ко всем элементам конкретного списка прибавить одно и то же число, ответ останется прежним. Добавим к каждому списку такое число, чтобы первый элемент стал нулем:

[0,  5]
[0, -4]
[0, -8]
[0, -1]

Комбинация с нулевой разницей тогда возможна только если есть комбинация вторых чисел списков, которая даёт нулевую сумму. Можно среди этих чисел отыскать  непустую комбинацию с нулевой суммой?

5, -4, -8, -1

Это задача о сумме подмножеств:

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

Она NP-полная. То есть, она решается только полным перебором вариантов.
Раскручиваем цепочку назад. Если бы для исходной задачи существовало бы быстрое решение, то и задача проверки нулевой разницы для списков из двух элементов решалась бы быстро. Тогда и задача о сумме подмножеств решалась бы быстро. А это, скорее всего, невозможно - NP-полнота.
Ещё раз, коротко: задача может быть решена только полным перебором всех комбинаций.
Практика
Перебор написать не сложно:

def cost(s):
    return max(s) - min(s), -sum(s)

def search(a):
    m = len(a)
    n = len(a[0])
    s = [0] * n

    best_s = a[0]
    best_c = cost(a[0])

    def rec(i, empty):
        nonlocal best_s
        nonlocal best_c
        if i == m:
            if not empty:
                c = cost(s)
                if c < best_c:
                    best_s = s[:]
                    best_c = c
        else:
            rec(i + 1, empty)
            for j in range(n):
                s[j] += a[i][j]
            rec(i + 1, False)
            for j in range(n):
                s[j] -= a[i][j]

    rec(0, True)
    return best_s

def main():
    s = search([
        [1, 3, 0],
        [2, 1, 4]
    ])
    print(s, cost(s))

    s = search([
        [0, 0, 5],
        [0, 4, 0],
        [0, 8, 0],
        [2, 1, 0],
        [3, 0, 0]
    ])
    print(s, cost(s))

main()

$ python temp.py
[3, 4, 4] (1, -11)
[5, 5, 5] (0, -15)


Как в python из словаря взять нужное мне значение?
API присылает мне это:
<code>
{'meta': {'last_updated_at': '2023-06-29T23:59:59Z'},
 'data': {'USD': {'code': 'USD', 'value': 1.086766}}}
</code>
Отсюда мне нужно взять значение value. Подскажите, как это сделать
я пробовал сделать через for, но у меня не получилось

Вообще несколько вариантов есть
<code>
# Способ 1
data = {'meta': {'last_updated_at': '2023-06-29T23:59:59Z'}, 'data': {'USD': {'code': 'USD', 'value': 1.086766}}}

value = data['data']['USD']['value']
print(value)

# Способ 2
data = {'meta': {'last_updated_at': '2023-06-29T23:59:59Z'}, 'data': {'USD': {'code': 'USD', 'value': 1.086766}}}

value = data.get('data', {}).get('USD', {}).get('value')
print(value)

# Способ 3
from jsonpath_ng import parse

data = {'meta': {'last_updated_at': '2023-06-29T23:59:59Z'}, 'data': {'USD': {'code': 'USD', 'value': 1.086766}}}

# Создаем шаблон jsonpath для значения 'value'
jsonpath_expr = parse("$.data.USD.value")

# Применяем шаблон к словарю и извлекаем значение
match = jsonpath_expr.find(data)
value = match[0].value if match else None

print(value)
</code>


Угадай число, программа учитывает не все варианты
проблема в коде по следующей задаче:

Август и Беатриса играют в игру. Август загадал натуральное число от 1 до n.
Беатриса пытается угадать это число, для этого она называет
некоторые множества натуральных чисел. Август отвечает Беатрисе YES, если среди
названных ей чисел есть задуманное или NO в противном случае.
После нескольких заданных вопросов Беатриса запуталась в том, какие вопросы она задавала и какие
ответы получила и просит вас помочь ей определить, какие числа мог задумать Август.

Входные данные
Первая строка входных данных содержит число n — наибольшее число, которое мог загадать Август.
Далее идут строки, содержащие вопросы Беатрисы. Каждая строка представляет собой набор чисел, разделённых
пробелами. После каждой строки с вопросом идет ответ Августа: YES или NO.

Наконец, последняя строка входных данных содержит одно слово HELP.

Выходные данные
Вы должны вывести (через пробел, в порядке возрастания) все числа, которые мог задумать Август.

Примеры
входные данные
10
1 2 3 4 5
YES
2 4 6 8 10
NO
HELP
выходные данные
1 3 5

Написала по ней код:

n=int(input())
mn=[]
a=[]
for i in range(1, n+1):
    mn.append(i)
mn=set(mn)
x=set()
q=""
while q!="HELP":
    q=input()
    if q=="HELP":
        break
    else:
        a.append(q)
for i in range(0, len(a)-1, 2):
    if a[i+1]=="YES":
        q=[]
        w=a[i]
        for j in range(len(w)):
            if w[j]!=" ":
                q.append(int(w[j]))
        #

        cu=list(mn)
        for k in range(len(cu)):
            if cu[k] not in q:
                mn.discard(cu[k])
    else:
        q=[]
        w=a[i]
        for j in range(len(w)):
            if w[j]!=" ":
                q.append(int(w[j]))
        #

        for k in range(len(q)):
            if q[k] in mn:
                mn.discard(q[k])

print(*sorted(mn))

Но в приведённом в задаче тесте программа вместо 1 3 5 выводит 3 5, к тому же на 2 последних тестах проверяющей системы(не известны) работает лишком долго. Помогите пожалуйста!!!

В вашем коде есть две пробемы:

Этот код обрабатывает только числа из единственных цифр. Если Беатриса загадает 10, вы учтёте единицу и ноль по отдельности. По этой причине в вашем решении не хватает единицы в ответе:

        for j in range(len(w)):
            if w[j]!=" ":
                q.append(int(w[j]))

В начале программы вы пытаетесь составить множество всех чисел. Строить его долго, оно может не поместиться в память. Я не знаю реальна ли эта проблема, зависит от ограничений на n.

Если предположить что n не велико, можно обойтись прямолинейным решением. Формируем множество всех кандидатов
candidates, если ответ положительный, то ограничиваем его множеством подходящих чисел (
candidates &= s), если отрицательный - удаляем неподходящие числа (
candidates -= s):

n = int(input())
candidates = set(range(1, n + 1))

while True:
    line = input()
    if line == 'HELP':
        break
    s = set(map(int, line.split()))
    reply = input()
    if reply == 'YES':
        candidates &= s
    else:
        candidates -= s

for i in sorted(candidates):
    print(i)

Если n может быть очень велико, создать первоначальное множество не получится. Тогда действуем так: до первого положительного ответа накапливаем множество отвергнутых чисел. После первого положительного ответа, действуем как в предыдущем варианте:

n = int(input())

yes = None
no = set()
while True:
    line = input()
    if line == 'HELP':
        break

    s = set(map(int, line.split()))
    reply = input()
    if reply == 'YES':
        if yes is None:
            yes = s
        else:
            yes &= s
    else:
        no |= s

    if yes is not None:
        yes -= no
        no = set()

if yes is None:
    for i in range(1, n + 1):
        if i not in no:
            print(i)
else:
    for i in sorted(yes):
        print(i)


При потоке новых значений находить разность между последующем и предыдущем значениями
Есть поток сообщений. Из каждого принятого сообщения я создаю словарь. Каждое сообщение проверяется на повторение ключа, если ключ повторяется, то в словарь я просто добавляю новое значение к этому же ключу. Таким образом словарь постоянно обновляется. Мне необходимо находить разность между последующем и предыдущем значением по каждому ключу отдельно во временном потоке. Вот часть изначального кода:
<code>
dict_ms = defaultdict(list)
        if key not in dict_msg :
            dict_msg[key] = [value]
        else:
            dict_msg[key].append(value)

</code>

Вот это нужно?
<code>
else:
    difference = value - dict_msg[key][-1]
    dict_msg[key].append(value)
</code>


Как подсчитать общий хэш для нескольких файлов?
Скрипт обрабатывает входные файлы, выделяет нужное и из него формирует "контент". Я сравниваю с сохраненным хэшем и если совпадает, то значит обработка не пострадала от изменений в ПО. Как быть если контент формируется в виде 2 файлов? Пока просто сортирую файлы ДО и склеиваю хеши ПОСЛЕ. Думаю что будет лучше просуммировать хэши 2 файлов. Подскажите варианты?

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

import hashlib

hash = hashlib.sha256()
files = sorted(["file1.txt", "file2.txt"])

for file_name in files:
    with open(file_name, "rb") as file:
        hash.update(file.read())

print(hash.hexdigest())

Экономный по памяти вариант:

import io
import hashlib

hash = hashlib.sha256()
files = sorted(["file1.txt", "file2.txt"])

for file_name in files:
    with open(file_name, "rb") as file:
        while block := file.read(io.DEFAULT_BUFFER_SIZE):
            hash.update(block)

print(hash.hexdigest())

В идеале в хэш еще нужно добавлять имена файлов, потому что теоретически может случиться ситуация, что файл A не пустой, а файл B пустой, в какой-то момент они меняются содержимым (A становится пустым, а B получает старое содержимое A), а хэш при этом не меняется.
Но вообще лучше конечно хранить список файлов с их хешами, не слепляя все в один хэш.


вроде как использовал кодировку 'utf-8', всё равно ничего не работает
<code>
import sys

def open_file(file_name, mode):
    """Открывает файл"""
    try:
        the_file = open(file_name, mode, encoding='utf-8')
        print('Исполняется')
    except IOError as e:
        print("Невозможно открыть файл", file_name, "Роабота программы будет завершена.\n", e)
        input("Нажмите Enter, чтобы выйти")
        sys.exit()
    else:
        print('Исполняется')
        return the_file

def next_line(the_file):
    """Возвращает в отформатированном формате очередную строку игрового файла"""
    line = the_file.readline()
    line = line.replace('/', "\n")
    return line

def next_block(the_file):
    """Вощвращает очредной блок данных из игрового файла"""
    category = next_line(the_file)
    question = next_line(the_file)
    answers = []
    for i in range(4):
        answers.append(next_line(the_file))
        correct = next_line(the_file)
        if correct:
            correct = correct[0]
            explanation = next_line(the_file)
    return category, question, answers, correct, explanation

def welcome(title):
    """Приветствует игорка и сообщает ему тему"""
    print('\t\tДобро пожаловать в игру викторина')
    print('\t\t', title, '\n')

def main():
    the_file = open("Текст викторины.txt", "r")
    title = next_line(the_file=the_file)
    welcome(title=title)
    score = 0
    category, question, answers, correct, explanation = next_block(the_file)

    while category:
        print(category)
        print(question)
        for i in range(4):
            print("\t", i + 1, answers[i])
        answer = input("Ваш ответ>>>")
        if answer == correct:
            print('\nДа!', end=' ')
            score += 1
        else:
            print('Нет', end=' ')
        print(explanation)
        print(score, '\n\n')
        category, question, answers, correct, explanation = next_block(the_file)

    the_file.close()
    print('Это был последнирй вопрос')
    print('На вашем счете', score)

main()
input("Нажмите Enter, чтобы выйти")
</code>

def open_file(file_name, mode):
    """Открывает файл"""
    try:
        the_file = open(file_name, mode, encoding='utf-8')

Тут mode - чего-то не хватает.

def main():
    the_file = open("Текст викторины.txt", "r")

Тут нет
encoding='utf8' по этому другая кодировка.
Дальше ничего не видно т.к. нет какого-то текста.


Pylance ругается на вызов Union аргумента функции
У меня есть следующий код как минимально воспроизводимый пример:

from typing import Any, Callable, Generic, Optional, TypeVar, Union
from random import choice

T1 = TypeVar("T1")

class qux(Generic[T1]):
    def foo(self) -> Callable[[T1], None]:
        def foo_wrapper(arg:T1):
            print(f'Foo wrapper called with argument {arg}')

        return foo_wrapper

    def bar(self) -> Callable[[], None]:
        def bar_wrapper():
            print('Bar wrapper called without arguments')

        return bar_wrapper

    def buzz(self, func:Union[Callable[[T1], Any], Callable[[], Any]], arg: Optional[T1] = None):
        if arg:
            func(arg)
        else:
            func()

    def choice_impl(self, flag:bool):
        if flag:
            return self.foo()
        else:
            return self.bar()

qux_instance = qux()
value = None
if choice((True, False)):
    value = 42

flag = value is not None

implementation = qux_instance.choice_impl(flag=flag)
if flag:
    qux_instance.buzz(func=implementation, arg=value)
else:
    qux_instance.buzz(func=implementation)

Pylance ругается на строку 21:

Expected 0 positional arguments  (parameter) arg: T1@qux

и 23:

Expected 1 more positional argument (parameter) func: ((T1@qux) -> Any) | (() -> Any)

потому что он не знает, какая сигнатура у аргумента
func функции
buzz будет на момент вызова. Хотя этот код всегда выполняется без ошибок. Как мне решить эту проблему? Это баг Pylance или это связанно с проблемой останова? Или это у меня руки кривые?

В данном случае можно использовать
cast из модуля
typing:

    def buzz(self, func:Union[Callable[[T1], Any], Callable[[], Any]], arg: Optional[T1] = None):
        if arg:
            cast(Callable[[T1], Any], func)(arg)
        else:
            cast(Callable[[], Any], func)()

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


Как реализовать перезапуск цикла, пока не будет получено одно из требуемых значений
<code>
nominal = input(int(тут надо ввести значение 2, либо 5, либо 25))
while nominal #не будет равняться 2 or 5 or 25:
   #предлагает снова ввести значение, пока не получит 2, 5, 25
</code>
Подскажите пожалуйста, как лучше это
реализовать, мои попытки привели либо к
ошибкам, либо к несрабатыванию (пропуску)
цикла
Я начинающий питонист, по этому пожалуйста,
обьясните проще

Можно так

nominal=0

while not any([nominal==5, nominal==15, nominal==25]):
    nominal=int(input('Введите новое значение:'))

Или так:

nominal=0
while not (nominal==5 or nominal==15 or nominal==25):
    nominal=int(input('Введите новое значение:'))

Ну или так

while True:
   nominal=int(input('Введите новое значение:'))
   if nominal==5 or nominal==15 or nominal==25:
       break


как выдавать роль за сообщение [закрыт]

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

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

Закрыт 4 месяца назад.

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

выдача роли '「🎲」Казино 777'   за сообщение 'pon'

ROLE_KASINO: discord.Role = ...

@bot.event
async def on_message(message):
    if message.content != 'pon':
        return
    await message.author.add_role(ROLE_KASINO)


Не могу запустить процессы concurrent.futures с асинхронной функции
Есть такой код:

import asyncio
from concurrent.futures import ProcessPoolExecutor

async def test1(text: str):
    for _ in range(2):
        await asyncio.sleep(1)
        print(text.upper())

async def test2(text: str):
    while True:
        await asyncio.sleep(1)
        print(text.lower())

async def test(text: str):
    while True:
        await asyncio.sleep(1)
        print(text.lower())

async def main():
    futures = []
    with ProcessPoolExecutor(max_workers=2) as executor:
        future1 = executor.submit(test1, "lored")
        future2 = executor.submit(test2, "hello")
        future3 = executor.submit(test, "nono")

        futures.extend([future1, future2, future3])

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

При запуске выдает 3 одинаковые ошибки:

RuntimeWarning: coroutine 'test' was never awaited
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

Помогите, пожалуйста

Экзекьюторы предназначены в первую очередь для запуска синхронного кода асинхронно (в отдельном потоке или процессе). Экзекьютор первым параметром должен принимать обычный callable объект, например, синхронную функцию, а вы передаете асинхронную.
Асинхронная функция при обычном вызове (без
await) возвращает не результат, а awaitable объект, но в дочернем процессе
await от этого объекта не вызывается, из-за этого фактически функция не запускается и выходит предупреждение, что она
was never awaited.
В целом, если убрать весь асинхронный синтаксис и заменить
await asyncio.sleep на
time.sleep, все заработает:

import time
from concurrent.futures import ProcessPoolExecutor

def test1(text: str):
    for _ in range(2):
        time.sleep(1)
        print(text.upper())

def test2(text: str):
    while True:
        time.sleep(1)
        print(text.lower())

def test(text: str):
    while True:
        time.sleep(1)
        print(text.lower())

def main():
    futures = []
    with ProcessPoolExecutor(max_workers=2) as executor:
        future1 = executor.submit(test1, "lored")
        future2 = executor.submit(test2, "hello")
        future3 = executor.submit(test, "nono")

        futures.extend([future1, future2, future3])

if __name__ == "__main__":
    main()

Вывод:

LORED
hello
LORED
hello
hello
nono
...

Чтобы работало в асинхронном
main с асинхронным синтаксисом, нужно использовать
loop.run_in_executor вместо
submit (тогда можно будет, например, принудительно дожидаться завершения задачи через
await future1). Но опять же, функции
test1,
test2,
test остаются синхронными.

import asyncio
from concurrent.futures import ProcessPoolExecutor
import time

def test1(text: str):
    for _ in range(2):
        time.sleep(1)
        print(text.upper())

def test2(text: str):
    while True:
        time.sleep(1)
        print(text.lower())

def test(text: str):
    while True:
        time.sleep(1)
        print(text.lower())

async def main():
    loop = asyncio.get_running_loop()
    futures = []
    with ProcessPoolExecutor(max_workers=2) as executor:
        future1 = loop.run_in_executor(executor, test1, "lored")
        future2 = loop.run_in_executor(executor, test2, "hello")
        future3 = loop.run_in_executor(executor, test, "nono")

        futures.extend([future1, future2, future3])

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

Чтобы запускать асинхронные функции из экзекьютора, их нужно запустить через
asyncio.run (точно так же, как вы запускаете
main из основного процесса). Можно написать общую запускающую синхронную функцию, и из нее уже вызвать асинхронные:

import asyncio
from concurrent.futures import ProcessPoolExecutor
import time

async def test1(text: str):
    for _ in range(2):
        await asyncio.sleep(1)
        print(text.upper())

async def test2(text: str):
    while True:
        await asyncio.sleep(1)
        print(text.lower())

async def test(text: str):
    while True:
        await asyncio.sleep(1)
        print(text.lower())

def wrapper(async_func, *args):
    asyncio.run(async_func(*args))

async def main():
    loop = asyncio.get_running_loop()
    futures = []
    with ProcessPoolExecutor(max_workers=2) as executor:
        future1 = loop.run_in_executor(executor, wrapper, test1, "lored")
        future2 = loop.run_in_executor(executor, wrapper, test2, "hello")
        future3 = loop.run_in_executor(executor, wrapper, test, "nono")

        futures.extend([future1, future2, future3])

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


Sounddevice, torch как сохранить озвученный текст?
Есть код для озвучивания текста. Как сохранить в .mp3?
<code>
import torch
import sounddevice as sd
import time

language = 'ru'
model_id = 'ru_v3'
sample_rate = 48000 # 48000
speaker = 'baya' # aidar, baya, kseniya, xenia, random
put_accent = True
put_yo = True
device = torch.device('cpu') # cpu или gpu
text = "Привет"

model, _ = torch.hub.load(repo_or_dir='snakers4/silero-models',
                          model='silero_tts',
                          language=language,
                          speaker=model_id)
model.to(device)

# воспроизводим
def va_speak(what: str):
    audio = model.apply_tts(text=what+"..",
                            speaker=speaker,
                            sample_rate=sample_rate,
                            put_accent=put_accent,
                            put_yo=put_yo)

    sd.play(audio, sample_rate * 1.05)
    time.sleep((len(audio) / sample_rate) + 0.5)
    sd.stop()

va_speak(text)
</code>

model.save_wav(text=example_text,
                             speaker=speaker,
                             sample_rate=sample_rate)


Как хранить правильно переносы \n в БД, чтобы python их воспринимал? [закрыт]

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

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

Закрыт 4 месяца назад.

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

При выборке предложений из БД, где используется
\n для переноса строки, \n воспринимается, как просто два символа.
Если же вписать \n в код вручную , как обычно, то работает исправно.
Пример:
В столбце Vote в таблице Ex в БД хранится:

\nВарианты ответа:\n**A.** Traveled\n**B.** Traveling\n**C.** Travel\n**D.** Travels

Выборка и вставка в переменные для вывода:

    cur.execute("""SELECT Vote FROM Ex""")
    mess = cur.fetchone()

    await ctx.send(f"{mess[2]}")

На выходе получаю:
\nВарианты ответа:\nA. Traveled\nB. Traveling\nC. Travel\nD. Travels
Вывожу сообщения в discord, но это к делу не имеет отношения.
Как хранить правильно переносы в БД, чтобы python их воспринимал?

Символы
\n хранятся как обычные символы, а не как управляющие символы, обозначающие перенос строки.
При выборке из БД,
\n воспринимаются просто как два символа, а не как перенос строки.
Проблему удалось решить с помощью функции replace().
Пример решения:

@bot.command()
async def test(ctx):

        cur.execute("""SELECT * FROM Ex""")

        f1 = cur.fetchall()
        f2= f1[0][2].replace(r"\n", "\n")

await ctx.send(f"Строка с переменной, где хранится текст с переносом строки {f2}"


Аналог `os.path.commonpath()` в `pathlib`
Я пытаюсь использовать библиотеку
pathlib вместо
os.path где это возможно.
Скажите, есть ли аналог функции
commonpath() в этой библиотеке? Я не нашёл. Если встроенной функции нет, я не буду писать код для этого, а просто использую
os.path.commonpath().

Похоже что нет, в таблице соответствия этой функций нет: Correspondence to tools in the os module.
Но в документации
os.path.commonpath указано, что она поддерживает path-like objects, т.е. в том числе объекты
Path из pathlib, поэтому если у вас везде в коде используется pathlib, конвертировать пути в строки перед передачей в
commonpath не нужно (правда возвращает путь в виде строки, результат нужно будет обернуть в
Path при необходимости).


Суммирование элементов словаря по значениям из списка
Имеется задача на поиск суммы из значений словаря по значениям из введенного списка. По условию задачи - вводится слово на английском или русском языках, каждой букве соответствует цифра.

можно ли преобразовать значения списка под формат число = все буквенные значения;
при суммировании по формуле в коде ниже выходит ошибка list indices must be integers or slices, not str - как суммировать данные?

Благодарю за помощь!
<code>
a=input("Введите слово:")
nums=list(a)
d={'A': 1,'E': 1,'I': 1,'O': 1,'U': 1,'L': 1,'N': 1,'S': 1,'T': 1,'R': 1,'D': 2,'G':2,'B':3,'C':3,'M':3,'P':3,
   'F':4,'H':4,'V':4,'W':4,'Y':4,'K':5,'J':6, 'X':6,'Q':7,'Z':7,'А':1,'В':1,'Е':1,'И':1,'Н':1,'О':1,'Р':1,'С':1,'Т':1,
   'Д':2, 'К':2, 'Л':2, 'М':2,'П':2, 'У':2, 'Б':3, 'Г':3, 'Ё':3, 'Ь':3, 'Я':3, 'Й':4, 'Ы':4, 'Ж':5, 'З':5, 'Х':5, 'Ц':5,
   'Ч':5, 'Ш':8, 'Э':8, 'Ю':8, 'Ф':10, 'Щ':10, 'Ъ':10}
total = sum(nums[x] for x in d)
print(total)
</code>

Такое впечатление, что у вас все с ног на голову перевернуто
<code>
total = sum(d[x] for x in a)
</code>


Старт файла после его перезаписи Python
Я создал программу которая обновляет файл, то-есть перезаписывает его и открывает но при запуске выполняется старая версия файла, при том если сделаю time.sleep на 10 сек перед выполнением файла, если посмотреть на него то все изменения уже есть, но выполняется старая версия.
Что делать ?
Код который изменяет файл
<code>
import requests
from bs4 import BeautifulSoup as BS
from test import version
import time

r = requests.get('секрет')
html = BS(r.content, 'html.parser')

for ver in html.select(".items > .version"):
  open("vers.txt", 'w').write(ver.text)
  if float(ver.text) != version:
    open('vers.txt', 'w').write(ver.text)
    for el in html.select(".items > .cod"):
      for trueor in html.select('.items > .yesorno'):
        if trueor.text == "no":
          for dop in html.select('.items > .dop'):
            a = open("test.py", 'r')
            b = a.read().replace(str(version), str(ver.text))
            b = b.replace("###", dop.text)
            print('no')
            with open('test.py', 'w') as f:
              f.write(b)
        if trueor.text == "yes":
          print('yes')
          with open('test.py', 'w') as f:
            f.write("version = " + ver.text + "\n\n" + el.text)
        if trueor.text != "no" and trueor.text != "yes":
          print("Ошибка обновления, напишите создателю.\nError: 'yes or no'")

time.sleep(1)
import test
test.gg()

</code>
Задачей было создать программу которая пере записывает файл а потом стартует его, то есть обновляет файл, берёт обновление с моего сайта.Тоесть я хотел делать программы которые мог обновлять через сайт, чтобы кому давал программы могли не каждый раз скачивать у меня новую версию, а могли просто открыть апдатер и обновить. Это всё. Я смог сделать только этот код.

Перезагрузить файл

from test import version
import test
import importlib

.....

importlib.reload(test)
version = test.version

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

import os,sys
print('Запуск')
if os.environ.get('NEEDUPDATE', 'YES') == 'YES':
    print('Код обновления')
    os.environ['NEEDUPDATE']='NO'
    os.execl(sys.executable, 'Имя проги в списке процессов' , *sys.argv)
print('Код программы')

Выведет

$ python3 execself.py
Запуск
Код обновления
Запуск
Код программы


как перебрать все файлы в папке и записать их имена в список?
Подскажите, с помощью какого модуля можно перебрать все файлы в папке и сохранить названия этих файлов в списке? Или же есть готовые скрипты под такую задачу? С помощью Python

Можно воспользоваться библиотекой
os:

import os
folder_path = 'путь_к_папке'
file_names = []
for file_name in os.listdir(folder_path):
    if os.path.isfile(os.path.join(folder_path, file_name)):
        file_names.append(file_name)
print(file_names)


Как получать среднее двух кадров с камеры OpenCV Python?
При получении изображения с камеры нам каждый раз отображается новый frame. Но, как каждый раз получать среднее изображение нового фрейма и предыдущего? Вариант с методом mean в numpy годится, но проблема в том, что я не могу все это запустить в бесконечном цикле. Прошу знающих внести дополнения в коде, чтобы выводились наложенные друг на друга 2 изображения в бесконечном цикле.
Учитывая комментарии людей, попробую объяснить более подробно. На первой итерации цикла while мы получаем frame1 и выводим его на экран. На второй итерации камера порождает нам frame2. Так вот на второй итерации нужно подвести frame1 для того, чтобы объединившись с frame2 прородился результат этой операции frame3, который уже выведется на экран. (Т.е. На первой итерации выводится на экран frame1, а на второй уже frame3)
Зачем это нужно? Конечно, для обычной вэбки это совершенно ни к чему. Но для научного оборудования такое полезно.
main.py
<code>
import cv2
import numpy as np

class Camera1():
    def __init__(self):
        super(Camera1, self).__init__()
        self.cap = cv2.VideoCapture(0)
        self.previousFrame = None

    def run(self):
        while(True):
            ret, frame = self.cap.read()
            if self.previousFrame is not None:
                meanFrame = [frame, self.previousFrame]
            else:
                self.previousFrame = frame
                meanFrame = [frame, self.previousFrame]
            composicion = np.mean(meanFrame, 0)
            cv2.imshow('Video', composicion)
            self.previousFrame = composicion
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        self.cap.release()
        cv2.destroyAllWindows()

if __name__ == '__main__':
    c = Camera1()
    c.run()
</code>

Вполне годное решение. Еще добавил стабилизацию. Операция сложения кадров никак не повлияла на производительность, что очень хорошо. Надеюсь, кому-то пригодится.
main.py
<code>
import cv2
from vidgear.gears import CamGear
import time

class Camera1():
    def __init__(self):
        super(Camera1, self).__init__()
        self.previousFrame = None

    def run(self):
        stream = CamGear(source=0).start()

        while(True):
            #start_time = time.time()
            frame = stream.read()
            if self.previousFrame is not None:
                composicion = cv2.addWeighted(frame, 0.5, self.previousFrame, 0.5, 0.0)
            else:
                self.previousFrame = frame
                composicion = cv2.addWeighted(frame, 0.5, self.previousFrame, 0.5, 0.0)
            cv2.imshow('Video', composicion)
            self.previousFrame = composicion
            #end_time = time.time()
            #print("Время выполнения: ", end_time - start_time)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        cv2.destroyAllWindows()

if __name__ == '__main__':
    c = Camera1()
    c.run()
</code>


Inline кнопки не отвечают на нажатия
Вот код

@dp.message_handler(state=Form.buy_or_more)
async def process_inline(message: types.Message):

    keyboard = InlineKeyboardMarkup()
    buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
    more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
    keyboard.add(buy_button)
    keyboard.add(more_button)

    await message.answer("Выберите действие:", reply_markup=keyboard)

@dp.callback_query_handler(lambda c: c.data == 'buy')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"
    await bot.send_message(callback_query.from_user.id, buy_ticket_text)
    await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")

    await Form.screen.set()

@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
    # Process the screenshot
    await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
                                                  "Электронный билет придет на почту в ближайшее время.")

    await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
                                                  "Самые интересные мы обсудим на нашей встрече.")
    await Form.next()

@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):
    # Process the questions
    await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для ####. "
                                                 "Ждем вас на нашей встрече!\n\nКоманда ######")
    await Form.buy_or_more.set()

@dp.callback_query_handler(lambda c: c.data == 'more')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    details_text = "Тема: 'Карьера'\n"
    await bot.send_message(callback_query.from_user.id, details_text)

Почему не работают inline кнопки?
Я думаю это как-то связано с состояниями.
У меня есть код который работает. В нем нету состояния у inline кнопок

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    keyboard = types.InlineKeyboardMarkup()
    buy_button = types.InlineKeyboardButton('Купить билет', callback_data='buy')
    more_button = types.InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
    keyboard.add(buy_button, more_button)

    await message.answer("Выберите действие:", reply_markup=keyboard)

@dp.callback_query_handler(lambda c: c.data == 'buy')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"
    await bot.send_message(callback_query.from_user.id, buy_ticket_text)
    await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")
    await Form.screen.set()

@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):

    await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
                                                  "Электронный билет придет на почту в ближайшее время.")

    await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
                                                  "Самые интересные мы обсудим на нашей встрече.")
    await Form.questions.set()

@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):

    await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для #####. "
                                                 "Ждем вас на нашей встрече!\n\nКоманда #####")
    await state.finish()

@dp.callback_query_handler(lambda c: c.data == 'more')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    details_text = "Тема: 'Карьера'\n"
    await bot.send_message(callback_query.from_user.id, details_text)

В предыдущем вашем вопросе я подсказал по поводу состояний, если брать тот кусок кода с клавиатурой

@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message):
    email = message.text
    if email.startswith("@"):
        keyboard = InlineKeyboardMarkup()
        buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
        more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
        keyboard.add(buy_button)
        keyboard.add(more_button)
        await message.answer("Выберите действие:", reply_markup=keyboard)
        # await Form.buy_or_more.set()  <- тут убираем явное назначение состояния
    else:
        await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")

убираем в нем явное назначение следующего состояния. И вместо этого для обработчиков кнопок указывайте
state='*' вот так

для кнопки 'Купить билет'

@dp.callback_query_handler(text='buy', state='*')
async def process_callback_buy(call: types.CallbackQuery):
    await bot.answer_callback_query(call.id)
    buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"  # Замените ссылкой на покупку билета
    await bot.send_message(call.from_user.id, buy_ticket_text)
    await bot.send_message(call.from_user.id, "Если вы купили, отправьте скриншот")
    await Form.screen.set() # <- регистрируем следующее состояние

@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
    # Process the screenshot
    await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
                                                 "Электронный билет придет на почту в ближайшее время.")

    await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
                                                 "Самые интересные мы обсудим на нашей встрече.")
    await Form.next()

для кнопки 'Подробнее о встрече 10 декабря'

@dp.callback_query_handler(text='more', state='*')
async def process_callback_buy(callback_query: types.CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(callback_query.id)

    details_text = "Тема: 'Карьера'\n"
    await bot.send_message(callback_query.from_user.id, details_text)

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


Чтение определенных строк в Python [дубликат]

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

Чтение с файла с определённой строки

                                (5 ответов)

Закрыт 5 месяцев назад.

Мне нужно  в файле x считать 5-9 строку, как это сделать?

<code>
rows = file.readlines()[5:10]
</code>
Если файл небольшой, то можно и так


Пользователь должен ввести email дважды, чтобы получить следующее сообщение от бота
Я пишу бота на aiogram, и у меня возникла проблема. Пользователь должен ввести номер дважды, чтобы получить следующее сообщение от бота. Вот пример:
Bot, [24.06.2023 20:54] Write email
Рамиль, [24.06.2023 20:54] @
Рамиль, [24.06.2023 20:54] @
Bot, [24.06.2023 20:54] Choose action:
Вот код

@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message, state: FSMContext):
    email=message.text
    if email.startswith("@"):
        await Form.next()
    else:
        await message.answer("Write email pls")

Что не так?
Вот весь код

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
import re

from states import Form

bot = Bot(token='TOKEN')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

@dp.message_handler(Command('start'))
async def start(message: types.Message, state: FSMContext):
    await message.answer("Привет, я чат-бот Wonder Women - самого доброго и созидательного комьюнити Центральной Азии:)\n\nЗдесь ты можешь купить билет на WWTalks, который состоится 10 декабря.\nНо сначала давай познакомимся поближе:\n\nНапиши, пожалуйста, своё имя")

    await Form.surname.set()

@dp.message_handler(state=Form.surname)
async def process_name(message: types.Message, state: FSMContext):
    await state.update_data(surname=message.text)
    await message.answer("Напиши, пожалуйста, свою фамилию")
    await Form.phone_number.set()

@dp.message_handler(state=Form.phone_number)
async def process_surname(message: types.Message, state: FSMContext):
    phone_number = message.text
    phone_number_pattern = r'^\+7\d{1}$'
    if not re.match(phone_number_pattern, phone_number):
        await message.answer("Напиши, пожалуйста, свой номер телефона по формату +7----------")
    else:
        await Form.email.set()

@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message, state: FSMContext):
    email=message.text
    if email.startswith("@"):
        await Form.next()
    else:
        await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")

@dp.message_handler(state=Form.buy_or_more)
async def process_email(message: types.Message, state: FSMContext):

    keyboard = InlineKeyboardMarkup()
    buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
    more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
    keyboard.add(buy_button)
    keyboard.add(more_button)

    await message.answer("Выберите действие:", reply_markup=keyboard)
    await Form.next()

@dp.callback_query_handler(lambda c: c.data == 'buy', state=Form.buy)
async def process_callback_buy(callback_query: types.CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(callback_query.id)

    buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"  # Замените ссылкой на покупку билета
    await bot.send_message(callback_query.from_user.id, buy_ticket_text)
    await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")

    await Form.next()

@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
    # Process the screenshot
    await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
                                                  "Электронный билет придет на почту в ближайшее время.")

    await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
                                                  "Самые интересные мы обсудим на нашей встрече.")
    await Form.next()

@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):
    # Process the questions
    await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для . "
                                                 "Ждем вас на нашей встрече!\n\nКоманда")

@dp.callback_query_handler(lambda c: c.data == 'more', state=Form.more)
async def process_callback_buy(callback_query: types.CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(callback_query.id)

    details_text = "Тема: 'Карьера'\n"
    await bot.send_message(callback_query.from_user.id, details_text)

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message):
    email = message.text
    if email.startswith("@"):
        keyboard = InlineKeyboardMarkup()
        buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
        more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
        keyboard.add(buy_button)
        keyboard.add(more_button)
        await message.answer("Выберите действие:", reply_markup=keyboard) # <- сообщение и клавиатура перенесена сюда
        await Form.buy_or_more.set()
    else:
        await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")

@dp.callback_query_handler(lambda c: c.data == 'buy')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    buy_ticket_text = "Вы можете купить билет по ссылке: [Ссылка на покупку билета]"
    await bot.send_message(callback_query.from_user.id, buy_ticket_text)
    await bot.send_message(callback_query.from_user.id, "Если вы купили, отправьте скриншот")

    await Form.screen.set()

@dp.message_handler(content_types=['photo'], state=Form.screen)
async def process_screenshot(message: types.Message, state: FSMContext):
    # Process the screenshot
    await bot.send_message(message.from_user.id, "Спасибо. Мне нужно немного времени, чтобы обработать запрос. "
                                                  "Электронный билет придет на почту в ближайшее время.")

    await bot.send_message(message.from_user.id, "Напишите от 1 до 3х вопросов, которые интересуют вас по теме WWTalks. "
                                                  "Самые интересные мы обсудим на нашей встрече.")
    await Form.next()

@dp.message_handler(state=Form.questions)
async def process_questions(message: types.Message, state: FSMContext):
    # Process the questions
    await bot.send_message(message.from_user.id, "Спасибо за участие в формировании актуальных вопросов для WWTalks. "
                                                 "Ждем вас на нашей встрече!\n\nКоманда Wonder Women")
    await Form.buy_or_more.set()

@dp.callback_query_handler(lambda c: c.data == 'more')
async def process_callback_buy(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    details_text = "Тема: 'Карьера'\n"
    await bot.send_message(callback_query.from_user.id, details_text)

Еще почему то не работают inline кнопки.

Покажу кусок вашего кода, как должно быть, далее думаю поймете как остальное переделать
<code>
@dp.message_handler(state=Form.phone_number)
async def process_surname(message: types.Message, state: FSMContext):
    phone_number = message.text
    phone_number_pattern = r'^\+7\d{10}$'
    if not re.match(phone_number_pattern, phone_number):
        await message.answer("Напиши, пожалуйста, свой номер телефона по формату +7----------")
    else:
        await message.answer("Напиши, пожалуйста, свой email") # <- сообщение с просьбой ввести email
        await Form.email.set()

@dp.message_handler(state=Form.email)
async def process_phone(message: types.Message):
    email = message.text
    if email.startswith("@"):
        keyboard = InlineKeyboardMarkup()
        buy_button = InlineKeyboardButton('Купить билет', callback_data='buy')
        more_button = InlineKeyboardButton('Подробнее о встрече 10 декабря', callback_data='more')
        keyboard.add(buy_button)
        keyboard.add(more_button)
        await message.answer("Выберите действие:", reply_markup=keyboard) # <- сообщение и клавиатура перенесена сюда
        await Form.buy_or_more.set()
    else:
        await message.answer("Напиши, пожалуйста, email (важно, т.к. электронный адрес должен совпадать с тем, что ты укажешь при оплате")
</code>
ну и странно то, что вы запрашиваете данные у пользователя, но никак их не собираете, чтобы в дальнейшем производить с ними манипуляции


Ошибка в токене ,не понимаю почему, выдает '' Token is invalid! It must be 'str' type instead of <class 'NoneType'> type."
<code>
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor

import os

bot = Bot(token=os.getenv('тут токен'))
dp = Dispatcher(bot)
@dp.message_handler()
async def echo_send(message: types.Message):
    await message.answer(message.text)
    # await message.reply(message.text)
    # await bot.send_message(message.from_user.id, mesage.text)
executor.start_polling(dp, skip_updates=True)`
</code>

Попробуйте создать отдельный python файл и создать в нём переменную с токеном так:

token = 'ваш_токен'

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

from созданный_файл import token

bot = Bot(token=token)


return возвращает всегда только одно последнее значение из цикла for (Django)

context_processors.py:

from .models import Category, Product

def all_cattegory(request):
   products = Product.objects.filter(published=True)
   categories = Category.objects.filter(published=True)
   user_k = f'{request.user.usrid.discount_list_k1}'

   for post in products:
      post = max(float(post.id_p), float(user_k))
      print(post)
   return {"categories": categories, "products": products,"post": post }

return возвращает всегда только одно последнее значение из цикла

Естественное поведение так, как вы переписываете каждый раз переменную
post. Для того чтобы хранить все значения в цикле вам нужен тип данных, который хранит набор. Например,
list, то есть список

....
   post = []
   for product in products:
      post.append(max(float(product.id_p), float(user_k)))
      print(post)
   return {"categories": categories, "products": products,"post": post }

Не очень понятны наборы данных, которые вы обрабатываете, поскольку и в самом цикле вы используете переменную
post, а затем ее изменяете. То есть не понятна логика, что вы делаете.

return возвращает то, что вы ему передаете и он тут совершенно ни при чем. Вам необходимо добиться, чтобы переменная
post содержала необходимые данные


Нумерация элементов
Подскажите, как сделать нумерацию:

filter_options = {
    'причины': ['возврат/зачет', 'вычеты', 'документы'],
    'последствия': ['документы', 'МНК'],
    'Классификация НО действий НП': ['взаимозависимые организации', 'дробление бизнеса']
}
[{"label": f'{list(filter_options.keys())[0]}_{[x for x in range(1, len(filter_options[list(filter_options.keys())[0]])+1)]}', "value": key} for key in filter_options[list(filter_options.keys())[0]]]

По итогу получается так:

[{'label': 'причины_[1, 2, 3]', 'value': 'возврат/зачет'},
 {'label': 'причины_[1, 2, 3]', 'value': 'вычеты'},
 {'label': 'причины_[1, 2, 3]', 'value': 'документы'}]

А хотелось бы так:

[{'label': 'причины_1', 'value': 'возврат/зачет'},
 {'label': 'причины_2', 'value': 'вычеты'},
 {'label': 'причины_3', 'value': 'документы'}]

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

filter_options = {
    'причины': ['возврат/зачет', 'вычеты', 'документы'],
    'последствия': ['документы', 'МНК'],
    'Классификация НО действий НП': ['взаимозависимые организации', 'дробление бизнеса']
}

reasons = [
    {"label": f"причины_{i}", "value": reason}
    for i, reason in enumerate(filter_options["причины"], 1)
]

print(reasons)

Вывод:

[{'label': 'причины_1', 'value': 'возврат/зачет'}, {'label': 'причины_2', 'value': 'вычеты'}, {'label': 'причины_3', 'value': 'документы'}]

Это только для ключа "причины". Если нужно в список собрать данные по всем ключам, то такой код:

filter_options = {
    'причины': ['возврат/зачет', 'вычеты', 'документы'],
    'последствия': ['документы', 'МНК'],
    'Классификация НО действий НП': ['взаимозависимые организации', 'дробление бизнеса']
}

result = [
    {"label": f"{label}_{i}", "value": value}
    for label, lst in filter_options.items()
    for i, value in enumerate(lst, 1)
]

from pprint import pprint
pprint(result, width=120)

Вывод:

[{'label': 'причины_1', 'value': 'возврат/зачет'},
 {'label': 'причины_2', 'value': 'вычеты'},
 {'label': 'причины_3', 'value': 'документы'},
 {'label': 'последствия_1', 'value': 'документы'},
 {'label': 'последствия_2', 'value': 'МНК'},
 {'label': 'Классификация НО действий НП_1', 'value': 'взаимозависимые организации'},
 {'label': 'Классификация НО действий НП_2', 'value': 'дробление бизнеса'}]


не могу решить проблему с отступами "expected an indented block after function definition on line..." после класса Main.window
Не могу решить проблему с отступом, все выглядит как положено, однако подсвечивается красный курсор после строки
class MainWindow(QtWidgets.QWidget, Ui_Form):

class Ui_Form(object):
    def setupUi(self, Form):

class MainWindow(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()

        self.setupUi(self)

        self.comboBox.currentIndexChanged.connect(self.update_spinbox_value)

        self.layout = QtWidgets.QVBoxLayout(self)

        self.image_label = QtWidgets.QLabel(self)
        self.image_label.setAlignment(QtCore.Qt.AlignCenter)
        self.image_label.setFixedSize(600, 400)

        self.layout.addWidget(self.image_label)
        self.layout.setContentsMargins(625, 80, 0, 700)

        self.comboBox.currentIndexChanged.connect(self.update_image)

    def update_spinbox_value(self, index):
        if index == 0:
            self.spinBox_2.setValue(0.8)  # Присвоение вероятности каждой засаде
        elif index == 1:
            self.spinBox_2.setValue(0.75)
        elif index == 2:
            self.spinBox_2.setValue(0.7)
        elif index == 3:
            self.spinBox_2.setValue(0.65)
        elif index == 4:
            self.spinBox_2.setValue(0.6)
        elif index == 5:
            self.spinBox_2.setValue(0.55)
        elif index == 6:
            self.spinBox_2.setValue(0.5)

Проблема в том, что функция
Ui_Form.setupUi пустая.
Решить это можно либо добавлением нужного кода в функцию, либо добавить ключевое слово
pass в функцию так:

class Ui_Form(object):
    def setupUi(self, Form):
        pass # эту строку я добавил


Как сделать чтобы gethostbyname возвращала ip в моей сети?
После перехода на debian 12 gethostbyname стала возвращать 127.0.1.1.
Я пробовал удалить строку с этой привязкой в hosts, но не помогло.
Как это исправить? может было у кого нибудь такое?

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.connect(('1.1.1.1', 1234))
local_ip, local_port = sock.getsockname()

socket.SOCK_DGRAM - не осуществляет реальное подключение при вызове
connect.

('1.1.1.1', 1234) - любой адрес из сети в которую должен смотреть сокет.
Линукс выбирает подходящий интерфейс и привязывает сокет к нему во время "подключения".
Если не сделать
connect, то  Линукс отдает первый попавшийся адрес для хоста, а это обычно
127.0.0.1 или
127.0.1.1.

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


Не работает изменение столбца в SQLite3
Код должен после команды
/start записывать в поля
user_id и
username следующие значения, полученные от
message.from_user.id и
message.from_user_username. Но в итоге у меня записывается только значение
user_id

@dp.message_handler(commands='start')
async def start_command(message: types.Message):
    db.add_user(message.from_user.id)
    db.username( message.from_user.username, message.from_user.id)

class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def add_user(self, user_id):
        with self.connection:
            self.cursor.execute("INSERT INTO 'users' ('user_id') VALUES (?)", (user_id,))
            self.connection.commit()

    def username (self, username, user_id):
        with self.connection:
            self.cursor.execute("UPDATE 'users' SET 'username' = ? WHERE 'user_id' = ?", (username, user_id,))
            self.connection.commit()

import sqlite3
import logging

from datetime import datetime

class Database:
    def __init__(self, db_file: str = "db.sqlite3") -> None:
        self.init_db(db_file)
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def init_db(self, db_file: str) -> None:
        """Инициализация базы данных.
        При инициализации базы данных создается таблица 'users' с полями 'id', 'user_id', 'username' и 'time'.
        Если таблица уже существует, ничего не делается."""

        with sqlite3.connect(db_file) as conn:
            conn.execute("""CREATE TABLE IF NOT EXISTS users (
                            id          INTEGER     PRIMARY KEY,
                            user_id     BIGINT      NOT NULL,
                            username    VARCHAR(32) NOT NULL,
                            time        TEXT        NOT NULL)""")
            conn.commit()

    def check_user(self, user_id: int) -> bool:
        """Проверка существования пользователя в базе данных.
        Проверяет, существует ли пользователь с указанным user_id в базе данных."""

        with self.connection:
            self.cursor.execute("SELECT user_id FROM users WHERE user_id = ?", (user_id,))
            result = self.cursor.fetchone()
            return bool(result)

    def add_user(self, user_id: int, username: str) -> None:
        """Добавление нового пользователя в базу данных.
        Добавляет нового пользователя с указанным user_id и username в базу данных."""

        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        with self.connection:
            self.cursor.execute("INSERT INTO users (user_id, username, time) VALUES (?, ?, ?)", (user_id, username, current_time))
            self.connection.commit()
            logging.info(f"Добавлен пользователь с ID = {user_id} | username = {username}")

    def check_username(self, user_id: int, username: str) -> None:
        """Проверка изменения имени пользователя.
        При вводе команды /start проверяет, изменилось ли имя пользователя с user_id в базе данных.
        Если имя пользователя изменилось, вызывается функция update_username для обновления имени пользователя."""

        with self.connection:
            self.cursor.execute("SELECT username FROM users WHERE user_id = ?", (user_id,))
            result = self.cursor.fetchone()
            if result and result[0] != username:
                self.update_username(user_id, username)

    def update_username(self, user_id: int, username: str) -> None:
        """Обновление имени пользователя в базе данных.
        Обновляет имя пользователя с указанным user_id в базе данных."""

        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        with self.connection:
            self.cursor.execute("UPDATE users SET username = ?, time = ? WHERE user_id = ?", (username, current_time, user_id))
            self.connection.commit()
            logging.info(f"Имя пользователя с ID = {user_id} был изменен на {username}")

Пример использоваения:

@dp.message_handler(commands="start")
async def cmd_start(message: types.Message) -> None:
    user_id = message.from_user.id
    username = message.from_user.username

    db = Database()

    if not db.check_user(user_id):
        db.add_user(user_id, username)
    else:
        db.check_username(user_id, username)


Ошибка unicodeDecodeError и TypeError при чтение txt файла
Вот кусок кода, в котором появляется ошибка при запуске:

def logon(logons):
    result_list_logon = {}

    with open(logons) as file:
        lines = file.readlines()
        length = len(lines)

        for i in range(length):
            each_line = lines[i]
            array_line = each_line.split(' ')

В функцию logon передаётся строкой путь к файлу, который затем открывается на чтение и построчно записывается в переменную lines.
Сначала была ошибка:

    File "/home/senior/home/log/script.py", line 121, in <module>
    all()
  File "/home/senior/home/log/script.py", line 102, in all
    logon_res = logon(logons)
  File "/home/senior/home/log/script.py", line 41, in logon
    lines = file.readlines()
  File "/usr/local/lib/python3.10/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x88 in position 1381: invalid start byte

Чтобы ее исправить добавила в функцию, где файл открывается на чтение, вместо 'r' - 'rb'
И теперь получается следующая ошибка:

array_line = each_line.split(' ')
TypeError: a bytes-like object is required, not 'str'

Это делается чтобы разбить в переменной каждую строку файла на слова по пробелу и дальше их перебирая и выводить их в нужные переменные
Не могу понять, как сделать чтобы он читался, вроде замкнутый круг получается
Скрипт запускается с Debian 11 Python3.10.11, а файл идут с Windows, думала может проблема в разных файловых системах, но файл корректно открывается в debian через nano/vim

Ответ оказался еще проще
Нужно было при открытие файла указать, чтобы если символ не подходит под кодировку его либо пропускало/либо заменяло знаками "???"
Работающий вариант:
<code>
def logon(logons):
    result_list_logon = {}

    with open(logons, encoding='ascii', errors='ignore') as file:
        lines = file.readlines()
        length = len(lines)

        for i in range(length):
            each_line = lines[i]
            array_line = each_line.split(' ')
</code>


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

lst = [
        'el1',
        ['el2', 15, 'text'],
        ['el3', '2.6', ['el4', ['el5']]],
        'el6'
     ]

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

def find_elem(lst: list, elem: any) -> list[int] | None:
    '''получаем путь до искомого элемента в виде списка индексов'''
    for i, el in enumerate(lst):
        if isinstance(el, (list, tuple)):
            returned = find_elem(el, elem)
            if returned != None:    #   проверяем был ли во вложенном списке искомый элемент
                return [i, ] + returned
        elif el == elem:
            return [i, ]
    return None #   элемент в переданной коллекции не нашелся

print(find_elem(lst, 'el5'))   #   вернет путь виде списка [2, 2, 1, 0]

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

needed_elem = lst[2][2][1][0]
P.S. функцию писал на коленке просто что бы показать суть вопроса.
UPD. прилагаю результат применения алгоритмов с путешествием по первоисточнику и локализацией искомого элемента. В итоге первоисточник остается в первозданном виде...

needed_elem = find_elem(lst, 'text')   №   [1, 2]
needed_addr = lst[1][2]
needed_addr = ['text', 'new text']
print(lst)    #    ['el1', ['el2', 15, 'text'], ['el3', '2.6', ['el4', ['el5']]], 'el6']

lst[1][2] = ['text', 'new text']
print(lst)    #    ['el1', ['el2', 15, ['text', 'new text']], ['el3', '2.6', ['el4', ['el5']]], 'el6']

Как видно из приведенного примера, к изменениям привел только второй вариант обращения.

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

locate(list_, value) - генератор, который возвращает все вхождения значения
value в список
list_. Просматривается как сам список, так и все его подсписки, рекурсивно.

replace_first(list_, old, new) заменяет первое значение
old (если оно есть) на
new.

replace_all(list_, old, new) заменяет все значения
old на
new.

def locate(list_, value):
    for i, v in enumerate(list_):
        if v == value:
            yield list_, i
        if isinstance(v, list):
            yield from locate(v, value)

def replace_first(list_, old, new):
    for lst, i in locate(list_, old):
        lst[i] = new
        break

def replace_all(list_, old, new):
    for lst, i in locate(list_, old):
        lst[i] = new

lst = [
    'el1',
    ['el2', 15, 'text'],
    ['el3', '2.6', ['el4', ['el5']]],
    'el6'
]

print(*locate(lst, 'text'))

print(lst)
replace_all(lst, 'text', ['text', 'new text'])
print(lst)

$ python replace.py
(['el2', 15, 'text'], 2)
['el1', ['el2', 15, 'text'], ['el3', '2.6', ['el4', ['el5']]], 'el6']
['el1', ['el2', 15, ['text', 'new text']], ['el3', '2.6', ['el4', ['el5']]], 'el6']

Решение с мультииндексом
Класс
NestedList оборачивает список и предоставляет синтаксис вида:

nlst = NestedList(lst)  # создание обёртки

print(nlst[[1, 2]])     # обращение ко второму индексу
                        # первого подсписка списка

nlst[[1, 2]] = value    # изменение этого же элемента

nlst.locate(value)      # перебирает все мультииндексы
                        # значения value

class NestedList:
    def __init__(self, list_):
        self._list = list_

    def __getitem__(self, index):
        v = self._list
        for i in index:
            v = v[i]
        return v

    def __setitem__(self, index, value):
        v = self._list
        for i in index[:-1]:
            v = v[i]
        v[index[-1]] = value

    def locate(self, value):

        def locate(list_, stack):
            for i, v in enumerate(list_):
                top = stack, i
                if v == value:
                    index = []
                    node = top
                    while node is not None:
                        index.append(node[1])
                        node = node[0]
                    yield index[::-1]
                if isinstance(v, list):
                    yield from locate(v, top)

        yield from locate(self._list, None)

lst = [
    'el1',
    ['el2', 15, 'text'],
    ['el3', '2.6', ['el4', ['el5']]],
    'el6'
]

nlst = NestedList(lst)

print('list =', lst)
i = next(nlst.locate('text'))
print('i =', i)
print('nlst[i] =', nlst[i])
nlst[i] = ['text', 'new text']
print('nlst[i] =', nlst[i])
print('list =', lst)

$ python replace.py
list = ['el1', ['el2', 15, 'text'], ['el3', '2.6', ['el4', ['el5']]], 'el6']
i = [1, 2]
nlst[i] = text
nlst[i] = ['text', 'new text']
list = ['el1', ['el2', 15, ['text', 'new text']], ['el3', '2.6', ['el4', ['el5']]], 'el6']


Как подключить OpenCV к монитору
Хочу отслеживать все, что происходит на рабочем столе и в приложениях. Видел множество примеров подключения к камерам, чтобы отслеживать объекты в потоке, но как отслеживать объекты на мониторе? Могу почитать мануалки, если такие есть.

python-opencv не позволяет так делать, но вы можете использовать к примеру
mss (
pip install mss):

from mss import mss
import numpy as np
import cv2 as cv
import time

with mss() as sct:
    rect = sct.monitors[0]
    while True:
        stime = time.time()
        sct_img = np.array(sct.grab(rect))
        cv.imshow('frame', sct_img)
        if cv.waitKey(1) == ord('q'):
            break
    cv.destroyAllWindows()