Как разложить число на множители всеми возможными способами [закрыт]

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

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

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

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

<code>
def divide(n):
    d = 2
    while d*d <= n:
        if n%d == 0:
            print (n, '*')
            divide(n//d)
        d = d+1
    if n>1:
        print(n)
        print('____')
n = input(n)
n = int(n)
divide(n)
</code>
У меня получилось вот это, но оно не работает так, как надо

Есть пара идей, в код пока не особо получается преобразовать:
Сначала разложим число на простые множители, а потом уже будем их друг на друга комбинациями умножать
Код для нахождения простых делителей:
<code>
n=0 #сброс (необязательно)
n =int(input(n))
s_divs=[] #массив простых делителей
def s_div(n): #функция нахождения всех простых делителей n
    a = [] #массив простых делителей
    d = [] #массив всех 'претендентов'
    #перебираем делители
    for i in range(n-2): #от 2 до n-1 включительно
        d.append(i+2)
    for i_2 in range(len(d)): #кол-во претендентов
        if n % d[i_2] == 0: #остаток от деления равен нулю
            a.append(d[i_2])
    print('Простые делители', n, ':', a)

s_divs=s_div(n)
</code>
Это плохая идея использовать саму процедуру внутри себя, работает некорректно


discord.ext.commands.errors.CommandInvokeError: Command raised an exception: IndexError: list index out of range

Полная ошибка

E:\bot>python bot.py
Ignoring exception in command duel:
Traceback (most recent call last):
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "E:\bot\bot.py", line 1201, in duel
    _balance = line[1]
IndexError: list index out of range

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\bot.py", line 902, in invoke
    await ctx.command.invoke(ctx)
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "E:\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: IndexError: list index out of range

Не работает именно часть кода, которая заносит данные в файл. Всё остальное работает без ошибок.

Код:

@bot.command()
async def duel(ctx, user: discord.Member = None):
    author = ctx.message.author
    if user != None:
        if user != author:
            hp1 = 100
            hp2 = 100

            emb0 = discord.Embed(
            title='Сражение',
            description=f'''
            ```py
            {author}Вызвал на бой {user}...
            ```
            ''')

            msg = await ctx.send(embed=emb0)
            await sleep(2)
            txt = ''
            m = 1
            while m != 0:

                dmg = random.randint(5, 25)
                hp2 -= dmg
                prev_txt = txt
                txt = f'{prev_txt} \n{author} нанёс {dmg} урона {user}.'

                emb1 = discord.Embed(
                title='Сражение',
                description=f'''
                ```py
                {txt}.
                --------------------------------
                У {author}: {hp1} жизней.
                У {user}: {hp2} жизней.
                ```
                ''')

                prev_txt = txt
                txt = f'{prev_txt} \n{user} нанёс {dmg} урона {author}.'

                await msg.edit(embed=emb1)
                await sleep(0.25)

                prev_dmg = dmg
                dmg = random.randint(5, 27)
                hp1 -= dmg

                emb2 = discord.Embed(
                title='Сражение',
                description=f'''
                ```py
                {msg}
                --------------------------------
                У {author}: {hp1} жизней.
                У {user}: {hp2} жизней.
                ```
                ''')

                await sleep(0.25)
                await msg.edit(embed=emb2)

                prev_dmg = dmg
                winner = None

                if hp2 <= 1:
                    winner = author
                    emb3 = discord.Embed(
                    title='Сражение',
                    description=f'''
                    ПОБЕДИТЕЛЬ: {winner}
                    ''')
                    await msg.edit(embed=emb3)
                    m = 0

                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "a+")
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "r")
                    line = file.read().split("\n")
                    _fights = line[0]
                    _fights = int(_fights)  if _fights else 0
                    _balance = line[1]
                    _balance =  int(_balance) if _balance else 0
                    _wins = line[2]
                    _wins=  int(_wins) if _wins else 0
                    _loses = line[3]
                    _loses =  int(_loses) if _loses else 0
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "r")
                    list_of_lines = file.readlines()
                    fights = int(_fights) + 1
                    balance = int(_balance) + random.randint(5, 30)
                    wins = int(_wins) + 1
                    loses = int(_loses) + 0
                    list_of_lines[0] = f"{fights}\n"
                    list_of_lines[1] = f"{balance}\n"
                    list_of_lines[2] = f"{wins}\n"
                    list_of_lines[3] = f"{loses}\n"
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "w")
                    file.writelines(list_of_lines)
                    file.close()

                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "a+")
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "r")
                    line = file.read().split("\n")
                    _fights = line[0]
                    _fights = int(_fights)  if _fights else 0
                    _balance = line[1]
                    _balance =  int(_balance) if _balance else 0
                    _wins = line[2]
                    _wins=  int(_wins) if _wins else 0
                    _loses = line[3]
                    _loses =  int(_loses) if _loses else 0
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "r")
                    list_of_lines = file.readlines()
                    fights = int(_fights) + 1
                    balance = int(_balance) - random.randint(5, 15)
                    wins = int(_wins) + 0
                    loses = int(_loses) + 1
                    list_of_lines[0] = f"{fights}\n"
                    list_of_lines[1] = f"{balance}\n"
                    list_of_lines[2] = f"{wins}\n"
                    list_of_lines[3] = f"{loses}\n"
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "w")
                    file.writelines(list_of_lines)
                    file.close()

                elif hp1 <= 1:
                    winner = user
                    emb3 = discord.Embed(
                    title='Сражение',
                    description=f'''
                    ПОБЕДИТЕЛЬ: {winner}
                    ''')
                    await msg.edit(embed=emb3)
                    m = 0

                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "a+")
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "r")
                    line = file.read().split("\n")
                    _fights = line[0]
                    _fights = int(_fights)  if _fights else 0
                    _balance = line[1]
                    _balance =  int(_balance) if _balance else 0
                    _wins = line[2]
                    _wins=  int(_wins) if _wins else 0
                    _loses = line[3]
                    _loses =  int(_loses) if _loses else 0
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "r")
                    list_of_lines = file.readlines()
                    fights = int(_fights) + 1
                    balance = int(_balance) + random.randint(5, 30)
                    wins = int(_wins) + 1
                    loses = int(_loses) + 0
                    list_of_lines[0] = f"{fights}\n"
                    list_of_lines[1] = f"{balance}\n"
                    list_of_lines[2] = f"{wins}\n"
                    list_of_lines[3] = f"{loses}\n"
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{user.id}.json", "w")
                    file.writelines(list_of_lines)
                    file.close()

                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "a+")
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "r")
                    line = file.read().split("\n")
                    _fights = line[0]
                    _fights = int(_fights)  if _fights else 0
                    _balance = line[1]
                    _balance =  int(_balance) if _balance else 0
                    _wins = line[2]
                    _wins=  int(_wins) if _wins else 0
                    _loses = line[3]
                    _loses =  int(_loses) if _loses else 0
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "r")
                    list_of_lines = file.readlines()
                    fights = int(_fights) + 1
                    balance = int(_balance) - random.randint(5, 15)
                    wins = int(_wins) + 0
                    loses = int(_loses) + 1
                    list_of_lines[0] = f"{fights}\n"
                    list_of_lines[1] = f"{balance}\n"
                    list_of_lines[2] = f"{wins}\n"
                    list_of_lines[3] = f"{loses}\n"
                    file.close()
                    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "w")
                    file.writelines(list_of_lines)
                    file.close()

        else:
            await ctx.send('Вы не можете вызвать на дуэль самого себя')

    else:
        await ctx.send('Упомяните пользователя, которого вызываете на дуэль.')

P.S: Не минусуйте пожалуйста, я впервые работаю с файлами и многого не понимаю.

Всё решилось довольно просто:

Все строки

file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "a+")
file.close()

Нужно было заменить на это:

if not os.path.exists(f"E:\\bot\\duels_db\\stats-{author.id}.json"):
    file = open(f"E:\\bot\\duels_db\\stats-{author.id}.json", "a+")
    file.write('0 \n0 \n0 \n0')
else:
    pass
file.close()

(нужен импорт os.path)

То, на что я заменил исходные строки создают файл, если он отсутствует и вписывает нужные мне 4 строки.
P.S. Спасибо @andreymal за объяснение значения ошибки.


Как правильно настроить нейросеть для выделения характерных точек?
есть задача находить ключевые точки на лицах
На данный момент есть определенное количество входных изображений (лиц) и такое же количество выходных изображений-лиц, с отмеченными на них ключевыми точками(точки отмечались с помощью маркера в фоторедакторе)
Планируется использовать библиотеку keras для построения сверточной нейронной сети ввиду хорошей производительности и подробной документации
Собственно вопрос:
В каком виде лучше подавать изображения на CNN (черно-белое, в градациях серого, уменьшенное, в исходном размере?) и что дать CNN в качестве обучающих выходных данных: изображения с отмеченными точками или массив с координатами каждой точки (их около 70)?

Я надеюсь, что вы ознакомились во-первых с теорией нейросетей, а во-вторых -  с тем как представляются картинки в компьютере. И как с этими картинками работает те-же нейросетевые алгоритмы. Представьте себе вы "показали" нейросети вашу картинку с "отмеченной с помощью меркера точкой". Нейросеть так или иначе должна ее представить в виде..... правильно, в виде координат точки. Соответственно понятно, что лучше не мучить сеть, а непосредственно показать в виде координат те точки, которые она должна бы найти, а не заставлять это сделать саму сеть.
P.S. Добавления после размышления. Если вы подадите точки в виде "отмеченных цветом поправок" и на таких картинках будете учить  нейросеть, то почти наверняка потом, получая картинки без отметок ваша сеть вообще ничего не будет находить на ваших изображениях. Вернее она будет искать аналогичные отметки, не находить их и радостно об этом вас уведомлять.
По первому вашему вопросу. Опять-же, ознакомившись с теорией и практикой применения нейросетей для распознавания изображений (лиц) вы наверняка обратили внимание на советы относительно того, что тренировочная выборка должна быть максимальна подобна реальной. Не "самой красивой", "самой цветной" или "самого большого размера", с "урезкой или без",  а именно такими, какие вы будет потом распознавать. Поэтому вам не выбирать надо, в каком виде картинки подавать, вам надо выяснять какие картинки вы будете подавать в продакшине и именно в таком виде готовить свой обучающий набор.


При вводе с клавиатуры, ошибка - ValueError: time data does not match format '%d.%m.%Y'
Сразу скажу,что на эту ошибку я нашёл немало вопросов и ответов здесь.
Но не смог получить оттуда нужной для себя информации.
Беру проблемный участок

def get_dateorder():
            dateordd = input('Дата заказа книги(дд-мм-гггг): ')
            dateord = time.strptime(dateordd,"%d.%m.%Y")
            return dateord

Что хочу получить?
Ввожу дату с клавитауры, вот так
11121990 и хочу чтобы она у меня выводилась как
11.12.1990
А в итоге я после ввода получаю

ValueError: time data '11121990' does not match format '%d.%m.%Y'

Что я сделал для исправления?
Перед строкой с
input() добавлял
str, так как
strptime() 1-ым аргументом содержит строку, но ошибка не исчезает.
Ниже представлены 2 варианта исправлений ошибки.

def get_dateorder():
                dateord = str(input('Дата заказа книги(дд-мм-гггг): '))
                return time.strptime(dateord,"%d.%m.%Y")

Решил уже добавить
split чтобы разбить цифры,но ошибка не исчезает

def get_dateorder():
                dateordd = input('Дата заказа книги(дд-мм-гггг): ')
                dateordd = split('.')
                dateord = time.strptime(dateordd,"%d.%m.%Y")
                return dateord

Вы указали формат даты

%d.%m.%Y, а хотите, чтобы оно работало с вводом
11121990 ?
Поменяйте формат на
'%d%m%Y' и все заработает.

def get_dateorder():
    dateord = input('Дата заказа книги(ддммгггг): ')
    return time.strptime(dateord,"%d%m%Y")

Или так:

def get_dateorder():
    return time.strptime(input('Дата заказа книги(ддммгггг): '),"%d%m%Y")


Бот не отвечает на кодовые слова
Делаю бота, который должен отправлять картинку по кодовому слову, к примеру:
бот, скинь картинку с собачками
Вот мой код :
<code>
@bot.message_handler(content_types=['text'])
def get_photo(message):
    words = "бот картинку картинка картины".split()
    dogs = "собак собака собаки собаку собачками".split()
    plac = "пейзажи пейзаж пейзажем".split()
    space = "космос космосом".split()
    if message.text.lower() in words:
        if message.text.lower() in dogs and words:
            bot.send_message(message.chat.id,"* картинка с собакой *")
        elif message.text.lower() in plac:
            bot.send_message(message.chat.id,"* картинка с пейзажем *")
        elif message.text.lower() in space:
            bot.send_message(message.chat.id,"* картинка с космосом *")
    #else:
        #bot.send_message(message.chat.id,"не было введено кодового слова")
</code>
Не понимаю, почему оно ничего не выводит? Ведь после того, как идет проверка на ключевое слово бот или картинка, должна быть проверка на тему картинки и, если слово, к примеру, собака, то кидать фото из группы собак?

У вас в
message.text будет строка
"бот, скинь картинку с собачками" и по коду вы пытаетесь всю эту строку найти как элемент списка
words.
А по факту, нужно наоборот -- разделять
message.text на слова и эти слова искать в
words и
dogs. Анализ слов запрос позволит понять намерения пользователя.
Накидал простенький пример анализа слов запроса. В качестве токенизатора использовал регулярку. Но можно использовать полноценный токенизатор и кроме вытаскивания слов, убрать ненужные токены, а слова, например привести в начальную форму.
Пример:

import re
...

    words = "бот картинку картинка картины".split()
    dogs = "собак собака собаки собаку собачками".split()
    plac = "пейзажи пейзаж пейзажем".split()
    space = "космос космосом".split()

    text = message.text.lower()
    tokens = re.findall(r'\w+', text)

    # Если в запросе есть слово из words
    if any(x in words for x in tokens):
        # Если в запросе есть слово из dogs
        if any(x in dogs for x in tokens):
            bot.send_message(message.chat.id, "* картинка с собакой *")

        elif any(x in plac for x in tokens):
            bot.send_message(message.chat.id, "* картинка с пейзажем *")

        elif any(x in space for x in tokens):
            bot.send_message(message.chat.id, "* картинка с космосом *")

Можно сделать без токенизации, тогда, проверка немного меняется -- ключевые слова ищутся в тексте запроса (но нужно внимательнее слова подбирать, т.к. тут поиск будет по подстроке в тексте запроса):

    text = message.text.lower()

    if any(x in text for x in words):
        if any(x in text for x in dogs):
            bot.send_message(message.chat.id, "* картинка с собакой *")

        elif any(x in text for x in plac):
            bot.send_message(message.chat.id, "* картинка с пейзажем *")

        elif any(x in text for x in space):
            bot.send_message(message.chat.id, "* картинка с космосом *")


Обращение к функции с аргументом message (pyTelegramBotAPI)
День добрый. Пишу телеграм бота, тема такая: я создал инлайн кнопку 'Получать рассылку погоды' которая прикрепляется к сообщению и при нажатии кнопки, бот совершает, скажем так, действие. Я создал условие (в декораторе bot.callback_query_handler) при котором происходит обращение к функции (sending_forecast(message)), то есть к действию, если нажата кнопка. Проблема в том, что эта самая функция имеет аргумент message, которому, при обращении, нужно задать параметр, а какой параметр, я не знаю. Много чего писал туда - возвращается ошибка: объект не имеет атрибута 'chat'
<code>
@bot.message_handler(commands=['info', 'start'])
def welcome(message):
    if message.text == '/start':
                #создание инлайн кнопки
        inline_mailing_forecast = telebot.types.InlineKeyboardMarkup()
        inline_mailing_button = telebot.types.InlineKeyboardButton(text='Получать рассылку погоды', callback_data='subscribe_weather')
        inline_mailing_forecast.add(inline_mailing_button)
        bot.send_message(message.chat.id, "Привет, я бот, призванный облегчить наблюдение за погодой������. Напиши мне свой город и я расскажу, всё что знаю о нём))", reply_markup=inline_mailing_forecast)

#обратный вызов инлайн кнопки
@bot.callback_query_handler(func = lambda call: True)
    if call.data == 'subscribe_weather':
        sending_forecast(message = )#какой параметр аргументу нужно задать?

@bot.message_handler(content_types=['text'])
def sending_forecast(message):
    bot.send_message(message.chat.id, 'Какое-то действие')
</code>

т.к. вы используете
callback_query_handler объект
message будет содержаться в
call:

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.data == 'subscribe_weather':
        sending_forecast(call.message)

def sending_forecast(message):
    bot.send_message(message.chat.id, 'sending_forecast Какое-то действие')


Не могу связать новость и комментарий
Выводится ошибка:
ValueError: Cannot assign "<django.db.models.query_utils.DeferredAttribute object at 0x0307E628>": "Comment.news" must be a "News" instance.
она жалуется на form.news = news_filter
Но почему она жалуется я не понимаю. P.s.Я новичек
models.py

class Comment(models.Model):
    news = models.ForeignKey(News, verbose_name='новость', on_delete=models.CASCADE)
    author = models.ForeignKey(User, verbose_name='Автор', on_delete=models.CASCADE, default=True)
    email = models.EmailField(verbose_name='Почта')
    text = models.TextField(verbose_name='Комментарий')
    file = models.FileField(verbose_name='Файл для загрузки', upload_to='comments', blank=True)
    date = models.DateField(auto_now_add=True)

def __str__(self):
    return f'Имя пользователя: {self.author.first_name} {self.author.last_name} | Почта: {self.email} ' \
           f'| Имя пользователя: {self.author.username}'

class Meta:
    verbose_name = 'комментарий'
    verbose_name_plural = 'комментарии'

forms.py

class CommentForm(ModelForm):
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    for name, item in self.fields.items():
        item.widget.attrs['class'] = f'form-control {name} mb-1 mt-1'

class Meta:
    model = Comment
    fields = ('text', 'file')

views.py

def news_page(request, pk):
news_filter = News.objects.filter(id=pk)
comments = Comment.objects.filter(news=pk)
if request.method == 'POST':
    form = CommentForm(request.POST)
    if form.is_valid():
        form = form.save(commit=False)
        form.author = request.user
        form.news = news_filter
        form.save()
        return HttpResponseRedirect(request.path_info)
else:
    form = CommentForm()
context = {
    'title': 'Новости',
    'news': news_filter,
    'form': form,
    'comments': comments,
}
return render(request, 'mainapp/news.html', context)

у тебя в коде идет

news_filter = News.objects.filter(id=pk)
в данном случае у тебя в
news_filter хранится queryset (в котором находится одна новость), а в форме у тебя требуется один объект News
ты можешь исправить это следующим образом добавив
.first() или заменив
.filter на
.get
т.е.

news_filter = News.objects.filter(id=pk).first()

или

news_filter = News.objects.get(id=pk)


Значение порядка числа [закрыт]

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

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

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

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

Есть два числа.

1.231221200034e12 = 1231221200034.0
1.2e-2 = 0.012

При сложении результат будет - 1231221200034.012 незначительное изменение числа, что можно записать как 1.231221200034012e+12.
Как можно отследить изменится ли показатель степени "Е" или нет?

В общем-то, MaxU уже всё сказал, приложу код для проверки, что порядок сохранится:

import math

x = 1.231221200034e12
y = 1.2e-2
print(int(math.log10(x)) == int(math.log10(x + y)))

Вывод:

True


Django MPTT вывод всех товаров из категории родителя
Подскажите как достать все товары из категории родителя . у меня есть категории
<code>
[<Category: Мужчин > Одежда>, <Category: Мужчин > Одежда > Рубашки>, <Category: Мужчин > Одежда > Футболки>, <Category: Мужчин > Обувь>, <Category: Мужчин > Обувь > Кроссовки>].
</code>
Как я могу получить все товары категории Мужчин queryset? и футболки и кроссовки и тд

сначала получи список всех вложенных подкатегорий внутри [<Category: Мужчин>]
до нужного количества вложенностей
например
<code>
category_man_id = ...  # укажи стартовую верхнюю категорию

sub1 = list(Category.objects.filter(parent = category_man_id))
sub2 = list(Category.objects.filter(parent__in = sub1))
#  можешь в цикле набрать нужное количество вложенностей

products = Product.objects.filter(category__in = sub1+sub2)
</code>


Python асинхронные циклы
Можете расписать как запускать циклы асинхронно? Не понимаю немного доки
Дано:
<code>
def mus():
    while True:
def dis(arg1, arg2):
    while True:
</code>
Хочу что бы они не останавливали друг друга тк один рисует текст, а другой принимает текст/нажатие кнопок/думает и работает с переменными которые улетают первому что бы он рисовал уже новые данные.

Дизайн выглядит непродуманным, нужно больше подробностей как
dis будет получать обновления. Сейчас он получает аргументы на старте и нигде не сказано, как они могут меняться.
Ниже код который запустит
mus и
dis параллельно. Основная техника: насоздавать нитей, запустить их, ждать их окончания. В нашем примере они не кончаются, но ждать надо - программа завершается когда завершается основная нить. Пример мог бы быть проще: две нити - излишество, можно было обойтись одной. Да я хочу показать технику вообще, кроме того хорошая практика не занимать основную нить - позже для неё обязательно найдется "работа по дому":

import threading
import time

def mus():
    while True:
        print('mus')
        time.sleep(0.9)

def dis(arg1, arg2):
    while True:
        print('dis({}, {})'.format(repr(arg1), repr(arg2)))
        time.sleep(1.5)

def test(arg1, arg2):
    threads = (
        threading.Thread(target=mus),
        threading.Thread(target=dis, args=(arg1, arg2))
    )

    for t in threads:
        t.start()

    print('started')

    for t in threads:
        t.join()

test('arg1', 'arg2')

Заметьте где печатается
started. Добро пожаловать в мир параллельного программирования:

mus
dis('arg1', 'arg2')
started
mus
dis('arg1', 'arg2')
mus
mus
dis('arg1', 'arg2')
mus
dis('arg1', 'arg2')
mus
mus
dis('arg1', 'arg2')
mus
mus
dis('arg1', 'arg2')
mus
dis('arg1', 'arg2')
mus
...


Как отключить вывод в консоль
Я собираю .py в .exe приложение с интерфейсом (PyQt)
И когда я использую:

os.system('wmic process where name="python.exe" CALL setpriority "realtime"')

На мгновение появляется командная строка, которая сбивает все полноэкранные приложения (Сворачивает их)
Мне нужно как - то отключить вывод в консоль.
Вывод в консоль будет как при успешном выполнение команды, так и наоборот. Поэтому не важно имя процесса
name="python.exe"

Есть пара вариантов:

В pyinstaller добавить флаг
--noconsole

Второе ваша команда
wmic ... может принудительно отрисовывать консоль. перенаправьте вывод например в текстовый файл
wmic ... > myfile.txt.


Как передать return в другую функцию python [закрыт]

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

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

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

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

у меня есть функция которая возвращает сумму двух цифр как передать это результат другой функции?

def sum(x, y):
    return x + y

def multiply(x, y):
    return x * y

a = multiply(sum(2, 3), 3)


Пишу бота для группы в контакте
Пишу бота для группы в контакте, не могли бы вы подсказать, как сделать, чтобы после отправки определенного сообщения, бот запоминал следующее сообщение пользователя.
Например пользователь отправляет сообщение: 'Запомнить'.И следующее сообщение от этого пользователя бот заносит в базу данных.
Есть база данных куда оно будет сохраняться, но как настроить на это условие понять не могу.

Вообще такие вопросы лучше гуглить самому, ибо так больше инфы найдете, а еще:
Удобно будет для таких целей заюзать
ORM. В питоне рекомендую
SqlAlchemy.
Настроим
SqlAlchemy для работы с
Sqlite3:

%PROJECT_DIR%/core.py

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine(f'sqlite:///test.db', echo=False)
Base.metadata.create_all(engine, checkfirst=True)

Session = sessionmaker(bind=engine)

Создадим модель таблицы:

%PROJECT_DIR%/source/database/models/user.py

from sqlalchemy import Column, Integer, String
from core import Base

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    message = Column(String)

    def __init__(self, id:int, message: str):
        self.id = id
        self.message = message

Потом напишем методы для работы с базой данных:

%PROJECT_DIR%/source/database/methods.py

from source.database.models.user import User
from core import Session

class Methods:
   def __init__(self):
      self.session = Session()

   def add_message(self, id: int, message: str):
      self.session.add(User(id, message))
      self.session.commit()

   def get_messages(self, id: int):
      for user in self.session.query(User).filter_by(id=id):
         yield user.message

Ну и обрабатываем...

%PROJECT_DIR%/main.py

from source.database.methods import Methods

methods = Methods()

while True:
    longpoll = VkLongPoll(self.vk)
        for event in longpoll.listen():
            if event.type == VkEventType.MESSAGE_NEW:
                if event.to_me:
                    if # custom statement... :
                        methods.add_message(event.user_id, event.text)

Рад был помочь ^^


django.db.utils.ProgrammingError: relation "django_site" does not exist
После того как я перенес локальную версию сайта на другой компьютер, я получаю ошибку следующего характера:

Traceback (most recent call last):
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "django_site" does not exist
LINE 1: ..."django_site"."domain", "django_site"."name" FROM "django_si...
                                                             ^
The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 31, in <module>
    execute_from_command_line(sys.argv)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/core/management/__init__.py", line 377, in execute
    django.setup()
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/administrator/Рабочий стол/site_lungscreening/lungscreening/users/models.py", line 10, in <module>
    from lungscreening.utils.sent_mail import send_email_for_action
  File "/home/administrator/Рабочий стол/site_lungscreening/lungscreening/utils/sent_mail.py", line 13, in <module>
    one = Site.objects.all()[0]
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/models/query.py", line 324, in __getitem__
    qs._fetch_all()
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/models/query.py", line 1308, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1156, in execute_sql
    cursor.execute(sql, params)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/backends/utils.py", line 99, in execute
    return super().execute(sql, params)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/administrator/Рабочий стол/site_lungscreening/myvenv/lib/python3.8/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "django_site" does not exist
LINE 1: ..."django_site"."domain", "django_site"."name" FROM "django_si...

Хотя все прошлые миграции я удалил и создал новую базу данных с таким же названием
Версия Python: 3.8
Версия Django: 3.1.4
Версия Postgres: 12
Установленные приложения :

DJANGO_APPS = [
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.sites",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    # "django.contrib.humanize", # Handy template tags
    "django.contrib.admin",
    "django.forms",
    "corsheaders",
    "rest_framework",
    "rest_framework.authtoken",

]
THIRD_PARTY_APPS = [
    "crispy_forms",
    "allauth",
    "allauth.account",
    "allauth.socialaccount",
    "bootstrapform",
    # "schedule",
]

LOCAL_APPS = [
    "lungscreening.users.apps.UsersConfig",
    "lungscreening.survey.apps.DjangoSurveyAndReportConfig",
    "lungscreening.labeling_upload_manager.apps.LabelingUploadManagerConfig",
    "lungscreening.appointment.apps.AppointmentConfig",
    "lungscreening.schedule.apps.ScheduleConfig",
    "lungscreening.research_results.apps.ResearchResultsConfig",
]

Обновил Django до 3.1.5, также в settings в DJANGO_APPS "django.contrib.sites" поднял на первое место и выполнил
python manage.py makemigrations, после чего всё заработало.


Как добавить с клавиатуры экземпляры класса в коллекцию?
Есть задание - создать класс и организовать коллекцию,которая будет хранить объекты класса.
Создал класс(вне методов и конструктора, вынесены счётчик и коллекция для хранения объектов класса)

import math
import collections
import datetime

class Bookorder:
      kolvorder = 0 #Будет считать количество заказчиков книг
      bookorders = []  #Коллекция где будут хранится объекты класса

      def __init__(self,surnm,dateorder,datetakeorder):
                """Инициализация атрибутов класса - фамилия,дата заказа книги,дата выдачи книги"""
                self.surnm = input('Фамилия заказчика книг: ')
                self.dateorder = input('Дата заказа книги(гггг-мм-дд): ')
                self.dateorder = time.strptime(input('Дата заказа книги(дд-мм-гггг): '), "%d.%m.%Y")
                self.datetakeorder = time.strptime(input('Дата выдачи заказа книги(дд-мм-гггг): '), "%d.%m.%Y")

Далее реализовал функцию вывода всех,уже добавленных объектов.

  def showallbookorders(self):
            """Вывод всех экземпляров класса из коллекции"""
            #bookorder = Bookorder()
            for bookorder in bookorders:
                      print(Bookorder.surnm, Bookorder.dateorder, Bookorder.datetakeorder)

Основной вопрос стоит в реализации
Вот главный блок программы.
Здесь введена переменная quant,которая у пойдёт в цикл,то есть хотим ввести 25 записей, то пишем 25,и работает цикл на ввод 25 записей

quant=int(input("Сколько экземпляров класса хотите создать"))
for x in range(quant):
    bookorder = Bookorder()
    bookorders.append(bookorder)
    kolvoorder+=1

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

Traceback (most recent call last):
TypeError: __init__() missing 3 required positional arguments: 'surnm', 'dateorder', and 'datetakeorder'

измените сигнатуру
__init__ на эту:

def __init__(self)
Т.е. должно получиться так:

class Bookorder:
    kolvorder = 0 #Будет считать количество заказчиков книг
    bookorders = []  #Коллекция где будут хранится объекты класса

    def __init__(self):
        """Инициализация атрибутов класса - фамилия,дата заказа книги,дата выдачи книги"""
        self.surnm = input('Фамилия заказчика книг: ')
        self.dateorder = input('Дата заказа книги(гггг-мм-дд): ')
        self.dateorder = time.strptime(input('Дата заказа книги(дд-мм-гггг): '), "%d.%m.%Y")
        self.datetakeorder = time.strptime(input('Дата выдачи заказа книги(дд-мм-гггг): '), "%d.%m.%Y")


Как создать исключение конкретной ошибки ftplib?
К примеру есть ошибка "ftplib.error_perm: 530 User cannot log in.". Как создать исключение по коду ошибки?
Нужно чтобы программа выводила пользователю в чем конкретно ошибка, при этом выполнение не останавливалось.

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

In [263]: ftp = ftplib.FTP('ftp.hornet.org')

In [264]: ftp.login('aaa', '[email protected]')
---------------------------------------------------------------------------
error_perm                                Traceback (most recent call last)
...
error_perm: 530 This FTP server is anonymous only.

поэтому можно проверять само сообщение об ошибке:

try:
    ftp = ftplib.FTP('ftp.hornet.org')
    ftp.login('aaa', '[email protected]')
except ftplib.error_perm as exc:
    if str(exc) == "530 User cannot log in.":
        print("Здесь обрабатываем ошибку ...")
    else:
        raise

рабочий пример:

In [265]: try:
     ...:     ftp = ftplib.FTP('ftp.hornet.org')
     ...:     ftp.login('aaa', '[email protected]')
     ...: except ftplib.error_perm as exc:
     ...:     if str(exc) == "530 This FTP server is anonymous only.":
     ...:         print("Здесь обрабатываем ошибку ...")
     ...:     else:
     ...:         raise
     ...:
Здесь обрабатываем ошибку ...


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

name = input("введите название файла: ")
f = open(name, 'r')

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

Exception has occurred: FileNotFoundError
[Errno 2] No such file or directory: 'file.png'

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

name = input("введите название файла: ")
f = open(name, 'r')
if error:
    print("error")

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

Воспользуйтесь обработкой ошибок -
try: ... except ...

while True:
    try:
        name = input("введите название файла: ")
        with open(name, 'r') as f:
            # здесь используем переменную `f`
        break
    except FileNotFoundError:
        print("error")


Можно ли значение по умолчанию в dict.setdefault() сделать функцией от ключа?
Известная возможность словарей Python - на лету подставлять значение по умолчанию для несуществующего ключа при помощи метода
dict.setdefault() порою бывает весьма продуктивна. Ну например, вам нужно посчитать сумму чего то с одинаковым ключем, и лень накручивать
if ... else.
У меня немного другая задача.  Есть необходимость поддерживать словарь подключений разных клиентов к Amazon.
Хотелось бы, чтобы была возможность устанавливать:

conn = dict()
conn.setdefault(connect_to)

где
connect_to будет не константой, а функцией от ключа, для которого создается "значение по умолчанию".  Получится своего рода кеш подключений, для которого можно использовать все плюшки словарей типа итерирования или проверки на наличие ключа в словаре.
Наверняка есть такой модуль? То есть желаемый код будет примерно таким:

def connect_to(client_id_key):
    """Connect to Amazon by token."""
    ...
    return connection

conn = dict()
# обращение к словарю соединений либо создает соединение если такой ключ еще не в словаре
# или берет соединение из словаря как из кеша
x = conn.setdefault(task.client_id, connect_to(task.client_id))
x.get_report(...)

Здесь подразумевается, что есть поток задач на разных клиентов, который надо последовательно обрабатывать. Последнюю строчку кода привел просто для "материализации" вопроса, чтобы вопрос не казался надуманным.
Что скажете? Мне не хочется каждый раз вызывать функцию подключения, ведь иногда подключение уже есть.
Прикол в том, что вторая часть (наш
default) всегда вычисляется, а я этого не хочу. Так код

conn = dict()
conn.setdefault(3, print("ключ был=",3))
conn.setdefault(3, print("ключ был=",3))

выдает

ключ был= 3
ключ был= 3

Хотя после первого
conn.setdefault(3, print("ключ был=",3)) в словаре уже есть ключ "3".   Можно сказать, что все, что мне хочется, чтобы метод .setdefault() был ленивым и не вычислял значение
default, а сразу лез в словарь, если ключ уже есть.
Наверное у меня словарь синглтонов.
Я конечно смотрел на
defaultdict из модуля collections, но пока не сообразил как сделать то, что мне хочется.

from collections import defaultdict
conn = defaultdict(connect_to)

не работает как я хочу, т.к. если я передаю свою функцию как default_factory, то мне нужен отсутствующий ключ как параметр этой фабрики, а это не предусмотрено в
defaultdict.

как вариант:

In [192]: def f():
     ...:     n = randint(0, 100)
     ...:     print(f"calling [f()], result {n}")
     ...:     return n
     ...:

In [193]: conn = dict()

In [194]: conn.get(3) or conn.setdefault(3, f())
calling [f()], result 49
Out[194]: 49

In [195]: conn.get(3) or conn.setdefault(3, f())
Out[195]: 49

In [196]: conn.get(3) or conn.setdefault(3, f())
Out[196]: 49

NOTE: этот вариант будет работать правильно (как ожидается) только в том случае если
bool(dict_value) == True. Т.е. для
connect_to(task.client_id) == 0 функция будет вызываться всегда, т.к.
bool(0) == False.

Можно также воспользоваться кэширующим декоратором @lru_cache:

from functools import lru_cache

@lru_cache(1024)
def connect_to(client_id_key):
    """Connect to Amazon by token."""
    ...
    return connection

В таком варианте вызовы
connect_to(client_id_key) будут кэшироваться и при повторном вызове
connect_to() для того же
client_id_key - результат будет браться из кэша.


Как сгенерировать массив с повторяющимися строками Python [закрыт]

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

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

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

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

Имеется одномерный массив чисел (длина 2*10**6). Прошу прощение за наглость, но существует ли более быстрый способ сгенерировать два массива, чтобы в одном
массиве каждая горизонтальная строка массива повторяла элементы исходного одномерного массива. Во втором массиве вертикальные столбцы должны повторять исходный одномерный массив.
Получается два транспонированных массива. Индексирование или транспонирование у меня получается медленнее.
В примере использован более короткий массив.
<code>
import numpy as np
import time
N = 2*10**6
m_0 = np.arange(N)

t1 = time.time()
m_1 = np.tile(m_0, N)
m_2 = np.repeat(m_0, N)
print(time.time() - t1)
print(m_1)
print(m_2)
</code>

В общем, пока ТС так и не разобрался, что и как он генерирует, приведу пример того, как можно дублировать одну строку массива "вниз", превратив массив в матрицу, или один столбец "вправо", превратив его тоже в матрицу. Не уверен, что это то, чего хочет ТС, но за неимением вразумительного пояснения или примера -  может кому пригодится.
(Разумеется,  размерность будет "игрушечная", что-бы видеть, что происходит).
Итак имеем начальный одномерный массив:

m_0 = np.arange(5)

Выглядит от так:

array([0, 1, 2, 3, 4])

Создаем его копию:

m_01=m_0[:]

и "растягиваем" исходный массив "вниз":

for i in range(4):
    m_01=np.vstack((m_01, m_0))
print (m_01)

Результат:

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

Теперь займемся растяжкой вправо:
Превращаем исходную строку в одномерный вектор:

m_2=m_0[:,np.newaxis]

и растягиваем его "вправо"

m_21=m_2[:]
for i in range(4):
    m_21=np.hstack((m_21, m_2))
print (m_21)

Результат:

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

Имеем две транспонированые матрицы, как ТС и просил.


Как реализовать добавление в словарь элементов?

n = int(input())
sl = {}
for i in range(n):
  a = list(map(int(input())))
  sl[n//2] =

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

3
1 2 3 4
3 2 3 1
4 1 5 3

пытаюсь сделать так, чтобы в словарь попадал ключ - это число из строки матрицы, индекс которой n // 2, а значение к этому ключу  – список отсортированных по возрастанию нечетных чисел того же столбца и той же строки (без числа-ключа) без повторений
проблема в том что ключ n//2 я добавляю ,но к нему нужно ведь добавлять и значение сразу же, а как его добавлять я не знаю, ибо нужно же в качестве значения взять числа из строки и столбца, а если к примеру только ввели 1 строку, то столбца же всего нет, чтобы взять значения
примерно, как должно получиться в итоге(входные данные к этому рез-ту написаны выше в примере):

{3: [1, 3, 5], 2: [1, 3], 1: [3]}

UPDATE:
Zhihar
Вывод

{1: [1, 3, 5], 2: [1, 3], 3: [1, 3, 5], 4: [1, 3, 5], 5: [1, 3, 5]}

Вывод

{1: [3, 5], 2: [1, 3], 3: [1, 3, 5], 4: [1, 3, 5], 5: [1, 3]}

UPDATE 2.0:
Более четкая формулировка:
Формат ввода
Вводится число n – количество строк в списке.
Затем вводятся строки из чисел, записанных через пробел.
Формат вывода
Вывести словарь, в котором ключи – это числа из строки матрицы, индекс которой n // 2, а значения – список отсортированных по возрастанию нечетных чисел того же столбца и той же строки (без числа-ключа) без повторений. Если в строке встречаются одинаковые числа, то значения добавляются в один список

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

# получить входные данные от пользователя
matrix = [list(map(int, input().split())) for _ in range(int(input()))]

# проанализировать данные
dictionary = {}

for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        key = matrix[i][j]

        # проанализировать строку и получить нечетные значения
        line1 = [matrix[i][x] for x in range(len(matrix[i])) if matrix[i][x] % 2]

        # проанализировать столбец и получить нечетные значения
        line2 = [matrix[x][j] for x in range(len(matrix)) if matrix[x][j] % 2]

        # добавить в словарь
        if key not in dictionary:
            dictionary[key] = []

        dictionary[key] = sorted(set(dictionary[key] + line1 + line2))

print(dictionary)

если сам элемент
(i, j) в анализе участвовать не должен, тогда надо сделать так:

    # проанализировать строку и получить нечетные значения
    line1 = [matrix[i][x] for x in range(len(matrix[i])) if matrix[i][x] % 2 and x != j]

    # проанализировать столбец и получить нечетные значения
    line2 = [matrix[x][j] for x in range(len(matrix)) if matrix[x][j] % 2 and x != i]

P.S.
разобравшись с задачей получается такой код (через упрощение первоначального общего):

# получить входные данные от пользователя
matrix = [list(map(int, input().split())) for _ in range(int(input()))]

# проанализировать данные
dictionary = {}

for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        if i == len(matrix) // 2:
            # проанализировать строку и получить нечетные значения
            line1 = [matrix[i][x] for x in range(len(matrix[i])) if matrix[i][x] % 2 and x != j]

            # проанализировать столбец и получить нечетные значения
            line2 = [matrix[x][j] for x in range(len(matrix)) if matrix[x][j] % 2 and x != i]

            # добавить в словарь
            key = matrix[i][j]
            if key not in dictionary:
                dictionary[key] = []

            dictionary[key] = sorted(set(dictionary[key] + line1 + line2))

print(dictionary)

P.P.S.
код можно пооптимизировать, например если перенести условия и вычисления связанные только с
i под
for i и над
for j - т.е. кол-во вычислений можно значительно сократить (на случай, если тест еще и время засекает)


проверка строки на палиндром (слово проверяется, текст нет)
Проверка слова палиндрома проходит, а строки ну никак, выдает False
пример палиндрома: А буду я у дуба
<code>
def palyndrom ():
    usr_string = input("enter string")

    urs_string = usr_string.replace(' ', '').replace(',', '').lower()

    reverce_str = usr_string[:: -1]

    if usr_string == reverce_str:
        print ("True")
    else :
        print("False")
palyndrom()
</code>

Попробуйте:

def is_palyndrom(text: str) -> bool:
    text = text.lower().strip().replace(' ', '')
    return text == text[::-1]

text = 'А буду я у дуба'
print(is_palyndrom(text))
# True

usr_string = input("enter string")
print(is_palyndrom(usr_string))

Вместо удаления символов можно заново составить текст, оставив только те, что разрешены (из русского алфавита):

def is_palyndrom(text: str) -> bool:
    ru_lowercase = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    text = ''.join(c for c in text.lower() if c in ru_lowercase)
    return text == text[::-1]

Или вариант через регулярки (тут все символы, что не входят в кириллицу, будут удалены):

import re

def is_palyndrom(text: str) -> bool:
    text = re.sub('[^а-яё]', '', text.lower())
    return text == text[::-1]


Каcтомный путь до .pypirc
Файл
.pypirc задаёт настройки для того, чтобы пушить пакеты в registry. Но он может находиться только в
$HOME. Как установить кастомную директорию для нахождения
.pypirc, а не домашнюю?

Это можно сделать путем перегрузки классов команд по умолчанию, используемых для связи с PyPI или вашим настраиваемым сервером репозитория. Это можно сделать в вашем скрипте setup.py. Пусть сначала говорит код:

# this is your project's setup.py script

import os
from distutils.command.register import register as register_orig
from distutils.command.upload import upload as upload_orig

from setuptools import setup

class register(register_orig):

    def _get_rc_file(self):
        return os.path.join('.', '.pypirc')

class upload(upload_orig):

    def _get_rc_file(self):
        return os.path.join('.', '.pypirc')

setup(
    name='myproj',
    ...
    cmdclass={
        'register': register,
        'upload': upload,
    }
)

Заметьте, что некоторые импорты в IDE могут выделяться как ненайденные. Не стоит этого пугаться. Из консоли всё прекрасно работает:

$ python setup.py sdist register upload

учетные данные сервера будут взяты из
.pypirc в каталоге проекта, а не из стандартного
~/.pypirc.
Таким образом, все, что вам нужно сделать, это заменить команды
register и
upload на свои собственные реализации. Эти реализации переопределяют метод
_get_rc_file с вашей собственной логикой. После этого не забудьте настроить аргумент
cmd_class в вашей функции
setup так, чтобы вместо стандартных классов использовались ваши собственные классы команд.
Конечно, поскольку оба класса переопределяют один и тот же метод, вы можете изменить код, например, написание класса миксина и его повторное использование и т. д. Кроме того, если вы загружаете документы sphinx в PyPI с помощью команды
upload_docs, вам придется перегрузить его таким же образом. В любом случае, вы должны получить общее представление о перегрузке команд из приведенного выше фрагмента.


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

a = int(input("Введите число, которое будет началом диапазона случайных чисел: "))
b = int(input("Введите число, которое будет концом диапазона случайных чисел: "))
c = random.randint(0, 100) # длина последовательности целых чисел, к примеру, возьмем случайное число от 0 до 100

rndlist = [random.randint(a, b) for i in range(c)] # Создаем и заполняем список, состоящий из случайных чисел и длиной "c"

newlist = []

for i in rndlist:
    if -10 < i < 10:
        newlist.append(i)

print(newlist)

Далее нужно найти максимальное значение 1-го списка (rndlist)

maxvalue = max(rndlist)

И вставить maxvalue после каждого положительного элемента второго массива (newlist)
Здесь собственно и вся проблема, с которой и ищу помощи :)
Заранее крайне благодарен! :)

for i in range(len(newlist) - 1, -1, -1):  # Проходим по индексам с конца
    if newlist[i] > 0:  # Если положительный
        newlist.insert(i + 1, maxvalue)  # Вставляем после него


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

Сделал так.
<code>
from os import path, system

file_path = path.abspath(__file__)[:-len(path.basename(__file__))]

buf_strings = []

system("wmic process get Caption, ProcessId, CommandLine >" + file_path + "PID.txt")

with open(file_path + "PID.txt", "r", encoding='utf-16-le') as file:
    for lines in file:
        if ".py" in lines and "python.exe" not in lines:
            for lines in lines.split():
                if "py.exe" not in lines:
                    buf_strings.append(lines)

print(buf_strings)
</code>


Как можно правильно оформить обработчик запросов в HTTP-сервере?
Имею такой вот хттп-сервер на питоне (весь код будет ниже). Передо мной стоит задача: необходимо при загрузке определённой страницы (скажем index.html) делать определённые действия (скажем, вызывать time.sleep() и "засыпать" на какое-то время). Насколько я понимаю, необходимо правильно описать do_GET() метод. Но каким таким образом? Может ли кто-нибудь направить меня на пусть истинный?
<code>
import http.server, socketserver, os
import _thread as thread

PORT = 8000
DIR = '/home/root/dir'
ADDRESS = '127.0.0.1'

class Handler(http.server.SimpleHTTPRequestHandler):

    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        self._set_headers()
        http.server.SimpleHTTPRequestHandler.do_GET(self)

    def do_POST(self):
        if self.path.startswith('/kill_server'):

            def kill_me_please(server):
                server.shutdown()
            thread.start_new_thread(kill_me_please, (httpd,))
            self.send_error(500)

class MyHTTPServer(socketserver.TCPServer):

    def server_bind(self):
        import socket
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(self.server_address)

os.chdir(DIR)
server_address = (ADDRESS, PORT)
httpd = MyHTTPServer(server_address, Handler)

try:
    httpd.serve_forever()
finally:
    httpd.server_close()
</code>

<code>
def do_GET(self):
    if self.path.endswith('/test.html'):
        time.sleep(60)
    else:
        self._set_headers()
        http.server.SimpleHTTPRequestHandler.do_GET(self)
</code>
а вот так


Помогите в Python [дубликат]

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

Неправильно работает сравнение переменной с несколькими значениями через or

                                (3 ответа)

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

в моей программе надо представить что есть шахматная доска 8x8
Тоесть A1 клетка - черная, A2 белая;
B1 - белая, B2 - чёрная и т.д. до H8
В программе мы вводим клетку например:
Входные данные №1:
A1
Вывод №1:
BLACK
Входные данные №2:
B1
Вывод №1:
WHITE
Помогите на основе моего кода:
<code>
a = input() # ввод данных
a1 = str(a[0]) # вырезаем букву
a2 = int(a[1]) # вырезаем число
text = "BLACK"
if a1 == 'A' or 'C' or 'E' or 'G':
    if a2 % 2 == 0: # проверка на целое число
        text = "WHITE"
else:
    if a1 == 'B' or 'D' or 'F' or 'H':
        if a2 % 2 == 1: # проверка на не целое число
            text = "WHITE"
print(text)
</code>

a = input() # ввод данных
a1 = str(a[0]) # вырезаем букву
a2 = int(a[1]) # вырезаем число
text = "BLACK"
if a1 in ['A', 'C', 'E', 'G']:
    if a2 % 2 == 1: # проверка на целое число
        text = "WHITE"
else:
    if a2 % 2 == 0: # проверка на не целое число
        text = "WHITE"
print(text)

if ("ABCDEFG".index(a[0])+int(a[1]))%2:
    print("BLACK")
else:
    print("WHITE")


Некорректно работает конструкция if...else. Телеграм бот
Всегда срабатывает
else, нужно чтобы выводилось сообщение
вы не подписаны, в случае, если в таблице поле
status == FALSE, у меня же всегда выводит все то, что в блоке
else. Используется библиотека
aiogram.

@dp.message_handler(commands=['unsubscribe'])
async def unsubscribe(message:types.Message):
    if (db.subscriber_exists(message.from_user.id) == False):
        print (db.get_status(message.from_user.id))
        # если юзера нет в базе, добавляем с неактивной подпиской (запоминаем)
        await message.answer("Вы не подписаны.")
    else:
        # если юзер есть в базе, то обновляем статус подписки
        db.update_subscription(message.from_user.id, False)
        #print (db.get_status(message.from_user.id))
        await message.answer("Я тебе больше не нужен...")
        await message.answer_sticker(r'CAACAgIAAxkBAAEBv8Vf-FRnpC5qrQZn2Qwt-rpBs-OJpwACDAEAAhZ8aAPEXuoz0922Fx4E')
        await message.answer("прощай 😿")

db

import sqlite3

class SQLighter:

    def __init__(self, database):
        """Подключаемся к БД и сохраняем курсор соединения"""
        self.connection = sqlite3.connect(database)
        self.cursor = self.connection.cursor()

    def get_subscriptions(self, status = True):
        """Получаем всех активных подписчиков бота"""
        with self.connection:
            return self.cursor.execute("SELECT * FROM `users` WHERE `status` = ?", (status,)).fetchall()

    def subscriber_exists(self, user_id):
        """Проверяем, есть ли уже юзер в базе"""
        with self.connection:
            result = self.cursor.execute('SELECT * FROM `users` WHERE `user_id` = ?', (user_id,)).fetchall()
            return bool(len(result))

    def add_subscriber(self, user_id, status = True):
        """Добавляем нового подписчика"""
        with self.connection:
            return self.cursor.execute("INSERT INTO `users` (`user_id`, `status`) VALUES(?,?)", (user_id,status))

    def update_subscription(self, user_id, status):
        """Обновляем статус подписки пользователя"""
        with self.connection:
            return self.cursor.execute("UPDATE `users` SET `status` = ? WHERE `user_id` = ?", (status, user_id))

    def get_status(self, user_id):
        """получаем статус юзера"""
        with self.connection:
            result = self.cursor.execute("SELECT `status` FROM `users` WHERE `user_id` = ?", (user_id,)).fetchall()
            return bool(len(result))

    def close(self):
        """Закрываем соединение с БД"""
        self.connection.close()

Думаю, проверку нужно поменять на
fetchone:

    def subscriber_exists(self, user_id):
        """Проверяем, есть ли уже юзер в базе"""
        with self.connection:
            has = self.cursor.execute('SELECT 1 FROM `users` WHERE `user_id` = ?', (user_id,)).fetchone()
            return bool(has)

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

    def subscriber_exists(self, user_id):
        """Проверяем, есть ли уже юзер в базе"""
        with self.connection:
            has = self.cursor.execute('SELECT 1 FROM `users` WHERE `user_id` = ? and `status` = 1', (user_id,)).fetchone()
            return bool(has)

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

    def get_status(self, user_id):
        """получаем статус юзера"""
        with self.connection:
            result = self.cursor.execute("SELECT `status` FROM `users` WHERE `user_id` = ?", (user_id,)).fetchone()
            # Если юзер не был найден
            if result is None:
                return False
            return bool(result[0])

Тогда, можно проверить статус так:

if not db.get_status(message.from_user.id):
    await message.answer("Вы не подписаны.")
else:
    ...

PS.
И я бы еще условие упростил:

if not db.subscriber_exists(message.from_user.id):
    print(db.get_status(message.from_user.id))
    ...


Как создать новый список из фаила .txt?
Задание состоит в следующем:
Дан файл names.txt

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

Нужно написать функцию, которая принимает список строк полученной в пункте 1, и возвращает список словарей
в формате {"name": name, "date": date},
где name это имя автора, а date - дата из строки в формате "dd/mm/yyyy" (d-день, m-месяц, y-год)

Например:  [{"name": Dr. Seuss, "date": 02/03/1904}, {"name": Jules Verne, "date": 24/03/1905}...]

Например, кусок из фаила:

2nd March 1904 - Dr. Seuss's birthday, author of Cat in the Hat
3rd March 2016 - World Book Day 2016
21st March - World Poetry Day
24th March 1905 - Jules Verne's death, author of Around the World in Eighty Days
31st March 1855 - Charlotte Bronte's death - Author of Jane Eyre

Я написал следующее:

def read_txt(filename = "authors.txt"):
    with open(filename, 'r') as file:
        data = []
        for line in file.readlines():
            if line.find("birthday") or line.find("death"):
                data.append(line)
    return data
print(read_txt())

Вот только выводит все равно все строки.
Как это исправить? Что не так делаю?

Функция str.find("text") - возвращает
-1 в том случае если ничего не найдено.
Проверка
if -1: - возвращает
True.
Таким образом проверка
line.find("birthday") or line.find("death") - всегда возвращает
True.
Воспроизведение:

In [178]: if -1:
     ...:     print("What ??")
     ...:
What ??

In [179]: if "aaa".find("bbb"):
     ...:     print("What ??")
     ...:
What ??


Дистрибутив Python приложения
У меня есть декстоп приложение, написанное на .Net. Вместе с ним мне необходимо упаковать еще одно приложение на Python. Есть ли способ, который позволит разрешить проблемы с зависимостям, чтобы моё приложение работало под любой Windows?
Я пробовал
pyinstaller , но с его помощью получается упаковать приложение только под конкретную Windows. Была идея использовать портативный Python и архивы модулей, необходимых для работы приложения, но в зависимостях есть
numpy и
scipy, которым нужен компилятор, для сборки таким методом.

Помогло собрать бинарный файл с помощью
Pyinstaller под 32 битной Windows 7. Проверил, полученное приложение запускается на Windows 7 (x86, x64), Windows 10 (x86, x64), Windows Server 2016.


Ошибка: TypeError: 'Series' objects are mutable, thus they cannot be hashed
У меня есть такой датасет (это только кусок):

   Login   Password
0   Jack      12345
1  admin       2323

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

def check_password(login):
    check = info.iloc(info['Login'] == str(login))
    print(check)

file = 'users.csv'
info = pd.read_csv(file, delimiter=';', names=['Login', 'Password'])
check_password('Jack')

Но что бы я не делал на строке:

check = info.iloc(info['Login'] == str(login))

получаю такую ошибку:

TypeError: 'Series' objects are mutable, thus they cannot be hashed.

Полазив на англоязычной версии сайта, я нашел решение похожей проблемы. Там описывается, что флаг должен быть таким, чтобы Pandas мог высчитать его хеш. В ответе говорилось использовать
int или
str значения. Но я не понимаю, где я ошибся, если флаг у меня -
str значение.

Попробуйте так:

In [164]: name = "Jack"

In [165]: df.query("Login == @name")["Password"]
Out[165]:
0    12345
Name: Password, dtype: int64

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

In [166]: df.query("Login == @name")["Password"].iat[0]
Out[166]: 12345


Как проверить, все ли элементы одинаковы в списке?
<code>
n = int(input())
sp = []
for _ in range(n):
  sp.append(int(input()))
</code>
Как проверить, все ли числа одинаковые в этом списке?

например так:
способ 1:

if len(set(sp)) == 1:
    print("ОДИНАКОВЫЕ!!!")

способ 2:

if [i for i in sp if i != sp[0]] == []:
    print("ОДИНАКОВЫЕ!!!")

способ 3 (скорее всего самый быстрый):

if sp.count(sp[0]) == len(sp):
    print("ОДИНАКОВЫЕ!!!")


Можно ли строку (с числами и арифметическими операторами) посчитать без условий в Python [дубликат]

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

Ввод выражений пользователем

                                (2 ответа)

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

Пример того, что я хочу
<code>
string = input() # Ввожу + или - или / или *

print(10 string 10)
</code>
На выходе должен быть результат в виде ответа в зависимости от символа.
1.Почему бы не сделать через условия спросите вы? Представьте что я не знаю, сколько введет пользователь арифметических операторов и переменных с числами, но это надо посчитать согласно математике. Как это делает Python
2.Или через циклы это все сделать и назначить что, после чего должно выполняться сначала с (+, -) потом (*, /)?
Но зачем изобретать велосипед чтобы покататься, если его уже изобрели. Вы просто научите кататься)

способ 1 (для сильных духом):

text = input("введите выражение:");

print(f"{text} = {eval(text)}")

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

text = input("введите выражение:");

res = 0

action = '+'

actions = {
    '+': lambda a, b: a + b,
    '-': lambda a, b: a - b,
    '*': lambda a, b: a * b,
    '/': lambda a, b: a / b,
}

for obj in text.split():
    if obj in '+-*/':
        action = obj
    else:
        res = actions[action](res, int(obj))

print(res)

тут у операций одинаковый приоритет, но можно чуть дописать код и сделать * и / более приоритетными, правда тогда надо будет и рекурсивный вызов добавить


Как отделить кириллицу от латиницы и несколько своих условий [закрыт]

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

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

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

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

в данный момент я отделяю так:

words_a_z = [x for x in words if re.search('[a-z]', x) if
             x.startswith('var') != True and x.endswith('vz') != True and x[3].isnumeric() != True and x[
                 3].isnumeric() != True and x[9] + x[10].isnumeric() != True and x[15] + x[16] + x[
                 17].isnumeric() != True]

как это можно упростить?, то что знаки 9-10, а также 15-17 можно сгруппировать я в курсе
просто по хорошему у меня шаблон того, что нужно не пропустить такой:
var1vartz02tzvz000vz
после var цифры 1-6
после tz и vz любые цифры
вот со всеми условиями:

words_a_z = [x for x in words if re.search('[a-z]', x) if x.startswith('var') != True and x.endswith('vz') != True and x[3] != [1, 2, 3, 4, 5, 6] and x[4:8] != 'vartz' and x[9:10].isnumeric() != True and x[11:14] != 'tzvz' and x[15:17].isnumeric() != True]

проще это можно записать?
UPDATE:
мне нужно, чтобы в список НЕ попали

var1vartz02tzvz000vz
var1vartz04tzvz004vz
var1vartz04tzvz008vz
var1vartz04tzvz010vz
var1vartz04tzvz012vz
var1vartz04tzvz016vz
var1vartz04tzvz020vz

var могут быть 1-6
в tz и vz могут быть любые цифры в первом случае две цифры, во втором три цифры

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

import re

re_exclude = re.compile(r'var\dvartz\d\dtzvz\d\d\dvz')
words = '''var1vartz02tzvz000vz
var1vartz04tzvz004vz
var1vartz04tzvz008vz
var1vartz04tzvz010vz
var1vartz04tzvz012vz
var1vartz04tzvz016vz
var1vartz04tzvz020vz
somethingdifferent'''.split()
print([word for word in words if not re_exclude.match(word)])

Вывод:

['somethingdifferent']


Как создать декоратор метода класса, который возвращает любой метод для всех экземпляров этого класса?
В моей реализации это выглядит так:
<code>
class qwe ():
    spis = []
    def __init__ (self, name, x, y):
        self.name = name
        self.x = x
        self.y = y
        qwe.spis.append (self)
    def forall (func):
        def wrapper (*args, **kwargs):
            for i in qwe.spis:
                return func(i)
        return wrapper
    @forall
    def pr(self):
        print (self.name)
        print (self.x)
        print (self.y)

p_1 = qwe('san', 10, 20)
p_2 = qwe('serg', 30, 40)
p_3 = qwe('vova', 20, 60)
qwe.pr()
</code>
Но в данном случае метод "pr()" возвращает только значение 0-го экземпляра

после
return функция завершает свой работу, поэтому у вас вызывается первый раз и функцию завершается.
Если убрать
return то все заработает

class qwe ():
    spis = []
    def __init__ (self, name, x, y):
        self.name = name
        self.x = x
        self.y = y
        qwe.spis.append (self)
    def forall (func):
        def wrapper (*args, **kwargs):
            for i in qwe.spis:
                func(i)
        return wrapper
    @forall
    def pr(self):
        print (self.name)
        print (self.x)
        print (self.y)

p_1 = qwe('san', 10, 20)
p_2 = qwe('serg', 30, 40)
p_3 = qwe('vova', 20, 60)
qwe.pr()

А если результат важен то так

class qwe ():
    spis = []
    def __init__ (self, name, x, y):
        self.name = name
        self.x = x
        self.y = y
        qwe.spis.append (self)
    def forall (func):
        def wrapper (*args, **kwargs):
            arr = []
            for i in qwe.spis:
                arr.append(func(i))
            return arr
        return wrapper
    @forall
    def pr(self):
        print (self.name)
        print (self.x)
        print (self.y)

p_1 = qwe('san', 10, 20)
p_2 = qwe('serg', 30, 40)
p_3 = qwe('vova', 20, 60)
qwe.pr()


Как вычислить максимальное количество дней между действиями?
Есть DataFrame, в одном из столбцов которого, хранятся даты действий в виде:

['2020-06-16 02:31:10', '2020-07-16 02:31:10', '2020-09-16 02:31:10', '2020-10-16 02:31:10']

Надо найти максимальный промежуток времени между действиями в днях и записать в новый столбец.
В данном примере это
'2020-09-16 02:31:10' - '2020-07-16 02:31:10' = 62 дня
Подскажите, как лучше всего это сделать?

Как-то так:
<code>
df['Date'] = pd.to_datetime(df['Date'])
max_days = df['Date'].diff().dt.days.abs().max()
</code>


Как вставить информацию из базы данных в выпадающий список в tkinter?
Я новичок, не могу разобраться в коде. Суть следующая, я хочу сделать выпадающее меню в окне tkinter, при этом данные для пункта меню я беру из базы данных main.db из таблицы orgs.
Таблица orgs содержит два столбца "Название организации" и "ИНН организации" и две записи:
ООО 123, 1234567890
ООО 321, 0987654321

con = sqlite3.connect('main.db')
cur = con.cursor()

cur.execute("SELECT * FROM orgs")
rows = cur.fetchall()
for row in rows:
    print(row[0])

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

ООО 123
ООО 321

Далее я хочу вставить эти данные в выпадающее меню, но не получается.

variable = StringVar(root)

variable.set(row[0]) # устанавливаю значение по умолчанию, выдаёт почему-то вторую строку "ООО 321" без ИНН, а надо первую строку "ООО 123" без ИНН.

ispi = OptionMenu(framemain, variable, *row)

На этом этапе, при вызове выпадающего меню он мне выдаёт меню из двух строк "ООО 321" и "0987654321".
Вопрос:
Как взять информацию из первого столбца таблицы базы данных и поместить её в выпадающий список?

Можно сделать ttk.Combobox: Он лучше как выпадающий список. И мороки с ним нет
<code>
from tkinter import ttk
import tkinter as tk

### Запросы sql и тд

root = tk.Tk()
combo = ttk.Combobox(root)
combo.pack()

def add_value(v):
    combo['values'] = tuple(list(combo['values']) + ['v'])

add_value(row[0])

root.mainloop()
</code>


Как вывести строки в DF по списку значений в столбце?
У меня есть вот такой DF:

df = pd.DataFrame({'A': ['100','110','120','130','140','150','160','170'],
'B': ['a','b','c','d','f','g','h','y'], 'C': ['a','b','c','d','f','g','h','y']})

A   B   C
0   100 a   a
1   110 b   b
2   120 c   c
3   130 d   d
4   140 f   f
5   150 g   g
6   160 h   h
7   170 y   y

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

list = [110,140,170]

Как мне, применив эти значения к столбцу А, вывести по ним соответствующие строки?
Должно получиться вот так:

    A   B   C
1   110 b   b
2   140 f   f
3   170 y   y

Значения в списке и в столбце должны быть одинакового типа, а у вас в столбце
A - строки, а в списке - целые числа.

In [138]: s = pd.Series(list_).astype(str)

In [139]: df.query("A in @s")
Out[139]:
     A  B  C
1  110  b  b
4  140  f  f
7  170  y  y

либо наоборот - приводим столбец к числовому типу данных и после этого ищем:

In [141]: df[df["A"].astype(int).isin(list_)]
Out[141]:
     A  B  C
1  110  b  b
4  140  f  f
7  170  y  y

Если же в ваших реальных данных типы данных в столбце и списке совпадают, то решение будет выглядеть проще:

res = df.query("A in @list_")

или так:

res = df[df["A"].isin(list_)]

PS не используйте зарезервированные слова (такие как
list) в качестве имен собственных переменных, функций и классов, чтобы избежать ненужных проблем.


Python. Поднять регистр слов в строке
Сижу над кодом. Вроде сделал правильно, но где-то есть ошибка и программа не делает то, что должна.
Задание: Задано текст, сделать программу которая определяет и поднимает регистр тех слов, в которых согласных меньше, чем гласных
Мой код:
<code>
text="ііі ввв ііі"
lst=text.split()
print(lst)
vowels = 0
consonants = 0
for i in lst:
    letter = i.lower()
    if letter == "а" or letter == "е" or\
        letter == "и" or letter == "і" or\
        letter == "о" or letter == "у":
        vowels += 1
    else:
        consonants += 1
        if vowels > consonants:
            i.upper()
print(lst)
</code>

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

result = [w.upper() if len([l for l in w.lower() if l in 'аеиіоу']) > len(w) // 2 else w for w in text.split()]

вариант 2:

result = [(w, w.upper())[len([l for l in w.lower() if l in 'аеиіоу']) > len(w) // 2] for w in text.split()]

вариант 3 (спасибо @Danis):

result = [(w, w.upper())[sum(l in "aеиіоу" for l in w.lower()) > len(w) // 2] for w in text.split()]


Python. Множества
Сделал программу, всё работает, но если 1 задание - ещё нормально выводит, то 2 - нет, ибо нужно что бы цифры были в порядке возрастания. Возможно я неправильно обращаюсь с числовыми множествами.
Задание: есть множество целых чисел {1,2,3,4,5,6,7,8,9}
1)Сделать функцию, которая будет считать количество уникальных цифр в числе n.
2)Выводит в порядке возрастания все цифры, которых нету в числе n
Мой код:
<code>
n = input("Число: ")
a = {"1", "2", "3", "4", "5", "6", "7", "8", "9"}

result=list(set(a) & set(n))
print(len(result))

result1=list(set(a)-set(result))
print(result1)
</code>

если я правильно понял задачу то так:
<code>
num = input()

task1 = len(set(num))

task2 = sorted(set('0123456789') - set(num))

print(task1)
print(*task2)
</code>


Не получается соединить пути при помощи os.path.join()
Пытаюсь соединить пути в системе при помощи os.path.join()
У меня есть класс, в который приходит параметр '\icons'
И он ни как не присоединяется к пути root в self.sorting_path

class SortingFiles:
    def __init__(self, sorting_pat):
       self.root_path = os.getcwd()
       self.sorting_path = os.path.join(self.root_path,sorting_pat)
       self.end_path = os.path.join(self.root_path, 'icons_by_year')
       self.files = {}
       print(self.files)
       print(self.sorting_path)
       print(self.root_path)

Вот что, выводят принты:

{}
C:/icons
C:/Users/bluntwave/PycharmProjects/python_base/lesson_009

Ваша проблема в лидирующем слеш - такой путь join начинает строить от корня первого пути, т.е. если убрать лидирующий слеш (вместо
\icons передать
icons) то все будет работать.

import os

root_path=r'c:\dummy\root\path'
path_with_slash=r'\target'
path_without_slash='target'

print(os.path.join(root_path,path_with_slash))    # c:\target
print(os.path.join(root_path,path_without_slash)) # c:\dummy\root\path\target


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

Я это делал через отдельный профиль в браузере.
Шаги (для Firefox):

Создал отдельный профиль (в адресной строке
about:profiles)
Запустил браузер с новым профилем
Зашел и авторизовался на сайте (куки получил)
В selenium'е указывал тот профиль

Пример:

    ...
    profile_directory = r'%AppData%\Mozilla\Firefox\Profiles\p75l82q1.for_mail__selenium'
    profile = webdriver.FirefoxProfile(os.path.expandvars(profile_directory))

    driver = webdriver.Firefox(profile, options=options)


Получение доступа к объекту через идентификатор
Необходимо реализовать что-то типа "указателей" на пайтоне...
Появилась идея использовать
id(obj), но появился вопрос: как мне получить обратно доступ к объекту по возвращаемому значению от
id()?
Или может есть более удобный способ?

Через
ctypes, если я правильно понял "получить обратно доступ к объекту":

import ctypes

text = "may force be with you"
obj_id = id(text)

print(ctypes.cast(obj_id, ctypes.py_object).value)

напечатает:

may force be with you


Как вывести 3 массива в 3 столбца в питоне
как вывести 3 подмассива в 3 столбца, как я понимаю, нужно задать ему координаты х и у

table[x][y]

что-то на подобе такого, но к сожелению, я никак не могу понять как в питоне их записать (а в гугле я смог найти функции np, но как сделать это без них). Нужно создать дополнительную функцию ?

tableData = [['cherries', 'banana', 'apples', 'bobs'],
             ['Alice', 'Carol', 'Bob', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

def printTable(table):
    for i in table:
        for j in i:
            print(j.rjust(len(max(i)), '+'))

printTable(tableData)

благодарен заранее

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

def printTable(table):
    mm = list(map(lambda x: len(max(x, key=lambda y: len(y))), table))
    for i in zip(*table):
        for j in range(len(i)):
            print(i[j].rjust(mm[j], ' '), end='  ')
        print()

выведет

cherries  Alice   dogs
  banana  Carol   cats
  apples    Bob  moose
    bobs  David  goose


Как передать список из одного класса в другой?
В виджете
Label класса
Text необходимо указать принадлежность к фрейму, который создается в класса
Frames, значение, а точнее список фреймов, с параметрами, сохраняются в список
self.List_frames, требуется передать этот список в класс
Text, а затем указать в виджете
Label принадлежность к одному из фреймов в списке, обратившись к нему по индексу, как лучше всего это реализовать?

from tkinter import *
import tkinter as tk

root = Tk()
root.title('Python')
root.geometry('605x400')
root.resizable(width = False, height = False)

# Класс реализации фреймов
class Frames():
    # Инициализация заданых параметров
    def __init__(self, background_line, width_line, height_line):
        self.background_line = background_line
        self.width_line = width_line
        self.height_line = height_line
        # Лист фреймов
        self.List_frames = []
        # Лист имен фреймов
        self.List_name_frames = ['One_line', 'Two_line', 'Three_line', 'Four_line', \
                                 'Five_line', 'Six_line', 'Seven_line', 'Eight_line',\
                                 'Nine_line', 'Ten_line']

        # Создание фреймов, присвоение параметров к фреймам, запись фреймов в список
        for name_line in self.List_name_frames:
            name_line = Frame(root, background = self.background_line, \
                              width = self.width_line, height = self.height_line)
            self.List_frames.append(name_line)

        # Вызов созданных фреймов с параметрами на экран
        for line in self.List_frames:
            line.pack(anchor = W)
            line.pack_propagate(False)

# Класс реализации текста
class Text():
    def __init__(self, text, background_text, font_text, foreground_text, width_texts):
        self.Pixel_Virtual = tk.PhotoImage(width = 1)
        self.text = text
        self.background_text = background_text
        self.font_text = font_text
        self.foreground_text = foreground_text
        self.width_text = width_texts

        # Создание текстового поля [День:]
        Day = Label(image = self.Pixel_Virtual, text = self.text,
                    background = self.background_text, font = self.font_text,
                    foreground = self.foreground_text, width = self.width_text)

# Создаем обьект класса фреймов
# Параметры: цвет фона, ширина, высота
call_Frames = Frames('olivedrab', 605, 40)

# Создаем обьект класса текста
# Параметры: текст, цвет фона, стиль текста, цвет текста, ширина блока с текстом
call_Text = Text('День', 'green', 'Arial 12', 'black', 40)

root.mainloop()

Разобрался, нужно использовать переменную класса вместо переменной экземпляра

# Класс реализации фреймов
class Frames():
    # Лист фреймов
    List_frames = []
    # Инициализация заданых параметров
    def __init__(self, background_line, width_line, height_line):
        self.background_line = background_line
        self.width_line = width_line
        self.height_line = height_line

# Функция текстового поля [День:]
    def day(self):
        Day = Label(Frames.List_frames[0], image = self.Pixel_Virtual, text = self.text,
                    background = self.background_text, font = self.font_text,
                    foreground = self.foreground_text, width = self.width_text,
                    height = self.height_texts)
        Day.pack(side = LEFT, padx = 2, pady = 2)


Django Nginx 502 Bad Gateway nginx/1.18.0

systemd[6181]: gunicorn.service: Failed to execute command: Permission
denied
systemd[6181]: gunicorn.service: Failed at step EXEC spawning
/home/neggo/venv/bin/gunicorn: Permission denied

Залил проект на сервер, но в итоге получаю ошибку 502.
Сделал диагностику и оказалось gunicorn не работает. Разрешение давал 710
Делал по инструкции

проверь сокет файл
<code>
$ sudo systemctl status nginx
$ sudo tail -f /var/log/nginx/error.log
</code>


Проблема с слиянием массивов Python
Я хочу "склеить" два массива,но при попытке их слить я получаю конечную часть с кавычками.
(data.txt)

5,4,6

(Code)

with open('data.txt') as f:
   array = [i.rstrip() for i in f]
   array1 = [1,5,8,9]
   result = array + array1

[1,5,8,9,5,4,6] (Желаемый результат)

[1,5,8,9,'5','4','6'] (Получаемый результат)

проблема в том что в
array у вас находится строки, а не числа. Вам надо превратить число

array = [int(i.rstrip()) for i in f]

Если они записаны в одну строку через запятую то так:

line = f.readline()
array [int(el) for el in line.split(",")


Поиск и сравнение по словарю
Есть 10 моментов из суток, с временем в часах, минутах и секундах, нужна программа которая сможет делать сравнение на два любых момента и определит, какой из них был раньше.
Пробую сделать через цикл for, была идея, делаю просто n1 и n2 через input, А сравнивает так: поиск минимального значение 'h', а если есть равные есть, тогда перейти к сравнению 'm' и аналогично к 's'.
Мой код:
<code>
ivents = {
    '1': {'h': 23,'m': 11,'s':32},
    '2': {'h': 4,'m': 32,'s':13},
    '3': {'h': 6,'m': 14,'s':51},
    '4': {'h': 14,'m': 32,'s':1},
    '5': {'h': 2,'m': 4,'s':32},
    '6': {'h': 21,'m': 58,'s':3},
    '7': {'h': 16,'m': 51,'s':6},
    '8': {'h': 19,'m': 21,'s':51},
    '9': {'h': 17,'m': 32,'s':16},
    '10': {'h': 2,'m': 6,'s':19},
}

n1=int(input("n1:"))
n2=int(input("n2:"))

for num in ivents:
    if n1[h] != n2[h] in num:
        for 'h' in num:
        key_min = min(ivents.keys(), key=(lambda k: ivents[k]))
    elif n1[m] != n2[m] in num:
        for 'm' in num:
        key_min = min(ivents.keys(), key=(lambda k: ivents[k]))
    else:
        for 's' in num:
        key_min = min(ivents.keys(), key=(lambda k: ivents[k]))
    print(key_min)
</code>

Реализация преобразования и сравнения времени, как сказал @Kers, возможно, подойдет:

import datetime

events = {
    '1': {'h': 23, 'm': 11, 's': 32},
    '2': {'h': 4, 'm': 32, 's': 13},
    '3': {'h': 6, 'm': 14, 's': 51},
    '4': {'h': 14, 'm': 32, 's': 1},
    '5': {'h': 2, 'm': 4, 's': 32},
    '6': {'h': 21, 'm': 58, 's': 3},
    '7': {'h': 16, 'm': 51, 's': 6},
    '8': {'h': 19, 'm': 21,'s': 51},
    '9': {'h': 17, 'm': 32,'s': 16},
    '10': {'h': 2, 'm': 6, 's': 19},
}

n1 = input('n1: ')
n2 = input('n2: ')

d1 = datetime.datetime.strptime(f'{events[n1]["h"]}:{events[n1]["m"]}:{events[n1]["s"]}', '%H:%M:%S').time()
d2 = datetime.datetime.strptime(f'{events[n2]["h"]}:{events[n2]["m"]}:{events[n2]["s"]}', '%H:%M:%S').time()

if d1 > d2:
    print(f'событие {n2} произошло раньше, чем {n1}')
elif d1 < d2:
    print(f'событие {n1} произошло раньше, чем {n2}')
else:
    print('события произошли одновременно')

PS Хотя, если формат именно такой, как в тесткейсе, проще и понятнее перевести всё в секунды и сравнить два числа... и писАть меньше:

d1_seconds = events[n1]["h"]*3600 + events[n1]["m"]*60 + events[n1]["s"]
d2_seconds = events[n2]["h"]*3600 + events[n2]["m"]*60 + events[n2]["s"]

if d1_seconds > d2_seconds:
    print(f'событие {n2} произошло раньше, чем {n1}')
elif d1_seconds < d2_seconds:
    print(f'событие {n1} произошло раньше, чем {n2}')
else:
    print('события произошли одновременно')


Python. Максимальное значение словаря
Дано список из 10 учениками и оценки из 10 предметов. Нужна программа, которая находит фамилию ученика с наибольшим и наименьшим количеством балов. Казалось, что вроде правильно всё, но программа не работает. Я так понимаю, что ошибка в цикле.
Вот мой код:
<code>
from collections import Counter
students={
'Трамп':{'Геометрія': 2,'Біологія': 3,'Англійська мова': 5,'Фізика': 3,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 2},
'Зеленський':{'Геометрія': 3,'Біологія': 3,'Англійська мова': 5,'Фізика': 3,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 2},
'Панасенко':{'Геометрія': 4,'Біологія': 4,'Англійська мова': 4,'Фізика': 4,'Алгебра': 1,'Українська мова': 3,'Хімія': 1,'Право': 2,'Історія': 1,'Німецька мова': 5},
'Сухацький':{'Геометрія': 2,'Біологія': 1,'Англійська мова': 2,'Фізика': 1,'Алгебра': 2,'Українська мова': 2,'Хімія': 1,'Право': 2,'Історія': 1,'Німецька мова': 1},
'Байда':{'Геометрія': 2,'Біологія':2,'Англійська мова': 5,'Фізика': 3,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 1,'Історія': 3,'Німецька мова': 3},
'Бородюх':{'Геометрія': 3,'Біологія': 4,'Англійська мова': 5,'Фізика': 1,'Алгебра': 2,'Українська мова': 1,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 2},
'Бучко':{'Геометрія': 4,'Біологія': 5,'Англійська мова': 5,'Фізика': 4,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 1,'Історія': 4,'Німецька мова': 4},
'Поліщук':{'Геометрія': 4,'Біологія': 3,'Англійська мова': 5,'Фізика': 5,'Алгебра': 2,'Українська мова': 1,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 4},
'Шевченко':{'Геометрія': 1,'Біологія': 3,'Англійська мова': 5,'Фізика': 3,'Алгебра': 3,'Українська мова': 5,'Хімія': 2,'Право': 3,'Історія': 4,'Німецька мова': 2},
'Горбач':{'Геометрія': 5,'Біологія': 5,'Англійська мова': 5,'Фізика': 5,'Алгебра': 5,'Українська мова': 5,'Хімія': 4,'Право': 4,'Історія': 5,'Німецька мова': 5}
            }

resultdict = {}
for name in students:
    for i in name:
        for key in i:
            resultdict[key] += i[key]

print(resultdict)
print(max(resultdict))
print(min(resultdict))

</code>

попробуйте так:

students={
    'Трамп':{'Геометрія': 2,'Біологія': 3,'Англійська мова': 5,'Фізика': 3,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 2},
    'Зеленський':{'Геометрія': 3,'Біологія': 3,'Англійська мова': 5,'Фізика': 3,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 2},
    'Панасенко':{'Геометрія': 4,'Біологія': 4,'Англійська мова': 4,'Фізика': 4,'Алгебра': 1,'Українська мова': 3,'Хімія': 1,'Право': 2,'Історія': 1,'Німецька мова': 5},
    'Сухацький':{'Геометрія': 2,'Біологія': 1,'Англійська мова': 2,'Фізика': 1,'Алгебра': 2,'Українська мова': 2,'Хімія': 1,'Право': 2,'Історія': 1,'Німецька мова': 1},
    'Байда':{'Геометрія': 2,'Біологія':2,'Англійська мова': 5,'Фізика': 3,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 1,'Історія': 3,'Німецька мова': 3},
    'Бородюх':{'Геометрія': 3,'Біологія': 4,'Англійська мова': 5,'Фізика': 1,'Алгебра': 2,'Українська мова': 1,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 2},
    'Бучко':{'Геометрія': 4,'Біологія': 5,'Англійська мова': 5,'Фізика': 4,'Алгебра': 2,'Українська мова': 2,'Хімія': 3,'Право': 1,'Історія': 4,'Німецька мова': 4},
    'Поліщук':{'Геометрія': 4,'Біологія': 3,'Англійська мова': 5,'Фізика': 5,'Алгебра': 2,'Українська мова': 1,'Хімія': 3,'Право': 5,'Історія': 1,'Німецька мова': 4},
    'Шевченко':{'Геометрія': 1,'Біологія': 3,'Англійська мова': 5,'Фізика': 3,'Алгебра': 3,'Українська мова': 5,'Хімія': 2,'Право': 3,'Історія': 4,'Німецька мова': 2},
    'Горбач':{'Геометрія': 5,'Біологія': 5,'Англійська мова': 5,'Фізика': 5,'Алгебра': 5,'Українська мова': 5,'Хімія': 4,'Право': 4,'Історія': 5,'Німецька мова': 5}
}

resultdict = {}
for name in students:
    resultdict[name] = 0
    for i in students[name]:
        resultdict[name] += students[name][i]

print(resultdict)
print(max(resultdict, key=lambda value:resultdict[value]))
print(min(resultdict, key=lambda value:resultdict[value]))

либо так:

print(max(students, key=lambda key:sum(students[key].values())))
print(min(students, key=lambda key:sum(students[key].values())))


Код не исполняется после app.exec_()
Как сделать так, чтобы код после
app.exec_() был выполнен?
main.py:

from PyQt5.QtWidgets import *

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

app = QApplication([])
window = MainWindow()

text = QLabel(window)

window.show()
app.exec_()

text.setText("Hello, world")      # этот код не будет выполнен :(

Так как вы задумали - не получится. Попробуйте так:
<code>
from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication
from PyQt5.QtCore import QThread

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.label = QLabel("Label", self)

    def closeEvent(self, event):
        self.label.setText("Hello, world")
        QApplication.processEvents()
        QThread.msleep(3000)

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    try:
        sys.exit(app.exec_())
    except SystemExit:
        print('Closing Window... ')
</code>


Ошибка при создании базы данных
Начал изучать создания баз данных в python.
Написал код для создание бд как в документации, но почему то возникает ошибка.

Traceback (most recent call last):
File "F:\bot_zadach\test.py", line 6, in <module>
cur.execute("""CREATE TABLE IF NOT EXISTS users(
sqlite3.OperationalError: unrecognized token: "1za"

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

import sqlite3

conn = sqlite3.connect('orders.db')
cur = conn.cursor()

cur.execute("""CREATE TABLE IF NOT EXISTS users(
   id INT PRIMARY KEY,
   fullname TEXT,
   1za TEXT,
   1za_pom INT,
   2za TEXT,
   2za_pom INT,
   3za TEXT,
   3za_pom INT.
   4za TEXT,
   4za_pom INT,
   5za TEXT,
   5za_pom INT,
   6za TEXT,
   6za_pom INT,
   7za TEXT,
   7za_pom INT,
   8za TEXT,
   8za_pom INT.
   9za TEXT,
   9za_pom INT,
   10za TEXT,
   10za_pom INT);
""")
conn.commit()

Название колонок должны быть в кавычках
Т.е вот так
<code>
sql = """
CREATE TABLE IF NOT EXISTS "users" (
   "id" INT PRIMARY KEY,
   "fullname" TEXT,
   "1za" TEXT,
   "1za_pom" INTEGER,
   "2za" TEXT,
   "2za_pom" INTEGER,
   "3za" TEXT
);
"""
</code>


Python. Проверка значения на наличие в словаре
Всем привет, с праздниками! Возникла проблема из словарями в Python.
Читал разную документацию и форумы, знаю что можно сделать через key поиск, но не могу понять, как нужно вывести названия. Последняя попытка была через цикл for. Задание:
Есть 10 стран с названиями и общей информации о них ( площадь, население и части мира). Написать Программу для поиска стран, которые находятся в Африке или Азии. Вывод должен быть из их названий.
<code>
countries={
'Нігерія':{'cw': 'Нігерія','sq': '923768','sq':'195900000','ct':'Африка' },
'Німеччина':{'cw': 'Німеччина','sq': '357578','sq':'83000000','ct':'Європа'},
'Пакистан':{'cw': 'Пакистан','sq': '803950','sq':'187300000','ct':'Азія'},
'Італія':{'cw': 'Італія','sq': '301000','sq':'60600000','ct':'Європа'},
'Узбекистан':{'cw': 'Узбекистан','sq': '447400','sq':'31100500','ct':'Азія'},
'Франція':{'cw': 'Франція','sq': '643801','sq':'66990000','ct':'Європа'},
'Палестина':{'cw': 'Палестина','sq': '6220','sq':'5159000','ct':'Азія'},
'Ніґер':{'cw': 'Ніґер','sq': '1267000','sq':'22400000','ct':'Африка'},
'Україна':{'cw': 'Україна','sq': '603628','sq':'41980000','ct':'Європа'},
'Греція':{'cw': 'Греція','sq': '131957','sq':'10760000','ct':'Європа'}
            }

for country in countries:
    if 'Африка' or "Азія" in country:
        print(country)
    else:
        print("-")
</code>

Попробуйте так:
<code>
for country in countries:
    if 'Африка' == countries[country]['ct'] or "Азія" == countries[country]['ct']:
        print(country)
#    else:
#        print("-")
</code>


подскажите как сделать в телеграм боте многоступенчатое меню без отправки сообщений
проблема в том что не могу сделать переход, хочу чтобы при нажатии кнопки открывалось второе меню с функциями, и там же была кнопка назад которая бы возвращала все назад, и все это происходило без отправки ботом команд пользователю
<code>
            small_function = ReplyKeyboardMarkup(
            keyboard = [
                [
                    KeyboardButton(text="Показать функции", callback_data='functions')
                ]
            ],
            resize_keyboard=True
        )
        all_functions = ReplyKeyboardMarkup(
            keyboard = [
                [
                    KeyboardButton(text="function 1", callback_data='Fddddddddddddddd')
                ],
                [
                    KeyboardButton(text="function 2", callback_data='Fddddddddddddddd')
                ],
                [
                    KeyboardButton(text="Вернуться назад", callback_data='Fddddddddddddddd')
                ],
            ],
            resize_keyboard=True
        )

    #insert my keyboard
        sent_message = await bot.send_message(chat_id=chat_id, text=msg,parse_mode = "Markdown", reply_markup=small_function)
        print(sent_message.message_id)
    #PIN my message
        await bot.pin_chat_message(chat_id=chat_id, message_id=sent_message.message_id,disable_notification = None)

    @bot.callback_query_handler(func=lambda call: True)
    async def answer(call):
</code>

Не буду писать полностью код, только  скажу, что для этого Вам пригодится метод:
<code>
bot.edit_message_reply_markup(
    chat_id=message.chat.id,
    message.id=message.message_id,
    reply_markup="Ваша клавиатура")
</code>
Так вы сможете изменять клавиатуру без отправки лишних сообщений.


Telegram бот на Python не отвечает на сообщения
(Эхо-бот из видео Хауди хо) Попытался запустить через консоль, вставив токен от BotFahter в конфиг, но бот не реагирует на /start и какие либо другие сообщения. Ошибок в консоли никаких нет и бот запущен. В чем проблема?
<code>
import telebot
import config

bot = telebot.TeleBot(config.TOKEN)

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

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

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

Согласно документации в обработчике указывается content_types:

@bot.message_handler(content_types=['text'])
def ans(message):
    bot.send_message(message.chat.id, message.text)

Доступные типы:

text,
audio,
document,
photo,
sticker,
video,
video_note,
voice,
location,
contact,
new_chat_members,
left_chat_member,
new_chat_title,
new_chat_photo,
delete_chat_photo,
group_chat_created,
supergroup_
chat_created,
channel_chat_created,
migrate_to_chat_id,
migrate_from_chat_id,
pinned_message
Для добавления реакций на команды используется обработчик
commands:

@bot.message_handler(commands=['start'])
def send_welcome(message):
    bot.reply_to(message, "Howdy, how are you doing?")

так же в обработчике может быть указано несколько команд:

@bot.message_handler(commands=['start', 'help'])