Как сделать таблицу из HTML кода на python
Сижу, не могу понять как это сделать, подскажите пожалуйста.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Document</title>
</head>
<body>
<table>
<tr>
<th>Название фильма</th>
<th>Режиссёр</th>
<th>Актёрский состав</th>
<th>Рейтинг фильма</th>
<th>Год</th>
</tr>
<tr>
<td>Седьмая печать</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Гуннар Бьёрнстранд, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Остров проклятых</td>
<td>Мартин Скорсезе</td>
<td>Леонардо Ди Каприо, Марк Руффало, Бен Кингсли, Эмили Мортимер</td>
<td>4</td>
<td>2010</td>
</tr>
<tr>
<td>Земляничная поляна</td>
<td>Ингмар Бергман</td>
<td>Виктор Шёстрём, Ингрид Тулин, Биби Андерссон</td>
<td>5</td>
<td>1957</td>
</tr>
<tr>
<td>Час волка</td>
<td>Ингмар Бергман</td>
<td>Макс фон Сюдов, Лив Ульман, Ингрид Тулин</td>
<td>3</td>
<td>1968</td>
</tr>
</table>
</body>
</html>

Как из этого сделать таблицу в python, чтобы столбики были

<th>Название фильма</th>
<th>Режиссёр</th>
<th>Актёрский состав</th>
<th>Рейтинг фильма</th>
<th>Год</th>

А таблица должна быть заполнена

<td>Остров проклятых</td>
<td>Мартин Скорсезе</td>
<td>Леонардо Ди Каприо, Марк Руффало, Бен Кингсли, Эмили Мортимер</td>
<td>4</td>
<td>2010</td>


Как можно определить язык текста на windows?
Есть список из русских и английских слов вперемешку, нужно разделить его на 2 словаря. Один словарь содержит все русские слова, второй все английские. Как это сделать на windows?
<code>
li = ['dog', 'cat', 'собака', 'кот']
</code>

 alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
 li = ['dog', 'cat', 'собака', 'кот']
 rus = {}
 engl = {}

for word in li:
   for w in word:
    if w in alphabet:
        rus[word]=''
        rus.update()
    else:
        engl[word] =''
        engl.update()

print('*',rus)
print('**',engl)


Как из словаря вывести 3 ключа с максимальным значением?
Есть словарь, из которого надо вывести 3 максимальных значения. Как это можно реализовать?

di = {'Матерь Богов': 528,
        'Крылья': 162,
        'Эта Музыка Будет Вечной': 295,
        'Золотое пятно': 1567,
        'Утро Полины': 174}

У меня получается вывести только одно максимальное значение вот таким кодом:

ma = (max(di, key=di.get))
print(ma)

Используйте сортировку и срез. Поскольку сортировка идёт в возрастающем порядке, нужно брать три последних элемента:

print(sorted(di, key=di.get)[-3:])

Вывод:

['Эта Музыка Будет Вечной', 'Матерь Богов', 'Золотое пятно']


Как разделить список на 2 списка(в 1 списке данные str, в другом int)
Есть список

li = ['cow', '1', 'cat', '2', 'dog', '3']

В списке
li все данные
str.
Нужно разделить этот список на 2 других списка.
1 список будет выглядеть так(в нем все данные типа
str):

animals = ['cow', 'cat', 'dog']

2список так(в нем все данные типа
int):

num = ['1', '2', '3']

Как это сделать?

Добавлю еще вариант решения
<code>
li = ['cow', '1', 'cat', '2', 'dog', '3']
animals = []
num = []
for i in li:
    num.append(i) if i.isnumeric() else animals.append(i)
</code>


Как преобразовать значения словаря из str в int и вывести ключ с максимальным значением?
Есть словарь, в котором значения это str. Далее нужно получить на выходе ключ с максимальным значением. Как это можно реализовать?
<code>
di = {'Python разработчик': '150000',
        'Data Scientist': '200000',
        'Программист Python': '40000',
        'Python разработчик (Django)': '140000',
        'Backend Python / Django разработчик (удаленно)': '50000'}
</code>

ma = (max(di, key=di.get))
print(f'{ma}: {di[ma]}')


Как преобразовать строку в имя переменной класса?
Я знаю как можно сделать переменную локальную или глобальную, но как сделать переменную, чтобы он была привязана к классу? self.locals()['a'] = 1?

Ну вроде так можно. Как видим, всё берётся из переменных:
<code>
classname = 'Test'
attrname = 'z'
attrval = 42
setattr(globals()[classname], attrname, attrval)
</code>


Как создать колонку с наиболее часто встречающимися значениями другой колонки?
Необходимо создать колонку
Temp для размещения в ней значения из колонки 'Net', наиболее часто встречающегося для каждого значения из колонки 'Address':

d = {'name': ['rick, mike, morty', 'tot, piter, carl', 'brick, nick', 'rick, reaven, bart, homer', 'rick, morty'],
     'Date': ['11/05/2011', '9/02/2010', '1/01/2014', '12/20/2020', '9/30/2009'],
     'Address': ['BY', 'YU', 'RU', 'BY', 'BY'], 'Net': [1, 0, 1, 0, 1]}

df = pd.DataFrame(data = d)
Ответ должен выглядеть как:

Address
Temp

BY
1

YU
0

RU
1

BY
1

BY
1

Как вариант через transform и mode
<code>
df['temp'] = df.groupby('Address')['Net'].transform(lambda x: x.mode().iat[0])

>>> df

                 name           Date       Address Net temp
0          rick, mike, morty  11/05/2011      BY    1     1
1           tot, piter, carl   9/02/2010      YU    0     0
2                brick, nick   1/01/2014      RU    1     1
3  rick, reaven, bart, homer  12/20/2020      BY    0     1
4                rick, morty   9/30/2009      BY    1     1
</code>


нужно посчитать сколько нулей ("0") находится в начале строки. Python. Объясните, как это сделать?
Вам дана строка состоящая только из цифр. Вам нужно посчитать сколько нулей ("0") находится в начале строки.
Пример:
<code>
('001') = 2
('100100') = 0
('001001') = 2
('012345679') = 1
('0000') = 4
</code>
Строка может иметь цифры: 0-9

Как вариант:
<code>
string = str(input())
check = 0

for i in string:
    if i == '0':
        check += 1
    else:
        break
print(check)
</code>


Как правильно хранить числа с плавающей точкой в базе данных SQLite3
пишу небольшое скрипт на Python к которому подкручена база данных SQLite3
Я записываю в базу данных числа с плавающей точкой ( или без неё ), чтобы потом вывести сумму этих чисел, но проблема в том что если в базе данных если число с двумя знаками после точки ( например: 14.55 ), то результат будет примерно вот таким: из списка с числами [55, 14.55, 21.9, 27, 27, 11.95, 45] выйдет вот такое число - 202.39999999999998. Если чисел с двумя знаками после точки не будет, всё будет нормально.
Числа в базу данных я записываю в виде float, а в базе данных я их храню real ( пробовал с numeric, но результат такой же )
Вопрос: как правильно складывать и хранить такие числа? Может лучше использовать другую базу данных?

Здесь проблема не в базе данных, вы же при обычном сложении в интерпретаторе тот же результат получите

sum([55, 14.55, 21.9, 27, 27, 11.95, 45])

202.39999999999998

Так что в базе вы можете хранить их хоть даже в виде строки, а потом преобразовывать во
float.
Здесь получается такое число скорее из-за особенностей проблемы чисел с плавающей точкой. Результат получается верный.
Если вам нужно просто вывести с точностью до 2 знаков после запятой, то воспользуйтесь форматированием строки:

f'{числовое_значение:.кол-во_знаковf}'

print(f'{sum([55, 14.55, 21.9, 27, 27, 11.95, 45]):.2f}')

'202.40'

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

a = float(f'{202.39999999999998:.2f}')

202.4


как импортировать модуль 'deterministic' в Colaboratory

!pip install statsmodels

from statsmodels.tsa.deterministic import DeterministicProcess

выдает ошибку

ModuleNotFoundError: No module named 'statsmodels.tsa.deterministic'

NOTE: If your import is failing due to a missing package, you can
manually install dependencies using either !pip or !apt.

Нужно обновить модуль
statsmodels (обратите внимание на ключ
-U, без него останется та же версия, которая уже стоит в Colab):

!pip install -U statsmodels

После этого перезапустить ядро:

Среда выполнения -> Перезапустить среду выполнения

После этого нормально импортируется.
Версия в Colab: statsmodels-0.10.2
Обновлённая версия: statsmodels-0.13.2


Перезаписывается одна и та же строка в CSV файле
Написал вот такой код
<code>
from csv import writer

with open('moscow.csv', 'r', encoding = 'utf-8') as source:
    for line in source.readlines():
        line = line.split(',')
        with open('all.csv', 'w', encoding = 'utf-8') as base:
            writer_obj = writer(base)
            writer_obj.writerow(line)
</code>
Вместо того, чтобы добавлять список с новой строки, перезаписывается одна и та же строка. Как это исправить?

Открывайте оба файла одновременно. Сейчас вы открываете файл на запись внутри цикла и он перезаписывается на каждой итерации. Ну и
readlines тут излишне, только лишнюю память съест:

with open('moscow.csv', 'r', encoding = 'utf-8') as source,
     open('all.csv', 'w', encoding = 'utf-8') as base:
    writer_obj = writer(base)
    for line in source:
        line = line.split(',')
        writer_obj.writerow(line)


Три функции python заменить одним методом
Есть три функции:
<code>
    def test_post_index_page_show_correct_context(self):
    """Проверяем Context страницы index"""
    response = self.authorized_client.get(reverse('posts:index'))
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)

def test_post_posts_groups_page_show_correct_context(self):
    """Проверяем Context страницы posts_groups"""
    response = self.authorized_client.get(
        reverse('posts:group_list', kwargs={'slug': self.group.slug}))
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)

def test_post_profile_page_show_correct_context(self):
    """Проверяем Context страницы profile"""
    response = self.authorized_client.get(
        reverse('posts:profile', kwargs={
            'username': self.author.username}))
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)
</code>
Нужно заменить их одним методом по принципу DRY.
Ревьюер в проекте мне указал: Ревьюер пишет:
"Код проверок контекста дублируется - проверку контекста можно вынести в отдельный метод и вызвать в самих тестах". Помогите, как это сделать?

Так:
<code>
def test_post_posts_groups_page_show_correct_context(self):
    """Проверяем Context страницы posts_groups"""
    response = self.authorized_client.get(
        reverse('posts:group_list', kwargs={'slug': self.group.slug}))

    self.check_context_is_correct(response)

def check_context_is_correct(self, response):
    first_object = response.context['page_obj'][0]
    context_objects = {
        self.author.id: first_object.author.id,
        self.post.text: first_object.text,
        self.group.slug: first_object.group.slug,
        self.post.id: first_object.id,
    }
    for reverse_name, response_name in context_objects.items():
        with self.subTest(reverse_name=reverse_name):
            self.assertEqual(response_name, reverse_name)
</code>


Как написать пользователю discord на python?
Я делаю бота. Но как мне сделать так, чтобы бот написал мне, при условии что у него нет никаких связей со мной(кроме личного чата)?
Код:
<code>
import discord as ds
bot = ds.Client()
@bot.event
async def on_ready():
    global game_creator
    game_creator = None#<-- Здесь
    game_creator.send("Hello")
</code>

Если вам нужен конкретный пользователь, то скопируйте его
id, нажав на него правой кнопкой мыши в дискорде. Если соответствующего пункта нет, то включите режим разработчика в настройках.
Сначала получите объект пользователя, а потом уже отправьте сообщение:

game_creator = await bot.fetch_user(723849347623489348)
await game_creator.send('hello')

Здесь
723849347623489348 - это число,
id пользователя.


Хранятся ли аргументы функции в какой-то переменной?
<code>
a=5
b=6
def func(a, b)
    for arg in args:
        print(arg) #5 6
</code>
Есть ли какая-то переменная, которая похожа на мною выдуманную args?

Попробуйте функцию locals, выдающую словарь локальных переменных:

def func(a, b):
    print(locals())

func(5, 6)

Вывод:

{'a': 5, 'b': 6}

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

print(*locals().values()) # 5 6


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

tav = {'Газ': 23.0, 'Отопление': 900.0, 'Школа/Кружки': 450.0, 'ОСББ/УК': 481.0, 'Молочка': 35.0, 'Сладости': 40.0, 'Фрукты и Овощи': 50.0}

И вот порядок сортировки. Сначала должны выводиться данные по фруктам, потом по молочке и т.д.

cats = ['Фрукты и Овощи', 'Молочка', 'Сладости', 'Газ', 'Отопление']

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

new_list = []
for i in tav:
    if i in cats:
        a = cats.index(i)
    else: a = 99
    new_list.append((i, tav[i], a)) # И добавляю все это в виде кортежа

#Получается так:
#[('Газ', 23.0, 3), ('Отопление', 900.0, 4), ('Школа/Кружки', 450.0, 99), ('ОСББ/УК', 481.0, 99), ('Молочка', 35.0, 1), ('Сладости', 40.0, 2), ('Фрукты и Овощи', 50.0, 0)]

# Сортирую по нужному значению
new_list = sorted(new_list, key=lambda b: b[2])

#И снова закидываю все в словарь.
final_dict = {}
for tuple in new_list:
    final_dict[tuple[0]] = tuple[1]

И наконец, получаю то что мне надо.

#{'Фрукты и Овощи': 50.0, 'Молочка': 35.0, 'Сладости': 40.0, 'Газ': 23.0, 'Отопление': 900.0, 'ОСББ/УК': 481.0, 'Школа/Кружки': 450.0}

Скажите, это совсем говнокод?
Как это сделать проще?

можно так:

import sys

def myindex(el):
    try:
        return cats.index(el)
    except ValueError:
        return sys.maxsize

new_dict = dict(sorted(tav.items(), key=lambda x: (myindex(x[0]), x[0]))))

>>> new_dict
{'Фрукты и Овощи': 50.0, 'Молочка': 35.0, 'Сладости': 40.0, 'Газ': 23.0, 'Отопление': 900.0, 'ОСББ/УК': 481.0, 'Школа/Кружки': 450.0}

если у вас в списке указан изначально верный порядок, то отсортирует именно по нему.
как видим при сортировке мы указываем два параметра, первый это как раз сортировка, как у вас в списке, второй уже по оставшимся ключам по алфавиту.
далее, для чего нам функция с обработкой исключений. Если ее не будет и будем просто делать сортировку по
key=lambda x: (cats.index(x[0]), то вылетит ошибка, что отсутствуют значения, поэтому в функции мы присваиваем отсутствующим значениям максимальное число (в вашем случае можно и 99, если вас это устраивает и словарь небольшой)


Телеграм бот выдаёт ошибку TypeError: 'str' object is not callable
Помогите пожалуйста решить проблему.
Во время работы бота при подтверждении того, что город выбран правильно программа останавливается и выдаёт ошибку. Что делать?
Код бота:

import telebot
from telebot import types

# creating
TOKEN = ""
bot = telebot.TeleBot(TOKEN)

base_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
button_weather = types.KeyboardButton("Узнать погоду в моём городе.")
button_change = types.KeyboardButton("Изменить мой город.")

base_markup.add(button_weather, button_change)

# creating buttons
@bot.message_handler(commands=['start'])
def welcome(message):
    bot.send_sticker(message.chat.id, 'CAACAgIAAxkBAAEEPWZiOgABRUBmN6NNKOsBU3mTh8ag_8gAAkwCAALKAwYLElZjg2wiVFIjBA')

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_help = types.KeyboardButton("Начать")
    button_start = types.KeyboardButton("Помощь")

    markup.add(button_help, button_start)

    # sending message
    bot.send_message(message.chat.id,
                     "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>, бот который поможет тебе узнать погоду в твоём городе.".format(
                         message.from_user, bot.get_me()), parse_mode='html', reply_markup=markup)

# getting messages and replying them
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == "Начать":

        city_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        button_moscow = types.KeyboardButton("Москва")
        button_spb = types.KeyboardButton("Санкт-Петербург")
        button_novosibirsk = types.KeyboardButton("Новосибирск")
        button_yekateriburg = types.KeyboardButton("Екатеринбург")
        button_kazan = types.KeyboardButton("Казань")
        button_nizhnynovgorod = types.KeyboardButton("Нижный Новгород")
        button_chelyabinsk = types.KeyboardButton("Челябинск")
        button_other = types.KeyboardButton("Другой город")

        city_markup.add(button_moscow, button_spb, button_novosibirsk, button_yekateriburg, button_kazan,
                        button_nizhnynovgorod, button_chelyabinsk, button_other)

        bot.send_message(message.chat.id,
                         "Выбери свой город:", reply_markup=city_markup)
        bot.register_next_step_handler(message, group_number)

    elif message.text == "Помощь":
        bot.send_message(message.chat.id,
                         "Нажми кнопку <b>\'Начать\'</b> и выбери один из предложенных городов. \nЕсли твоего города нет в списке, нажми <b>\'Другой город\'</b>. \nПодтверди название города.\nБот выдаст тебе погоду в твоём городе.\n<b>Создатель: Батиев Ростислав</b>",
                         parse_mode='html')

def group_number(message):
    global city
    city = message.text

    answer_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_yes = types.KeyboardButton("Да")
    button_no = types.KeyboardButton("Нет")

    answer_markup.add(button_yes, button_no)

    if city == "Другой город":
        bot.send_message(message.chat.id, "Введите название Вашего города:", parse_mode='html',
                         reply_markup=types.ReplyKeyboardRemove())
        bot.register_next_step_handler(message, another_city)

    else:
        bot.send_message(message.chat.id, "Ваш город - {}, верно?".format(city), parse_mode='html',
                         reply_markup=answer_markup)
        bot.register_next_step_handler(message, city)

def city(message):
    global answer
    answer = message.text

    city_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_moscow = types.KeyboardButton("Москва")
    button_spb = types.KeyboardButton("Санкт-Петербург")
    button_novosibirsk = types.KeyboardButton("Новосибирск")
    button_yekateriburg = types.KeyboardButton("Екатеринбург")
    button_kazan = types.KeyboardButton("Казань")
    button_nizhnynovgorod = types.KeyboardButton("Нижный Новгород")
    button_chelyabinsk = types.KeyboardButton("Челябинск")
    button_other = types.KeyboardButton("Другой город")

    city_markup.add(button_moscow, button_spb, button_novosibirsk, button_yekateriburg, button_kazan,
                    button_nizhnynovgorod, button_chelyabinsk, button_other)

    if answer == "Да":
        bot.send_message(message.chat.id, "Погода в вашем городе:\n", parse_mode='html', reply_markup=base_markup)
        bot.register_next_step_handler(message, get_text_messages)
    else:
        bot.send_message(message.chat.id,
                         "Выбери свой город:", reply_markup=city_markup)
        bot.register_next_step_handler(message, group_number)

def another_city(message):
    city = message.text

    answer_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_yes = types.KeyboardButton("Да")
    button_no = types.KeyboardButton("Нет")

    answer_markup.add(button_yes, button_no)

    bot.send_message(message.chat.id, "Ваш город - {}, верно?".format(city), parse_mode='html',
                     reply_markup=answer_markup)
    bot.register_next_step_handler(message, city)

# checking if messages were sent to bot
bot.polling(none_stop=True, interval=0)

Ошибка:

Traceback (most recent call last):
  File "C:/Users/User/PycharmProjects/WeatherBot/main.py", line 123, in <module>
    bot.polling(none_stop=True, interval=0)
  File "C:\Users\User\PycharmProjects\WeatherBot\venv\lib\site-packages\telebot\__init__.py", line 658, in polling
    self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
  File "C:\Users\User\PycharmProjects\WeatherBot\venv\lib\site-packages\telebot\__init__.py", line 720, in __threaded_polling
    raise e
  File "C:\Users\User\PycharmProjects\WeatherBot\venv\lib\site-packages\telebot\__init__.py", line 680, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\User\PycharmProjects\WeatherBot\venv\lib\site-packages\telebot\util.py", line 135, in raise_exceptions
    raise self.exception_info
  File "C:\Users\User\PycharmProjects\WeatherBot\venv\lib\site-packages\telebot\util.py", line 87, in run
    task(*args, **kwargs)
TypeError: 'str' object is not callable

Всё дело в том, что вы одинаково назвали переменную и функцию, и когда вы хотели перейти на следующий шаг с помощью
bot.register_next_step_handler, при этом в аргументах указывая переменную
city программа думала что вы пытаетесь вызвать переменную (как бы это странно не звучало):

import telebot
from telebot import types

# creating
TOKEN = ""
bot = telebot.TeleBot(TOKEN)

base_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
button_weather = types.KeyboardButton("Узнать погоду в моём городе.")
button_change = types.KeyboardButton("Изменить мой город.")

base_markup.add(button_weather, button_change)

# creating buttons
@bot.message_handler(commands=['start'])
def welcome(message):
    bot.send_sticker(message.chat.id, 'CAACAgIAAxkBAAEEPWZiOgABRUBmN6NNKOsBU3mTh8ag_8gAAkwCAALKAwYLElZjg2wiVFIjBA')

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_help = types.KeyboardButton("Начать")
    button_start = types.KeyboardButton("Помощь")

    markup.add(button_help, button_start)

    # sending message
    bot.send_message(message.chat.id,
                     "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>, бот который поможет тебе узнать погоду в твоём городе.".format(
                         message.from_user, bot.get_me()), parse_mode='html', reply_markup=markup)

# getting messages and replying them
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == "Начать":

        city_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        button_moscow = types.KeyboardButton("Москва")
        button_spb = types.KeyboardButton("Санкт-Петербург")
        button_novosibirsk = types.KeyboardButton("Новосибирск")
        button_yekateriburg = types.KeyboardButton("Екатеринбург")
        button_kazan = types.KeyboardButton("Казань")
        button_nizhnynovgorod = types.KeyboardButton("Нижный Новгород")
        button_chelyabinsk = types.KeyboardButton("Челябинск")
        button_other = types.KeyboardButton("Другой город")

        city_markup.add(button_moscow, button_spb, button_novosibirsk, button_yekateriburg, button_kazan,
                        button_nizhnynovgorod, button_chelyabinsk, button_other)

        bot.send_message(message.chat.id,
                         "Выбери свой город:", reply_markup=city_markup)
        bot.register_next_step_handler(message, group_number)

    elif message.text == "Помощь":
        bot.send_message(message.chat.id,
                         "Нажми кнопку <b>\'Начать\'</b> и выбери один из предложенных городов. \nЕсли твоего города нет в списке, нажми <b>\'Другой город\'</b>. \nПодтверди название города.\nБот выдаст тебе погоду в твоём городе.\n<b>Создатель: Батиев Ростислав</b>",
                         parse_mode='html')

def group_number(message):
    global city
    city = message.text

    answer_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_yes = types.KeyboardButton("Да")
    button_no = types.KeyboardButton("Нет")

    answer_markup.add(button_yes, button_no)
    print("here2")
    if city == "Другой город":
        bot.send_message(message.chat.id, "Введите название Вашего города:", parse_mode='html',
                         reply_markup=types.ReplyKeyboardRemove())
        bot.register_next_step_handler(message, another_city)

    else:
        bot.send_message(message.chat.id, "Ваш город - {}, верно?".format(city), parse_mode='html',
                         reply_markup=answer_markup)
######################################################
        bot.register_next_step_handler(message, city2)

def city2(message):
######################################################
    global answer
    answer = message.text

    city_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_moscow = types.KeyboardButton("Москва")
    button_spb = types.KeyboardButton("Санкт-Петербург")
    button_novosibirsk = types.KeyboardButton("Новосибирск")
    button_yekateriburg = types.KeyboardButton("Екатеринбург")
    button_kazan = types.KeyboardButton("Казань")
    button_nizhnynovgorod = types.KeyboardButton("Нижный Новгород")
    button_chelyabinsk = types.KeyboardButton("Челябинск")
    button_other = types.KeyboardButton("Другой город")

    city_markup.add(button_moscow, button_spb, button_novosibirsk, button_yekateriburg, button_kazan,
                    button_nizhnynovgorod, button_chelyabinsk, button_other)
    if answer == "Да":

        bot.send_message(message.chat.id, "Погода в вашем городе:\n", parse_mode='html', reply_markup=base_markup)
        bot.register_next_step_handler(message, get_text_messages)
    else:
        bot.send_message(message.chat.id,
                         "Выбери свой город:", reply_markup=city_markup)
        bot.register_next_step_handler(message, group_number)

def another_city(message):
    city = message.text

    answer_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_yes = types.KeyboardButton("Да")
    button_no = types.KeyboardButton("Нет")

    answer_markup.add(button_yes, button_no)
    bot.send_message(message.chat.id, "Ваш город - {}, верно?".format(city), parse_mode='html',
                     reply_markup=answer_markup)
    bot.register_next_step_handler(message, city)

# checking if messages were sent to bot
bot.polling(none_stop=True, interval=0)


Как сделать отдельный поток для интерфейса?
У меня есть программа которая работает перебором и сравнением с помощью цикла. Я сделал ей интерфейс и когда в интерфейса нажимаю запустить - она зависает при любом клике. Как сделать несколько потоков в такой программе?
Интерфейс на pysimpleGui
<code>
import string
import PySimpleGUI as sg
from numba import njit, prange
import time

string.digits + string.ascii_letters + string.punctuation + string.digits
alph = string.ascii_uppercase

def decrypt(message, key):
    return algo(message, key, -1)

def algo(text, k, op):
    k *= len(text) // len(k) + 1
    return ''.join(alph[alph.index(j) + int(k[i]) * op] for i, j in enumerate(text))

def encrypt(message, key):
    return algo(message, key, 1)

f = open('words.txt')
dictionary = f.readlines()

duplicate_wordss = []
dictionary = set(word.strip().lower() for word in dictionary)

def brute(word_decode):
    for x in prange(10000000):
        s = decrypt(word_decode.upper(), str(x))
        if s.lower() in dictionary:

            for i in duplicate_wordss:
                if i == s.lower(): break
            else:
                duplicate_wordss.append(s.lower())
                print(s + ' Key - ' + str(x))

def start(word):
    cur_time = time.time()
    brute(word)
    end_time = time.time()
    total_time = end_time - cur_time
    print('Time: ' + str(total_time))
    f.close()

def main():
    layout = [[sg.Text('Enter your text')],
              [sg.Input(key='_IN_')],  # input field where you'll type command
              [sg.Output(size=(60, 15))],  # an output area where all print output will go
              [sg.Button('Decrypt'), sg.Button('Exit')]]  # a couple of buttons

    window = sg.Window('Gronsfeld cipher - auto decryptor', layout)
    while True:  # Event Loop
        event, values = window.Read()
        if event in (None, 'Exit'):  # checks if user wants to
            exit
            break

        if event == 'Decrypt':  # the two lines of code needed to get button and run command
            # runCommand(cmd=values['_IN_'], window=window)
            word_decode = values['_IN_']
            start(word_decode)

    window.Close()

if __name__ == '__main__':
    main()
</code>

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

import string
import PySimpleGUI as sg
from numba import njit, prange
import time
import threading

string.digits + string.ascii_letters + string.punctuation + string.digits
alph = string.ascii_uppercase

def decrypt(message, key):
    return algo(message, key, -1)

def algo(text, k, op):
    k *= len(text) // len(k) + 1
    return ''.join(alph[alph.index(j) + int(k[i]) * op] for i, j in enumerate(text))

def encrypt(message, key):
    return algo(message, key, 1)

f = open('words.txt')
dictionary = f.readlines()

duplicate_wordss = []
dictionary = set(word.strip().lower() for word in dictionary)

def brute(word_decode):
    for x in prange(10000000):
        s = decrypt(word_decode.upper(), str(x))
        if s.lower() in dictionary:

            for i in duplicate_wordss:
                if i == s.lower(): break
            else:
                duplicate_wordss.append(s.lower())
                print(s + ' Key - ' + str(x))

def start(word):
    cur_time = time.time()
    t = threading.Thread(target=brute, args=(word,))
    t.start()

    end_time = time.time()
    total_time = end_time - cur_time
    print('Time: ' + str(total_time))
    f.close()

def main():
    layout = [[sg.Text('Enter your text')],
              [sg.Input(key='_IN_')],  # input field where you'll type command
              [sg.Output(size=(60, 15))],  # an output area where all print output will go
              [sg.Button('Decrypt'), sg.Button('Exit')]]  # a couple of buttons

    window = sg.Window('Gronsfeld cipher - auto decryptor', layout)
    while True:  # Event Loop
        event, values = window.Read()
        if event in (None, 'Exit'):  # checks if user wants to
            exit
            break

        if event == 'Decrypt':  # the two lines of code needed to get button and run command
            # runCommand(cmd=values['_IN_'], window=window)
            word_decode = values['_IN_']
            t = threading.Thread(target=start, args=(word_decode,))
            t.start()
            # start(word_decode)

    window.Close()

if __name__ == '__main__':
    main()


Невозможно импортировать имя MutableseSequeSace
Пытаюсь собрать программу. При компиляции Python файла выдает такую интересную ошибку:

ImportError: cannot import name 'MutableSequence' from 'collections'

Искал решение, успех был обречен на провал. Возникает такой конфликт при импорте библиотеки messages. Откат версии модуля не решил проблему, изменение версии Python тоже. Ниже прикрепил полный лог, в котором произошла ошибка. Пытался импортировать данную функцию из библиотеки collections.abc, но это не помогло. Код программы можно найти здесь. Заранее огромное спасибо за ответ.
Полный лог ошибки:

Traceback (most recent call last):
  File "D:\Desktop-App\tools\build_all.py", line 40, in <module>
    import base.utils as utl
  File "D:\Desktop-App\tools\base\utils.py", line 15, in <module>
    import messages as msg
  File "D:\Python\lib\site-packages\messages\__init__.py", line 7, in <module>
    from .api import send
  File "D:\Python\lib\site-packages\messages\api.py", line 3, in <module>
    from .email_ import Email
  File "D:\Python\lib\site-packages\messages\email_.py", line 15, in <module>
    from ._config import check_config_file
  File "D:\Python\lib\site-packages\messages\_config.py", line 8, in <module>
    from collections import MutableSequence
ImportError: cannot import name 'MutableSequence' from 'collections' (D:\Python\lib\collections\__init__.py)

В документации пишут, что с версии питона
3.3
MutableSequence переехало из
collections в
collections.abc. Попробуйте исправить импорт прямо в
messages\_config.py, если нет возможности посвежее этот
messages поставить, чтобы он был совместим с питоном версии
3.3 или выше.


Как задать Индивидуальные переменные для каждого пользователя в боте?
Вот эти переменные

type.key = random.choice(list(type.words.keys()))
type.length = "-"*len(type.key)
type.wrong = 0
type.used = []

Весь код
Bot.py

logging.basicConfig(level = logging.INFO)

storeg = MemoryStorage()

bot = Bot(token=config.TOKEN, parse_mode="HTML")
dp = Dispatcher(bot, storage=storeg)

class Test(StatesGroup):
    Q1 = State()

@dp.message_handler(commands=['start'],state=None)
async def start_game(message: types.Message):
    type.key = random.choice(list(type.words.keys()))
    type.length = "-"*len(type.key)
    type.wrong = 0
    type.used = []

    await bot.send_message(message.from_user.id,
        fmt.text(
        fmt.text('ДОБРО ПОЖАЛОВАТЬ В ИГРУ ВИСЕЛЬНИЦА!!!'),
        fmt.text('======================='),
        fmt.text('Вы использовали эти буквы:', *type.used),
        fmt.text("Ошибок:", fmt.hbold(type.wrong)),
        fmt.text('======================='),
        fmt.text('Загадака звучит так:', type.words[type.key]),
        sep="\n"
    ), parse_mode="HTML")

    await bot.send_message(message.from_user.id, fmt.text('Слово:', type.length))
    await bot.send_message(message.from_user.id, 'Напишите "Отмена", если перехотели играть')
    await bot.send_message(message.from_user.id, 'Введите букву или слово')

    type.input_let_id.clear()
    type.bot_id.clear()

    await Test.Q1.set()

@dp.message_handler(state=Test.Q1)

async def game(message: types.Message, state: FSMContext):
    try:
        answer = message.text.upper()

        await state.update_data(Q1 = answer)

        if answer == type.key:
            type.length = type.key

        if answer in type.key:
            new = ""
            type.used.append(answer)

            for i in range(len(type.key)):
                if answer == type.key[i]:
                    new += answer
                else:
                    new += type.length[i]

            type.length = new

            if type.length == type.key:
                await bot.send_message(message.from_user.id, fmt.text("Вы победили!!! Загаданное слово было:", type.key))
                await state.finish()

                for i in type.bot_id:
                    await bot.delete_message(message.chat.id, i)

                for i in type.input_let_id:
                    await bot.delete_message(message.chat.id, i)

        elif answer != 'ОТМЕНА':
            type.used.append(answer)
            type.wrong += 1
            await bot.send_message(message.from_user.id, HANGMAN[type.wrong])

        if type.wrong == len(HANGMAN) - 1:
            await bot.send_message(message.from_user.id, fmt.text('Вас повесили :('))
            await bot.send_message(message.from_user.id, fmt.text('загаданное слово было:', type.key))

            await state.finish()

            for i in type.bot_id:
                    await bot.delete_message(message.chat.id, i)

            for i in type.input_let_id:
                await bot.delete_message(message.chat.id, i)

        elif type.wrong != len(HANGMAN) - 1 and type.length != type.key and answer != 'ОТМЕНА':

            msg = await bot.send_message(message.from_user.id,
                fmt.text(
                fmt.text('Вы использовали эти буквы:', *type.used),
                fmt.text("Ошибок:", fmt.hbold(type.wrong)),
                fmt.text('======================='),
                fmt.text('Загадака звучит так:', type.words[type.key]),
                fmt.text('======================='),
                fmt.text('Слово:', type.length),
                sep="\n"
            ), parse_mode="HTML")

            input_let = await message.answer('Введите букву')

            type.bot_id.append(msg.message_id)
            type.bot_id.append(input_let.message_id)

        elif answer == 'ОТМЕНА':
            await bot.send_message(message.from_user.id,'Досвидание!')
            await state.finish()

    except:
        asyncio.sleep(0.1)

@dp.message_handler()
async def set_default_commands(dp):
    await dp.bot.set_my_commands([
        types.BotCommand("start", "Начать игру"),
    ])

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

type.py

import random

words = {"УРОКИ":"Что можно приготовить, но нельзя съесть?",
        "ШАХМАТИСТ":"Кто ходит сидя?",
        "ДВЕРЬ":"Кто приходит, кто уходит, все ее за ручку водят.",
        "ДОРОГА":"Если б встала, до неба достала б.",
        "ДЕНЬ":"К вечеру умирает, по утру оживает.",
        "РАДИО":"В Москве говорят, а у нас слышно.",
        "ВРЕМЯ":"Без ног и без крыльев оно, быстро летит, не догонишь его.",
        "ТУАЛЕТНАЯ":"Самая популярная бумага",
        "СЕКРЕТОМ":"Чем можно поделиться только один раз?"}

key = random.choice(list(words.keys()))
length = "-"*len(key)
wrong = 0
used = []
bot_id = []
input_let_id = []

Можно использовать
state: FSMContext как в примере:

from aiogram.dispatcher import FSMContext
from aiogram import types

@dp.message_handler(commands=['start'],state=None)
async def start_game(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        ... # code with setting type_ variable
        data["type"] = type_
    ... # other your code


Фильтрация таблицы по условиям
Имеется следующая таблица

df = pd.DataFrame({'class1': ['a', 'b', 'c', 'a', 'a', 'c', 'a'],
                   'class2': ['y', 'x', 'z', 'w', 'y', 'x', 'z']})
df

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

df['class1'].value_counts().loc[lambda x: x < 2]
df['class2'].value_counts().loc[lambda x: x < 2]

Oжидаемый результат

res = pd.DataFrame({'class1': ['a', 'c', 'a', 'c', 'a'],
                   'class2': ['y', 'z', 'y', 'x', 'z']})
res

Ну вот прямо "в лоб" решение. Возможно, можно и как-то короче записать было бы:

i1 = df['class1'].value_counts().loc[lambda x: x < 2].index
i2 = df['class2'].value_counts().loc[lambda x: x < 2].index

res = df.loc[~((df['class1'].isin(i1)) | (df['class2'].isin(i2)))]
res

Вывод:

class1  class2
0   a   y
2   c   z
4   a   y
5   c   x
6   a   z


Найти наибольшее значение в словаре
Всем привет.
Нужна помощь по поиску ключей с наибольшей датой в словаре.
Есть словарь ftp_json. Ключ это название файла, значение - дата {'rayon.arj': 'Jan-18-2007', 'RCLOSE.arj': 'Jun-23-2005', 'REAL.arj': 'Jun-23-2005', 'REASON.ARJ': 'Jan-29-2021', 'REGFAULT.arj': 'Oct-26-2015', 'ROS.ARJ': 'Nov-25-2019', 'ROSINKAS.ARJ': 'Feb-22-2022',...}. Он очень большой, там около 3000 ключей.
В этом словаре мне нужны ключи соответствующие названиям, которые хранятся в списке daily_updated. Причем, значения в словаре ftp_json представляют собой название + дата(mmdd) (kgrd0112, cvhd0522 и т.д).

daily_updated = ('kgrd', 'cvhd', 'metd')

for sprav in daily_updated:
    for arc_name, arc_date in ftp_json.items():
        arc_name = arc_name.lower()
        dateFormat = '%b-%d-%Y'
        rc_date = dt.strptime(arc_date, dateFormat)

Итого:

daily_updated = ('kgrd', 'cvhd', 'metd')

ftp_json = {'kgrd0118.arj': 'Jan-18-2007',
 'kgrd0623.arj': 'Jun-23-2005',
 'kgrd0624.arj': 'Jun-24-2005',
 'cvhd0629.ARJ': 'Jan-29-2021',
 'cvhd1026.arj': 'Oct-26-2015',
 'cvhd1125.ARJ': 'Nov-25-2019',
 'cvhd0222.ARJ': 'Feb-22-2022',
 'metd0228.ARJ': 'Feb-28-2022',
 'metd0321.ARJ': 'Mar-26-2021',
}

result = ['kgrd0118.arj', 'cvhd0222.arj', 'metd0228.ARJ']

Сколько есть масок в списке daily_updated , столько и результатов хочу получить.

первое, что приходит в голову - это использовать модуль pandas:

import pandas as pd

ftp_json = {'kgrd0118.arj': 'Jan-18-2007',
            'kgrd0623.arj': 'Jun-23-2005',
            'kgrd0624.arj': 'Jun-24-2005',
            'cvhd0629.ARJ': 'Jan-29-2021',
            'cvhd1026.arj': 'Oct-26-2015',
            'cvhd1125.ARJ': 'Nov-25-2019',
            'cvhd0222.ARJ': 'Feb-22-2022',
            'metd0228.ARJ': 'Feb-28-2022',
            'metd0321.ARJ': 'Mar-26-2021'}

daily_updated = ('kgrd', 'cvhd', 'metd')

df = pd.DataFrame(ftp_json.items(), columns=['key','value'])
result = (df.groupby(df['key'].apply(lambda x: next(i for i in daily_updated if i in x))).
          apply(lambda x: df.loc[pd.to_datetime(x['value']).idxmax(),'key'])).tolist()

print(result)
'''
['cvhd0222.ARJ', 'kgrd0118.arj', 'metd0228.ARJ']

upd
а впрочем можно обойтись и без pandas:

from itertools import groupby
from datetime import datetime as dt

result = [max(g, key=lambda y: dt.strptime(y[1],'%b-%d-%Y'))[0]
          for _,g in groupby(ftp_json.items(),
                             lambda x: next(i for i in daily_updated if i in x[0]))]


Ошибка "IndexError: list index out of range" при нулевом индексе

def sort(list):
    x = list[0]
    less = []
    more = []
    if len(list) < 2:
        return list
    else:
        sort_list = [x]
        for i in list:
            if i < x:
                less.append(i)
            else:
                more.append(i)
        sort(less)
        sort(more)
        sort_list.append(more)
        sort_list.insert(0, less)
        return sort_list

sort([1, 2, 3])

Я попробовал написать свою функцию сортировки основанную на алгоритме быстрой сортировки. Но появляется ошибка:

Traceback (most recent call last):
  File "D:\Coding\Projects\1code.py", line 21, in <module>
    sort([1, 2, 3])
  File "D:\Coding\Projects\1code.py", line 14, in sort
    sort(less)
  File "D:\Coding\Projects\1code.py", line 2, in sort
    x = list[0]
IndexError: list index out of range

Как объект под нулевым индексом может отсутствовать?

Во-первых не стоит использовать зарезервированные в python слова в качестве имён самописных функций и имён параметров (list, sort).
Во-вторых данная ошибка вполне может возникать когда список пустой. В Вашем случае функция рекурсивная и Вы сначала делаете так -
less = [] , а потом ниже делаете так -
sort(less).
В цикле:

for i in list:
    if i < x:
        less.append(i)
    else:
        more.append(i)

3 раза заходит в ветку с
more.append, и список less остаётся пустой. И вы его передаёте в sort(), где пытаетесь обратиться к нулевому элементу, которого нет.


Админ панель для телеграм бота с обратной связью
Подскажите пожалуйста как реализовать панель для админа?Админ получает сообщение от пользователей бота.
P.s Пишите по обширный т.к я в python не особо разбираюсь.

Чтобы отправить сообщение нужно просто сделать
bot.send_message(chat_id=айдишник_юзера_который_является_админм, text="текст")
Пример кода

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage

from data import config

bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

ADMIN_CHAT_ID = 1234567

@dp.message_handler()
async def send_to_admin(message: types.Message):
    await bot.send_message(chat_id=ADMIN_CHAT_ID, text="Сообщение для админа")

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


Получение названия запускаемого файла Python
Как можно получить название файла который запускается?
Допустим есть файл main.py затем мы его запускаем и код возвращает название файла (: main.py).
Потом файл переименовывается в non.py и так же возвращение (: non.py)
Беглый поиск по гуглу не дал четкого ответа :c

<code>
import sys
print(sys.argv[0].split('\\')[-1:][0])
</code>
Спасибо.


Прибавить к отправленному времени определенное кол-во часов (discord)
Пытаюсь написать бота который к отправленному времени прибавит заранее написанное время. Например:
Test 18:00 и после этого бот прибавляет 3 часа и отправляет это в чат т.е Test 18:00 - 21:00.
<code>
@bot.command()
async def Test (ctx, amount=1):
    await ctx.channel.purge(limit=amount)
    author = ctx.message.author
    await ctx.send(f'Test  {} - {p}')
p = datetime.timezone(datetime.timedelta(hours=6))
def get_time(p):
    return datetime.datetime.now(p).time().replace(microsecond=0)
</code>

Если я вас правильно понял, то идёт текущее время, потом новое и всё в одной строке
<code>
@bot.command()
async def Test (ctx, time_: str):
    current_datetime = None
    try:
        current_datetime = datetime.strptime(time_, '%H:%M')
    except ValueError:
        return await ctx.send(f"{ctx.author.mention} Вы неверно указали время. Пример: 15:00")
    new_datetime = current_datetime + datetime.timedelta(hours=6)
    await ctx.send(f'Test  {current_datetime} - {new_datetime}')
</code>


Python async function
3дрaвствyйте, начал читать про асинхронность, но возник вопрос.
В первом случаем мне нужно запустить 2 цикла в разных потоках, во втором нужно получить
return асинхронной функции.

import asyncio

async def test():
    while True:
        print(0)
        await asyncio.sleep(1)

async def main():
    asyncio.ensure_future(test())
    while True:
        print(1)
        await asyncio.sleep(1)

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

Код выше запустит 2 цикла в разных потоках, но через
asyncio.ensure_future() нельзя получить
return, то есть следующий код не сработает.

import asyncio

async def test():
    return 1

async def main():
    print( asyncio.ensure_future(test()))

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

Поэтому я ищу функцию которая сможет запустить функцию в отдельном потоке, как
asyncio.ensure_future() но что бы можно было получить
return от функции

Чтобы получить результат работы асинхронной функции, используйте
await:

async def main():
    print(await asyncio.ensure_future(test()))
          ^^^^^

Вывод:

1

Вы получаете из асинхронной функции задачу
Task, чтобы дождаться результата её работы и получить результат нужен
await.
Вы так и делаете в первом примере кода, просто вас там не интересует результат работы функций, а только их завершение. Но
await используется в обоих случаях - и когда нужно просто вызвать асинхронную функцию, и когда от неё нужно получить результат.
P.S. Попробовал в Google Colab, а вроде даже и так работает:

print(await test())


Отфильтровать NaNы через условие
При подсчете p-значения на выводе
nan

xbox_one = df[(df['platform'] == 'XOne') & (df['user_score'] != np.nan)]['user_score']

Это происходит из-за того, что присутсвуют NaNы. При такой фильтрации (см.выше) все равно в итоге
nan. Как можно еще отфильтровать NaNы?

df['user_score'] != np.nan

NA - это специальное значение, которое нельзя проверять через "равно" или "не равно". Его нужно проверять функцией
isna, ну и ещё нужно сделать отрицание условия с помощью
~, чтобы получилось "не равно":

~df['user_score'].isna()


Как при инициализации класса передать аргументом этот же класс?
Хочу сделать тип данных, в котором используется этот же тип данных.
<code>
class Message:
    def __init__(self, text: Message):
        self.text = text
</code>
Такой код не хочет работать, есть ли какое-то решение?

Сейчас этот код вызывает исключение
NameError. Так происходит потому, что Вы пытаетесь обратиться к типу
Message. Но тип
Message ещё не объявлен. Избежать ошибки можно, передав имя класса строкой:

class Message:
    def __init__(self, text: 'Message'):
        self.text = text

Но есть одна проблема — как Вы создадите первый экземпляр класса, если для его инициализации нужен другой экземпляр этого же класса? Предлагаю сделать параметр
text необязательным:

class Message:
    def __init__(self, text: 'Message'=None):
        if text is not None:
            self.text = text

message1 = Message()
message2 = Message(message1)


Поиск наиболее выраженных локальных максимумов в столбце данных
Задача
В столбце данных y1 около 100 тысяч строк. найти локальные максимумы, которые удовлетворяют условию: элемент y1[i] больше каждого из n1 предыдущих и каждого из n2 последующих элементов. По итогу вывести все значения i для которых это условие выполняется. Отмечу, что максимумов может быть большое количество, обычно их не менее 4-7 штук.
Для варианта сравнения с одним предыдущим и одним последующим элементом (n1 = n2 = 1) проблем не возникло:
<code>
max_y = []
for i in range(1, len(y1)-1):
    if y1[i] > y1[i-1] and y1[i] > y1[i+1]:
        max_y.append(i)
</code>
Теперь как это масштабировать для n1 и n2 значений? Частный случай n1 = n2 = 100.

Я так понимаю это учебная задача, но если допустимо использовать срезы и функцию max, то могу предложить такой способ.
<code>
a = [3,5,2,4,8,6,5,1,2,10,3,4,6]
n1 = 3
n2 = 3
for i in range(n1, len(a) - n2):
    if a[i] > (max(a[i - n1:i])) and a[i] > (max(a[i - i:n2])):
       print(a[i])
</code>
В моем списке два локальных максимума подходящих под условие 8 и 10. Как видим решение работает.


Pygame не понимает символ переноса строки \n
Сделал скрипт для pygame, чтобы строка переносилась, если количество символов в строке делится по модулю на end (максимальное количество символов на строку):

def print_text(message, x, y, end=0, font_color=(255, 255, 255), font_type='media/FiraSans-Italic.ttf', font_size=30):
    pygame.font.init()
    if end > 1:
        words = []
        for i in message:
            words.append(i)
            if len(words) % end == 0:
                words.append("\n")
        message = "".join(words)
        print(message)
    font_type = pygame.font.Font(font_type, font_size)
    text = font_type.render(message, True, font_color)
    screen.blit(text, (x, y))

Но на выходе получаю вместо переноса строки только этот символ -
⍰, на месте вставляемого
"\n"

def text(x, y, color, size, text, w):
    a = {}
    n = int(((w - x)/size)/0.45)
    k = int((len(text)//n))
    font = pg.font.Font(None, size)
    for i in range(0, k + 1):
        f = str()
        if i == 0:
            for m in range(0, len(text)):
                if m < n:
                    f += text[m]
        else:
            for m in range(n * i, len(text) - (k * i)):
                if m < (n*(i + 1)):
                    f += text[m]
        text1 = font.render(f, True, color)
        sc.blit(text1, (x, y))
        y += (0.5 * size)
    pg.display.update()


Telebot Python нужно создать функцию для handler
Безопасность банка
Саша создал телеграм бота для банка, чтобы предупреждать пользователей о злоумышленниках, при отправке данных карт, и удалять сообщение с данными. Если пользователь отправил одно из "ключевых" слов, то, возможно, в сообщении есть данные от банковской карты. Помогите Саше написать функцию findkeywords, которую он вставит в @bot.message_handler(), чтобы проверять сообщения на ключевые слова и удалять сообщения с данными от карт.
Что вам нужно сделать:
Функция должна выводить True если слова есть и False если их нет.
Функция не должна быть зависимой от регистра

По-видимому, как-то так. Здесь
message_text нужно вытащить из сообщения, которое прислал боту пользователь.

words = ['безопасность', 'карта', 'номер', 'счёт']
message_text = 'Здравствуйте! Нас интересует Ваша безопасность. Продектуйте, пожалуйста НоМер счёТА.'
text = message_text.lower()

for word in words:
    if word in text:
        return True

return False


как с помощью лямбда функций определить целое число
Напишите функцию is_num, используя синтаксис анонимных функций, которая принимает строковый аргумент и возвращает значение True, если переданный аргумент является числом (целым или вещественным) и False в противном случае.

a = lambda x: (x.replace('.', '', 1).replace('-', '', 1)).isnumeric()

print(a('-123.77'))

replace: проверяем есть ли отрицательные и дробные числа. И приводим их в целые и положительные.

b = lambda x: (x.replace('.', '', 1).replace('-', '', 1)).isnumeric() if x.find(".") > x.find("-") or x.find(".") == x.find("-")\
    or x.find(".") ==-1 and x.find("-") == 0  else False

print(b('123-'))

еще вариант


Сохранение discord.py
Делаю бота Discord. Увидел в Discord боте "MEE6" создание кастомных команд и соответственно их сохранение, захотел сделать хотя-бы сохранение настроек. В боте есть словарь с серверными настройками, которые можно настраивать с помощью команд.
<code>
configs = {
    'logDM': 939064043740729364,
    'logBot': 937207414623703080,
    'welcomeChannel': 937264634262618122,
    'filtered_words': ['some', 'filtered', 'words']
}
</code>
Моя задача - сделать, чтобы настройки, устанавливаемые боту на сервере, сохранялись и в cfg, т.е. после отключения бота - они не пропадали, однако не представляю реализации этой затеи. Пытался гуглить, но даже гугля, не нашел ответа на свой вопрос, поэтому пришел сюда.

Попробуйте сделать запись конфига в файл!
Вот кусочек кода как это сделать:
<code>
lines = ["one", "two", "three"]
with open(r"D:\Папка\cnf.txt", "w") as file:
for line in lines:
    file.write(line + '\n')
</code>


Как сделать чтоб бот брал рандомно ссылку из "базы"
Вот отрезок кода:
<code>
gifs = ["url", "url", "url", "url", "url"]
gif = random.choice(gifs)
@bot.command()
async def сказать(ctx, *args):
  embed = discord.Embed(description=f"  ".join(args), color=0x8A2BE2)
  embed.set_image(url=gif)
  await ctx.send(embed=embed)
</code>
Код должен выводить сообщение пользователя из команды: "!сказать (текст)" и под ним оставлять гифку из указанных в коде. Мне понятно почему он выводить только первую гифку из списка, но я не понимаю как сделать иначе

Потому, что у вас рандомизация происходить только при запуске, чтобы это решить, необходимо
gif = random.choice(gifs) поместить в команду

gifs = ["url", "url", "url", "url", "url"]
@bot.command()
async def сказать(ctx, *args):
    gif = random.choice(gifs)
    embed = discord.Embed(description=f"  ".join(args), color=0x8A2BE2)
    embed.set_image(url=gif)
    await ctx.send(embed=embed)


Проверка нажатия Inline кнопок. Telebot
Пытаюсь написать бота, который будет отправлять сообщения постоянно, не принимая текстовых сообщений от пользователя,а лишь будет реагировать на нажатия кнопок и команды /start в начале. Как сделать проверку нажатия Inline кнопки, чтобы последующие строки кода не выполнялись до их нажатия? Пробовал разделять код на несколько функций, но в таком случае боту так же приходится принимать какие-то сообщения от пользователя...

button1 = types.InlineKeyboardMarkup(row_width = 1)
item1 = types.InlineKeyboardButton("Какой-то текст", callback_data= "answer1")
item2 = types.InlineKeyboardButton("Какой-то текст", callback_data= "answer2")

button1.add(item1, item2)

bot.send_message(message.chat.id, "Какой-то текст", reply_markup=button1)
sl(1)

#Здесь надо сделать проверку на нажатие перед выполнением
for i, line in enumerate(f):
        if i > 4:
            bot.send_message(message.chat.id, line )
            sl(1)

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

button1 = types.InlineKeyboardMarkup()
item1 = types.InlineKeyboardButton("text", callback_data= "ans1")
button1.add(item1)

bot.send_message(message.chat.id, "text", reply_markup=button1)

button2 = types.InlineKeyboardMarkup()
item2 = types.InlineKeyboardButton("text", callback_data= "ans2")
button2.add(item2)

bot.send_message(message.chat.id, "text", reply_markup=button2)

Ну смотри, тебе не нужны месседж хендлеры если ты не намерен никак получать информацию от юзера в текстовом виде. Чтобы юзать только кобеки нужно передавать в кнопках колбек дату и на основании этого делать определенное поведение бота.
Ну и немного инфы как удобней делать фильтры.
Во первых есть вот эти:
text - колбек дата (или текст сообщения) равны тому что мы указали (text="4toto")
text_startwith - начинается с
text_endswith - заканчивается на
text_containt - имеет внутри то-то
Еще есть колбекдата точнее CallbackData. Это уже более продвинутый тип фильтрации хендлеров. Юзать их постоянно не очень удобно но для некоторых случаев подойдет.
Ну и вот немного кода
<code>
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils.callback_data import CallbackData

from data import config

bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

# cd_action = CallbackData("prefix", "filter")
# фильтров может быть несколько
cd_action = CallbackData("cd_choto_tam", "data")

@dp.message_handler(commands=["start"])
async def start(message: types.Message):
    markup = InlineKeyboardMarkup().add(InlineKeyboardButton("text", callback_data="from_start"))
    await message.answer("text", reply_markup=markup)

@dp.callback_query_handler(text="from_start")
async def callbacl_choto_tam(call: types.CallbackQuery):
    await call.answer()
    await call.message.edit_text(
        "text",
        reply_markup=InlineKeyboardMarkup().add(
            InlineKeyboardButton("text1", callback_data=cd_action.new(data="1")),
            InlineKeyboardButton("text2", callback_data=cd_action.new(data="2"))
        ))

# хендлер принимает только cd_action
# и вроде как и фильтр text_startswith="cd_choto_tam" тоже сработает
# доп инфа
# вот такой хендлер можно использовать для более подробной фильтрации колбек даты
# @dp.callback_query_handler(cd_action.filter(data="1"))
###
# хендлер ниже принимает нажатие кнопок сделаных в хендлере выше
@dp.callback_query_handler(cd_action.filter())
async def callbacl_choto_tam(call: types.CallbackQuery, callback_data: dict):
    await call.answer()
    print(callback_data)
    # {'@': 'cd_choto_tam', 'data': '1'} при нажатии на text1

"""
#Второй вариант

@dp.callback_query_handler(text="from_start")
async def callbacl_choto_tam(call: types.CallbackQuery):
    await call.answer()
    await call.message.edit_text(
        "text",
        reply_markup=InlineKeyboardMarkup().add(
            InlineKeyboardButton("text", callback_data="go_to:1"),
            InlineKeyboardButton("text", callback_data="go_to:2")
        ))

@dp.callback_query_handler(text_startswith="go_to")
async def callbacl_choto_tam(call: types.CallbackQuery):
    await call.answer()
    if call.data.split(":")[1] == "1":
        pass
    else:
        pass
"""

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

</code>


Как выглядит строчка кода, если формат вывода в яндекс. контесте не стандартный, а output.txt
<code>
f = open('input.txt')
lines = f.readlines()
striplines = [line.strip() for line in lines]
n = int(striplines[0])
names = striplines[1:n+1]
dates = striplines[n+1:]
    for i,k in zip(names,dates):
     print(i,k, sep='\t')
f.close()
</code>
Недавно начал изучать python. Не могу понять, как прописать код так, чтобы форматом вывода был output.txt, а не print. Пытался разобраться сам или найти в интернете, но все равно не могу понять.

Ввиду невозможности воспроизвести Ваш код (input.txt Вы не приложили) не совсем понимаю что Вы ожидаете увидеть в output.txt. Отвечаю на вопрос на собственном примере
<code>
lines = [
    '123',
    '456',
    '789'
]

with open('output.txt', 'w', encoding='utf-8') as output:
    for line in lines:
        print(line, file=output)

with open('output2.txt', 'w', encoding='utf-8') as output:
    for line in lines:
        output.write(line + '\n')

with open('output3.txt', 'w', encoding='utf-8') as output:
    output.write('\n'.join(lines))
</code>


Python Pygame падение объекта
Я бы хотел, чтобы у меня в игре в случайном месте появлялся метеорит и падал вниз, создавая проблемы игроку.
Я загрузил картинку метеора

meteor = pygame.image.load('met.jpg')

прописал координаты метеора вначале

x_met = random.randint(0, 900)
y_met = 0

а дальше создал функцию, которую вызываю внутри цикла:

def drawWindow2():
    global y_met

    win.blit(meteor, (x_met, 0))
    while y_met != 300:
        if x_met >= 0:
            y_met += 10
            win.blit(meteor, (x_met, y_met))

    pygame.display.update()

Метеорит мигает (как будто пытается сдвинутся, но ему мешают), но не двигается с места. Что я упустил?

В Pygame есть основной цикл в котором и происходят все события. До смены кадра достаточно переместить ваш метеорит на какое-то расстояние, например y_met += 10, но если вы внутри основного цикла запускаете еще один, который гораздо быстрее, то метеорит "пролетает" весь экран без прорисовки. Вам просто надо убрать цикл while y_met != 300:. Ну и конечно убрать рекурсивный вызов функции.


"GET /static/css/style.css HTTP/1.1" 404 1798
settings.py

# django.contrib.staticfiles включен INSTALLED_APPS.
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'project'
]
# Указание пути
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

information.html

{% load static %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Информация о человеке</title>
    <!-- Определение пути  к папке-->
    <link href="{% static 'css/style.css' %}" rel="stylesheet">
</head>
<body>
    <p>Имя:{{name}},  возраст: {{years}}</p>
</body>
</html>

style.сss

body{
    padding: 0;
    margin: 0;
    color:red;
}

Проблема:

"GET /static/css/style.css HTTP/1.1" 404 1798

Согласно документации по django, необходимо указать в
settings.py папку для обслуживания статических файлов и поместить в переменную
STATIC_ROOT.
Пример:

STATIC_ROOT = os.path.join(BASE_DIR, "static")

Или можно указать другую директорию (из доки)

STATIC_ROOT = "/var/www/example.com/static/"

Далее выполните команду

py manage.py collectstatic

Команда соберет все статические файлы проекта, включая статику
admin панели.
Путь прописанный в переменной
STATIC_ROOT нужно указать в веб-сервере, для обслуживания их.


Почему не виден текст в QGraphicsView? (PyQt5)
Разбираюсь с графической сценой PyQt5. Почему текст не отображается?
<code>
import sys
from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self, parent = None):
        QWidget.__init__(self, parent)

        self.setMinimumSize(600,600)

        sq = QRectF(100,100,100,100)
        obj = QGraphicsScene(sq)

        obj.addText("Привет", font = QFont("8pt MS Reference Sans Serif"))
        obj2 = QGraphicsView(self)
        obj2.setScene(obj)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Window()
    ex.show()
    app.exec_()
</code>

Всё дело в координатах, которые вы неправильно указали:
<code>
import sys
from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setMinimumSize(600, 600)
        ####################################
        obj = QGraphicsScene(0, 0, 100, 100)
        ####################################
        obj.addText("Привет", font=QFont("8pt MS Reference Sans Serif"))
        obj2 = QGraphicsView(self)
        obj2.setScene(obj)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Window()
    ex.show()
    app.exec_()
</code>


Несколько сообщений на одну команду
Попробовал сделать вот так, не работает.

elif message.text == '▫A':
    await bot.send_video(message.chat.id, open('videos/mid.mp4', 'rb'), open('videos/mid2.mp4', 'rb'))

Два
elif на одно сообщение "A" тоже не помогло.

Так а в чем проблема просто сделать два сенд_видео?
<code>
await bot.send_video(message.chat.id, open('videos/mid.mp4', 'rb'))
await bot.send_video(message.chat.id, open('videos/mid2.mp4', 'rb'))
</code>


Как красиво отформатировать python-скрипт, который вызывается в bash скрипте?
У меня есть такой код:
<code>
if [[ $ENABLE_DIND == 1 ]]; then

        python3 <<EOF
import pathlib
import subprocess
import time

path = pathlib.Path('/var/run/docker.sock')
while not path.exists():
  time.sleep(0.01)
try:
  subprocess.call(['chmod', '0666', '/var/run/docker.sock'])
except Exception as e:
  print(e)
EOF

fi;
</code>
Мне не нравится как отформатирована часть, которая вызывает Python-код. Но при этом любые попытки навести красоту, приводят к тому, что bash ругается на синтаксис.

Можно просто оставить и смирится. Форматирование встроенных документов с начала строки — вполне привычная вещь для bash'а.
Можно также использовать
<<- и табами для отбивки отступов:

if [[ $ENABLE_DIND == 1 ]]; then
    python3 <<-EOF
        import pathlib
        import subprocess
        import time

        path = pathlib.Path('/var/run/docker.sock')
        while not path.exists():
          time.sleep(0.01)
        try:
          subprocess.call(['chmod', '0666', '/var/run/docker.sock'])
        except Exception as e:
          print(e)
        EOF
fi

Внимание: здесь отступы встроенного документа должны быть отбиты именно символами табуляции (
\t), а код питона — пробелами. Данное различие на сайте может отображаться некорректно.

Но в данном случае всё это намного проще будет сделать сразу на
bash'е:

if [[ $ENABLE_DIND == 1 ]]; then

  while [ ! -e /var/run/docker.sock ]; do
    sleep 0.01
  done

  chmod 0666 /var/run/docker.sock
fi

Также вместо тупого ожидания файла можно было бы сделать это с помощью чего-то более технологичного вроде
inotify (если дело на linux), но в данном случае это не даст особых преимуществ...
Ещё более правильным решением было бы найти, где почесать ту штуку, которая создаёт этот файл, чтобы она делала это сразу с нужными правами или как-то другим способом настроить права, но это уже будет совсем другая история...


Вывод текста "заборчиком"
Необходимо вывести строку формата *слово*другоеслово* заборчком, т.е. каждая последующая буква в другом регистре (*СлОвО*дРуГоЕсЛоВо*).
Имеется такой код:

text = input("Введите строку: ")
for i in range(len(text)):
    if i % 2 == 0:
        print(text[i].upper(), end="")
    else:
        print(text[i], end="")

Проблема заключается в том, что после символа '*' буква не меняяет своей регистр и получается так:

*СлОвО*ДрУгОеСлОвО*

Как это можно исправить?

import string
text_sample = '*слово*другоеслово*'
i = 0
for simvol in text_sample:
    if simvol in string.punctuation:
        print(simvol, end='')
        continue
    if i % 2 == 0:
        print(simvol.upper(), end='')
    else:
        print(simvol.lower(), end='')
    i += 1


Что значат 2 набора скобок при обращении к классу в python?
Например:

x = layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(x)

Или это:

x = layers.GlobalAveragePooling2D()(x)

Никак не могу понять что это за
(x) передается и чему в конце

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

def func(a):
  def f(x):
    return a+x
  return f

print(func(1)(2))
print(func(42))

Вывод:

3
<function func.<locals>.f at 0x7fafb43a2050>

Как видим,
func(...) возвращает функцию, а
func(...)(...) возвращает результат работы этой функции. В принципе, такие цепочки могут быть и длиннее, чем два звена.


Пару Ошибок а понять не могу Как их исправить [закрыт]

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

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

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

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

 `import cloudinary
from faunadb import query as q
from faunadb.client import FaunaClient
from telegram import (
    ReplyKeyboardRemove, InlineKeyboardButton, InlineKeyboardMarkup
)
from telegram.ext import (
    CallbackContext,
    ConversationHandler
)

from config import (
    api_key, api_secret,
    FAUNA_KEY
)

# configure cloudinary
cloudinary.config(
    cloud_name="curiouspaul",
    api_key=api_key,
    api_secret=api_secret
)
# fauna client config
client = FaunaClient (secret=FAUNA_KEY)
# Define Options
CHOOSING, CLASS_STATE, SME_DETAILS, CHOOSE_PREF, \
SME_CAT, ADD_PRODUCTS, SHOW_STOCKS, POST_VIEW_PRODUCTS = range (8)

def start(update, context: CallbackContext) -> int:
    print ("You called")
    bot = context.bot
    chat_id = update.message.chat.id
    bot.send_message (
        chat_id=chat_id,
        text="Hi fellow, Welcome to SMEbot ,"
             "Please tell me about yourself, "
             "provide your full name, email, and phone number, "
             "separated by comma each e.g: "
             "John Doe, [email protected], +234567897809"
    )
    return CHOOSING

def choose(update, context):
    bot = context.bot
    chat_id = update.message.chat.id

    data = update.message.text.split(',')
    if len(data) < 3 or len(data) > 3:
        bot.send_message(
            chat_id=chat_id,
            text="Invalid entry, please make sure to input the details "
            "as requested in the instructions"
        )
        bot.send_message(
            chat_id=chat_id,
            text="Invalid entry, please make sure to input the details "
            "as requested in the instructions"
        )
        bot.send_message(
             chat_id=chat_id,
             text="Type /start, to restart bot"
        )
        return ConversationHandler.END
     # TODO: Check if user already exists before creating new user
      new_user = client.query(
          q.create(q.collection('User'), {
              "data":{
                  "name":data[0],
                  "email":data[1],
                  "telephone":data[2],
                  "is_smeowner":False,
                  "preference": "",
                  "chat_id":chat_id
              }
          })
      )
      context.user_data["user-id"] = new_user["ref"].id()
      context.user_data["user-name"] = data[0]
      context.user_data['user-data'] = new_user['data']
      reply_keyboard = [
      [
          InlineKeyboardButton(
              text="SME",
              callback_data="SME"
          ),
          InlineKeyboardButton(
              text="Customer",
              callback_data="Customer"
          )
      ]
    ]
    markup = InlineKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
      bot.send_message(
          chat_id=chat_id,
          text="Collected information succesfully!..?? \n"
          "Which of the following do you identify as ?",
          reply_markup=markup
      )
      return CLASS_STATE

def classer(update, context):
    bot = context.bot
    chat_id = update.callback_query.message.chat.id
    name = context.user_data["user-name"]
    if update.callback_query.data.lower() == "sme":
        # update user as smeowner
        client.query(
            q.update(
                q.ref(q.collection("User"), context.user_data["user-id"]),
                {"data": {"is_smeowner":True}}
             )
        )
        bot.send_message(
            chat_id=chat_id,
            text=f"Great! {name}, please tell me about your business, "
            "provide your BrandName, Brand email, Address, and phone number"
            "in that order, each separated by comma(,) each e.g: "
            "JDWears, [email protected], 101-Mike Avenue-Ikeja, +234567897809",
            reply_markup=ReplyKeyboardRemove()
        )
        return SME_DETAILS
    categories = [
        [
            InlineKeyboardButton(
                text="Clothing/Fashion",
                callback_data="Clothing/Fashion"
            ),
            InlineKeyboardButton(
                text="Hardware Accessories",
                callback_data="Hardware Accessories"
            )
        ],
        [
            InlineKeyboardButton(
                text="Food/Kitchen Ware",
                callback_data="Food/Kitchen Ware"
            ),
            InlineKeyboardButton(
                text="ArtnDesign",
                callback_data="ArtnDesign"
            )
        ]
    ]
    bot.send_message(
        chat_id=chat_id,
        text="Here's a list of categories available"
        "Choose one that matches your interest",
        reply_markup=InlineKeyboardMarkup(categories)
    )
    return CHOOSE_PREF

    `import handlers
from telegram.ext import (
    CommandHandler, CallbackContext,
    ConversationHandler, MessageHandler,
    Filters, Updater, CallbackQueryHandler
)
from config import TOKEN
updater = Updater(token=TOKEN, use_context=True)
print(updater)
dispatcher = updater.dispatcher
def main():
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('start', handlers.start)],
        states={
            handlers.CHOOSING: [
                MessageHandler(
                    Filters.all, handlers.choose
                )
            ],
            handlers.CLASS_STATE: [
                CallbackQueryHandler(handlers.classer)
            ]
        },
        fallbacks=[CommandHandler('cancel', handlers.cancel)],
        allow_reentry=True
    )
    dispatcher.add_handler(conv_handler)
    updater.start_polling()
    updater.idle()
if __name__ == '__main__':
    main()`

Вот две Ошибки:line 1, in

import handlers
l
ine 66 new_user = client.query(
^
IndentationError: unindent does not match any outer indentation level
Чем они обоснованны я не могу понять

    if len(data) < 3 or len(data) > 3:
    ^
        ...
        return ConversationHandler.END
        ^
     # TODO: Check if user already exists before creating new user
      new_user = client.query(
    ^ ^ ^
    | | \ позиция return
    | \ позиция new_user
    \ позиция if

Так в Питоне делать нельзя. Комментарии ещё можно сдвигать куда хочешь, хотя это и не желательно, а вот код должен быть либо на той же позиции, что и код выше, либо быть сдвинут на одно и то же число позиций вправо или влево относительно кода выше (либо на число, кратное им, если одновременно закончились несколько блоков кода). А у вас
new_user находится в промежуточной позиции между позициями кода, идущего выше, такое в Питоне не допустимо.
Питон - это язык, где отступы являются не произвольными, а чётко регламентированными.


Необходимо получить изображение, которое прислал пользователь по такому принципу: /команда [фото]. Aiogram
Нужно скачать на диск изображение, которое прислал пользователь с помощью команды. Бот в телеграмме библиотека Aiogram по типу: /команда [фото]. Буду очень признателен объяснениям. Спасибо.

<code>
@dp.message_handler(content_types=['photo'])
async def message_text(message: types.Message):
        await message.photo[-1].download('img/am.jpg')

</code>
После скачивания в консоли появляется сообщение об ошибке, но она ничему не мешает


Как gRPС обрабатывает большое кол-во подключений?
Не нашел нормального объяснения как gRPС обрабатывает большое кол-во одновременных подключений?
Нужно ли перед ним вешать веб сервер nginx и т.п. ? Или он сам выступает как веб сервер?
Нужно ли запускать большое кол-во потоков самому? Или это настраивается на уровне самого сервера gRPС кодом на том языке на котором пишешь?

Наверное, речь идёт о
gRPC.

gRPC сервер при подключении клиента создаёт новый сокет и вешает на него обработчик сообщений. То, как именно работают эти обработчики, зависит от языка программирования.
В
go это горутины, и сам рантайм
go определяет, в каких потоках их выполнять. Соответственно, в
go обработчики нескольких подключений могут работать параллельно.
В
python это пайтоновский потоки, но так как пайтон работает в однопоточном режиме, то их переключение осуществляется внутри рантайма и по факту в каждый момент времени выполняется не более одного такого обработчика.
Краткий ликбез о том, как работают сокеты TCP
Раз у вас есть вопрос про "раздаёт на другие сокеты", то опишу кратенько как работают сервера поверх сокетов.
Сокеты TCP бывают двух видов - серверные и клиентские. Клиентские умеют подключаться к серверным и умеют передавать данные. Серверные сокеты не умеют передавать данные, но зато они могут ждать запросы на подключение от клиентов.
Как происходит подключение клиента к серверу.
На стороне сервера программа выполняет несколько системных вызовов:
bind для связывания сокета с IP адресом и портом, и
listen для переключения в hрежим серверного сокета,
accept для ожидания подключений (в реальности, как правило, несколько сложнее, но для ликбеза несущественно).
Вызов
accept блокируется до тех пор, пока не будет получен запрос на соединение от клиента. Когда клиент подключается, внутри ядра создаётся клиентский сокет для обмена данными с клиентом. Этот сокет прикрепляется к таблице файлов серверного процесса и его файловый дескриптор возвращается в вызове
accept. Этот новосозданный сокет является клиентским, то есть через него можно ожидать данные (
recv) или отправлять данные (
send)
Что происходит дальше.
Все сервера устроены примерно одинаково. Как только
accept где-то в дебрях серверного кода возвращает клиентский сокет, с ним связывается обработчик получаемых данных. Когда в сокет приходят данные от клиента, серверная инфраструктура находит обработчик и вызывает его (здесь я умышленно не пишу про
select/
poll). Так работает
gRPC, так работает web-сервер.
Ограничения
Серверная инфраструктура может накладывать различные ограничения на число подключений и объем трафика.
Во-первых, ядро ОС лимитирует количество файлов, открытых одним процессом. Клиентский сокет с точки зрения ОС - файл, поэтому этот лимит может привести к тому, что
accept вернёт ошибку
too many open files. Я недавно на такое налетел. Забыл поднять через
ulimit предел, и через пару дней работы сервер
gRPC падал именно с этой ошибкой. Накапливалось число открытых файлов
leveldb и в какой-то недетерминированный момент опс - и сервер аварийно завершался.
Во-вторых, библиотека
gRPC, которой вы пользуетесь, может лимитировать число подключений. Если
accept возвращает новый сокет, а число открытых клиентских сокетов уже достигло заданного предела, новый сокет просто закрывается без прикрепления к нему обработчика.
В-третьих, библиотека может накладывать ограничения на число данных, получаемых из сокета. Так как вся работа с сокетами, как правило, инкапсулирована, и обработчик получает уже готовые данные, то для слишком активных сокетов обращение за новыми данными может происходить по таймеру. Скажем, через пару-тройку секунд после завершения обработчика, а не сразу после его завершения.
Первое ограничение смотрите в документации на ОС. В частности в Linux это утилита
ulimit. Второе и третье в документации на библиотеку
gRPC, которой вы пользуетесь.


Как забрать значение InLine кнопки и чтобы записать в FSM
<code>
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram import types, Dispatcher
from TelegramBot.create_bot import bot
from TelegramBot.sqlRequests import SqlRequests as mSql
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

class FSMSearchArticle(StatesGroup):
    searchArticle = State()
    brandID = State()

# @dp.message_handler(commands=['search_article'], state=None)
async def start_search_article(message: types.Message):
    await FSMSearchArticle.searchArticle.set()
    await bot.send_message(message.from_user.id, "🔎 Введите номер запчасти")
    await message.delete()

# @dp.message_handler(state=FSMSearchArticle.searchArticle)
async def load_search_article(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['s_article'] = message.text
        nor = mSql.number_of_results(message.text)
        article_result = mSql.search_by_article(message.text)
        if nor == 0:
            await state.finish()
            await message.reply(" ❌ Жаль, но я не знаю номер: " + message.text + "\n\n")
        elif nor == 1:
            await state.finish()
            result = ('🎯\nАртикул:  ' + str(article_result[0][1]) + '\n'
                      + 'Бренд:  ' + str(article_result[0][3]) + '\n'
                      + 'Наименование:  ' + str(article_result[0][4]))
            await bot.send_message(message.chat.id, result)
        else:
            brand_inline_keyboard = InlineKeyboardMarkup()
            for i in article_result:
                brand_inline_keyboard.add(InlineKeyboardButton(text=i[3], callback_data=i[2]))
            await FSMSearchArticle.next()
            await bot.send_message(message.from_user.id, "Данный артикул присутствует в нескольких брендах!\n\n"
                                                         "👇 Пожалуйста выберете необходимый бренд.",
                                   reply_markup=brand_inline_keyboard)

# @dp.callback_query_handler(text="text")
async def load_brand(callback_query: types.CallbackQuery, state: FSMContext):
    async with state.proxy() as data:
        data["brand_id"] = callback_query.data

        print(data)

        await bot.send_message('результат !!!!! ДОПИСАТЬ')
        await state.finish()

def register_handlers_client_search_article(dp: Dispatcher):
    dp.register_message_handler(start_search_article, commands=['search_article'])
    dp.register_message_handler(load_search_article, state=FSMSearchArticle.searchArticle)
    dp.register_message_handler(load_brand, text="text")
</code>
Не понимаю как написать следующий handler, чтобы callback_data была записана в FSM.

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

@dp.callback_query_handler(text="text")
async def echos(callback_query: CallbackQuery, state: FSMContext):
    async with state.proxy() as data:
        data["data_callback"] = callback_query.data

UPD1. Ааа, ты так занимаешься этими извращениями с регистрацией хендлеров? Тогда понятно.
Ну смотри, меняй вот это

dp.register_message_handler(load_brand, text="text") на вот это
 dp.register_callback_handler(load_brand, text="text").
А ещё лучше будет полный отказ от регистрации хедлеров таким способом. Просто сделай пакет с инитом, который импортирует разбитые по папкам модули с хендлерами внутри и вот этот пакет импортируй в основном файле. В PyCharm'е он будет выделяться серым так как не используется, но он свою задачу сделал, он зарегистрировал их и они будут работать, главное не забывать импортировать новые модули в ините.
UPD2. Ну так само собой он не будет срабатывать ведь в
@dp.callback_query_handler(text="text") нужно заменить "text" на ту колбек дату которую возвращает тебе инлайн кнопка. К примеру можно вот так.

# @dp.message_handler(state=FSMSearchArticle.searchArticle)
async def load_search_article(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['s_article'] = message.text
        nor = mSql.number_of_results(message.text)
        article_result = mSql.search_by_article(message.text)
        if nor == 0:
            await state.finish()
            await message.reply(" ❌ Жаль, но я не знаю номер: " + message.text + "\n\n")
        elif nor == 1:
            await state.finish()
            result = ('🎯\nАртикул:  ' + str(article_result[0][1]) + '\n'
                      + 'Бренд:  ' + str(article_result[0][3]) + '\n'
                      + 'Наименование:  ' + str(article_result[0][4]))
            await bot.send_message(message.chat.id, result)
        else:
            brand_inline_keyboard = InlineKeyboardMarkup()
            for i in article_result:
                brand_inline_keyboard.add(InlineKeyboardButton(text=i[3], callback_data=f"load_search:{i[2]}"))
            await FSMSearchArticle.next()
            await bot.send_message(message.from_user.id, "Данный артикул присутствует в нескольких брендах!\n\n"
                                                         "👇 Пожалуйста выберете необходимый бренд.",
                                   reply_markup=brand_inline_keyboard)

# @dp.callback_query_handler(text_startswith="load_search:")
async def load_brand(callback_query: types.CallbackQuery, state: FSMContext):
    async with state.proxy() as data:
        data["brand_id"] = callback_query.data.split(":")[1]

        print(data)

        await bot.send_message('результат !!!!! ДОПИСАТЬ')
        await state.finish()


Преобразование списка [ [,],[,],[,] ] в [,,,]
В списке ниже, вторые значения [ ,эти] следуют друг за другом на основе первых значение [эти, ] - 4,4,4,5,5,5,7,7,7,8,8,8 (может быть больше).
Как можно получить новый список (new_l) в измененном порядке первых значений 4,5,7,8,4,5,7,8,4,5,7,8 а потом и вовсе их убрать? [убрать эти, ]

l = [[4, -2],
 [4, -1],
 [4, 2],
 [5, -1],
 [5, 1],
 [5, 2],
 [7, 2],
 [7, 1],
 [7, 1],
 [8, 2],
 [8, 2],
 [8, 1]]

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

l = [[4, -2],
 [5, -1],
 [7, 2],
 [8, 2],
 [4, -1],
 [5, 1],
 [7, 1],
 [8, 2],
 [4, 2],
 [5, 2],
 [7, 1],
 [8, 1]]

Получаем итоговый вариант удаляя ненужные первые значения:

new_l = [-2,-1,2,2,-1,1,1,2,2,2,1,1]

<code>
from copy import deepcopy

l = [
    [4, -2],
    [4, -1],
    [4, 2],
    [5, -1],
    [5, 1],
    [5, 2],
    [7, 2],
    [7, 1],
    [7, 1],
    [8, 2],
    [8, 2],
    [8, 1]
]

def re_sort(array: list) -> list:
    work_array = deepcopy(array)  # делаем копию списка, то бы не изменять исходный
    last_value = None             # запоминаем последнее значение
    while any(work_array):        # работаем пока есть не пустые элементы
        for i, arr in enumerate(work_array):
            if not arr:           # встретился пустой элемент - ничего не делаем
                continue
            elif last_value != arr[0]:   # если не дублирует предыдущее значение, то выдаем элемент, и на его место ставим None
                last_value = arr[0]
                yield work_array[i]
                work_array[i] = None
            else:                       # если дублирует предыдущее значние - идем к след элементу
                continue

print([x for x in re_sort(l)])
# out: [[4, -2], [5, -1], [7, 2], [8, 2], [4, -1], [5, 1], [7, 1], [8, 2], [4, 2], [5, 2], [7, 1], [8, 1]]
res = [x[1] for x in re_sort(l)]
print(res)
# out: [-2, -1, 2, 2, -1, 1, 1, 2, 2, 2, 1, 1]

</code>
Собственно, по коментариям должно быть все понятно. Логика простая - итерируемся по списку, и если первый элемент не равен предыдущему (сохраняем его значение каждую итерацию) - возвращаем его. Сложность O(n*k), k - максимально кол-во повторяющихся элементов. Первое и самое простое решение, если посидеть, подумать, то думаю кто то лучше напишет.
Пару поправок:

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


Создание векторного изображения из массива NumPy
Я генерирую изображения, они сохраняются в растре. Но для печати они мне нужны в векторном формате. Можно ли как-то сразу сохранить изображения в SVG. Или же например PNG перегнать в массив, где каждое значение это номер цвета в RGB, а потом этот массив превратить в векторное изображение?

<code>
from pystrich.datamatrix import DataMatrixEncoder

encoder = DataMatrixEncoder("12345")
encoder.save("test.png")
print(encoder.get_ascii())
with open("test.dxf", "w") as text_file:
    text_file.write(encoder.get_dxf(inverse=True, cellsize=1))
</code>
необходимо вручную обновить библиотеку PyStich


Как впихнуть два метода в одну функцию?
У меня есть бот на aiogram. Задача бота принимать в себя данные от пользователей. Я не хочу убирать концепцию callback'a в боте но... инлайн сообщения требуют аргумента в функции

async def checkname(query: CallbackQuery):

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

async def checkname(message: types.Message):
     msg = message.text

Но так как аио не принимает в себя два аргумента функций одновременно, я задался вопросом - каким образом можно запихнуть в одну функцию И callback И message

Штош. Вот вам небольшой пример кода, как должно работать то что вы хотите. (вроде)
<code>
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

from data import config

bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

class InputData(StatesGroup):
    input_fio = State()

@dp.message_handler(commands=["start"])
async def start(message: types.Message):
    markup = InlineKeyboardMarkup().add(InlineKeyboardButton("ввести фио", callback_data="fio_input"))
    await message.answer("привет вот клавиатура", reply_markup=markup)

@dp.callback_query_handler(text="fio_input")
async def fio_call(call: types.CallbackQuery):
    await call.answer()
    await call.message.answer("Введите ваше ФИО")
    await InputData.input_fio.set()

@dp.message_handler(state=InputData.input_fio)
async def fio_input(message: types.Message):
    await message.answer(f"Ваше ФИО - {message.text}")

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


Не срабатывает хендлер aiogram
Прочитал документацию aiogram по состояниям, сделал структуру базовую, но почему-то не работает 2 хендлер. В состояниях еще не сильно разбираюсь)Вот код:

@dp.message_handler(content_types=types.ContentTypes.TEXT, state='*')
async def text_handler(message: types.Message, state : FSMContext):
    if message.text == labels.USER_MENU_BTN_1:
        await state.update_data(user_id=message.from_user.id)
        await message.reply(labels.CATEGORY_CHOOSE_MSG, reply=False, reply_markup=keyboards.question_category_list())
        await Form.category.set()
    elif message.text == labels.BACK_BTN:
        await message.reply(labels.BACK_MSG, reply=False, reply_markup=keyboards.user_menu())
        await state.reset_state()
        await state.reset_data()

@dp.message_handler(content_types=types.ContentTypes.TEXT, state=Form.category)
async def category_set(message: types.Message, state: FSMContext):
    if message.text == labels.CATEGORY_BTN_1:
        await message.reply(labels.CATEGORY_CHOSEN_MSG.format(category=message.text), reply=False,
                            reply_markup=keyboards.back_keyboard())
    elif message.text == labels.CATEGORY_BTN_2:
        await message.reply(labels.CATEGORY_CHOSEN_MSG.format(category=message.text), reply=False,
                            reply_markup=keyboards.back_keyboard())
    elif message.text == labels.CATEGORY_BTN_3:
        await message.reply(labels.CATEGORY_CHOSEN_MSG.format(category=message.text), reply=False,
                            reply_markup=keyboards.back_keyboard())
    await state.update_data(category=message.text)
    await message.reply(labels.QUESTION_TEXT_MSG, reply=False, reply_markup=keyboards.back_keyboard())
    await Form.next()

Код файла states, который импортируется так from states import Form:

from aiogram.dispatcher.filters.state import State, StatesGroup

class Form(StatesGroup):
    user_id = State()
    category = State()
    text = State()

Если еще что-то нужно добавлю.

Штош. Фикситься это в пару кликов. Берешь нижний хендлер, вырезаешь его и вставляешь над хендлером который сейчас выше.
Не срабатывает он по довольно просто причине: хендлеры проверяются по порядку сверху внизу. То есть если где-то условие подходит, то следующие хендлеры игнорируются.
В твоём случае
@dp.message_handler(content_types=types.ContentTypes.TEXT, state='*')
срабатывает на все что является текстом и с любым стейтом (то есть хоть None, хоть какой-то определенный стейт) потому второй и не срабатывает.


Получить json из всего текста с помощью регулярки
Хочу достать json из строки.
<code>
[{"json0":"1"}] fdfdfdfdsgfdgd [{"you":"12"}] fdfdfdfdsgfdgd fdfdfdfdsgfdgd fdfdfdfdsgfdgd [{"youthe:"121"}]
</code>
Хочу из этой всех кучи доставать json форматы(данные бывают и другие, но json начинается с [{ и заканчивается }]). У меня получилось сделать с помощью find, но оно получает только один массив

через регулярные выражения можно сделать так
<code>
>>> import re
>>> import json

>>> pattern = r"\[(.*?)\]"
>>> str_ = '[{"json0":"1"}] fdfdfdfdsgfdgd [{"you":"12"}] fdfdfdfdsgfdgd fdfdfdfdsgfdgd fdfdfdfdsgfdgd [{"youthe":"121"}]'
>>> all_jsons = re.findall(pattern, str_)
>>> all_jsons
['{"json0":"1"}', '{"you":"12"}', '{"youthe":"121"}']
>>> list_for_dicts = []
>>> for i in all_jsons:
...   d = json.loads(i)
...   list_for_dicts.append(d)
...
>>> list_for_dicts
[{'json0': '1'}, {'you': '12'}, {'youthe': '121'}]
>>> # или в одну строку
>>> list_for_dicts = [json.loads(i) for i in all_jsons]
</code>


Почему выводит list index out of range?

path = 'C:\\Users\\admin\\Desktop\\1.txt'
m= []
cords = []
f = open(path,mode = 'r')

a = list(map(int,f.readline().split()))
for i in range(a[1]):
    m.append(([]))
    for j in range(a[0]):
        m[i].append(0)
#создаем массив

for i in range(a[2]):
    mas = (list(map(int,f.readline().split())))
    print(mas[0],mas[1])
    x= mas[0]
    y = mas[1]
    m[y][x]=1
#заменяем нули однерками
for i in m:
   print(i)
#выводим массив

данные в файле:

7 6 8
3 1
5 1
1 2
1 3
5 3
2 5
1 6
6 6

<code>
path = 'C:\\Users\\admin\\Desktop\\1.txt'
m= []
cords = []
f = open(path,mode = 'r')

a = list(map(int,f.readline().split()))
print(a)
f.close()
for i in range(a[1]):
    m.append(([]))
    for j in range(a[0]):
        m[i].append(0)
#создаем массив
print(m)
print('размер первого измерения', len(m))
print('размер второго измерения', len(m[0]))

for i in range(0, len(m)):
    for k in range(0, len(m[0])):
        m[i][k] = 1

#заменяем нули однерками

print(m) #выводим массив
</code>
Дело в том, что у Вас двумерный список размер первого измерения 6, а второго 7.
При этом в файле Вы берете индекс 7, больше размера массива(первого измерения "mas[0]"- размер измерения 6).
И чтобы заполнить все значения массива нужно итеративно двигаться по каждому элементу.
В Вашем примере индексы остаются неизменными.
Я сделал два вложенных цикла для наглядности i это индекс первого измерения,
k второго.


Проблема с функцией для бота
Всем привет, я недавно в этом удивительном мире и начал свой путь с питона. Я решил сделать простого "бота" для общения, но у меня возникает проблема с выводом. По идеи, отправляя данные в функцию, оно должно проходить через проверки пока не дойдет до нужной, но чтобы я не ввёл, всегда исполняется первая.
<code>
IA = True
print("Зравствуйте, сэр. Меня зовут Джарвис. Я простой искусственный интеллект")
def Intellect(msg):
    if msg == "Привет" or "Здравствуй" or "Интересно" or "Круто" or "Привет, Джарвис" or "Здравствуй, Джарвис":
        print("Как прошёл ваш день?")
    elif msg == "Джарвис?" or "Джарвис" or "Кто?" or "Кто":
        print("Джарвис - искусственный интеллект, первая версия от 17.03.2022.")
        print("Создан с целью практики в кодинге и от скуки")
        print("Версия №1. Надеюсь, меня сделают  лучше и подарят голос")
        print("Что-то ещё?")

while IA:
    data = input().lower().title()
    Intellect(data)
</code>

Ответ на ваш вопрос:

if msg == "Привет" or msg == "Здравствуй" or msg ==  "Интересно" or msg ==  "Круто" or msg ==  "Привет, Джарвис" or msg ==  "Здравствуй, Джарвис":
        print("Как прошёл ваш день?")

Нужно добавлять
msg ==.
Но я думаю что здесь будет намного удобнее проверять так:

hello_words_list = ["привет", "здравствуй", "хай"] # здесь просто список слов которые могут встретиться в предложении

for word in msg: # сделайте ваш msg списком в котором буду слова по отдельности
    if word in hello_words_list: # если слово в списке
        # тут делайте что-то, например создайте функцию say_hello() которая напечатает в ответ приветсвие

Пишите мне если будут вопросы по боту. Я тоже делал что-то похожее только с распознованием речи и голосом.


Как вывести индексы вхождений символа с помощью list comprehension?
Пусть у меня есть какая-то строка например
some_str = "вася бежал по полю и умер" и я хочу получить список всех индексов вхождений буквы "а". То есть я хочу сделать следующее:

some_str = "вася бежал по полю и умер"
lst = []
for i in range(len(some_str)):
    if some_str[i] == "а":
        lst.append(i)
print(lst)

То есть вывод на данную строку будет следующим:

[1, 8]

Есть ли возможность здесь использовать list comprehension? То есть у меня была идея написать, что то типо следующего:

lst = [x == "а" for x in some_str]

Но естественно, это не дает желаемого результата. Есть ли возможность использовать list comprehension в моем случае?

Собственно, также, как и в обычном цикле :)

some_str = "вася бежал по полю и умер"
lst = [i for i in range(len(some_str)) if some_str[i] == "а"]
print(lst)

Выхлоп:

[1, 8]

Очень забавно, что я пару часов назад задавал вопрос на эту тему =)


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

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

a: int = 1
b: str = 'текст'

Функция, для сложения 2 чисел может выглядеть вот так:

def sum_(a: int, b: int) -> int:
    return a + b

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

print(type(sum_(1.2, 2.5)))

<class 'float'>