Как можно считать была ли нажата клавиша ESC?
Делаю прогу одну, суть в том, что когда вводишь пароль 3 раза неверно, то должны создаваться окна (TopLevel) в случайных местах(с этим мне уже помогли на форуме), но проблема в том, что это нужно зациклить и отменить их создание при нажатии клавиши ESC. Как это можно реализовать и как считать нажатие клавиши?
Вот кусок кода.
<code>
k = 0
def sravnenie():
    global k

    a = e1.get()

    if a == itog:
        print('Пароль верный!')
        new_window1 = Toplevel(root)
        new_window1.geometry('200x200')
        l3 = Label(new_window1, text = 'Успех!', borderwidth = 5, font = 'TimesNewRoman 30')
        l3.place(x=50, y=50)

    else:
        l4 = Label(text = 'Неверный пароль!')
        l4.place(x=120, y=50)
        k += 1
        print(k)
        if k >= 3:
            print(k,"Достигнут лимит!")
            #new_window2 = Toplevel(root)
            #new_window2.geometry('200x200')
            #l4 = Label(new_window2, text = 'Провал!', borderwidth = 5, font = 'TimesNewRoman 30')
            #l4.place(x=30, y=50)
            show_window()

#окно в случайном месте
def show_window():
    window1 = Toplevel(root)
    w1_width, w1_height = 300, 100  # длина и ширина создаваемого окна
    print(d_width - w1_width, d_height - w1_height)
    # координаты верхнего левого угла создаваемого окна, определяющиеся
    # рандомно:
    w1_x, w1_y = random.randint(0, d_width - w1_width), \
                 random.randint(0, d_height - w1_height)
    window1.geometry(f"{w1_width}x{w1_height}+{w1_x}+{w1_y}")
    window1.title('Окно в случайном месте')
    chek_key_pressed()

def chek_key_pressed():
    if #не нажата ESC: то show_window()

#для окна
d_width, d_height = [root.winfo_screenwidth(), root.winfo_screenheight()]
</code>

import random
from tkinter import *

# окно в случайном месте
def show_window():
    global random_windows
    window1 = Toplevel(root)
    w1_width, w1_height = 300, 100  # длина и ширина создаваемого окна
    # координаты верхнего левого угла создаваемого окна, определяющиеся
    # рандомно:
    w1_x, w1_y = random.randint(0, d_width - w1_width), \
                 random.randint(0, d_height - w1_height)
    window1.geometry(f"{w1_width}x{w1_height}+{w1_x}+{w1_y}")
    window1.title('Окно в случайном месте')
    random_windows.append(window1)  # добавляем в список
    # после создания рандомного окна делаем активным основное окно (root),
    # чтобы в нем принимать нажатие клавиш:
    root.focus()

def destroy_random_windows(*args, **kwargs):
    for i in random_windows:  # для окна в списке рандом. окон
        i.destroy()  # закрываем окно

# для окна
root = Tk()
# при нажатии Esc вызываем функцию destroy_random_windows:
root.bind('<Escape>', destroy_random_windows)
d_width, d_height = [root.winfo_screenwidth(), root.winfo_screenheight()]
random_windows = []  # список для создаваемых в show_window() окон
# моделируем ситуацию, когда создано 3 рандомных окна:
show_window()
show_window()
show_window()
root.mainloop()


Как копировать текст в буфер обмена на python
У меня есть переменная
text в которой храниться информация. Мне надо чтобы по вызову функции, эта информация копировалась в буфер обмена

Сначала скачиваем библиотеку
pyperclip (
pip install pyperclip).
Эта библиотека сможет копировать в буфер обмена информацию.
Пишем код:

#Импортируем pyperclip
import pyperclip

#Делаем переменную text с информацией
text = 'ваша информация'

#Делаем функцию которая принимает переменную text
def write(name):
    pyperclip.copy(name) #Копирует в буфер обмена информацию
    pyperclip.paste()

#Вызываем функцию записи в буфер обмена
write(text)

#Наслаждаемся результатом


NameError: name 'self' is not defined
Код:
<code>
try:
    import vk_api
    from colorama import init, Back, Fore, Style

except ImportError:
    os.system('pip install vk_api')
    os.system('pip install colorama')

init()

class data():
    token = '' #токен юзера
    index = 1 #не трогаем данные пункт (с какого юзера начнется рассылка [list id])
    chatid = 912 #ид чата
    chatids = [None] #Список ид чатов(при chatid = None)
    timewait = 2 #задержка
    message = '''Made by blinchikdev''' #сообщение

    def get_users(api):
        users = api.messages.getChatUsers(chat_id=self.chatid, chat_ids=self.chatids)

    def send(api, users):
        api.messages.send(chat_id=users[self.index], random_id=0, message=self.message)
        self.index += 1
        time.sleep(self.timewait)

def main():
    vk_session = vk_api.VkApi(token=data.token)
    api = vk_session.get_api()

    try:
        data.get_users(api)
        users = data.get_users(api)
    except Exception as error:
        print(error)

    try:

        while data.index != len(users):
            data.send(api, users)
    except Exception as error:
        print(error)

main()

</code>
Ошибка:
name 'self' is not defined.
local variable 'users' referenced before assignment

def get_users(api):
    users = api.messages.getChatUsers(chat_id=self.chatid, chat_ids=self.chatids)

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

def get_users(self, api):

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


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

for i in message:
    mesto = alfavit.find(i) #ищем индекс первого вхождения в строку
    new_mesto = mesto - smeshenie #задаём новый индекс
    if i in alfavit:
        itog += alfavit[new_mesto]  #задаем значения в итог
    else:
        itog += i
print ('Сообщение в расшифрованном виде: ',itog)
</code>

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

а ничего, что вы точку и запятую 2 раза указали?

ыьэюя.,.,0123456

как думаете какой символ будет получаться при кодировании? :)


Как получить простые числа
Вроде простая задача и все в коде понятно кроме самой логики определения простого числа.
Код из книги:
<code>
def main():

    # Локальная переменная
    number = 0

    # Получить число
    number = int(input('Введите целое число: '))

    # Показать информацию о том, является ли число простым
    if is_prime(number):
        print('Введенное вами число является простым.')
    else:
        print('Введенное вами число не является простым.')

# Функция is_prime получает в качестве аргумента число и
# возвращает True, если число простое, и False в противном случае.
def is_prime(number):
    # Локальные переменные
    half = int(number / 2)
    status = True

    for count in range(2, half + 1):
        if number % count == 0:
            status = False

    return status

# Вызвать главную функцию.
main()
</code>
Почему переменной half присваивается целое значение половины введенного числа и потом half+1 используется как конец цикла?

чтобы проверить что число простое в данном алгоритме он делится на все числа от
2 до
int(number / 2) включительно (поэтому и
half + 1)
очевидно, что если число не делится на какое-то число в диапазоне
0 ..number / 2, то оно не делится на любое числа в диапазоне
number / 2 .. number и поэтому проверять на делимость дальше не нужно
ведь если число
a делится на число
b из диапазона
number / 2 .. number:

c = a / b

то оно делится и на число
c из диапазона
0 ..number / 2
Но это неоптимальный алгоритм, потому что достаточно проверить все числа в диапазоне
2 .. sqrt(number) и если число не делится ни на одно число из этого диапазона, то оно простое.
На этом принципе основано решето Эратосфена поиска простых чисел - когда вы рассматриваете только
sqrt(n) чисел чтобы найти все простые числа до
n
P.S.
по хорошему надо проверить делимость на 2, а дальше в диапазоне проверять только нечётные числа
а еще как только найден делитель - не надо проверять остальные числа и так понятно, что число составное и можно выходить

def is_prime(number):
    if number % 2 == 0:
        return number == 2

    # Локальные переменные
    sqrt_num = int(number**.5)

    for count in range(3, sqrt_num + 1, 2):
        if number % count == 0:
            return False

    return True


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

Используйте метод из
tkinter
geometry("window_widthxwindow_height+x+y"), чтобы задать координаты левого верхнего угла создаваемого окна. Случайное значение координат можно генерировать с помощью
random.randint() из модуля
random.
Чтобы окно не повлялось за пределами экрана и было видно пользователю, я бы ограничил координаты окна:
x: от 0 до (ширина экрана пользователя - ширина создаваемого окна),
y: от 0 до (высота экрана пользователя - высота создаваемого окна)

import tkinter as tk
import random

def show_window():
    window1 = tk.Toplevel()
    w1_width, w1_height = 300, 100  # длина и ширина создаваемого окна
    print(d_width - w1_width, d_height - w1_height)
    # координаты верхнего левого угла создаваемого окна, определяющиеся
    # рандомно:
    w1_x, w1_y = random.randint(0, d_width - w1_width), \
                 random.randint(0, d_height - w1_height)
    window1.geometry(f"{w1_width}x{w1_height}+{w1_x}+{w1_y}")
    window1.title('Окно в случайном месте')

root = tk.Tk()
# определяем размеры экрана, чтобы окно не создавалось далеко за его пределами:
d_width, d_height = [root.winfo_screenwidth(), root.winfo_screenheight()]
button1 = tk.Button(text='создать окно', command=show_window)
button1.pack()
root.mainloop()


Как отправлять фото по file_id pyTelegramBotAPI

@bot.message_handler(content_types=["text", "contact", "photo", "voice"])
def mess(message):
admin_id = 231... # случайный написал здесь
    if message.voice:
        bot.send_voice(admin_id, message.voice.file_id, f"Имя = {mess.chat.first_name}\n"
                                                     f"user_name = {mess.chat.username}")
    elif message.photo:
        bot.send_photo(admin_id, message.photo.file_id)

Оставленные голосовые сообщения в чате бота, отправляются на указанный id, то есть в другой телеграм аккаунт, а фото нет.
И так тоже не работает (хотя понимаю, что это не должно что-то поменять):

elif message.photo:
    bot.send_photo(chat_id=231..., photo=message.photo.file_id)

Объекте .photo, содержит:

{'file_id': '', 'file_unique_id': '', 'width': , 'height': , 'file_size':}
Вот конкретное фото, которое выберу, с помощью функции open, могу отправить admin_id, а то что пользователь отправил в чат бот, - нет.

Фото нужно отправлять так. Ибо вы берете оригинальный размер фото
<code>
bot.send_photo(chat_id=..., photo=message.photo[-1].file_id)
</code>


Деплой телеграм бота на Яндекс.Облаке
Жил-был на Heroku телеграм бот на питоне. Всё хорошо работало. Использовал python-telegram-bot и вебхуки.
Но т.к. Heroku закрывает ботов на бесплатных тарифах, решил мигрировать на Yandex.Cloud.
И вот тут у меня ничего не получается. Саму среду в яндексе настроить удалось, простой эхо бот работает. А вот как связать получаемый от телеграма json с
Updater из python-telegram-bot пока не понимаю.
Короче, вопрос: как настроить бота на python-telegram-bot в Яндекс.Облако?

Посмотрите это видео. serverless yandex.cloudСегодня по нему бота в облако переселил...только вот засыпает пока что быстро...копаюсь дальше


Функция с regex, которая вернет акроним по переданной в нее строке со словами[Python]
Мне нужно написать функцию с регулярными выражениями, которая будет из рандомной строки делать акроним.
Пробую сразу несколько способов, но они все останавливаются на первом слове:
<code>
import re
def acronym(some_words):
  some_words = 'Информационные технологии'
  for word_pattern in some_words:
    word_pattern_find = re.findall(r'(\w{1})\w+\s+', some_words, flags = re.IGNORECASE)
    word_pattern_search = re.search(r'(\w{1})\w+\s+', some_words, flags = re.IGNORECASE)
    word_sub = re.sub(r'((\w{1})\w+\s+)*', r'\2', some_words)
  print(word_pattern_find)
  print(word_pattern_search.group(1))
  print(word_sub)

acronym(some_words)
</code>
В результате получается
['И'] \ И \ Итехнологии
соответственно после поиска по строке 'Информационные технологии'.
Я пытаюсь весь шаблон включить в скобочную группу и добавлять квантификаторы вроде *, +, ненужную часть шаблона ставить в скобки с ?= и ?:, но все равно не могу сделать так, чтобы следующие слова тоже сокращались до первого символа. Что я делаю не так?

Достаточно добавить
\b (граница слова) в регулярное выражение

import re

def acronym(some_words):
    return ''.join(re.findall(r'\b\w', some_words, flags=re.IGNORECASE)).upper()

some_words = 'Информационные технологии и все такое прочее'
print(acronym(some_words))

ИТИВТП


Как изменять некоторые данные файла json

import json

with open('test.json') as f:
    f = json.load(f)
    print('Out: ', f)

Out:
{'a': {'b': 0, 'c': 2, 'd': 4}, 'e': {'b': 6, 'c': 8, 'd': 10}}
Если я хочу обновить некоторые данные таким способом, то мне приходится перезаписывать все данные, а мне например нужно изменить значение
'd':10 на
'd':12

with open('test.json', 'w') as f:
    f = json.dump({'a': {'b': 0, 'c': 2, 'd': 4}, 'e': {'b': 6, 'c': 8, 'd': 12}}, f)

Вопрос: Как изменять данные выборочно, не перезаписывая все данные?
Вот как вариант:

import json

with open('test.json', 'r') as r:
    r = json.load(r)
    r['e']['d'] = 12
with open('test.json', 'w') as w:
    w = json.dump(r, w)

Это по сути тоже самое что и в примере выше, перезаписывает все данные.
Может у кого есть другие мысли

Файловые системы устроены так, что нельзя перезаписать в файле только несколько символов. Перезаписывается весь кластер на диске, а то и не один. Для NTFS (скорее всего у вас именно эта файловая система) размер кластера по умолчанию (для дисков размером до 32 терабайт) - 4 килобайта. Поэтому, если ваш джейсон меньше 4 кб, то перезаписать данные выборочно невозможно технически.


Найти k-ую цифру в последовтельности
Задача: Дано натуральное число k. Составить программу получения k-той цифры последовательности:

а) 110100100010000..., в которой вписаны подряд степени 10

б) 123456789101112..., в которой вписаны подряд все натуральные числа

в) 149162536...,в которой вписаны квадраты всех натуральных чисел

д) 01123581321..., в которой записаны подряд все числа Фибоначчи

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

def task1():
    num1 = 110100100010000
    num2 = 123456789101112
    num3 = 149162536

    num_arr = []

    while num1 > 0:
        num_arr.append(num1 % 10)
        num1 //= 10

    k = int(input("Enter index of the digit: "))

    for i in range(len(str(num1))):
        if i == k-1:
            result = num_arr[i]

    print(f"Result: {result}")

Проблема в переменной result. Если ее объявить как
result = 0, тогда результат выдает 0, какой бы индекс я не вписал, однако если ее не объявить вообще, то выдает ошибку:

Traceback (most recent call last):
  File "D:\eclipse_workspace\Lab05\Lab05\t2.py", line 34, in <module>
    task1()
  File "D:\eclipse_workspace\Lab05\Lab05\t2.py", line 23, in task1
    print(f"Result: {result}")
UnboundLocalError: local variable 'result' referenced before assignment

Собираем в список и ждем, когда длина всех элементов превысит k.
Обратите внимание, что в функции, вычисляющей числа Фибоначчи, счет элементов идет не с 1, как принято, а  с нуля
<code>
def fibonachi(i):
    a0 = a1 = 1
    for k in range(2, i+1):
        a0, a1 = a1, a0 + a1
    return a1

def task1():
    k = int(input("Enter index of the digit: "))

    num_arr = ['' for _ in range(4)]
    i = 0
    while any(len(x) < k for x in num_arr):
        num_arr[0] += str(10**i)
        num_arr[1] += str(i+1)
        num_arr[2] += str((i+1)**2)
        num_arr[3] += str(fibonachi(i))
        i += 1
    print(*[num_arr[i][k-1] for i in range(len(num_arr))])

task1()
</code>


AttributeError: 'str' object has no attribute 'get' Flask api
Вылетает ошибка:

next_call_date_str = env.get("callback_time", None)
AttributeError: 'str' object has no attribute 'get'

Как можно исправить?
<code>
def write_env_data(
                   env: dict,
                   dialog_uuid: str = '',
                   project=None):
    next_call_date_str = env.get("callback_time", None)

    ex = get_ex(db_expired=next_call_date_str)
    if not ex:
        return f"Incorrect callback_time {next_call_date_str}", 403
    response: tuple = set_to_redis(
        dialog_uuid=dialog_uuid,
        env=env,
        ex=ex,
        project=project,
    )

    return response
</code>

Ошибка вам подсказывает, что у объекта
env нет метода
get, так как это строка.
То есть при вызове функции
write_env_data()  в параметр
env вы передаете строку. Следовательно надо смотреть выше по иерархии на вызов данной функции и передать ожидаемый словарь, а не строку.
NB Определение в функции типа данных вот так:

def func(parameter: dict):
....

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


пожалуйста разобраться с числами [закрыт]

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

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

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

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

Python. помогите, пожалуйста, разобраться до конца, вернее с ошибками
например, вводимые числа:
200, 290, 180, 400, 340, 150, 440, 650, 300, 210.. их может быть и больше
нужно определить является ли число больше при сравнивании со суммой чисел слева и справа. так нужно сделать со всеми. Результат должен быть:
2.290
8.650
сейчас выводит одно число, но нужно сравнить весь список подобно и потом соединить с функцией 'enumerate'
<code>
income = input(" Enter numbers: ")
numbers = [int(d) for d in income.split(',')]

current_number = 0

for index in range(1, len(numbers) - 1):
numbers = (numbers[index - 1], numbers[index], numbers[index + 1])
summary = numbers[index - 1] + numbers[index + 1]
item = numbers[index]
if item >= summary == 0:
current_number += 1

print(item)

for index, item in enumerate(item, start=2):
print(f"index:{index},item:{item}")
</code>

numbers = [200, 290, 180, 400, 340, 150, 440, 650, 300, 210]

print('\n1 способ')
for i, x in enumerate(numbers):
    if 0 < i < (len(numbers) - 1) and numbers[i - 1] < x > numbers[i + 1]:
        print(f'{i + 1}.{x}')

print('\n2 способ')
for i, x in enumerate(numbers[1:-1]):
    if numbers[i] < x > numbers[i + 2]:
        print(f'{i + 2}.{x}')

print('\n3 способ')
for i, (y, x, z) in enumerate(zip(numbers, numbers[1:], numbers[2:])):
    if y < x > z:
        print(f'{i + 2}.{x}')

1 способ
2.290
4.400
8.650

2 способ
2.290
4.400
8.650

3 способ
2.290
4.400
8.650


Как сделать отрисовку метки каждые 5 сек? [дубликат]

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

Периодическое обновление Label в tkinter

                                (2 ответа)

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

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

from tkinter import *
import time

root = Tk()
root.title('main')
root.geometry('400x400')

def develop_label():

    l1 = Label(text = '1', font = 'TimesNewRoman 12')
    l1.place(x=10,y=10)

    #time.sleep(5) #in sec

    l2 = Label(text = '2', font = 'TimesNewRoman 12')
    l2.place(x=10,y=50)

    l3 = Label(text = '3', font = 'TimesNewRoman 12')
    l3.place(x=10,y=90)

develop_label()
root.mainloop()

time.sleep пока закомментировал, ибо всё равно не работает, как задумывал.
Каким методом можно воспользоваться?

from tkinter import *

root = Tk()
root.title('main')
root.geometry('400x400')

def develop_label(mark_index):
    marks = ['1', '2', '3']
    l1['text'] = marks[mark_index]  # меняем свойство text виджета на значение из списка marks
    if mark_index == len(marks) - 1:  # если сейчас последний элемент
        mark_index = -1
    root.after(5000, develop_label, mark_index + 1)  # (интервал в мс, функция, аргумент функции)

l1 = Label(text='1', font='TimesNewRoman 12')
l1.place(x=10, y=10)

root.after(0, develop_label, 0)  # (интервал в мс, функция, аргумент функции)
root.mainloop()


Как импортировать RestrictChatMember Aiogram
<code>
from aiogram.methods.restrict_chat_member import RestrictChatMember
ModuleNotFoundError: No module named 'aiogram.methods'
</code>
Из документации, использовал обе формы иморта, на каждый раз выпадает одна и та же ошибка

Ну так вы открыли доку для 3 версии, а у вас скорее всего 2.

# хз почему он лежит в вебхуке
from aiogram.dispatcher.webhook import RestrictChatMember

На всякий случай оставлю импорт для 3.

from aiogram.methods import RestrictChatMember


Как получить адрес сайта по кнопке на сайте?
Пытаюсь написать парсер, на сайте есть кнопка, которая получает gps координаты и открывает гугл карты по этим координатам. Я бы хотел получить координаты или ссылку, но не понимаю как это сделать. Для парсинга использую BeautifulSoup
Помогите написать код.
Код кнопки:

Get Directions

Решается данная задача, с помощью библиотеки Selenium
<code>
driver = webdriver.Chrome("C:\chromedriver.exe")
            driver.get(self.link)
            #Указываем текст кнопки, у меня "Get Directions"
            element = driver.find_element("link text", "Get Directions")
            element.click()
            #Получаем список всех вкладок и выбираем новую
            driver.switch_to.window(driver.window_handles[1])
            link_to_map = driver.current_url

</code>


Получение названия переменной через ее значение (не словарь) [закрыт]

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

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

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

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

У меня есть переменная
p1w = [0, 0], мне нужно реализовать код, который по значению переменной сможет как-то сослаться на ее название или вывести его.

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

variables = vars().copy()
for name, value in variables.items():
    if type(value) == list and value == [0, 0]:
        print(name)

Встроенная функция
vars() возвращает словарь всех имен с их значениями.


Ним-2 v2.0 - задача
Имеется задача:

Игра ним для двух игроков с двумя кучами и без ограничения на количество забираемых камней.
Напишите программу с «искусственным интеллектом» (ИИ), которая играет против пользователя и выигрывает, если может. Исходное количество камней в кучах задаёт пользователь, программа всегда ходит первой. Выигрывает забравший последний камень, и при окончании игры нужно объявить победителя.
Алгоритм игры выглядит следующим образом:
Сначала пользователь вводит количества камней в кучах (натуральные числа, каждое на новой строке).
Затем первый ход делает программа и выводит через пробел четыре числа: из какой кучи взяты камни; сколько камней взято; сколько камней осталось в кучах, сначала в первой, затем во второй.
Затем ход делает пользователь: вводит на отдельных строках номер кучи и количество камней, которые он хочет взять.
Если ход некорректный, например, пользователь пытается взять камней больше, чем есть в куче, программа должна вывести: Некорректный ход: <куча> <кол-во камней> и ожидать нового ввода пользователя.
После каждого корректного хода игрока или ИИ нужно выводить четыре числа, как и после первого хода ИИ.
Если выигрывает игрок, то надо вывести фразу: Вы выиграли!, а если ИИ – фразу: ИИ выиграл!
Все сообщения программы должны строго соответствовать условию.
Формат ввода
Для старта игры вводятся два натуральных числа.
Пример диалога игры:
10
10
2 1 10 9
1
15
Некорректный ход: 1 15
2
10
Некорректный ход: 2 10
2
7
2 7 10 2
1 8 2 2
2
1
2 1 2 1
1 1 1 1
1
1
1 1 0 1
2 1 0 0
ИИ выиграл!
Примечания
Данная задача дополнительно проверяется преподавателем.
Обратите внимание, что ИИ в выводе не показывает получаемые данные от игрока.

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

stdout:
/bin/sh ./build.sh 1>&2

stderr:
ИИ не умеет считать: 1 + 2 != 2
Completion status: ABNORMAL_EXIT
Term sig: null
Error code: 2

Вот сам код:

stone1 = int(input())
stone2 = int(input())
stnum = int(0)
take = int(0)
while stone1 != 0 or stone2 != 0:
    if stone1 == 0:
        stnum == 2
    elif stone2 == 0:
        stnum = 1
    else:
        stnum = 1
    if stnum == 1:
        take = 1
        stone1 -= take
    elif stnum == 2:
        take = 1
        stone2 -= take
    print(stnum, take, stone1, stone2)
    if stone1 == 0 and stone2 == 0:
        print('ИИ выиграл!')
    else:
        stnum = int(input())
        take = int(input())
        if stnum == 1:
            while not (1 <= take <= stone1 and take <= stone1):
                print('Некорректный ход:', stnum, take)
                stnum = int(input())
                take = int(input())
            stone1 -= take
        elif stnum == 2:
            while not (1 <= take <= stone2 and take <= stone2):
                print('Некорректный ход:', stnum, take)
                stnum = int(input())
                take = int(input())
            stone2 -= take
        print(stnum, take, stone1, stone2)
        if stone1 == 0 and stone2 == 0:
            print('Вы выиграли!')

Вообще, программа скучная, поскольку нет никакой стратегии. Но если немго разобраться в ваших условиях, она станет более управляемой
<code>
stone1 = int(input())
stone2 = int(input())

while stone1 * stone2 != 0:
    if stone1 == 0:
        stnum = 2
        take = 1
        stone2 -= take
    else:
        stnum = 1
        take = 1
        stone1 -= take
    print(stnum, take, stone1, stone2)
    if stone1 + stone2 == 0:
        print('ИИ выиграл!')
    else:
        while True:
            stnum = int(input())
            take = int(input())
            if stnum == 1:
                if stone1 and 1 <= take <= stone1:
                    stone1 -= take
                else:
                    print('Некорректный ход:', stnum, take)
                    continue
            elif stnum == 2:
                if stone2 and 1 <= take <= stone2:
                    stone2 -= take
                else:
                    print('Некорректный ход:', stnum, take)
                    continue
            break
        print(stnum, take, stone1, stone2)
        if stone1 + stone2 == 0:
            print('Вы выиграли!')
</code>


Преобразовать время в нужный формат
Как преобразовать время, которое я получаю в переменную sunrise_form (15:9), в 15:09?
<code>
sunset = sunsets.sunset_time('iso')
                    sunset_format = datetime.datetime.fromisoformat(sunset)

                    sunrise = sunsets.sunrise_time('iso')
                    sunsire_format = datetime.datetime.fromisoformat(sunrise)
                    sunsire_format.strftime("%hh:%mm")
                    sunsire_format.date()
                    result = w.weather
                    windy = weather.wind()

                    wis = weather.visibility_distance
                    clouds = weather.clouds
                    temperature = Label(tk,
                                        text=f'Погода в городе {str(inputs["text"])} на завтра'
                                             f'{str("-") + str(result.detailed_status)}\n'
                                             f'Погода ощущается как {round(number=feels_like)}°С  \n'
                                             f'Максимальная температура {round(number=max_temp)}°С \n'
                                             f'Минимальная температура {round(number=min_temp)}°С  \n'
                                             f'Температура прямо сейчас {round(number=cel["temp"])}°С\n'
                                             f'Влажность-{round(number=humidity)} %\n'
                                             f'Скорость ветра-{round(number=windy["speed"])}м/с  \n'
                                             f'Количество облаков-{round(number=clouds)}%\n'
                                             f'Средний статистический показатель погоды за '
                                             f' {datetime.datetime.today().month}'
                                             f'.{datetime.datetime.now().day + 1} число- {round(number=feels_like)} °С\n'
                                             f'Видимость {round(number=wis / 1000)}'
                                             f'км,Давление {ceil(ref / 1.33245033213)} '
                                             f'мм.рт.ст,Закат начинается в {sunset_format.hour}:{sunset_format.minute},'
                                             f'Рассвет {sunsire_format.hour}:{sunsire_format.minute}'

                                        , fg='gold', bg='SteelBlue4', width=200, height=10, foreground='gold',
                                        borderwidth=2, activeforeground='SteelBlue', font=("Arial Bold", 17),
                                        justify='center')
                    sleep(0.1)
</code>


Что делает этот код? [ООП Python] [закрыт]

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

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

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

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

Недавно перебрался к ООП, не могу понять что выполняет данный код. Нашёл в видео, а автор не объясняет.
<code>
class Dog:
    def __init__(self, name, age, bread):
        self.name = name
        self.age = age
        self.bread = breed

    def bark(self):
        print("Bark")

    def getInfo(self):
        return {name: self.name,
                age: self.age,
                breed: self.breed}
</code>

Здесь не хватает строчки создания самого класса.
Например,
class Dog:
А так - это код класса собаки.
3 метода:

Инициация объекта класса (конструктор)
Задает экземпляру класса (конкретной собаке) свойства: имя, возраст, порода
Гавкать (выводит текст "Bark")
Получить информацию об объекте класса:
Возвращает словарь: {имя:имя этой собаки, возраст: возраст этой собаки, порода: порода этой собаки}


условия для каждго выбранного элемента combobox
как проверять через условие чему равен combobox, чтобы изменять данные другие? Что в условие вписывать?
<code>
def lookupCustomer():
   if комбобокс == один:
      text = "12"
   elif комбобокс == два:
      text = "21"

combo = Combobox(window)
combo['values'] = ("один", "два")
combo.current(0)
combo.bind("<<ComboboxSelected>>", lookupCustomer)
</code>

Либо
combo.get() == 'один' (один - это то, что вы написали в values комбобокса) либо
combo.current() == 0 в данном варианте 0 - индекс выбранного варинта (0 - первый, 1 - второй и т.д.)

from tkinter import *
from tkinter.ttk import *

def lookupCustomer(text):
    if combo.get() == 'один':
        print("1")
    if combo.get() == 'два':
        print("2")
    # 2 Вариант по индексу:
    if combo.current() == 0:
        print("другой вариант кода: 1")
    if combo.current() == 1:
        print("другой вариант кода: 2")

root = Tk()
combo = Combobox(root)
combo.pack()
combo['values'] = ("один", "два")
combo.current(0)
combo.bind("<<ComboboxSelected>>", lookupCustomer)
root.mainloop()


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

Генерируем 4 случайных числа, каждое из которых больше нуля и которые в сумме дают 1.
Далее просто находим выпуклую комбинацию вершин квадрата.
Проблемой является то, что точки распределяются очень неравномерно, около вершин точек почти нет, а мне бы хотелось, чтобы распределение было равномерным. Какой алгоритм можно использовать для решения задачи?

Создайте два случайных числа
a,
b из отрезка
[0, 1]. Постройте из них выпуклую комбинацию вершин квадрата с коэффициентами
(1-a)(1-b),
a(1-b),
ab,
(1-a)b.


Фильтр для сообщений с реплаем на бота aiogram
Есть такой кусочек кода
<code>
ANSWER_PHRASE = [
    '🖕',
    'Я просто делаю свою работу.',
    'Отвалите от меня, я занят.',
    '🤦♂',
    '😒',
    '🤣',
]

@dp.message_handler(filters.IsReplyFilter())
async def joke_answer(message: types.Message):
    await message.answer(text=random.choice(ANSWER_PHRASE))
</code>
Бот работает в группе телеграм.
Проблема заключается в том, что бот реагирует на все отвеченные сообщения, даже если ответили не на сообщение бота, хэндлер срабатывает.
Как сделать так чтобы это работало только если отвечают сообщение бота?

Вот фильтр который тебе нужен.
<code>
from aiogram.dispatcher.filters import BoundFilter

class ReplyFilterBot(BoundFilter):
    async def check(self, msg: types.Message):
        try:
            if msg.reply_to_message.from_user.id == bot.id:
                return True
        except Exception:
            pass

@dp.message_handler(ReplyFilterBot())
async def joke_answer(message: types.Message):
    await message.answer(text=random.choice(ANSWER_PHRASE))
</code>


Как установить статус участнику тг чата?
из telegram api, нашел тему с ChatMemberRestricted
Так вот, как выдавать ограниченный статус пользователям чата?

Кажется то, что вам нужно уже описано здесь
А тут подробнее про ChatPermissions
<code>

from aiogram import Bot, Dispatcher, types

from aiogram.types.chat_permissions import ChatPermissions
from aiogram.dispatcher.webhook import RestrictChatMember

bot = Bot(token="<ТОКЕН>") # вставьте токен

dp = Dispatcher()

@dp.message(commands=["test"])
async def cmd_start(message: types.Message):
    chat_id = 1 # ID чата
    user_id = 1 # ID пользователя, у которого меняем статус
    perms = ChatPermissions(can_send_messages=false)
    await bot(RestrictChatMember(chat_id=chat_id, user_id=user_id, permissions=perms));
    await message.answer("Ready!")

async def main():
    await dp.start_polling(bot)

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


расположение переменных внутри класса python
Всем доброго времени суток, я новичок в ООП, пытаюсь сейчас написать текстового тамагочи. У меня есть вот такой код

class Animal():
    def __init__(self, health, condition, food_size, time):
        self.health = float(health)
        self.food_size = float(food_size)
        self.condition = int(condition)
        self.time = int(time)

    def feed(self):
        self.food += 20

Как и где будет более правильно прописать изначальное состояние переменных
food,
health,
food_size? Помогите пожалуйста. Всем заранее спасибо большое, и доброго вечера!

При инициализации объекта, в методе
__init__()

class Animal():
    def __init__(self, health=100, condition=1, food_size=20, time=2):
        self.health = float(health)
        self.food_size = float(food_size)
        self.condition = int(condition)
        self.time = int(time)

    def feed(self):
        self.food += 20

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

# default
pet_default = Animal()

# другие параметры на старте
pet_fat = Animal(health=1000)


Получение аргументов из команды Aiogram
Вообщем-то, простенький фидбек бот(с отправкой сообщений(копирование и отправка) в обе стороны)
При отправке через команду, бот пересылает сообщение вместе с командой, т.е
/send bla bla bla
Каким образом можно удалить команду  из сообщения?
убрал код в связи с решением, спасибо большое.

Вот. К примеру
/send 123

@dp.message_handler(commands="send")
async def start(msg: types.Message):
    result = msg.get_args() # <- 123


os.path.exists возвращает False, при этом путь правильный
Система: win7x64, Python 3.8
Нужно было проверить находится ли файл по указанному пути(файл там находится 100%)

import subprocess
import os

python = subprocess.check_output('where python', shell=True).decode("utf-8")
print(os.path.exists(python))

Но почему-то вместо True я получаю False. Далее я попробовал указать сразу путь(тот же):

import subprocess
import os

python = subprocess.check_output('where python', shell=True).decode("utf-8")
print(os.path.exists("C:\Program Files\Python38\python.exe"))

На что в этот раз я получил
True. Я попробовал просто сравнить с помощью
if:

import subprocess
import os

python = subprocess.check_output('where python', shell=True).decode("utf-8")

if (python == r"C:\Program Files\Python38\python.exe"):
    print("True")
else:
    print("False")

И тут также False. Т.е. строка не ровняется указанному значению?
Я также выводил строки с помощью print():

import subprocess
import os

python = subprocess.check_output('where python', shell=True).decode("utf-8")

print(os.path.exists(python))
print(r"C:\Program Files\Python38\python.exe")
print(python )

Вывод:

False
C:\Program Files\Python38\python.exe
C:\Program Files\Python38\python.exe

и проверял их тип с помощью
type(), строки полностью одинаковые. Что я делаю не так и как это исправить?

Там в конце еще перевод строки. Его нужно убрать
<code>
print(os.path.exists(python.rstrip()))
# rstrip() удаляет пробелы, табуляторы и пр. в конце строки
</code>

И тут также False. Т.е. строка не ровняется указанному значению?

То есть да, строки не равны. То, что на печати строки выглядят одинаково, не означает, что они и в самом деле одинаковы.


как к datetime прибавить time
Есть 2 переменных

print(datetime_1)
print(time_1)

их вывод:

2022-10-19 00:00:00
07:24:27

Как к datetime прибавить time, что бы получилось:

2022-10-19 07:24:27

?
datetime_1 и time_1 тянутся из бд

Самый простой вариант:
<code>
combined_dateTime = datetime_1.combine(datetime_1, time_1)
print(combined_dateTime) #2022-10-19 07:24:27
</code>


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

Если вам нужно проверить есть ли несколько подряд идущих слов, то сделать это можно просто при помощи оператора
in

text = "Возможно ли встретиться нам сегодня вечером?"
if "Возможно ли" in text:
    print("Словосочетание есть в тексте")

Если же надо проверить не подряд идущие слова, то необходимо текст разделить на слова методом
split, преобразовать текст и слова во множества, и проверить полностью ли принадлежит множество слов множеству текста методом
issubset

text = "Возможно ли встретиться нам сегодня вечером?"
if set(["Возможно", "вcтретиться"]).issubset(set(text.split())):
    print("Эти слова есть в тексте")


Linux cron спамит выполнением скрипта
Сервер
Ubuntu 20.04.3 LTS
Задача в corn записана след образом

sudo crontab -e
* 23 * * * cd /path/to/dir && /path/to/python/env/python3 /path/to/dir/one_day.py

Скрипт собирает статистику из репозитироия git, скрипт исправен и рабоатет, но cron вместо одиночного выполнения спамит данной командой 1 раз в минуту в течении часа
логи забиты цекличными сообщениями

Oct 18 23:40:02 MYSERVERD CRON[3034542]: (CRON) info (No MTA installed, discarding output)
Oct 18 23:41:01 MYSERVERD CRON[3034584]: (root) CMD (cd /path/to/dire && /path/to/python/env/python3 /path/to/dire/one_day.py)
Oct 18 23:41:01 MYSERVERD CRON[3034583]: (CRON) info (No MTA installed, discarding output)
Oct 18 23:42:01 MYSERVERD CRON[3034624]: (root) CMD (cd /path/to/dire && /path/to/python/env/python3 /path/to/dire/one_day.py)

И так с каждым файлом на python
Файлы отрабатывают в окружении крона
env -i /bin/bash --noprofile -norc шебанг на нужный интрепритатор стоит, возможно ли это из-за того, что в python и linux код 1 имеют разные расшифровки?

Забыл указать минуты спасибо @Герман Борисов
<code>
1 23 * * * cd /path/to/dir && /path/to/python/env/python3 /path/to/dir/one_day.py
</code>


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

my_objects = Mymodel.objects.filter(date_change__date=date.today()).aggregate(param1=Count('counter', filter=Q(counter__gte=2)), param2=Count('counter', filter=Q(counter__lte=1)), param3=Count('counter'))

Но из-за того, что запрос получается огромный, хочу вывести фильтр и агрегацию в отдельную переменную. Пример

my_filter = date_change__date=date.today()
my_aggregate = param1=Count('counter', filter=Q(counter__gte=2)), param2=Count('counter', filter=Q(counter__lte=1)), param3=Count('counter')

my_objects = my_objects = Mymodel.objects.filter(my_filter).aggregate(my_aggregate)

Пробовал сделать через Q expression, фильтр работает, а в аггрегации пишет:
Complex aggregates require an alias
Django 2.0
Python 3.6.9

Нашёл, помогла распаковка **kwargs
<code>
my_aggregate = {'param1' : Count('counter', filter=Q(counter__gte=2)),'param2' : Count('counter',filter=Q(counter__lte=1)),'param3' : Count('counter'))}

Mymodel.objects.aggregate(**my_aggregate)
</code>
аналогично и с фильтром


Как улучшить рекуррентную функцию для вычисления сложного процента?
Можно ли написать рекуррентную функцию сложного процента лучше.
Вопрос задан для лучшего понимания как используют рекурсию в проектах
Эта функция вычисления сложного процента, изучал статью где в примере был такой код
Основная формула
principalAmount * (1 + interestRate / compoundedPerYear) и она выполняется рекурсивно такое количество раз,
durationInYears * compoundedPerYear = 120 месяцев (раз)

const durationInYears = 10;
const interestRate = .06;
const compoundedPerYear = 12;
const principalAmount = 4000;

function compoundRecursion(principalAmount, compoundedPerYear, durationInYears, interestRate, numberOfRecursions) {
    let amount, newDuration, totalDuration;

    if (numberOfRecursions === 0) {
        totalDuration = compoundedPerYear * durationInYears;
    } else {
        if (numberOfRecursions !== 0) {
            totalDuration = durationInYears;
        }
    }

    if (durationInYears === 0) {
        return principalAmount;
    } else {
        newDuration = totalDuration - 1;
        amount = principalAmount * (1 + interestRate / compoundedPerYear);
        return compoundRecursion(amount, compoundedPerYear, newDuration, interestRate, 1);
    }
}

console.log(compoundRecursion(principalAmount, compoundedPerYear, durationInYears, interestRate, 0));

мне показался такой код, не совсем красивым и по скорости уступающим второму варианту, да и для понимания сложнее, некрасиво потому что начальное значение рекурсии 10 вместо 120
второй вариант такой

const durationInYears = 10;
const interestRate = .06;
const compoundedPerYear = 12;
const principalAmount = 4000;

let totalDuration = compoundedPerYear * durationInYears;
function compoundRecursion(principalAmount, compoundedPerYear, durationInYears, interestRate) {

    if (totalDuration === 0) {
        return principalAmount;
    } else {
        let amount = principalAmount * (1 + interestRate / compoundedPerYear);
        totalDuration = totalDuration - 1;
        return compoundRecursion(amount, compoundedPerYear, totalDuration, interestRate)
    }
}

console.log(compoundRecursion(principalAmount, compoundedPerYear, durationInYears, interestRate))

Пожалуйста, если можно расскажите, почему автор статьи использовал первый вариант, вместо второго с выносом переменной за функцию, я чувствую что второй вариант, будет плохо влиять на код, но не знаю из-за малого опыта, так ли это.
Подскажите, может это плохой тон, писать так рекурсию.
Также если есть варианты лучше написать эту формулу именно рекурсивно, очень буду рад ознакомиться. Спасибо!
UPD:
Stanislav Volodarskiy, Спасибо большое ему за ответ развернутый, не смотря на то какой был глупый вопрос)
В любом случае, вопрос я изменил для лучшей релевантности в поиске, заголовок изменен был таким:
Плохо ли использовать перезаписываемую переменную за рекурсивной функцией, к чему это может привести?
Ответ: Да. Второй метод, который я написал плохой))

Новый вариант работает один раз, второй вызов не приводит к ожидаемому результату. Функциональность испорчена. Stanislav Volodarskiy

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

principalAmount   - начальная сумма
interestRate      - годовой процент
compoundedPerYear - годовой процент начисляется не один раз в год,
                        а равными частями, это число частей в году
durationInYears   - сколько лет начислять проценты

проценты должны быть начислены compoundedPerYear * durationInYears раз
формула для начислений рекуррентная:

amount(0)     = principalAmount
amount(n + 1) = amount(n) * (1 + interestRate / compoundedPerYear)

Из постановки задачи вызов функции должен выглядеть так:

amount(principalAmount, compoundedPerYear, durationInYears, interestRate)

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

amountRec(principalAmount, compoundedPerYear, interestRate, n)

durationInYears не используется. Зато есть
n - сколько раз надо начислить проценты.
Функция
amountRec - деталь реализации. Спрячем её внутри
amount:

function amount(principalAmount, compoundedPerYear, durationInYears, interestRate) {

    function amountRec(principalAmount, compoundedPerYear, interestRate, n) {
        if (n === 0) {
            return principalAmount;
        }
        return amountRec(principalAmount, compoundedPerYear, interestRate, n - 1) * (1 + interestRate / compoundedPerYear);
    }

    return amountRec(principalAmount, compoundedPerYear, interestRate, compoundedPerYear * durationInYears);
}

Первые три аргумента функции
amountRec одинаковы во всех вызовах. Их можно убрать, значения будут взяты из замыкания:

function amount(principalAmount, compoundedPerYear, durationInYears, interestRate) {

    function amountRec(n) {
        if (n === 0) {
            return principalAmount;
        }
        return amountRec(n - 1) * (1 + interestRate / compoundedPerYear);
    }

    return amountRec(compoundedPerYear * durationInYears);
}

P.S. То что, удобный для пользователя интерфейс не подходит для рекурсии - нормальная ситуация. Большинство рекурсивных функций прячется внутри функций с нормальным интерфейсом.
P.P.S. Если думать над задачей дальше, ясно что рекурсия не нужна: вычисляется некоторая степень и умножается на сумму. Так как мы говорим о рекурсии, я этот шаг опускаю.
P.P.P.S. Рекурсия - глубокая тема. Почитайте SICP. Есть перевод на русский.


Как заблокировать закрытие окна в PyQt5?
<code>
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(240, 320)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(80, 180, 75, 23))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "ok"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
</code>

Например, можно сделать саму кнопку закрытия некликабельной. Только тогда
Form сделать экземпляром
QMainWindow:

from PyQt5 import QtCore, QtWidgets

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QMainWindow()
    Form.setWindowFlags(Form.windowFlags() & ~QtCore.Qt.WindowCloseButtonHint)
    Form.show()
    sys.exit(app.exec_())


Функция, которая парсит json файлы и создает новый json файл по уникальному ключу
Мне надо реализовать функцию parse(out_file, *in_files) для создания файла, который будет содержать только уникальные записи (уникальные по ключу "name") путем слияния информации из всех input_files (если мы найдем пользователя с уже существующим именем из предыдущего файла, мы должны игнорировать его).
Мой код выглядит следующим образом:

def parse(out_file, *in_files):
    result = []
    for files in input_files:
        with open(files, 'r') as infile:
            data = json.load(infile)
        for item in data:
            if dict(item)["name"] not in result:
                result.extend(item)
            else:
                continue

    with open(out_file, 'w') as outfile:
        json.dump(result, outfile)

parse("user3.json", "user1.json", "user2.json")

Я застрял на моменте проверки уникального ключа и мой список выводиться только с названиями ключей. Идея была в том, чтобы сначала вычитать два json файла, а потом искать уникальные записи по ключу "name" и записывать их в переменную result, а после сконвертировать result в json файл.
К примеру есть следующие два файла:

user1.json :
[{"name": "Bob1", "rate": 1, “languages": ["English"]},
{"name": "Bob2", "rate":0.78, "languages": ["English", "French"]}
]

user2.json :
[{"name": "Bob1", "rate": 25, “languages": ["French"]},
{"name": "Bob3", "rate": 78, "languages": ["Germany"]}
]

Результат должен быть следующим:

[{"name": "Bob1", "rate": 1, “languages": ["English"]},
{"name": "Bob2", "rate":0.78, "languages": ["English", "French"]}
{"name": "Bob3", "rate": 78, "languages": ["Germany"]}
]

Собирайте ваши словари в словарь с ключом
name. Примерно так:

lists = [
[{"name": "Bob1", "rate": 1, "languages": ["English"]},
{"name": "Bob2", "rate":0.78, "languages": ["English", "French"]}
],
[{"name": "Bob1", "rate": 25, "languages": ["French"]},
{"name": "Bob3", "rate": 78, "languages": ["Germany"]}
]
]

result = {}
for data in lists:
    for item in data:
        name = item['name']
        if name not in result:
            result[name] = item
result = list(result.values())
result

Вывод:

[{'name': 'Bob1', 'rate': 1, 'languages': ['English']},
 {'name': 'Bob2', 'rate': 0.78, 'languages': ['English', 'French']},
 {'name': 'Bob3', 'rate': 78, 'languages': ['Germany']}]


Что выбрать for или while?
Больше теоритический вопрос выбора.
На мой субъективный взляд и я указывал на это в нескольких ответах на SO, я почти всегда искользую
for. И только где необходим бесконечный цикл (например слушать входящие сообщения) я использую
while.
Есть ли конкретные правила где и почему надо использовать ту или иную конструкцию?

В принципе, на английском SO нормально написано. Но даже не заглядывая туда я был готов дать такой же ответ по сути.

for - для перебора элементов такой сущности, по которой можно итерироваться: коллекция, генератор, итератор.

while - для бесконечного цикла, а также для циклов, где нет последовательного перебора сущностей, а есть некое условие окончания цикла, либо вычисляемое, либо зависящее от ввода пользователя или какого-то другого недетерминированного события.
Большинство циклов в питоне всё же сводится к
for, потому что обычно требуется именно что-то перебрать, какую-то коллекцию: список объектов, диапазон чисел, строки файла, выборку из базы данных.
Да,
while при желании тоже можно использовать для перебора сущностей, но это будет: более длинно, менее красиво и менее понятно. И наоборот, превратить
while в
for теоретически тоже можно, но это будет ещё более сложно, непонятно и бессмысленно.


Как удалить первые 2 строки из файла на Python?
У меня есть 2 файла, которые я свожу вместе. Во втором файле первые 2 строки нужно вырезать, чтобы в otput получить "первый файл (fgjf) + второй файл (fxyz) без первых двух строк"
Код без удаления строк:
<code>
with open(filexyz, "r") as fxyz, open(file1gjf, "r") as fgjf, open(foutput, "w") as fout:
    fout.write(fgjf.read() + "\n Title " + prefix + "\n\n")
    fout.write(fxyz.read())
</code>

Что-то такое:
<code>
    fout.writelines(fxyz.readlines()[2:])
</code>


Как отправить текстовое сообщение телеграм бот с aiogram. То есть просто что бы бот отправлял и все в чате видели (уведомления)?
Есть токен от бота и данный код, а дальше как отправить. chat_id какой должен быть что бы все в чате видели сообщение?
<code>
loop = asyncio.get_event_loop()
bot = Bot(token, loop, parse_mode=types.ParseMode.HTML)
await bot.send_message()
</code>

C помощью этого бота определяешь ID канала
@username_to_id_bot. Добавляешь его в беседу с полными правами, он напишет в беседу ID группы, жмешь на красный текст и вставляешь после
chat_id=''.
Если просто копировать выделением, то не определяет знак перед числом группы и после, а они обязательно нужны - и .   .После бота можно удалить из группы.
Если вводить в чате  с ботом по определению ID ссылку на группу, то не определит, выдаст ошибку.

bot.send_message(chat_id='-11111111.', text='Твой текст')


Пользователь вводит строку из слов, разделённых пробелами. Сколько слов этом предложении имеют длину менее 4?
Дали вот такое задание в процессе знакомства с Python.
Моя логика такова: нужно найти индексы пробелов в строке и посчитать расстояния между ними. Билась над этим не один день и ни к чему не пришла. Возможно ли такое? Как посчитать эти расстояния?
Буду признательна за помощь, если сможете усовершенствовать и закончить мой код и укажете на ошибки.
Код, который родился, ниже.
<code>
s=input('Введите текст: ')
count=0
answer=0
for i in range(len(s)):
    if s[i]==' ':
        print('Индекс пробела: ', i)
        if i<4:
            answer+=1
print('Число слов длиной менее 4-х символов: ', answer)
</code>

text = input('Введите текст: ')
values = text.split(' ') #Разделяем строку по пробелам
answer_values = [value for value in values if len(value) < 4] #Оставляем слова с кол-вом букв < 4
answer = len(answer_values) #Считаем количество оставшихся слов
print(answer)


pyautogui перемещение курсора
Используя этот код мышка перемещается по указанным координатам
Если вместо координат пишу
pg.moveTo(cord, 3) ничего не присходит

import pyautogui as pg

osk500  = 'osk500.PNG'
cord = pg.locateOnScreen(osk500, confidence = 0.7)
pg.sleep(1)
pg.moveTo(1101, 441, 3)

pg.locateOnScreen(osk500, confidence = 0.7) вернет кортеж, состоящий из 4ех элементов, для
pg.moveTo() требуется только две координаты X и Y.
Вашим решением будет являться следующее:

import pyautogui as pg

osk500  = 'osk500.PNG'
cord = pg.locateOnScreen(osk500, confidence = 0.7)
pg.sleep(1)
pg.moveTo(pg.center(cord))

pg.center() вернет вам две координаты X и Y, по ним курсор и переместится


Python 3 Группировка списка с одинаковыми элементами
Например, есть вложенный список такого вида:

# имя, гендер, возраст
nlist = [
['Oleg', 1, 20],
['Aleksandr', 1, 19],
['Masha', 0, 22],
['Sasha', 0, 27],
['Masha', 0, 39],
['Masha', 0, 23],
]

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

nlist = [
['Oleg', 1, 20],
['Aleksandr', 1, 19],
['Masha', 0, 84], #22 + 39 + 23
['Sasha', 0, 27],
]

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

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

from itertools import groupby
grouped = [[*g[0], sum(x[2] for x in list(g[1]))]
           for g in groupby(sorted(nlist), key=lambda x: (x[:2]))]
print(grouped)

[['Aleksandr', 1, 19], ['Masha', 0, 84], ['Oleg', 1, 20], ['Sasha', 0, 27]]

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

import pandas as pd
res = pd.DataFrame(nlist).groupby([0,1], as_index=False)[2].sum().values.tolist()
print(res)

[['Aleksandr', 1, 19], ['Masha', 0, 84], ['Oleg', 1, 20], ['Sasha', 0, 27]]


Django | Последовательный вывод
Вот код карусели:

 <div class="col-md-5 col-sm-5 col-xs-12">
                                    <div class="imgs-zoom-area">
                                        <img id="zoom_03" src="#" data-zoom-image="#" alt="222">
                                        <div class="row">
                                            <div class="col-xs-12">
                                                <div id="gallery_01" class="carousel-btn slick-arrow-3 mt-30">
                                                    <div class="p-c">
                                                        <a href="#" data-image="#" data-zoom-image="#">
                                                            <img class="zoom_03" src="#" alt="">
                                                        </a>
                                                    </div>
                                                    <div class="p-c">
                                                        <a href="#" data-image="img/product/3.jpg" data-zoom-image="img/product/3.jpg">
                                                            <img class="zoom_03" src="img/product/3.jpg" alt="">
                                                        </a>
                                                    </div>
                                                    <div class="p-c">
                                                        <a href="#" data-image="img/product/4.jpg" data-zoom-image="img/product/4.jpg">
                                                            <img class="zoom_03" src="img/product/4.jpg" alt="">
                                                        </a>
                                                    </div>
                                                    <div class="p-c">
                                                        <a href="#" data-image="img/product/5.jpg" data-zoom-image="img/product/5.jpg">
                                                            <img class="zoom_03" src="img/product/5.jpg" alt="">
                                                        </a>
                                                    </div>
                                                    <div class="p-c">
                                                        <a href="#" data-image="img/product/6.jpg" data-zoom-image="img/product/6.jpg">
                                                            <img class="zoom_03" src="img/product/6.jpg" alt="">
                                                        </a>
                                                    </div>
                                                    <div class="p-c">
                                                        <a href="#" data-image="img/product/7.jpg" data-zoom-image="img/product/7.jpg">
                                                            <img class="zoom_03" src="img/product/7.jpg" alt="">
                                                        </a>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>

Вот код Admin.py:

    class GalleryAdmin(admin.TabularInline):
    fk_name = 'product'
    model = Gallery

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("name",)}
    inlines = [GalleryAdmin,]

Вот код модели:

    class Product(models.Model):
    name = models.CharField(max_length=255)
    description = models.CharField(max_length=1000)
    information = models.CharField(max_length=1000)
    brand = models.ForeignKey(Brand,
                              on_delete=models.CASCADE,
                              related_name='Brand')

    rating = models.PositiveSmallIntegerField(default=0)
    color = models.CharField(max_length=100, default=None)
    slug = models.SlugField(max_length=400, unique=True, db_index=True, verbose_name="URL", default=None)

    def get_absolute_url(self):
        return reverse('product', kwargs={'product_slug':self.slug})

    def __str__(self):
        return '{brand} {name} {color}'.format(
            brand=self.brand,
            name=self.name,
            color=self.color,
        )

class Gallery(models.Model):
    image = models.ImageField(upload_to='gallery', help_text='270x300')
    product = models.ForeignKey(Product,
                                on_delete=models.CASCADE,
                                related_name='images')

    def __str__(self):
        return self.product.name

Вот код Views:

    def index(request):
    ads = Ad.objects.all()

    return render(request, 'index.html', {'ads': ads})

class ProductDetailView(DetailView):
    model = Product
    template_name = 'product-detail.html'
    context_object_name = 'product'
    slug_url_kwarg = 'product_slug'

Урлы не вижу смысла кидать.
Задача
В карусели нужно выводить последовательно фотографии из Галереи модели Продукта.
Мои попытки это реализовать:

{% for images in product.images.all() %}

И дальше что-то типа:

images.images.url

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

После просмотра смешариков, про серию где Бимо взрывал корабль 10 раз из-за проблемы в его аккумуляторе до меня дошло.
Ответ в карусели.

{% for images in product.images.all %} # Создаю цикл для Галереии
  {% if forloop.counter == 1 %} # 1 раз прогоняю его
 #главное изображение
  {% endif %}
{% endfor %}

   {% for images in product.images.all %} #снова прогоняю цикл

      # та-дам, все работает как и задумано было.

   {% endfor %}

Надеюсь это кому-нибудь в будем поможет.
Небольшой фидбэк для начинающих:

Django копирует весь кусок кода и вставляет его на страницу если он находится в цикле FOR. Запомните это и грамотно вставляйте циклы.


Как вытащить из списка элемент, включающий в себя заданную пользователем переменную? Python
Есть список:

list=['cat', 'dog', 'cat and dog', 'butterfly'].
Пользователь вводит значение (например, dog). Программа не должна выводить только
'dog', но и
'cat and dog', так как
dog имеется в данной элементе. Как это можно реализовать?

например так:
<code>
name = 'dog'
list = ['cat', 'dog', 'cat and dog', 'butterfly']

res = [w for w in list if name in w]

print(*res, sep='\n')
</code>


Помогите доработать цикл для создания специального шифра
Мне нужно, чтобы все повторяющиеся символы были вывидены в такой же последовательности и вместо, например, аааа выводилося а4 и так далее. Пример: aaaabbcaa = a4b2c1a2. Вышло только с первым символом, а дальше не могу понять что сделать, чтобы перебросило на следующий символ и посчитало его. ОЧЕНЬ ВАЖНО: не делать это слишком сложными методами, а использовать только циклы, списки, ну и там по мелочи
<code>
_string = str(input())
_sum = 0

for i in(_string[0:]): # отвечает за символ
    for j in _string[+1]: # отвечает за цифру
        if i == j: # ПОДСЧЕТ
            _sum += 1 #ПОДСЧЕТ
        else: # ПОДСЧЕТ
            _string = _string[0+1:] # переброс на след. символ

print(j + str(_sum))
</code>

можно без вложенных кучи
for:
вариант 1:

text = "aaaabbcaa"

res = text[0]
count = 1

for l in text[1:]:
    if l == res[-1]:
        count += 1
    else:
        res += str(count) + l
        count = 1
res += str(count)

print(res)

вариант 2:
больше встроенных функций

res = ''

while text:
    letter = text[0]
    size = len(text)
    text = text.lstrip(letter)
    res += f'{letter}{size - len(text)}'


ValueError: latex error converting to dvi
Запускаю скрипт.

class Name(Scene):
    def construct(self):
        z = Tex("e^{i\theta}=\cos(\theta)+i\sin(\theta)")
        self.add(z)
        self.wait(5)

Выводит ошибку:

ValueError: latex error converting to dvi.

Использую
manim (не
manimgl).
Установлен
MiKTeX.

Я перерыл множество сайтов и перепробовал все что можно. Я множество раз переустанавливал
MiKTeX. Я решил, что нужно скачать
LaTeX вместо
MiKTeX и в итоге скачал. Но все еще выдавало ошибку, но другую:

ValueError: Your installation does not support converting .dvi files to SVG.
Consider updating dvisvgm to at least version 2.4.

Но вдруг я подумал, что версия
manim с
pip была не той версии. Но она была как раз самой новой. Я решил удалить
manim с
pip и снова скачать его, но уже с использованием
Chocolatey. После скачивания я перезагрузил компьютер и все заработало!
Везде писали, что дело в
TeX, но в моем случае проблема была с
manim.


Ошибка multiple values for argument

    def __init__(name):
        name = name
        deadline = True

    def work_hard(self, deadline=True):
        if self.deadline:
            print(self.name, 'Что ж, ещё часок поработаю!')
        else:
            print(self.name, 'Можно отдыхать')

tester_1 = Tester(name='tester_1')
tester_1.work_hard(deadline=False)  # 'tester_1 Можно отдыхать'
tester_2 = Tester(name='tester_2')
tester_2.work_hard(deadline=True)

получаю в результате ошибку

Traceback (most recent call last):
  File "/Users/olga/PycharmProjects/Python_tasks/main.py", line 62, in <module>
    tester_1 = Tester(name='tester_1')
TypeError: Tester.__init__() got multiple values for argument 'name'

в чем может быть причина

Причина в том, что у вас не хватает части кода. В
work_hard у вас есть параметр
self, значит это метод класса, а в
__init__ у вас этого
self и не хватает. И самого класса не хватает, хотя в коде вы создаете экземпляры этого класса:
tester_1 = Tester() и
tester_2 = Tester()
Вот так должен выглядеть ваш код:

class Tester:
    def __init__(self, name):
        self.name = name
        self.deadline = True

    def work_hard(self, deadline=True):
        if self.deadline:
            print(self.name, 'Что ж, ещё часок поработаю!')
        else:
            print(self.name, 'Можно отдыхать')

tester_1 = Tester(name='tester_1')
tester_1.work_hard(deadline=False)  # 'tester_1 Можно отдыхать'
tester_2 = Tester(name='tester_2')
tester_2.work_hard(deadline=True)


Не работает очистка в калькуляторе Tkinter
Пишу для себя калькулятор на
Tkinter в
Pydroid 3. Но у меня не работает функция
clear(), которая должна очищать дисплей калькулятора. Если что, переменная
buffer - это математический пример, записанный списком посимвольно. Потом он преобразуется в строку и решается командой
eval(). Помогите, пожалуйста, как сделать так, чтобы очистка кнопкой C (функция
clear) работала? Также, если не сложно, подскажите, как выровнять текст в надписи
disp так, чтобы он был в правом нижнем углу. Вот код программы:

from tkinter import *

buffer = []

def close():
    try:
        root.destroy()
        root.quit()
    except:
        pass

def displaybuffer():
    try:
        disp['text'] = ''.join(buffer)
    except:
        pass

def add1():
    try:
        buffer.append('1')
        displaybuffer()
    except:
        pass

def add2():
    try:
        buffer.append('2')
        displaybuffer()
    except:
        pass

def add3():
    try:
        buffer.append('3')
        displaybuffer()
    except:
        pass

def add4():
    try:
        buffer.append('4')
        displaybuffer()
    except:
        pass

def add5():
    try:
        buffer.append('5')
        displaybuffer()
    except:
        pass

def add6():
    try:
        buffer.append('6')
        displaybuffer()
    except:
        pass

def add7():
    try:
        buffer.append('7')
        displaybuffer()
    except:
        pass

def add8():
    try:
        buffer.append('8')
        displaybuffer()
    except:
        pass

def add9():
    try:
        buffer.append('9')
        displaybuffer()
    except:
        pass

def add0():
    try:
        buffer.append('0')
        displaybuffer()
    except:
        pass

def addl():
    try:
        buffer.append('(')
        displaybuffer()
    except:
        pass

def addr():
    try:
        buffer.append(')')
        displaybuffer()
    except:
        pass

def addc():
    try:
        buffer.append('.')
        displaybuffer()
    except:
        pass

def adda():
    try:
        buffer.append('+')
        displaybuffer()
    except:
        pass

def adds():
    try:
        buffer.append('-')
        displaybuffer()
    except:
        pass

def addm():
    try:
        buffer.append('*')
        displaybuffer()
    except:
        pass

def addd():
    try:
        buffer.append('/')
        displaybuffer()
    except:
        pass

def clear():
    try:
        buffer = []
        displaybuffer()
    except:
        pass

def bksp():
    try:
        buffer.pop()
        displaybuffer()
    except:
        pass

def result():
    try:
        res = str(eval(''.join(buffer)))
        if res.endswith('.0'):
            res = str(int(float(res)))
        disp['text'] = res
    except ZeroDivisionError:
        disp['text'] = '!ZER'
    except SyntaxError:
        disp['text'] = '!SYN'
    except:
        disp['text'] = '!ERR'

root = Tk()
root.title('Калькулятор')
root.geometry('690x1320')
root['bg'] = '#555'

disp = Label(root, text=''.join(buffer), bg='#6B6', fg='black', font=('Droid Sans Mono', 17), height=7)
disp.pack(fill=BOTH)

kbd1 = Frame(root, bg='#444')
kbd1.pack(expand=True, fill=BOTH)

kbd2 = Frame(root, bg='#444')
kbd2.pack(expand=True, fill=BOTH)

kbd3 = Frame(root, bg='#444')
kbd3.pack(expand=True, fill=BOTH)

kbd4 = Frame(root, bg='#444')
kbd4.pack(expand=True, fill=BOTH)

kbd5 = Frame(root, bg='#444')
kbd5.pack(expand=True, fill=BOTH)

Button(kbd1, text='C', bg='red', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=clear).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd1, text='(', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=addl).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd1, text=')', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=addr).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd1, text='/', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=addd).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd2, text='7', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add7).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd2, text='8', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add8).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd2, text='9', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add9).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd2, text='*', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=addm).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd3, text='4', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add4).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd3, text='5', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add5).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd3, text='6', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add6).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd3, text='-', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=adds).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd4, text='1', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add1).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd4, text='2', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add2).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd4, text='3', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add3).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd4, text='+', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=adda).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd5, text='<', bg='purple', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=bksp).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd5, text='0', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=add0).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd5, text='.', bg='gray', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=addc).pack(expand=True, fill=BOTH, side=LEFT)

Button(kbd5, text='=', bg='green', fg='white', activebackground='#555', activeforeground='white', font=('Droid Sans Mono', 22), command=result).pack(expand=True, fill=BOTH, side=LEFT)

root.protocol('WM_DELETE_WINDOW', close)
root.mainloop()

У вас внутри функции
clear
buffer - это локальная переменная. Поэтому после того как вы ее переопределяете внутри функции, вне функции она не изменяется. Как вариант, вы можете внутри функции
clear дописать
global buffer, тогда будет изменяться глобальная переменная, и поле будет очищаться:

def clear():
    global buffer
    try:
        buffer = []
        displaybuffer()
    except:
        pass

По поводу текста внутри лейбла - используйте якорь
anchor, чтобы привязывать текст к определенной стороне виджета. Он может принимать значения:
n, ne, e, se, s, sw, w, nw, center.
n - nord - Север, т.е. верх виджета,
ne - northeast - Северо-Восток, т.е. верхний правый угол. Вам нужен правый нижний - это Юго-Восток -
se

disp = Label(root, text=''.join(buffer), bg='#6B6', fg='black', font=('Droid Sans Mono', 17), height=7, anchor='se')
disp.pack(fill=BOTH)


Экспорт истории телеграмм канала в txt файл
Прошу помощи - необходимо сделать экспорт сообщений (только текст) телеграмм канала в txt файл при помощи python(использую библиотеку pyrogram). Проблема - в тексте присутствую эмоджи, не получается записать в файл, часть строк имеют тип данных str, часть - NoneType, циклом пройтись и удалить эмоджи не получается. Спасибо за помощь!

    async with app:
        async for message in app.get_chat_history("medvedev_telegram"):
            file = open("all_history.txt", "w")
            file.write(str(message.text))
            file.close()

app.run(main())

Если строка имеет тип None, то пройтись циклом можно так:
<code>
for message in app.get_chat_history("medvedev_telegram"):
    if message.text:  # Условие не будет выполнено, если message.text = None
        file = open("all_history.txt", "w")
        file.write(str(message.text))
        file.close()
</code>


Проверка на количество чисел стоящие рядом. Python
Вводится натуральное число. Необходимо проверить, есть ли в этом числе какие-то две одинаковые стоящие рядом цифры. Вывести эти цифры, если таковые имеются, иначе вывести «НЕТ».
<code>
a = int(input("a = "))
a1 = a % 10
a = a // 10
k = 0
while a>0:
    a2 = a % 10
    if a1==a2:
       k+=1
       a = a // 10
       a1 = a2
       if k>0:
           print("Yes")
       else:
           print("Нет")
</code>

Как вариант ещё код с параллельной итерацией по числу-строке со сдвигом. Мне кажется такой код гораздо понятнее других:

def test_num(num):
    for a, b in zip(num, num[1:]):
        if a == b:
            print(a)
            return
    print('НЕТ')

test_num('')
test_num('12345')
test_num('1233')

Вывод:

НЕТ
НЕТ
3


Как можно ускорить работу программы?
в промежутке от start до finish (включительно) ищет все простые числа
<code>
    start, finish = map(int, input().split())
    count = 0
    for i in range(start, finish + 1):
        c = 2
        while c ** 2 < i and i % c != 0:
            c += 1
        if c ** 2 > i:
            print(i)
            count += 1
    if count == 0:
        print('Absent')
</code>

вот 2 быстрых способа :)
способ 1:

import gmpy2

primes = [i for i in range(start, finish + 1) if gmpy2.is_prime(i)]

способ 2 (быстрее на 25%):

import gmpy2

primes2 = []
p = start - 1
while p <= finish:
    p = gmpy2.next_prime(p)
    if p <= finish:
        primes2.append(p)

способ 3 (без библиотек):
используем решето Эратосфена

primes = []
sieve = [0] * n

for i in range(2, n):
    if sieve[i] == 0:
        primes.append(i)
        if i * i <= n:
            for j in range(i * i, n, i):
                sieve[j] = 1

способ 3+ (тоже самое решето, но получше)

def get_primes(n):
    n = b + 1
    size = n//2
    sieve = [1]*size
    limit = int(n**0.5)
    for i in range(1, limit):
        if sieve[i]:
            val = 2*i+1
            tmp = ((size-1) - i)//val
            sieve[i+val::val] = [0]*tmp
    return [2] + [i*2+1 for i, v in enumerate(sieve) if v and i > 0]


Django - models
Как передать first_field из первой модели во вторую
<code>
class One(models.Model):
    first_field = models.ForeignKey(User)
    second_field
    third_field
    ...

class Two(models.Model):
    first_field = models.ForeignKey(User)
    second_field = first_field_from_One
</code>

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

class One(models.Model):
  first_field = models.ForeignKey(User)
  second_field
  third_field
...

class Two(models.Model):
  first_field = models.ForeignKey(User)
  second_field = models.ForeignKey(One, on_delete=CASCADE)

в данном случае во втором поле второй модели будет досутпна вся сущность
One модели и к ней можно обратиться

first_from_one = Two.objects.get(pk=1).second_field.first_field

Или написать свой
create метод для класса
Two

def create_two(self, first_field, second_field):
    two = self.create(first_field, second_field)

И передавать нужные вам параметры при созданиии

f = One.objects.get(pk=111)
two = Two()
two.create_two(User.objects.get(username="Name"), f.first_field)

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


Бот не берет сообщения от юзера телеграм
Бот не ждет сообщения от пользователя а сразу шлет сообщения об ошибке в чат
вот часть кода отвечающая за это
<code>
@bot.message_handler(commands=['weather'])
def weather(message):

    bot.send_message(message.chat.id, 'В каком населённом пункте хочешь узнать погоду?')
    bot.message_handler(content_types=['text'])
    try:
        mgr = owm.weather_manager()
        observation = mgr.weather_at_place(message.text)
        w = observation.weather
        temp = w.temperature('celsius')['temp']
        today = datetime.datetime.today()

        answer = 'Сегодня, ' + (today.strftime("%d/%m/%Y")) + ' ' + 'в городе ' + message.text + ' ' + w.detailed_status + '\n'
        answer += 'Температура в районе ' + str(temp) + ' по Цельсию.' + '\n\n'
        if temp < 5:
            answer += 'Сейчас на улице холодно, одевайся тепло!'
        elif temp < 25:
            answer += 'Сейчас на улице прохладно, одевайся потеплее!'
        else:
            answer += 'Погода просто каеф! Одевайся как душе угодно!'
            bot.send_message(message.chat.id, answer)
    except:
            bot.send_message(message.chat.id, 'Я ещё не знаю такого города \nДавай посмотрим погоду в другом месте?')
</code>
как заставить его работать

Попробуй так
<code>
@bot.message_handler(commands=['weather'])
def weather(message):
    bot.send_message(message.chat.id, 'В каком населённом пункте хочешь узнать погоду?')
    bot.register_next_step_handler(message, get_data_weather)

def get_data_weather(message):
    try:
        mgr = owm.weather_manager()
        observation = mgr.weather_at_place(message.text)
        w = observation.weather
        temp = w.temperature('celsius')['temp']
        today = datetime.datetime.today()

        answer = 'Сегодня, ' + (today.strftime("%d/%m/%Y")) + ' ' + 'в городе ' + message.text + ' ' + w.detailed_status + '\n'
        answer += 'Температура в районе ' + str(temp) + ' по Цельсию.' + '\n\n'
        if temp < 5:
            answer += 'Сейчас на улице холодно, одевайся тепло!'
        elif temp < 25:
            answer += 'Сейчас на улице прохладно, одевайся потеплее!'
        else:
            answer += 'Погода просто каеф! Одевайся как душе угодно!'
            bot.send_message(message.chat.id, answer)
    except:
        bot.send_message(message.chat.id, 'Я ещё не знаю такого города \nДавай посмотрим погоду в другом месте?')

</code>


Повторяющиеся значения в столбце
Не могу понять как сделать столбец, чтобы в нем последовательно повторялись значения по нарастанию. К примеру длиной 5.
Должно быть вот так:
<code>
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,5,5,5,5,5 и так далее до конца датасета.
</code>

для датафрейма с дефолтным индексом можно попробовать сделать так:
<code>
df['col'] = ((df.index)%5==0).cumsum()
</code>


sqlite3 хочу сделать проверку , нет ли там учасника повторно
<code>
db = sqlite3.connect('db_course24.db', check_same_thread=False)
    cursor = db.cursor()

    def db_table_val(user_id: int, user_name: str, user_surname: str, username: str):
        cursor.execute('INSERT INTO users (user_id, user_name, user_surname, username) VALUES (?, ?, ?, ?)',
                       (user_id, user_name, user_surname, username))
        db.commit()

    @bot.message_handler(commands=['start'])
    def handle_start(message):
        user_markup = telebot.types.ReplyKeyboardMarkup(True)
        user_markup.row('Почати')
        bot.send_message(message.chat.id, 'Доброго дня, ' + message.from_user.first_name +
                         '!\nЦе Курс Валют на сьогодні!',
                         reply_markup=user_markup)
        us_id = message.from_user.id
        us_name = message.from_user.first_name
        us_sname = message.from_user.last_name
        username = message.from_user.username
        result = cursor.execute('SELECT user_id FROM users WHERE user_id="us_id"').fetchall()
        if result is None:
            db_table_val(user_id=us_id, user_name=us_name, user_surname=us_sname, username=username)
            cursor.close()
        else:
            print('Have been.', message.from_user.username)
</code>
хелп..

Еслии us_id в данном случае - это переменная для выборки, то её нужно объявить, как переменную, а в данном случае, она просто строка

result = cursor.execute(f'SELECT user_id FROM users WHERE user_id="{us_id}"').fetchall()

Здесь мы добавили форматирование строки (f'') и заключили us_id в фигурные скобки, объявив как переменную.
Не уверен, только в этом ли проблема здесь.
Если вы проверите выборку несуществующего значения, вам будет приходить не None, а пустой список []
Попробуйте сделать
if result == []:


Никак не могу разобраться с циклом while и его выводом
Нужно, чтобы в output выводились все числа, которые попадают в условие 10 < x <= 100. Очень важно, чтобы эти числа выводились не как только из ввел(как у меня), а уже после завершения цикла
<code>
while True:
    num = int(input())
    if num < 10:
        continue
    elif num > 100:
        break
    if num >= 10:
        print(num)
</code>

Как и написал splash58, просто складываем всё в список и выводим.
<code>
l = [] # пустой список для заполнения данными
while True:
    num = int(input())
    if num < 10:
        continue
    elif num > 100:
        print(l) # когда выходим из цикла, выводим накопленные числа
        break
    else:
        l += [num] # добавляем в список все подходящие числа
</code>


Замена значения в столбце по значению другого столбца Pandas DataFrame по условию
Датафрейм:

      Match ID              Radiant               Dire  Winner
0   6808446343           beastcoast         Team Aster   False
1   6808199906              PSG.LGD        Team Liquid    True
2   6807837834              PSG.LGD                 OG    True
3   6808433308              TSM FTX        Team Spirit   False
4   6808416013               Fnatic             Entity    True
..         ...                  ...                ...     ...
95  6806101302         BOOM Esports                 OG   False
96  6806097565         BetBoom Team  Gaimin Gladiators   False
97  6806097974               Hokori            PSG.LGD    True
98  6806047119  Royal Never Give Up        Team Liquid   False
99  6806047605    Gaimin Gladiators       BetBoom Team    True

[100 rows x 4 columns]

Как сделать так, чтобы при значении False в столбце Winner выводилась ячейка Dire, а при True - ячейка Radiant? Пример ниже:

      Match ID              Radiant               Dire   Winner
0   6808446343           beastcoast         Team Aster   Team Aster
1   6808199906              PSG.LGD        Team Liquid   PSG.LGD
2   6807837834              PSG.LGD                 OG   PSG.LGD
3   6808433308              TSM FTX        Team Spirit   Team Spirit
4   6808416013               Fnatic             Entity   Fnatic
..         ...                  ...                ...   ...

Пытался таким куском кода - не вышло, ячейки не менялись вовсе:

for i in range(len(df)):
    if df["Winner"][i] == "TRUE":
        df["Winner"][i] == df["Radiant"][i]
    elif df["Winner"][i] == "FALSE":
        df["Winner"][i] == df["Dire"][i]

Также были попытки через
.loc, но не вышло: видимо где-то ошибся.
Прошу помощи :)

можно воспользоватьcя numpy.where()
если winner логическая переменная:
<code>
df['new'] = np.where(df['Winner'], df['Dire'], df['Radiant'])
</code>


Вывод переменной из работающего цикла while
Доброго всем времени суток! Я только не давно занялся программированием на python поэтому прошу сильно не пинать.
В моей программе в функции работает цикл while в этом цикле производятся расчеты, мне нужно постоянно отслеживать состояние одной переменной и на каждой итерации передовать ее значение в другую функцию которая работает паралельно в потоке,возможно ли это сделать и если возожно то как? Я уже неделю голову ломаю и ни чего не могу придумать.
Вот подобный код, только без потоков и он тоже не работает!
<code>
    def fg():
kloc = ty()
global y
if kloc:                  # Если значения переменной kloc = True (флаг поднят)
    print('Переклчаемся') # то исполняется программа print('Переклчаемся')
    y = 44
elif not kloc:            # Если значения переменной kloc = False (флаг опущен)
    print('Не переклчаемся') # то исполняется программа print('Не переклчаемся')
    y = 55

def ty():
z = 0
x = 0
kloc = False           # Назначем нашим флагом переменную kloc и присваеваем ей
while x < 10:          # значение False (флаг опущен)
    if z == 0:
        z = 1
        x = x + 1
        fg()
    elif z == 1:
        x = x + 1
        kloc = True        # Присваеваем переменной kloc значение True (поднимаем флаг)
        fg()               # Вызываем фукцию проверки флага fg()

ty()
</code>
Если не создавать функцию  ty() то эта программа работает. Команду return в функцию ty() тоже добовлял, все равно не  работает! Ошибка происходит на этой строке kloc = ty() она просто не чего не передает даже с командой или командами return.
Помогите пожалуйста, что делать не знаю.

Я не понял ваш замысел, но вам не такое взаимодействие надо?
<code>
def fg(kloc):
    if kloc:
        print('Переклчаемся')
        y = 44
    else:
        print('Не переклчаемся')
        y = 55
    return y

def ty():
    z = 0
    x = 0
    while x < 10:
        if z == 0:
            z = 1
            x = x + 1
            y = fg(False)
        elif z == 1:
            x = x + 1
            y = fg(True)

ty()
</code>


Подсчитать количество символов идущих подряд в серии [закрыт]

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

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

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

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

Нужно подсчитать количество символов идущих подряд в серии pandas, но без помощи циклов.
К примеру, есть:
<code>
pd.Series([1,1,1,1,1,-1,-1,-1,-1,-1,-1,8,8,8,8,1,1,2,3,3,3])
</code>
результат вывода должен быть список [5 6 4 2 1 3]

Используйте сравнение со сдвигом и подсчет значений:

s = pd.Series([1,1,1,1,1,-1,-1,-1,-1,-1,-1,8,8,8,8,1,1,2,3,3,3])
res = (s.ne(s.shift()).cumsum()).value_counts().sort_index().to_list()

res:

[5, 6, 4, 2, 1, 3]


Напишите программу, которая найдёт произведение пар чисел списка. Парой считаем первый и последний элемент, второй и предпоследний и т.д
Подскажите пожалуйста, не могу решить задачу, так как только учусь...
Напишите программу, которая найдёт произведение пар чисел списка. Парой считаем первый и последний элемент, второй и предпоследний и т.д.
результат должен быть таким: Пример: - [2, 3, 4, 5, 6] => [12, 15, 16]; (то есть 2 * 6 = 12, 3 * 5 = 15, 4 которая осталась лишней возводится в собственную степень 4 * 4 = 16)
я попробовал написать такой код:
<code>
x = input().split()
for i in range(len(x)):
    x[i] = int(x[i])
    count = x[0:2]
    count1 = x[2:]
    result = map(sum, (count, count1))

print(list(result))
</code>
я понимаю что данный код у меня складывает значения... Помогите пожалуйста. Если будет возможность дать развернутый ответ, что бы объяснить на пальцах как будет выглядеть правильное решение.

не изобретайте, раз только изучаете - решайте в лоб
у вас не код, а мешанина каких-то команд, все свалили в кучу в надежде, что все заработает?
напишите код на бумажке словами и потом превращайте его в питон

запросить у пользователя строку с числами

разбить строку на отдельные слова (числа)

перевести разбитые слова в числа

пройтись в цикле от
0 до
length / 2 + 1 (до половины массива)

умножить числа одинаково удаленных от начала и конца списка между собой
arr[i] * arr[len(arr) - i - 1]

занести полученный результат в массив

вывести массив на экран

P.S.
задача решается в 1 строку, но вам надо использовать 10-15 строчек пока вы учите базу
И НЕ МЕШАЙТЕ ВСЁ В КУЧУ - УЖАС!!!
ошибки в вашем коде (кроме всего прочего)

x = input().split() # получен список строк, а не чисел
for i in range(len(x)):
    x[i] = int(x[i]) # запись числа идет последовательно слово за словом
    count = x[0:2] # а результаты используются уже сразу по всему списку - но там до сих пор слова, а не числа
    count1 = x[2:] # это список, а не число
    result = map(sum, (count, count1)) # результат - число и никуда не записывается

print(list(result)) # тут будет последний результат превращен в список, содержащий 1 число


Как правильно сократить дробь n/m, используя алгоритм Евклида?
Задача:
Сокращение дроби
Сократите дробь n/m. Используйте алгоритм Евклида.
Мой код:
<code>
a, b = map(int, input(). split())
if a == 0 or b == 0:
    c = a + b
if a % 2 != 0 or a % 3 != 0 or a % 5 != 0 or a % 7 != 0:
    с = 1
elif b % 2 != 0 or b % 3 != 0 or b % 5 != 0 or b % 7 != 0:
    с = 1
    print(a, b)
elif a >= b:
    c = a % b
elif a < b:
    c = b % a

x = a // c
y = b // c
print(x, y)
</code>
Что делать, что мой код упрощает дроби не совсем так?
То есть при вводе 16 6
он упрощает до 4 1. А надо до 8 3?

a/b = x * НОД(a, b) / y * НОД(a, b)

НОД(a, b) вычисляется алгоритмом Евклида
т.е.

import math
x, y = a // math.gcd(a, b), b // math.gcd(a, b)

Ну НОД можно реализовать например так:

def my_gcd(m, n):
    m, n = max(abs(m), abs(n)), min(abs(m), abs(n))

    while m % n != 0:
        m, n = n, m % n

    return n


Как подставлять следующее число в каждом новом запросе? Python
У меня есть множество строк, которые отправляются в MySQL. Каждой строке я присваиваю отдельный ID. Это выглядит примерно так:

[
(1, "value1", "value2", "value3", value4"),
(2, "value1", "value2", "value3", value4"),
(3, "value1", "value2", "value3", value4"),
(4, "value1", "value2", "value3", value4"),
(5, "value1", "value2", "value3", value4"),
(6, "value1", "value2", "value3", value4")
]

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

N = 500
num = list(range(1, N+1))

[
(num, "value1", "value2", "value3", value4"),
(num, "value1", "value2", "value3", value4"),
(num, "value1", "value2", "value3", value4"),
(num, "value1", "value2", "value3", value4"),
(num, "value1", "value2", "value3", value4"),
(num, "value1", "value2", "value3", value4")
]

Это, конечно же, не работает. Уверен, что код для такой задачи очень простой. Но я не знаю как его прописать...

num = (range(0, 501))
my_list = []
for i in num:
    my_list.append((i, "value1", "value2", "value3", "value4"))

Или в 1 строку:

my_list = [(i, "value1", "value2", "value3", "value4") for i in range(0, 501)]


Как для бота discord сделать команду для вывода постоянно разного числа?
Возможно ли для бота discord сделать команду для рандомного числа (по типу dice) с одним randint, но что бы выводилось постоянно разное число? Как это можно реализовать?

Возможно. Реализовать это можно по-разному.
Если брать игральную кость для примера, то это случайные значения от 1 до 6:

import random

my_list = list(range(1, 7))  # создаем список из чисел
random.shuffle(my_list)  # перемешиваем элементы списка
for i in my_list:
    print(i)

Если нужно одно случайное число:

import random

my_list = list(range(1, 7))
random.shuffle(my_list)

def get_random_digit():
    global my_list
    if len(my_list) == 0:
        my_list = list(range(1, 7))
        random.shuffle(my_list)
    print(my_list.pop())

get_random_digit()


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

Вот хендлер который ловит ссылки, удаляет их и отправляет от имени бота такое же сообщение с измененными ссылками.
PS. Немного соврал. Не такие же. Если было фото/видео/аудио/документ то он просто игнорит этот факт и отправляет обычное сообщение.
Мне немного лень с этим париться ибо фиксится простыми условиями типа
if message.photo: await answer_photo(...) и тд

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters import BoundFilter
from aiogram.types import MessageEntityType
from aiogram.utils.markdown import link

import config # <- в нем лежит мой токен, игнорируй

bot = Bot(token=config.BOT_TOKEN) # <- делай как у тебя
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

# делаем фильтр
class FilterLinks(BoundFilter):
    async def check(self, message: types.Message):
        if msg_entities := (message.entities or message.caption_entities):
            entities = []
            for entitie in msg_entities:
                if entitie.type in [MessageEntityType.URL, MessageEntityType.TEXT_LINK]:
                    entities.append(entitie)
            # этот словарь идет в хендлер ниже
            return {"entities": entities} if entities else False

# делаем хендлер с нашим фильтром + добавляем несколько типов,
# они будут срабатывать для message.caption_entities
@dp.message_handler(FilterLinks(), content_types=['text', 'photo', 'document', 'audio', 'video'])
async def bot_message(message: types.Message, entities: dict):
    new_message = message.text or message.caption
    for entitie in entities:
        new_link = "www.google.com"
        prev_ = new_message[:entitie.offset]
        next_ = new_message[entitie.offset + entitie.length:]
        if entitie.type == MessageEntityType.TEXT_LINK:
            new_link = link(new_message[entitie.offset:entitie.offset + entitie.length], new_link)
        new_message = f"{prev_}{new_link}{next_}"

    await message.delete()
    await message.answer(new_message, parse_mode="Markdown")

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


Можно ли упростить данный код в python?
Можно ли упростить данный код? А то код получается длинный и мне кажется что есть способ это все организовать компактнее.
<code>
tournament_header = driver.find_element("css selector", "span.tournamentHeader__country").text
if "АНГЛИЯ: ПРЕМЬЕР-ЛИГА" in tournament_header:
  tournament.append("английской Премьер-лиги")
elif "АНГЛИЯ: ЧЕМПИОНШИП" in tournament_header:
    tournament.append("английского Чемпионшипа")
elif "ИСПАНИЯ: ПРИМЕРА" in tournament_header:
    tournament.append("испанской Примеры")
elif "ИСПАНИЯ: СЕГУНДА" in tournament_header:
    tournament.append("испанской Сегунды")
...
</code>

tournament_header = "ИСПАНИЯ: ПРИМЕРА - ТУР 9"
tournament_strings = ["АНГЛИЯ: ПРЕМЬЕР-ЛИГА", "АНГЛИЯ: ЧЕМПИОНШИП", "ИСПАНИЯ: ПРИМЕРА", "ИСПАНИЯ: СЕГУНДА"]
tournaments = ["английской Премьер-лиги", "английского Чемпионшипа", "испанской Примеры", "испанской Сегунды"]
tournament = []
for x, z in zip(tournament_strings, tournaments):
    if x in tournament_header:
        tournament.append(z)

print(tournament)

#['испанской Примеры']


как на Python правильно сделать Parsing сайта и убрать две строки?
<code>
course = requests.get(config.minfit_site).text
b = bs4.BeautifulSoup(course, "html.parser")

pln_0 = b.find('div', class_='mfm-grey-bg').select('span', class_='mfm-posr')[0].text
pln_1 = b.find('div', class_='mfm-grey-bg').select('span', class_='mfm-posr')[2].text

print(pln_0, pln_1)
</code>
Результат
7.8000
-0.100 забрать
8.2200
-0.030 забрать

ну примерно так:
<code>
z = b.find('div', class_='mfm-grey-bg').select('span', class_='mfm-posr')
pln_0, _ = z[0].stripped_strings
pln_1, _ = z[2].stripped_strings

print(pln_0, pln_1)

# 7.8000 8.2200

pf0 = float(pln_0)
print(pf0, type(pf0))

# 7.8 <class 'float'>
</code>