Сумма всех простых чисел меньше заданного числа
Решая задачу, я столкнулся с трудностью. Вот данные задачи:

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

А вот мой код:

def sum_of_primes(n):
    primes = []
    for num in range(2, n):
        if is_prime(num):
            primes.append(num)
    return sum(primes)

def is_prime(num):
    for i in range(2, int(num ** 0.5)):
        if num % i == 0:
            return False
    return True

В этом коде функция
sum_of_primes() должна находить сумму всех простых чисел меньше n. Она использует вспомогательную функцию
is_prime(), которая проверяет, является ли число простым.
Буду очень благодарен, если вы мне объясните, где тут моя ошибка, и в чем?

Ваша ошибка заключается в том, что вы неправильно реализовали функцию
is_prime(). Проверьте, например, число "4". Ваша функция скажет, что это простое число. Хотя, очевидно, это не так.
Для корректного подсчёта используйте данную функцию:

def is_prime(n: int) -> bool:
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

Обратите внимание на крайние значения
range(). Подробнее о работе последовательностей можно прочитать здесь.


Бьёт ошибку: sqlite3.OperationalError: unable to open database file в коде на Python при создании погодной программы через библиотеку pyowm

from pyowm.owm import OWM

owm_obj = OWM('токен')
reg = owm_obj.city_id_registry()

list_of_tuples = reg.ids_for('London', matching='like')
print(list_of_tuples)

При создании погодного приложения через pyowm выходит ошибка:

Traceback (most recent call last):
  File "G:\PROJECT2\1.21 Lesson_21.py", line 342, in <module>
    reg = owm_obj.city_id_registry()
  File "G:\PROJECT2\venv\lib\site-packages\pyowm\owm.py", line 96, in city_id_registry
    return cityidregistry.CityIDRegistry.get_instance()
  File "G:\PROJECT2\venv\lib\site-packages\pyowm\commons\cityidregistry.py", line 29, in get_instance
    return CityIDRegistry(CITY_ID_DB_PATH)
  File "G:\PROJECT2\venv\lib\site-packages\pyowm\commons\cityidregistry.py", line 21, in __init__
    self.connection = self.__decompress_db_to_memory(sqlite_db_path)
  File "G:\PROJECT2\venv\lib\site-packages\pyowm\commons\cityidregistry.py", line 52, in __decompress_db_to_memory
    src_conn = sqlite3.connect(tmpf_name)
sqlite3.OperationalError: unable to open database file

Данная часть кода взята из документации за 2023 г. по pyowm
К слову, ни одна задача не выполняется, бьётся идентичная ошибка.
Данный код работает с БД, а именно reg = owm_obj.city_id_registry().
Файл БД - cities.db.bz2.

Вобщем у меня ошибка воспроизводится.
Система
Windows 11 eng

Python 3.11.4 и Python 3.10.11

venv/Lib/site-packages/pyowm/commons/cityidregistry.py
вот в этом файле есть вот такой код

        with tempfile.NamedTemporaryFile(mode='wb') as tmpf:
            tmpf.write(decompressed_data)
            tmpf_name = tmpf.name

            # read temp DB to memory and return handle
            src_conn = sqlite3.connect(tmpf_name)
# Ошибка происходит здесь ^^^^^^^^^^^^^^^^^^^^^^^^

            dest_conn = sqlite3.connect(':memory:')
            src_conn.backup(dest_conn)
            src_conn.close()
            return dest_conn

Если его изменить:

        with tempfile.NamedTemporaryFile(mode='wb') as tmpf:
            tmpf.write(decompressed_data)
            tmpf_name = tmpf.name

            db_file = Path(__file__).parent / 'db.sqlite'
# Вот так --- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            db_file.write_bytes(decompressed_data)
# Вот так --- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            # read temp DB to memory and return handle

            src_conn = sqlite3.connect(db_file.absolute())
# И вот так --- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

            dest_conn = sqlite3.connect(':memory:')
            src_conn.backup(dest_conn)
            src_conn.close()
            db_file.unlink(missing_ok=True)
            return dest_conn

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


Ошибка возникает из-за того, что
df["age"] - это целая серия (pd.Series), т.е. в данном случае - колонка значений возраста из фрейма, а условие
df["age"]<25 из этой колонки формирует булев массив из 30 значений. Интерпретатор вполне справедливо возражает: "Истинное значение серии неоднозначно" и просит применить какую-либо функцию, с помощью которой можно привести эти 30 значений к одному - Истина или Ложь.
Ошибку спровоцировала также неправильная обработка данных внутри фрейма - в цикле вы не перебираете строки, а каждый раз осуществляете проверку столбца
age из исходного фрейма.
Вообще в
Pandas циклы в явном виде почти не используются, т.к. механика
Pandas заточена под векторные вычисления.
Например, в данном случае (и в случае посложнее, например, когда нужно определить не 2, а 5-10 или более категорий), удобно использовать категориальные данные:

print(pd.cut(df.age, (0, 25, 200), labels=('A', 'B'), right=False).tolist())

где мы определяем границы диапазонов и метки. Т.е. диапазону от 0 до 25 (не включая) будет присвоена метка A, диапазону от 25 до 200 - B. Можно сделать больше диапазонов и меток.
Если говорить о том, как сделать работоспособным ваш пример кода (что, повторюсь,  неэффективно для
Pandas), можно сделать так:

vacant = []
for i in range(len(df)):
    if df.at[i,"age"] < 25:
        vacant.append("A")
    else:
        vacant.append("B")
print(vacant)

или так

vacant = []
for _, row in df.iterrows():
    if row.age < 25:
        vacant.append("A")
    else:
        vacant.append("B")
print(vacant)


Удалить каждый второй элемент из списка
Задача состоит в следующем:
Дан список строк. Нужно убрать из списка каждый второй элемент. Например:

['1', '2', '3', '4'] => ['2', '4']
['qwerty', 'asdfg', 'zxcvb'] => ['asdfg']

Я захотел написать однострочное решение данной задачи. Моя попытка:

return [i for i in spisok if spisok.index(i) % 2 == 0]

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

i = 1
while index < len(spisok):
    del spisok[i]
    i += 1
return spisok

Но все-таки, существует ли однострочное решение данной задачи? Хотелось бы узнать

Самое лаконичное решение
Самое понятное решение
Самое запутанное решение (☻)

l=['1', '2', '3', '4']
def q2 (l):
    return l[1::2]

def qq2(l):
    return [l[i] for i in range(1,len(l),2) ]

def qqq2(l):
    return list(dict(filter(lambda pair: pair[0]%2 == 1, dict(zip(range(len(l)), l)).items())).values())

def r(l):
    return [] if not l else r(l[:-1]) + [l.pop()] if len(l) % 2 == 0 else r(l[:-1])

print(q2(l),qq2(l),qqq2(l),r(l))

Вывод

['2', '4'] ['2', '4'] ['2', '4'] ['2', '4']


Как на Python использовать переменные/списки в нескольких функциях без глобальных переменных?
Например есть список number который получает номер телефона во второй по счету функции, а в третьей по счету я уже его использую. Если делать через global, то все работает, но при условии что ботом пользуется только 1 человек. Если им одновременно пользуется несколько то все значения путаются в global и получается некорректный результат. Как этого избежать?(Текст в кавычках убран специально)
<code>
from telebot import types

bot = telebot.TeleBot('')
count = 0
spis = []
fil = 0
chet = 0
number = []
name1 = []
name2 = []

@bot.message_handler(commands=['start'])
def start(message):
    global count
    global spis
    global number
    global name1
    global name2
    global fil
    fil = 0
    name1 = []
    name2 = []
    number = []
    count = 0
    spis = []
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
    button_phone = types.KeyboardButton(text="", request_contact=True)
    markup.add(button_phone)

    send_mess = f'<b> Здравствуйте, {message.from_user.first_name} </b>!👋\n\nЭтот бот поможет '
    bot.send_message(message.chat.id, send_mess, parse_mode='html', reply_markup=markup)

@bot.message_handler(content_types=['contact'])
def contact(message):
    global number
    global name1
    global name2
    if message.contact is not None:
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
        btn1 = types.KeyboardButton('1100 ')
        btn2 = types.KeyboardButton('1100')
        markup.add(btn1, btn2)
        number = message.contact.phone_number
        name1 = message.contact.first_name
        name2 = message.contact.last_name
        final_message = "Отлично!"
    bot.send_message(message.chat.id, final_message, parse_mode='html', reply_markup=markup)

@bot.message_handler(content_types=['text'])
def mess(message):
    global count
    global spis
    global fil
    global chet
    global number
    global name1
    global name2
    get_message_bot = message.text.strip().lower()

    if get_message_bot == "":
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
        bot.send_message(, f'Заявка 1000+\nПользователь:\n{name1, name2}\nНомер телефона:\n{number}')
        final_message = ""```
</code>

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


Как быстро распарсить много json файлов на python?
Стоит задача распарсить 8000 Json файлов, объем всего этого добра ~ 8 гигов. Нужно вытащить нужную информацию и записать в базу. На файл уходит по 2 секунды. То есть на все файлы ~5 часов. Ищу решение как сделать быстрее, учитывая, что i\o biund операция.
Прошу всех неравнодушных и не душных подсказать куда копать!
Вот часть кода
<code>
for filename in os.listdir(download_dir):
    if filename.endswith('.json'):
        with open(os.path.join(download_dir, filename), 'r', encoding='utf-8') as j_f:
            try:
                data = json.load(j_f)
                companies_to_create = []
                for d in data:
                    if isinstance(d, dict):
                        inn = d.get('inn', '')
                        kpp = d.get('kpp', '')
                        name = d.get('name', '')
                        address_ul = d.get('data', {}).get('СвРегОрг', {}).get('АдрРО', '')
                        sv_okved = d.get('data', {}).get('СвОКВЭД', {})
                        if sv_okved:
                            sv_okved_dop = sv_okved.get('СвОКВЭДДоп', [])
                            for sv in sv_okved_dop:
                                if isinstance(sv, dict) and sv.get('КодОКВЭД', '').startswith('96'):
                                    okved = sv.get('КодОКВЭД', '')
                                    if not "Хабаровск" in address_ul:
                                        existing_company = Company.objects.filter(inn=inn).first()
                                        if not existing_company:
                                            company = Company(
                                                name=name,
                                                okved=okved,
                                                inn=inn,
                                                kpp=kpp,
                                                address_ul=address_ul,
                                            )
                                            companies_to_create.append(company)
                Company.objects.bulk_create(companies_to_create)
</code>

Давайте начнем с уточнения задачи. Если я правильно понял, то Вам нужно выбрать все компании зарегистрированные не в Хабаровске и имеющие дополнительные ОКВЭД начинающиеся на
96 (при этом сами ОКВЭД не нужны)
Если ошибся в формулировке задачи, поправьте, что-то придумаем
Самая главная, на мой взгляд, ошибка заключается в том, что Вы для каждого найденного ДопОКВЭД начинающегося с
96 пытаетесь создать запись, проверяя не создавалась ли она ранее.
Предлагаю несколько изменить такой порядок:

pip install pydantic --upgrade

import json
from pydantic import BaseModel, TypeAdapter
# В этом примере используется pydantic >= 2.0
# Для более ранних версий код будет слегка отличаться

# В данном случае я искусственно увеличил размер набора данных, чтобы воспроизвести Вашу ситуацию.

with open(r'C:\Users\karpo\Downloads\00001.json', encoding='utf-8') as f:
    data = json.load(f) * 8000

# Тем не менее я предлагаю Вам прежде чем пытаться записывать
# данные в БД собрать данные в одну переменную и подготовить данные для записи.

class Firm(BaseModel):
    inn: str = ''
    kpp: str = ''
    name: str = ''
    address: str = ''

    # Добавление этих методов даст возможность создать множество
    # (объект типа set) подобных объектов
    def __hash__(self):
        return hash(self.inn)
        # В данном случае объекты будут считаться идентичными если их ИНН равны

    def __eq__(self, other):
        return self.__hash__() == other.__hash__()

# Создадим функцию которая будет возвращать нам генератор только нужных нам элементов
def get_useful(firm_list: list[dict]):
    for firm in firm_list:
        address = ''

        try:
            if 'Хабаровск' in (address := firm['data']['СвРегОрг']['АдрРО']):
                continue
        except KeyError:
            pass

        for item in firm['data'].get('СвОКВЭД', dict()).get('СвОКВЭДДоп', []):
            if isinstance(item, dict) and item['КодОКВЭД'].startswith('96'):

                yield Firm.model_validate(
                    firm | {
                        'address': address
                    }
                )
                break

# Далее создадим множество подходящих записей и преобразуем его в кортеж данных для записи в БД

data_to_db = TypeAdapter(tuple[Firm]).dump_python(tuple(set(get_useful(data))))

-- так как структуру БД вы не предоставили, пришлось пофантазировать

create table okved_test (
    inn varchar primary key ,
    kpp varchar,
    name text,
    address text
);

import psycopg2 as pg
from psycopg2.extras import execute_values

with pg.connect('<connection string>') as conn, conn.cursor() as cur:
    execute_values(
        cur,
        """
        insert into okved_test (inn, kpp, name, address) values %s on conflict do nothing
        """,
        data_to_db,
        template="""(
        %(inn)s,
        %(kpp)s,
        %(name)s,
        %(address)s
        )""",
        page_size=10000
    )
    conn.commit()

Вот что получилось из Вашего
json

inn
kpp
name
address

0103007142
010101001
ООО "КАСКАД"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0104007787
010401001
ТУЛЬСКОЕ ПО
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

1643000792
164301001
КП АЗНАКАЕВСКОГО РПУ БОН
,420054,,, Казань г,, Владимира Кулагина ул, 1,,

0105037625
010501001
ООО "МОНОЛИТ"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105012701
010501001
АО "МАЙКОПНОРМАЛЬ"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105034293
010501001
ООО "АНИТ"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105035875
231201001
ООО "МАЙКОПГИПССТРОЙ"
,350020,,, Краснодар г,, Коммунаров ул, д 235,,

0103006420
010101001
ООО "АНТЕЯ"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105005341
010501001
ООО "НАРТ"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105031260
010501001
ООО "МИР ЦЕНТР"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105004595
010501001
ТПП РА
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105029550
010501001
ООО "ЮГ-КОМПЛЕКТ"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.

0105027730
010501001
ООО ФИРМА "ЦЕНТР"
385009,Республика Адыгея,город Майкоп, ул. Привокзальная, 331.


Как получить данные с страницы Django
У меня есть таблица. Приведу только часть, где используется шаблонизатор

<tbody>
  {% for el in getted_data %}
    <tr>
      <form action="{% url 'orders_page' %}" method="post">
        {% csrf_token %}
        <th scope="row"><input type="text" name="client_name" value="{{ el.client_name }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></th>
        <td><input type="text" name="order_number" value="{{ el.order_number }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><input type="text" name="phone_number" value="{{ el.phone_number }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><input type="text" name="print_type" value="{{ el.print_type }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><a href="#" style="text-decoration:dotted; color: rgb(1, 10, 177);">файл.docx</a></td>
        <td><input type="text" name="numbers_of_page" value="{{ el.numbers_of_page }}" disabled="disabled" style="background-color: none; border: none; color: #000;"></td>
        <td><input type="submit" name="document_printed" class="btn btn-success" value="Готово"></td> <!-- кнопка -->
      </form>
    </tr>
  {% endfor %}
</tbody>

views.py

class OrdersView(View):
    def get(self, r: WSGIRequest) -> HttpResponse:
        getted_data = OrderModel.objects.filter(status='getted')
        printed_data = OrderModel.objects.filter(status='completed')

        context = {
            'getted_data': getted_data,
            'getted_data_len': len(getted_data),
            'printed_data': printed_data,
            'printed_data_len': len(printed_data)
        }

        return render(r, 'main_service/orders.html', context=context)

    def post(self, r: WSGIRequest) -> HttpResponse:
        if 'document_printed' in r.POST:
            print(r.POST)
            print(r.POST.get('document_printed', False))
        return redirect('/orders')

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

Начнем с того, что внутри твоего представления (view) на сервере ты можешь получить данные из POST-запроса, если они были отправлены формой. Для этого тебе нужно использовать
request.POST.get() или
request.POST[''], где вместо пустых кавычек передай имя поля, с которого ты хочешь получить данные.
В твоем случае, если ты хочешь получить данные из строк таблицы, когда нажата кнопка "Готово", ты можешь добавить скрытое поле (hidden field) в твою форму для передачи данных из этих строк. Я бы сделал так:

<form action="{% url 'orders_page' %}" method="post">
  {% csrf_token %}
  <input type="hidden" name="client_name" value="{{ el.client_name }}">
  <input type="hidden" name="order_number" value="{{ el.order_number }}">
  <!-- Остальные скрытые поля с данными -->
  <td><input type="submit" name="document_printed" class="btn btn-success" value="Готово"></td>
</form>

Затем в твоем представлении ты можешь получить данные из этих полей, проверив наличие
document_printed в
request.POST, и извлечь значения с помощью
request.POST.get():

def post(self, request):
    if 'document_printed' in request.POST:
        client_name = request.POST.get('client_name', '')
        order_number = request.POST.get('order_number', '')
        # Извлеките остальные значения из скрытых полей

        # Обработка данных...

    return redirect('/orders')

Таким образом, ты сможешь получить данные из строк таблицы при нажатии на кнопку.


PostgreSQL добавление значения в дочернюю таблицу
Создаётся платеж, записывается в таблицы: платежи (
payments) и история изменения статусов (
payments_approval_history). В таблице истории изменений есть внешний ключ из ссылающийся на таблицу договоров.
Правильно ли производить запись в таблицу
payments, делать
commit, а после делать запись в таблицу
payments_approval_history и тоже делать
commit?
Как защититься от случая, когда мы записали в данные в одну таблицу, но получили ошибку при записи во вторую, и в итоге потеряли запись, ну и не поняли, что потеряли эту запись?

DROP TABLE IF EXISTS payments;
DROP TABLE IF EXISTS payments_approval_history;

CREATE TABLE payments(
   payment_id INT GENERATED ALWAYS AS IDENTITY,
   payment_number VARCHAR(255) NOT NULL,
   PRIMARY KEY(payment_id)
);

CREATE TABLE payments_approval_history(
   confirm_id INT GENERATED ALWAYS AS IDENTITY,
   payment_id INT,
   status_id INT DEFAULT 1
   PRIMARY KEY(confirm_id),
   CONSTRAINT fk_payment
      FOREIGN KEY(payment_id)
      REFERENCES payments(payment_id)
);

Записываем данные в таблицы. (упрощенный код)

import psycopg2 as pg

from psycopg2.extras import execute_values

values_p = [
    ('num-1'),
    ('num-2'),
    ('num-3')
]

with pg.connect('<connection string>') as conn:
    with conn.cursor() as cur:
        try:
            p_id = execute_values(
                cur,
                """
                INSERT INTO payments (
                    payment_number
                )
                VALUES %s on conflict do nothing
                RETURNING payment_id;
                """,
                values_p,
                template="""(%s)""",
                page_size=len(values_p),
                fetch=True
            )
        except Exception:
            conn.rollback()
            raise
        else:
            conn.commit()

        values_p_a_h = []
        [values_p_a_h.append((x,)) for x in p_id]

        try:
            execute_values(
                cur,
                """
                INSERT INTO payments_approval_history (
                    payment_id
                )
                VALUES %s on conflict do nothing;
                """,
                values_p_a_h,
                template="""(%s::int)""",
                page_size=len(values_p_a_h) # вот тут возможны варианты. По умолчанию 500
            )
        except Exception:
            conn.rollback()
            raise
        else:
            conn.commit()

Вопрос, правильно ли так делать? если нет, то как сделать лучше?

Попробуйте вот такую конструкцию.

create table status
(
    id      int generated by default as identity primary key,
    title   varchar not null,
    payload jsonb default '{}'
);

insert into status (title) values ('created'), ('new'), ('approved');

create table users
(
    id       int generated by default as identity primary key,
    username varchar,
    name     varchar,
    surname  varchar
);

CREATE TABLE transaction
(
    id        int GENERATED ALWAYS AS IDENTITY primary key,
    sender    int references users on delete restrict on update cascade,
    receiver  int references users on delete restrict on update cascade,
    amount    numeric not null,
    status_id int references status on delete restrict on update cascade default 1
);

create table transaction_status_history
(
    id             int generated by default as identity primary key,
    transaction_id int references transaction on delete cascade on update cascade,
    old_status_id  int references status on delete set null on update cascade,
    new_status_id  int references status on delete restrict on update cascade,
    datetime       timestamp default current_timestamp
);

create or replace function reg_transaction_status() returns trigger
    language plpgsql
as
$$
begin
    if tg_op = 'INSERT' then
        insert into transaction_status_history (transaction_id, old_status_id, new_status_id)
        values (new.id, 1, new.status_id);
    elseif tg_op = 'UPDATE' then
        insert into transaction_status_history (transaction_id, old_status_id, new_status_id)
        values (new.id, old.status_id, new.status_id);
    end if;
    return null;
end;
$$;

create trigger _000_reg_status_new
    after insert
    on transaction
    for each row
execute procedure reg_transaction_status();

create trigger _000_reg_status_upd
    after update
    on transaction
    for each row
    when ( new.status_id is distinct from old.status_id)
execute procedure reg_transaction_status();

insert into users (username, name, surname) values ('geek', 'John', 'Verter'), ('japi', 'Jago', 'Pilman');

insert into transaction (sender, receiver, amount) values (1, 2, 25000);

update transaction set status_id = 2 where id = 1;

select * from transaction_status_history;

id
transaction_id
old_status_id
new_status_id
datetime

1
1
1
1
2023-08-25 13:23:47.998185

2
1
1
2
2023-08-25 13:23:48.314745

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


Не работает callback_query_handler() в Python Telebot
Всем привет! Создаю двух-язычного (ru, en) тг бота. Ниже часть кода с проблемой:

@bot.message_handler(commands=['lang'])
def start_func(message):
    markup = types.InlineKeyboardMarkup()
    rus = types.InlineKeyboardButton('Русский 🇷🇺', callback_data='rus')
    eng = types.InlineKeyboardButton('English 🇬🇧', callback_data='eng')
    markup.row(rus, eng)
    bot.send_message(message.chat.id, 'Please, choose the language you want to continue in below again 👇', reply_markup=markup)

@bot.callback_query_handler(func=lambda callback: True)
def language(callback):
    if callback.data == 'rus':
        markup1 = types.InlineKeyboardMarkup()
        btn1 = types.InlineKeyboardButton('Продолжить', callback_data='да')
        markup1.add(btn1)
        bot.edit_message_text(f'Привет, {callback.from_user.first_name}! Вы выбрали Русский 🇷🇺 язык. Продолжить? \n\nIf you want to change your choice, write /lang', callback.message.chat.id, callback.message.message_id, parse_mode='html', reply_markup=markup1)

    elif callback.data == 'eng':
        markup2 = types.InlineKeyboardMarkup()
        btn2 = types.InlineKeyboardButton('Continue', callback_data='yes')
        markup2.add(btn2)
        bot.edit_message_text(f'Hello, {callback.from_user.first_name}! You chose English 🇬🇧 language. Continue? \n\nЕсли вы хотите изменить свой выбор, напишите /lang', callback.message.chat.id, callback.message.message_id, parse_mode='html', reply_markup=markup2)

@bot.callback_query_handler(func=lambda callback: True)
def choose_mood(message):
    print(message)
    text = f'Ещё раз привет, {message.from_user.first_name}, я - бот Cool Pictures! \n\nЯ помогу Вам найти интересные картинки по вашему вкусу. Для начала выберите настроение картинки из плиток в низу экрана.👇'
    if message.data == 'да':
        text = text
        markup = types.ReplyKeyboardMarkup(row_width=2,resize_keyboard=True)
        btn1r = types.KeyboardButton('Весёлое 😄')
        btn2r = types.KeyboardButton('Нейтральное 😐')
        btn3r = types.KeyboardButton('Грустное 😔')
        markup.add(btn1r)
        markup.add(btn2r)
        markup.add(btn3r)
        bot.send_message(message.from_user.id, text, parse_mode='html', reply_markup=markup)

    elif message.data == 'yes':
        text = translator.translate(text, crs='ru', dest='en').text
        markup1 = types.ReplyKeyboardMarkup(row_width=2,resize_keyboard=True)
        btn1e = types.KeyboardButton('Happy 😄')
        btn2e = types.KeyboardButton('Neutral 😐')
        btn3e = types.KeyboardButton('Sad 😔')
        markup1.add(btn1e)
        markup1.add(btn2e)
        markup1.add(btn3e)
        bot.send_message(message.from_user.id, text, parse_mode='html', reply_markup=markup1)

Дело в том, что Inline кнопка "Продолжить" появляется, но после её нажатия ничего не происходит, то есть не срабатывает функция "choose_mood". Что я делаю не так? Если понадобится полный код - пишите, я отредактирую! Всем заранее спасибо.

Дело в том, что каждый обработчик для бота должен быть в одном экземпляре (а в коде выше функции с
@bot.callback_query_handler(func=lambda callback: True) объявлены сразу две), иначе обработчики, которые были объявлены после самого первого, будут игнорироваться (в коде функция
choose_mood игнорируется, так как уже есть
language).
Вам надо объединить функции
language и
choose_mood в одну:

@bot.callback_query_handler(func=lambda callback: True)
def language(callback):
    text = f'Ещё раз привет, {callback.from_user.first_name}, я - бот <b>Cool Pictures</b>! \n\nЯ помогу Вам найти интересные картинки по вашему вкусу. Для начала выберите настроение картинки из плиток в низу экрана.👇'
    if callback.data == 'rus':
        markup1 = types.InlineKeyboardMarkup()
        btn1 = types.InlineKeyboardButton('Продолжить', callback_data='да')
        markup1.add(btn1)
        bot.edit_message_text(f'Привет, {callback.from_user.first_name}! Вы выбрали <b>Русский</b> 🇷🇺 язык. <b>Продолжить?</b> \n\nIf you want to change your choice, write /lang', callback.message.chat.id, callback.message.message_id, parse_mode='html', reply_markup=markup1)

    elif callback.data == 'eng':
        markup2 = types.InlineKeyboardMarkup()
        btn2 = types.InlineKeyboardButton('Continue', callback_data='yes')
        markup2.add(btn2)
        bot.edit_message_text(f'Hello, {callback.from_user.first_name}! You chose <b>English</b> 🇬🇧 language. <b>Continue?</b> \n\nЕсли вы хотите изменить свой выбор, напишите /lang', callback.message.chat.id, callback.message.message_id, parse_mode='html', reply_markup=markup2)

    if callback.data == 'да':
        text = text
        markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
        btn1r = types.KeyboardButton('Весёлое 😄')
        btn2r = types.KeyboardButton('Нейтральное 😐')
        btn3r = types.KeyboardButton('Грустное 😔')
        markup.add(btn1r)
        markup.add(btn2r)
        markup.add(btn3r)
        bot.send_message(callback.from_user.id, text, parse_mode='html', reply_markup=markup)

    elif callback.data == 'yes':
        text = translator.translate(text, crs='ru', dest='en').text
        markup1 = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
        btn1e = types.KeyboardButton('Happy 😄')
        btn2e = types.KeyboardButton('Neutral 😐')
        btn3e = types.KeyboardButton('Sad 😔')
        markup1.add(btn1e)
        markup1.add(btn2e)
        markup1.add(btn3e)
        bot.send_message(callback.from_user.id, text, parse_mode='html', reply_markup=markup1)

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

# Если данные с нажатия кнопки равны "X"
@bot.callback_query_handler(func=lambda callback: callback.data == "X")
def func_x(callback):
    ...

# Если они равны "Y"
@bot.callback_query_handler(func=lambda callback: callback.data == "Y")
def func_y(callback):
    ...


NameError: name 'image_id' is not defined [дубликат]

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

Проблема с name is not defined

                                (1 ответ)

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

<code>
from random import randint as r
def image_info(**dictionary):
    if image_id not in dictionary or image_title not in dictionary:
        raise TypeError("Name 'image_id' or 'image_title' is not defined")
    return f"Изображение {dictionary[image_title]} имеет id {dictionary[image_id]}"
print(image_info(image_id = r(10, 999), image_title = f'image_{r(100,999)}'))
</code>

Предлагаю вариант:

from random import randint as r
def image_info(**dictionary):
    if 'image_id' not in dictionary.keys() or 'image_title' not in dictionary.keys() :
        raise TypeError("Name 'image_id' or 'image_title' is not defined")
    return f"Изображение {dictionary['image_title']} имеет id {dictionary['image_id']}"
print(image_info(image_id = r(10, 999), image_title = f'image_{r(100,999)}'))

Вывод:

 Изображение image_973 имеет id 651


Помогите решить задачу на Python)
Задача:
Миша купил себе новый YouPhone. После очередного обновления в системе пропал счетчик процентов зарядов и пользоваться им стало очень сложно. Миша подробно изучал характеристики перед покупкой, поэтому он знает, что:

с 100% до 0% телефон разряжается ровно за a минут, при этом он теряет заряд равномерно

с 0% до 100% телефон заряжается ровно за b минут, при этом зарядка так же идет равномерно

зарядка не может опускаться ниже 0% или становиться выше 100%

В течение дня Миша постоянно перемещался и его телефон менял источник энергии n раз (с зарядки от сети на аккумулятор и наоборот). Известно, что в начале дня (в 00:00) телефон стоял на зарядке и был полностью заряжен. Помогите Мише найти оставшийся в конце дня процент заряда на его телефон.
Формат входных данных:
Первая строка входного файла содержит числа n, a, b — количество смен источника энергии телефона, время разряда и заряда аккумулятора соответственно.
Каждая из следующих n строк содержит время суток в формате «hh:mm», в которое была произведена смена источника питания. Данные уникальны и перечислены в хронологическом порядке
Формат выходных данных:
В выходной файл выведите процент заряда батареи в 23:59 с точностью четыре знака после запятой.
Мое решение: (неправильное)
<code>
    n, a, b = map(int,input().split())
    #комментарий - входные данные
    x = 100
    #комментарий - процент заряда
    g, h = map(int,input().split(':'))
    #комментарий - ввод времени
    z = h + (60 * g)
    #комментарий - переводим часы в минуты и складываем
    for i in range(n-1):
    g, h = map(int,input().split(':'))
    v = h + (60 * g)
    x = x - a / (z - v)
    #Комментарий -
    g, h = map(int,input().split(':'))
    z = h + (60 * g)
    x = x - b / (z + v)
    print(x)
</code>
Помогите, пожалуйста, решить задачу.

Что же, давай разбираться...

В цикле ты два раза вводишь g и h, поэтому вторую строчку
g, h = map(int, input().split(':')) стоит убрать.
Заведи переменную
count, чтобы знать когда телефон снимают с зарядки и меняй её с
false на
true после каждой итерации.
Почему ты
a или
b делишь на время, должно быть наоборот.
Почему из
x ты вычитаешь дробь? Домножай на 100, чтобы получить проценты, то есть примерно:
x = x - (z - v) / a * 100.
Если честно я вообще не понял, что такое
z и
v. Могу предложить сделать
z - количество минут с прошлой записи, тогда
x = max(x - 100 * (z / a), 0) или
x = min(x + 100 * (z / b), 100), если аккумулятор разряжается или заряжается соответственно.


Как заставить модуль googletrans убрать ненужные "системные" слова при выводе перевода?
Всем привет! Пишу двух-язычного (ru, en) телеграм бота. Код полностью кидать не буду, а покажу на похожем примере:
<code>
from googletrans import Translator

tr = Translator()

text = 'Привет, знатоки, помогите!'

print(tr.translate(text))
</code>
При выводе в консоли виден данный результат (пишу полностью):
Translated(src=ru, dest=en, text=Hi experts, help!, pronunciation=None, extra_data="{'translat...")
Такой результат пишется и в самом телеграм боте (пишу полностью):
Translated(src=ru, dest=en, text=Hello again Cheburkek, I'm a Cool Pictures bot!
I will help you find interesting pictures to your liking. To get started, select your mood from the tiles at the bottom of the screen., pronunciation=[[]], extra_data="{'translat...")
Помогите пожалуйста. Кто знает, как убрать эти "Translated(src=ru, dest=en, text..." и т.д.?
Надеюсь, вам всё понятно. Если нет - пишите, допишу подробнее. Всем спасибо!

Translated(src=ru, dest=en, text=Hello again Cheburkek...

Это выглядит как некая структура с полями
src,
dest,
text и т.д. Нужно просто взять через точку нужное вам поле этой структуры, я полагаю, что это
text:

print(tr.translate(text).text)
                        ^^^^^


Есть ли алгоритм со сложностью O(n) для нахождения минимального количества перестановок элементов массива 1, чтобы массив 1 стал равен массиву 2?
Есть 2 массива, элементы которых от 1 до n:

current_array = [1, 3, 5, 2, 4, 7, 6]
expected_array = [6, 2, 4, 1, 3, 5, 7]

Чтобы current_array стал равен expected_array за минимальное количество перестановок элементов current_array влево, нужно переставить 3 элемента:
current_array -> [4, 1, 3, 5, 2, 7, 6] -> [2, 4, 1, 3, 5, 7, 6] -> [6, 2, 4, 1, 3, 5, 7]
[6, 2, 4, 1, 3, 5, 7] == expected_array
Переставить - значит, подвинуть элемент t на p позиций влево, где p не больше, чем текущее количество элементов слева от t.
Чтобы найти минимальное количество перестановок, я написал такой код:

n = 7
current_array = [1, 3, 5, 2, 4, 7, 6]
expected_array = [6, 2, 4, 1, 3, 5, 7]
counter = 0

for i in range(n):
    if current_array[i] != expected_array[i]:
        current_array.remove(expected_array[i])
        current_array.insert(i, expected_array[i])
        counter += 1

print(counter)

Но его сложность O(n^2), что довольно медленно. Я думал использовать расстояние Левенштейна, но его сложность при равных массивах тоже будет равна O(n^2).
Есть ли алгоритм для этой задачи, сложность которого будет O(n)?

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

sa = [1, 3, 5, 2, 4, 7, 6]
ta = [6, 2, 4, 1, 3, 5, 7]

n = len(sa)
t = [0] * n
for i in range(n):
    t[ta[i] - 1] = i
counter = 0
m = t[sa[0] - 1]
for i in range(1, n):
    a = t[sa[i] - 1]
    if a < m:
        counter += 1
    else:
        m = a

print(counter)

-->

3

Другие примеры:

Src [1, 3, 5, 2, 4, 7, 6]
Tgt [7, 6, 1, 3, 5, 2, 4]

2

Src [1, 2, 3, 4, 5]
Tgt [1, 2, 3, 4, 5]

0

Src [1, 2, 3, 4, 5]
Tgt [5, 4, 3, 2, 1]

4

Src [1, 2, 3, 4, 5]
Tgt [1, 2, 4, 3, 5]

1

Src [1, 2, 3, 4, 5]
Tgt [1, 5, 4, 3, 2]

3

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

n = len(sa)
t = [0] * n
tmp = [0] * n
for i in range(n):
    t[ta[i] - 1] = i
for i in range(n):
    tmp[i] = t[sa[i] - 1]
counter = 0
m = tmp[0]
for i in range(1, n):
    if tmp[i] < m:
        counter += 1
    else:
        m = tmp[i]

print('  Src', sa)
print('  Tgt', ta)
print('Order', tmp, '-->', counter)


Форматирование байтов
Есть число
3454. Как его преобразовать и отформатировать чтобы получилось
b'3454'?

bytes:

bytes(str(3454), 'ascii')

Кодировки тут: standard-encodings. Так как тут только цифры,
ascii подойдёт. Впрочем подойдет и любая другая.


Функция-таймер для Telegram-бота
Друзья, добрый день!
Наверняка этот вопрос уже кем-то задавался, но соответствующего топика не нашёл.
Есть Telegram-бот, принимающий сообщения пользователей и пересылающий их администратору. Необходимо реализовать антиспам-защиту, чтобы один и тот же пользователь не мог отправлять сообщения чаще одного раза в пять минут.
Создал в папке с хэндлерами файл "global_data.py", имеющий следующее содержание:

import time

# Глобальная переменная-флаг с таймером отправки сообщений.
timer_flag = False

def start_timer() -> None:
    """
    Функция - таймер для отправки сообщений.
    """
    global timer_flag
    timer_flag = True
    while True:
        duration = 5 * 60  # Время в секундах.
        start_time = time.time()
        remaining_time = duration - (time.time() - start_time)
        time.sleep(1)
        if remaining_time <= 0:
            timer_flag = False
            break

В файле с хендлерами сделал импорт

from . import global_data as data

и добавил

data.start_timer()

в конце функции отправки сообщения администратору.
Проблема в том, что функция "start_timer" запускается, но цикл, по-видимому, почему-то никогда не прерывается, и, соответственно, глобальной переменной "timer_flag" не передаётся значение False.
Проверка в самом хендлере выглядит так:

elif data.timer_flag:
    bot.send_message(message.chat.id, f'<b>Анти-спам</b>: Вы сможете отправить '
                                      f'новое сообщение через 5 минут',
                     parse_mode='html')

Помогите, пожалуйста, с решением этой проблемы или предложите какую-нибудь более изящную реализацию.
Заранее спасибо :)

Сделать БД с id пользователями и записывать туда дату/время последнего сообщения, потом создать декоратор проверяющий текущее время и время в БД, если всё ок - отправить сообщение по адресу, если не ок - ответить пользователю об ошибке или забанить на время.


как сделать правильный вывод?
при выводе чисел последнее число не выводится, как это решить подскажите

def pipe_fix(nums):
    return list(range(nums[0],nums[-1]))

мне нужен чтобы функция выводила следующий список:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
а выводит вот такой:
[1, 2, 3, 4, 5, 6, 7, 8]

Функция
range возвращает диапазон, не включая последнее число:

>>> list(range(0, 9))
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Для решения этой проблемы надо просто добавить
+ 1:

def pipe_fix(nums):
    return list(range(nums[0], nums[-1] + 1))
    #                                  ^^^^


Ошибка при ответе на команду start ,telegram bot, Aiogram
Файл запускается, но после ввода в чат команды
start вылетает ошибка. Не могу ее понять, подскажите пожалуйста.
Ошибка будет после кода

from aiogram import Bot, Dispatcher

from aiogram.types import Message
import markups as nav
import asyncio

token = 'token'

async def get_start(message:Message, bot: Bot):
    await message.answer(f'<b>Привет {message.from_user.first_name}. Рады приветствовать тебя в нашем магазине!</b>',parse_mode="html", reply_markup= nav.mainMenu)

async def start():
    bot = Bot(token = token)

    dp = Dispatcher(bot)
    dp.register_message_handler(get_start)
    try:
        await dp.start_polling(bot)
    finally:
        await dp.session.close()

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

Task exception was never retrieved
future: <Task finished name='Task-16' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\kvard\PycharmProjects\TechItBot_test\Lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=TypeError("get_start() missing 1 required positional argument: 'bot'")>
Traceback (most recent call last):
TypeError: get_start() missing 1 required positional argument: 'bot'

ошибка в том что в get_start, аргумент bot обязательный, можете либо сделать его необязательным либо передать туда значение
Вообще не вижу чтобы этот аргумент где-то использовался, поэтому его вообще стоит убрать
Попробуйте так:

from aiogram import Bot, Dispatcher

from aiogram.types import Message
import markups as nav
import asyncio
from aiogram.filters.command import Command

token = 'token'
bot = Bot(token=token)
# Диспетчер
dp = Dispatcher()

@dp.message(Command("start"))
async def get_start(message:Message):
    await message.answer(f'Привет {message.from_user.first_name}. Рады приветствовать тебя в нашем магазине!',
                         parse_mode="html", reply_markup=nav.mainMenu)

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

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

PS. Не оставляйте токен от бота в открытом доступе, его могут угнать


TypeError at /profile/edit_profile/ profile_edit() missing 1 required positional argument: 'username'
Пишу социальную сеть. При попытке отредактировать профиль выходит ошибка выше. Кто-то может, пожалуйста, объяснить что не так с моим кодом?
<code>
@login_required
def profile_edit(request, username):
    username = get_object_or_404(User, author=username)
    if request.username != post.author:
        return redirect('blog:post_detail', username)
    form = PostForm(
        request.POST or None,
        files=request.FILES or None,
        instance=post)
    if form.is_valid():
        form.save()
        return redirect('blog:post_detail', author=username)
    template = 'blog/create.html'
    context = {'form': form, 'post': post}
    return render(request, template, context)
</code>

Итак, начнем с того, что ошибка "TypeError: profile_edit() missing 1 required positional argument: 'username'" означает, что функция
profile_edit() требует передачи аргумента
username, но ты вызываешь функцию без этого аргумента.
Предположу, что тебе нужно передать
username в URL-шаблоне. Убедись, что у тебя есть правильно настроенный URL-шаблон для представления
profile_edit(), который включает
username в качестве аргумента.
Например, твой URL-шаблон может выглядеть как-то так:

from django.urls import path

from . import views

app_name = 'blog'

urlpatterns = [
    # ...
    path('profile/edit/<str:username>/', views.profile_edit, name='profile_edit'),
    # ...
]

Получившийся URL-шаблон будет передавать значение
username в качестве аргумента функции
profile_edit()
Измени свой код функции
profile_edit() следующим образом:

@login_required
def profile_edit(request, username):
    user = get_object_or_404(User, username=username)
    # ...

Затем обнови шаблон с формой редактирования профиля, чтобы в URL-шаблоне использовать аргумент
username.
Например:

<form action="{% url 'blog:profile_edit' username=request.user.username %}" method="POST">
    <!-- ... -->
</form>


Задача из яндекс контест по графам. 2 варианта кода, один проходит все тесты другой нет, почему?
Ниже представлены два кода, тот, что на Python мой. На плюсах взял из инета. Алгоритм на плюсах проходит все тесты. Мой не проходит 6 тест (не знаю точно какие входные данные). Помогите разобраться в чем может быть ошибка и на каких входных данных может мой код выдавать ошибку. Моя фантазия на тесты иссякла, два дня сидел придумывал разные тесты, но так и не нашёл в чём дело. Я использую DFS, алгоритм на плюсах -  BFS
Задача
В заданном корневом дереве найдите вершины, максимально удалённые от корня. Расстоянием между вершинами считается количество рёбер в пути.
Формат ввода
В первой строке задано n — количество вершин в дереве (1 ≤ n ≤ 100). В следующих n − 1 строках заданы вершины, являющиеся предками вершин 2, 3, …, n. Вершина 1 является корнем дерева.
Формат вывода
В первой строке выведите максимальное расстояние от корня до остальных вершин дерева. Во второй строке выведите, сколько вершин дерева находятся от корня на таком расстоянии. В третьей строке выведите номера этих вершин через пробел в порядке возрастания.

Пример 1

    Ввод
    3
    1
    1

    Вывод
    1
    2
    2 3

 Пример 2

    Ввод
    3
    1
    2

    Вывод
    2
    1
    3

Python

count = int(input())

graph = {}
costs = {}
for i in range(count):
    graph[i + 1] = []

for i in range(count - 1):
    parent = int(input())
    graph[parent].append(i + 2)

costs[1] = 0
def dfs(head, max_dist):
    for node in graph[head]:
        costs[node] = costs[head] + 1
        if costs[node] >  max_dist:
            max_dist = costs[node]
        max_dist = dfs(node, max_dist)

    return max_dist

max_dist = dfs(1, 0)
print(max_dist)

count_max = 0
answer = []
for item in costs.keys():
    if costs[item] == max_dist:
        count_max += 1
        answer.append(item)

print(count_max)
print(' '.join([str(item) for item in answer]))

C++

#include <algorithm>
#include <queue>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

int main(int argc, const char * argv[]) {
    int n;
    cin >> n;
    vector<vector<int> > gr(n+1);
    for (int i = 2; i <= n; ++i) {
        int a;
        cin >> a;
        gr[a].push_back(i);
    }

    vector<int> nodes;
    queue<int> q;
    q.push(1);
    int depth = -1;
    while (!q.empty()) {
        int m = q.size();
        depth += 1;
        nodes.clear();
        for (int i = 0; i < m; ++i) {
            int u = q.front();
            nodes.push_back(u);
            q.pop();
            for (const auto& v : gr[u]) {
                q.push(v);
            }
        }
    }

    sort(nodes.begin(), nodes.end());

    cout << depth << "\n" << nodes.size() << "\n";

    for (const auto& u : nodes) {
        cout << u << " ";
    }
    return 0;
}

... выведите номера этих вершин через пробел в порядке возрастания.

Ваше решение порядок не фиксирует - кто первый встретился, тот первый печатается:

<code>
$ cat temp.txt
5
1
1
3
2

$ python temp.py < temp.txt
2
2
5 4
</code>


Есть ли в Python тернарный условный оператор?
Есть ли в Python тернарный оператор?
Примечание. Это перевод замечательного вопроса с enSO Does Python have a ternary conditional operator?

Да, он был добавлен в версии 2.5. Вот его синтаксис:

a if condition else b

Сначала вычисляется
condition, затем, в соответствии с его булевым значением, вычисляется и возвращается
a или
b. Если
condition равно True, вычисляется и возвращается
a, а
b игнорируется; в противном случае вычисляется и возвращается
b, а
a игнорируется.
Это позволяет провести так называемое сокращенное вычисление: когда условие истинно — вычисляется только
a, а когда условие ложно —  вычисляется только
b (налицо экономия времени).
Например:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Заметьте, что тернарный оператор — это выражение (expression), а не инструкция (statement). Это означает, что вы не можете использовать инструкции (вроде
pass) или присваивания (
x = 5,
x += 5) внутри условного оператора:

>>> pass if False else pass
  File "<stdin>", line 1
    pass if False else pass
         ^
SyntaxError: invalid syntax

>>> # Python обрабатывает это как `x = (1 if False else y) = 2`
>>> # Часть `(1 if False else x)` верна, но
>>> # она не может быть слева от знака равенства.
>>> x = 1 if False else y = 2
  File "<stdin>", line 1
SyntaxError: cannot assign to conditional expression

>>> # То же, но со скобками...
>>> (x = 1) if False else (y = 2)
  File "<stdin>", line 1
    (x = 1) if False else (y = 2)
       ^
SyntaxError: invalid syntax

(В версии 3.8 и выше "моржовый оператор"
:= позволяет одновременно вычислить выражение, присвоить результат переменной, и вернуть это значение куда угодно, в том числе и в условие тернарного оператора. Но не стоит этим увлекаться — слишком быстро станет трудно разобраться в коде.)
Кроме того, поскольку это выражение, то часть
else обязательна:

# Неверный синтаксис: мы не определили, какое будет значение, если
# условие окажется ложным.
a if True

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

x = a if True else b

Или, например, в комбинации с оператором return:

def my_max(a, b):
    return a if a > b else b

О тернарном выражении следует думать как о "переключении" между двумя значениями. Его следует использовать, когда перед нами выбор одного из двух значений, а дальнейшие строки программы выполнятся вне зависимости от того, будет ли условие верно. Тернарный оператор используется, когда мы хотим вычислить выражение и потом что-то с ним сделать. В остальных случаях применяйте обычный
if.
Имейте в виду, что некоторые питонисты недолюбливают тернарный оператор по следующим причинам:

Порядок аргументов отличается от аналогичного классического тернарного оператора
condition ? a : b многих других языков (например, C, C++, Go, Perl, Ruby, Java, JavaScript и т. д.). Это может привести к ошибкам, если человек незнаком с "необычным" поведением Питона в отношении тернарного оператора (он может перепутать порядок аргументов).

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

Хотя "однострочный if" может быть очень полезен и делает код более лаконичным, он сильно его усложняет.

Если вам трудно запомнить порядок аргументов, то вспомните, что если произнести выражение с тернарным оператором вслух, получится примерно то же, что оператор и обозначает. Например,
x = 4 if b > 8 else 9 произносится как
x будет равно 4, если b больше чем 8, в противном случае 9.
Официальная документация:
Conditional expressions
Is there an equivalent of C’s ”?:” ternary operator?


Сообщение от пользователя telegram на python?
недавно у меня появилась проблема никак не могу ее решить, мне нужно получить сообщение от юзера, но при каждом его выводе в cmd вижу не сообщение от юзера, а сообщение написанное ботом, пробовал получать сообщения в пустом дискрипторе, но он все равно выводил не то что нужно
<code>
@dp.callback_query_handler(cb.filter(type='categoryadd'))
async def spis(call: CallbackQuery, callback_data: dict):
    data = await db.get_product_id()
    for i in data:
        print(i[0])
        insert_product_id = int(i[0]) + 1
    category_id = callback_data.get('category_id')
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton(text='добавить позицию',callback_data='btn:add_price:-:-'))
    await bot.send_message(call.message.chat.id,'напишите через пробел позицию пример (название цена колличество)',reply_markup=keyboard)

    time.sleep(10)
    string = call.message.text
    print(string)
</code>

Если вы запрашиваете сообщение от пользователя и хотите выводить его после получения, то можно использовать функцию
register_next_step_handler, в которую надо передать сообщение бота и следующую функцию, которая будет обрабатывать полученное сообщение от пользователя. В telebot это будет выглядеть примерно так:

import telebot
from telebot import types

dp = telebot.TeleBot(TOKEN)

@dp.message_handler(commands=['message'])
def msg_from_user1(message: types.Message):
    msg = dp.send_message(message.chat.id, 'Введите сообщение...')
    dp.register_next_step_handler(msg, msg_from_user2)

def msg_from_user2(message: types.Message):
    msg_from_user = message.text
    print(msg_from_user)

if __name__ == '__main__':
    dp.polling(none_stop=True)

Здесь, после отправки команды /message боту, он будет запрашивать сообщение от пользователя и после его получения запустит функцию
msg_from_user2, которая выведет это сообщение в консоль.
В aiogram вроде не работает.


Как сделать считывание и проверку на наличие определенной роли участника сервера?
Я уже написал код который должен это делать но выходит ошибка.
Код:

@bot.command()
async def reserv(ctx, comm:int):
    vip=False
    member = ctx.author
    role = member.roles
    if "1143125771603419217" in role:
        vip=True
    if vip == False:
        cena = int(comm * 15)
        em = discord.Embed(title="**Заказ:**", description=f"**Отлично! К оплате {cena} ₽**"
                                                           + "\n\n**Способы оплаты: **"
                                                             "\n**Сбер: 2202 2023 2127
                                                              2225**"
                                                             "\n*Вскоре появятся новые
                                                              способы.*"
                                                             "\n\n**После оплаты напишите
                                                               владельцу с
                                                               доказательствами.**
                                                               *creeper_kriper*",
                                                                color=0x1f8b4c)
        await ctx.author.send(embed=em)

    if vip == True:
        cena = int(comm * 15)
        cena = cena/100*90
        em = discord.Embed(title="**Заказ:**", description=f"**Отлично! К оплате {cena} ₽**"
                                                           + "\n\n**Способы оплаты: **"
                                                             "\n**Сбер: **"
                                                             "\n*Вскоре появятся новые
                                                               способы.*"
                                                             "\n\n**После оплаты напишите
                                                               владельцу с
                                                               доказательствами.**
                                                              *creeper_kriper*",
                                                               color=0x1f8b4c)
        await ctx.author.send(embed=em)

Ошибка:

[2023-08-22 08:24:56] [ERROR   ] discord.ext.commands.bot: Ignoring exception in command reserv
Traceback (most recent call last):
  File "C:\Users\matve\Desktop\CreeperBot 1.0\lib\site-packages\discord\ext\commands\core.py", line 235, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:\Users\matve\Desktop\CreeperBot 1.0\main.py", line 37, in reserv
    role = member.roles
AttributeError: 'User' object has no attribute 'roles'

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

Traceback (most recent call last):
  File "C:\Users\matve\Desktop\CreeperBot 1.0\lib\site-packages\discord\ext\commands\bot.py", line 1350, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\matve\Desktop\CreeperBot 1.0\lib\site-packages\discord\ext\commands\core.py", line 1029, in invoke
    await injected(*ctx.args, **ctx.kwargs)  # type: ignore
  File "C:\Users\matve\Desktop\CreeperBot 1.0\lib\site-packages\discord\ext\commands\core.py", line 244, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'User' object has no attribute 'roles'

Если делать выводы по ошибкам, которые вы привели в вопросе и комментарии, то можно предположить, что выполнение команды происходит в личных сообщениях с ботом, поэтому
ctx.author возвращает вам объект класса
User.
Попробуйте сделать вот так:

import discord

from discord.ext import commands

bot = commands.Bot(command_prefix='.')

@bot.command()
async def reserv(ctx: commands.Context, comm: int):
    # Получаем объект класса `Guild`
    # Вместо параметра guild_id, нужно написать ID сервера
    guild = bot.get_guild(guild_id)
    # Получаем объект класса `Member`
    member = guild.get_member(ctx.author.id)
    # Получаем объект класса `Role` с необходимой ролью
    # Вместо параметра role_id, нужно вписать ID нужной вам роли
    role = member.get_role(role_id)

    # Аналогично из вашего кода, если vip == False
    if role not in member.roles:
        ...
    # Если vip == True
    else:
        ...


Как заставить программу повторно просить ввести цифру при вводе любого другого символа?
Нужно чтобы программа при вводе любого символа кроме цифры писала "Неправильно заданы значения" и снова просила ввести цифру.Должен использовать цикл while.
Код:
<code>
fnum=input("Введите 1 число : ")
try:
    int(fnum)
except ValueError:
    try:
        float(fnum)
    except ValueError:
        print("Неправильно заданы значения")
snum=input("Введите 2 число: ")
try:
    int(snum)
except ValueError:
    try:
        float(snum)
    except ValueError:
        print("Неправильно заданы значения")
arif=input("Введите арифметический знак: ")
if arif=="*":
    print(fnum*snum)
if arif=="/":
    print(fnum/snum)
if arif=="-":
    print(fnum-snum)
if arif=="+":
    print(fnum+snum)
else:
    print("Неправильно заданы значения")

</code>

Используйте этот код:
<code>
while True:
    fnum=input("Введите 1 число : ")
    try:
        int(fnum)
        break
    except ValueError:
        try:
            float(fnum)
            break
        except ValueError:
            print("Неправильно заданы значения")
while True:
    snum=input("Введите 2 число: ")
    try:
        int(snum)
        break
    except ValueError:
        try:
            float(snum)
            break
        except ValueError:
            print("Неправильно заданы значения")
while True:
    arif=input("Введите арифметический знак: ")
    if arif=="*":
        print(float(fnum)*float(snum))
        break
    elif arif=="/":
       print(float(fnum)/float(snum))
        break
    elif arif=="-":
        print(float(fnum)-float(snum))
        break
    elif arif=="+":
        print(float(fnum)+float(snum))
        break
    else:
        print("Неправильно заданы значения")
</code>


Как найти словарь по значению определённого ключа во вложенном словаре?
Есть словарь с вложенными словарями:

d = {'result': {'1': {'NAME': 'Саша', 'AGE': 20},
                '2': {'NAME': 'Вася', 'AGE': 30}
                }
     }

Необходимо вывести словарь, в котором
AGE = 30
То есть:

{'NAME': 'Вася', 'AGE': 30}

Как это сделать? Желательно без for

Чтобы из вашего словаря d достать искомый словарь, следует воспользоваться следующей конструкцией:
<code>
print(list(filter(lambda v: v["AGE"]==30, d["result"].values()))[0])
</code>
Здесь мы фильтруем список значений, полученных из словаря, хранящегося в d["result"].
Для фильтрации используем лямбда-функцию: если у элемента v фильтруемого списка поле "AGE" равно 30, то мы сохраняем этот элемент, иначе - отбрасываем.
Полученный отфильтрованный объект переводим в список, используя list().
Из полученного списка достаём нулевой (единственный) элемент, это и будет искомый словарь.
Обратите внимание, что конечный список может содержать несколько элементов, если в исходном словаре d было несколько элементов с "AGE" равным 30. Или, например, конечный список может быть пустым, если в исходном словаре не было элементов, удовлетворяющих условию.


ТГ Бот не может отправить видео
<code>
import random
import os
import re
import asyncio
from aiogram import Bot, Dispatcher, types, executor
from pytube import YouTube
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.dispatcher import FSMContext
from aiogram.contrib.middlewares.logging import LoggingMiddleware

storage = MemoryStorage()
bot = Bot(token=Token)
dp = Dispatcher(bot, storage=storage)
dp.middleware.setup(LoggingMiddleware())

@dp.message_handler(commands=["download"])
async def start_download(message: types.Message, state: FSMContext):
   await message.answer("Введите URL видео на YouTube для скачивания:")
   await DownloadState.waiting_for_url.set()

@dp.message_handler(state=DownloadState.waiting_for_url)
async def process_video_url(message: types.Message, state: FSMContext):
   video_url = message.text
   try:
       video_info = YouTube(video_url)
       video_title = re.sub(r'[/:"*?<>|]', '_', video_info.title)
       video_file_absolute = os.path.abspath(os.path.join(os.path.dirname(__file__), "videos",
       f"{video_title}.mp4"))

       os.makedirs(os.path.join(os.path.dirname(__file__), "videos"), exist_ok=True)

       print("Скачивание видео...")
       await asyncio.to_thread(video_info.streams.get_highest_resolution().download,
       output_path="videos")
       print("Скачивание завершено.")

       print("Отправка видео...")
       with open(video_file_absolute, 'rb') as video_opened:
           await bot.send_video(message.chat.id, video=video_opened)
       print("Отправка завершена.")

       await message.answer("Видео успешно отправлено!")

   except Exception as e:
       print("Ошибка при скачивании и отправке видео:", e)
       await message.answer("Ошибка при скачивании и отправке видео. Пожалуйста, убедитесь, что URL корректен.")

   await state.finish()
</code>
Есть вот такой телеграмм бот который должен скачивать по url из ютуба, бот скачивает видео на сервер, но не может её отправить
Логи:
Скачивание видео...
Скачивание завершено.
Отправка видео...
Ошибка при скачивании и отправке видео:[Errno 2] No such file or directory:'название видео'

import io

video_buffer = io.BytesIO()
# Скачиваем
video_info.streams.get_highest_resolution().stream_to_buffer(video_buffer)
# Отправляем
await bot.send_video(message.chat.id, video=video_buffer)


Как выбрать рандомную строчку из txt файла и исключить её из дальнейшего подбора?
Я делаю телеграмм бота, который по команде будет выбирать рандомную строчку из файла .txt и присылать юзеру, но чтобы в дальнейшем она не выбиралась (пока я не перезапущу код)

Ну так загрузи этот файл, подели его на строки, выбирай рандомную и удаляй:
<code>
import random;
f = open("file.txt", "r")
lines = f.read().split("\n")

def getRandom(lines):
    i = random.randint(0, len(lines)-1)
    el = lines[i]
    del lines[i]
    return el
</code>


Tksbrokerapi не устанавливается
Я установил tksbrokerapi через
pip install tksbrokerapi, после чего попробовал его запустить командой в повершеле.
вывело:
ModuleNotFoundError: No module named 'mako'
я установил модуль mako, после чего появилась ошибка
ModuleNotFoundError: No module named 'Templates'.
После установки Templates ничего не меняется и все еще возникает ошибка о том что уже установленный модуль Templates отсутствует.

Модуль TKSBrokerAPI тестировался для версий python >= 3.9 . В более ранних версиях будут возникать ошибки. Может проблема именно в этом?
Попробуйте проверить действительность установки модулей выдающих ошибку с помощью команды "pip show имя_модуля"
Также можно использовать модуль TKSBrokerAPI, скачав его напрямую из репозитория через git clone и взяв кодовую базу любого протестированного релиза.


Выход из программы, функция main() в Python
Программа тренажер таблицы умножения. В ней необходимо:

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

Вывод таблицы умножения и запуск тренажера оформить в виде функций, которые затем будут использоваться в теле основной функции программы.
Вопрос в следующем. Если запустить тренажер ('r'), произвести вычисления, после чего выбрать 'меню' ('m'), затем 'выход из программы' ('q'), выходить приходится дважды, т.е. два раза выбирать 'q' чтобы программа завершила работу. Хотелось бы понять как это можно исправить. Спасибо.
<code>
class Multiply:
    name = "Тренажер таблицы умножения"
    version = "1.0."
    def multiply_table(self):
        for i in range(1, 10):
            for j in range(1, 10):
                print("%4d" % (i * j), end=" ")
            print()

    def trainer(self):
        x = int(input("type first number < 10: "))
        y = int(input("type second number < 10: "))
        if x < 10 and y < 10:
            result = x * y
            myres = int(input(f'{x} * {y} = '))
            print()

            if myres == result:
                print("Correct answer")
            else:
                print(f"Wrong answer, correct is {result}. Try again")
            print()

            choice = input("Продолжить/Меню (y/m): ")
            print()

            if choice == 'y':
                Multiply.trainer(self)

            elif choice == 'm':
                main()

            else:
                print('Ошибка')

        else:
            print()
            print("Number is out of range")

def main():
    name = Multiply.name
    version = Multiply.version
    print(f'{name}, версия {version}')
    obj = Multiply()
    while True:
        print()
        menu = input("Вывести таблицу умножения: t\nЗапустить тренажер: r\nВыйти из программы: q\nВыбор: ")
        print()
        if menu == 't':
            obj.multiply_table()

        elif menu == 'r':
            obj.trainer()

        elif menu == 'q':
            break

        else:
            print('Error')

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

Нужно всего лишь заменить
main() на
return в методе
Multiply.trainer()

elif choice == 'm':
    return


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

#загружаем библиотеки
import pandas as pd
import datetime

#адрес папки
pp_path='C:/Users/Макс/Desktop/ПП.xlsx'

# загружаем данные
pp_excel_data = pd.read_excel(pp_path)

# переименовываем заголовки
pp_excel_data.rename(columns={"Дата начала": "start_date","Дата окончания": "end_date","ДатаКалендарь": "date",}, inplace=True)

#функция
def check_range(start_date, end_date, date):
    if start_date <= date <= end_date:
        return True
    else:
        return False

#создание нового столбца
pp_excel_data["is_in_range"] = pp_excel_data.apply(lambda row: check_range(row["start_date"], row["end_date"], row["date"]), axis=1)

display(pp_excel_data)

Вот итоговый корректно работающий вариант кода, который был предложен в ответе :

#загружаем библиотеки
import pandas as pd
import numpy as np
import datetime

#адрес папки
pp_path='C:/Users/Макс/Desktop/ПП.xlsx'

# загружаем данные по бюджету проектов
pp_excel_data = pd.read_excel(pp_path)

#функция
def check_range(x):
    return x["Дата начала"]<= x["ДатаКалендарь"]<= x["Дата окончания"]

#создание нового столбца
pp_excel_data["is_in_range"] = pp_excel_data.apply(check_range, axis=1)

display(pp_excel_data)

Думаю, что в вашем случае можно передавать в функцию не отдельные скаляры, а строку целиком:

#функция
def check_range(x):
    return x["Дата начала"]<= x["ДатаКалендарь"]<= x["Дата окончания"]:

#создание нового столбца
pp_excel_data["is_in_range"] = pp_excel_data.apply(check_range), axis=1)

Дополню. Вообще apply работает довольно медленно, поэтому лучше применить другие способы:

# подготовка данных
df = pd.DataFrame({'Дата начала': ['01.01.2023', '01.02.2023', '01.03.2023'],
                   'Дата окончания': ['15.01.2023', '20.02.2023', '30.03.2023'],
                   'Дата': ['10.01.2023', '25.02.2023', '28.03.2023']})
df = df.apply(lambda x: pd.to_datetime(x, format='mixed', dayfirst=True))
# вычисление столбца is_in_range
df["is_in_range"] = df['Дата начала'].le(df['Дата']) & df['Дата'].le(df['Дата окончания'])
# или
df["is_in_range"] = df['Дата'].between(df['Дата начала'], df['Дата окончания'])
print(df)

  Дата начала Дата окончания       Дата  is_in_range
0  2023-01-01     2023-01-15 2023-01-10         True
1  2023-02-01     2023-02-20 2023-02-25        False
2  2023-03-01     2023-03-30 2023-03-28         True


При импортировании модуля math количество ссылок на объект None уменьшается
Заметил интересное поведение, понять которое не могу.
При импортировании модуля
math кол-во ссылок на объект
None уменьшается:

import sys

print(sys.getrefcount(None))
import math
print(sys.getrefcount(None))

Вывод:

4138
4099

Стало интересно, почему так происходит. Если кто объяснит буду рад)

Как сказали проффесионалы:

I think this is just the method cache filling up in Python 3.8. When a cache entry gets filled, it drops a reference to None and instead holds a reference to a string.
A little printf-debugging showed this:
<code>
>>> import math
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\listobject.c:2488
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\listobject.c:2488
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\compile.c:1331
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\compile.c:1331
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2373
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:6805
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2373
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:6805
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3390
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3391
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
INCREF None
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
INCREF None
INCREF None
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2373
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2373
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2373
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:6805
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:4971
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:4971
INCREF None
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3390
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3391
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:4971
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
INCREF None
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\typeobject.c:3160
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:4971
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:4971
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:4971
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:4971
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2978
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2979
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\frameobject.c:430
INCREF None
INCREF None
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2373
INCREF None
INCREF None
INCREF None
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3390
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3391
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:1363
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\weakrefobject.c:939
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Objects\funcobject.c:585
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3390
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:3391
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\ceval.c:2995
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Include\object.h:560
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\pythonrun.c:268
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Modules\_io\bufferedio.c:804
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\pythonrun.c:1126
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Modules\_io\bufferedio.c:804
INCREF None
DECREF None at C:\Users\sween\Source\Repos\cpython2\cpython\Python\pythonrun.c:1134
</code>

Перевод:

Я думаю, что это просто заполнения кэша методов в Python 3.8. Когда запись кэша заполняется, она удаляет ссылку на None и вместо этого содержит ссылку на строку.
Небольшой отладочный printf показал это:
-- обрезано --

То есть дело в том что math не хватает кэша методов (method cache) и он удаляет оттуда лишние None.


Как сделать правильное название города в Python
Здраствуйте! Я начинающий программист и пока делал новый проект столкнулся с такой задачей.
Когда моему голосовому помощнику говоришь

Какая погода в Казани?

Он посылает на сайт с прогнозом погоды строку

Казани

Но сайт принимает название города. То есть "Казань". Я бы мог просто заменить в коде последнею букву на 'ь', но тогда если скажешь

Какая погода в Ижевске?

Станет ещё хуже. То есть он отправит строку "Ижевскь". Скажите пожалуйста, какую программу нужно написать на Python что бы преобразовывать "Казани" в "Казань", Ижевске в Ижевск, Москве в Москва и т.д.

Попробуйте в свой алгоритм добавить прослойку с использованием библиотеки pymorphy2 (необходима установка):
<code>
pip install pymorphy2
</code>
Согласно документации анализатор позволяет ставить слово в нужную форму. Например, ставить слово во множественное число, менять падеж слова и т.д.
При работе используется словарь OpenCorpora; для незнакомых слов строятся гипотезы. Библиотека достаточно быстрая.
Подробнее о падежах здесь.


Условные выражения: not x или x == False?
В python существует два варианта проверки отрицательного условия:

if not x:

if x == False:

Какой из этих двух вариантов лучше на предмет удобочитаемости и/или быстродействия?

Ответиь на этот вопрос нам поможет PEP 285:

It has been suggested that, in order to satisfy user expectations, for every x that is considered true in a Boolean context, the expression x == True should be true, and likewise if x is considered false, x == False should be true. In particular newbies who have only just learned about Boolean variables are likely to write

if x == True: ...
instead of the correct form,

if x: ...

Сокращенный перевод:
В частности, новички, которые только что узнали о логических переменных, скорее всего напишут
if x == True: вместо правильной формы
if x:


Как заполнить словарь сложной конструкции?
Есть словарь вот такой конструкции:

{
 'DV':
     {
       '1': {'dict_id': 'DV', 'tags': '', 'value': ''},
       '10': {'dict_id': 'DV', 'tags': '', 'value': ''},
       '100': {'dict_id': 'DV', 'tags': '', 'value': ''},
       '101': {'dict_id': 'DV', 'tags': '', 'value': ''}
     }
}

И есть список
[1, 2, 3, 4]
Как заполнить словарь, чтобы элементы этого списка были в полях value?
То есть ожидаемый эффект:

{
 'DV':
     {
       '1': {'dict_id': 'DV', 'tags': '', 'value': '1'},
       '10': {'dict_id': 'DV', 'tags': '', 'value': '2'},
       '100': {'dict_id': 'DV', 'tags': '', 'value': '3'},
       '101': {'dict_id': 'DV', 'tags': '', 'value': '4'}
     }
}

Вот так:

lst = [1, 2, 3, 4]
dct = {
 'DV':
     {
       '1': {'dict_id': 'DV', 'tags': '', 'value': ''},
       '10': {'dict_id': 'DV', 'tags': '', 'value': ''},
       '100': {'dict_id': 'DV', 'tags': '', 'value': ''},
       '101': {'dict_id': 'DV', 'tags': '', 'value': ''}
     }
}

for e, d in zip(lst, dct['DV']):
    dct['DV'][d]['value'] = str(e)

print(dct)

Здесь мы на первой итерации берём пару
1 (первый элемент
lst) и
'1' (первый ключ вложенного словаря), преобразовываем число-первый элемент
lst в строку и сохраняем его в ключ
'value' словаря
dct['DV']['1']. И так далее.
Вывод:

{
    'DV':
        {
          '1': {'dict_id': 'DV', 'tags': '', 'value': '1'},
          '10': {'dict_id': 'DV', 'tags': '', 'value': '2'},
          '100': {'dict_id': 'DV', 'tags': '', 'value': '3'},
          '101': {'dict_id': 'DV', 'tags': '', 'value': '4'}
        }
}

Но этот код будет работать, только если кол-во элементов в списке
lst равно кол-ву ключей в словаре
dct['DV'].


Не сохраняются строки в txt файле python
Я написал программу, должна сохранения текста, который ввел пользователь
<code>
    import os

print("Назовите имя файла и его расширение")
name = input()
stroka = 1
while True:
    a = input(f"Строка {stroka}: ")
    if a == 'выйти':
        print("Вы уверены, что хотите выйти?")
        if input() == 'да':
            exit()
        else:
            test = open(name, 'a', encoding = 'utf-8')
            test.write(a + "\n")
            stroka = stroka + 1
    else:
        test = open(name, 'a', encoding = 'utf-8')
        test.write(a + "\n")
        stroka = stroka + 1
</code>
Но она не сохраняет последнюю введенную строку (если после последней строки два раза не оставить пустую строку)

Вот этот код должен работать нормально:
<code>
name = input("Введите имя файла и его расширение: ")
stroka = 1
f = False
while True:
    a = input(f"Строка {stroka}: ")
    if a == 'выйти':
        if input("Вы уверены, что хотите выйти? ") == 'да':
            if f: f.close()
            exit()
        else: continue
    else:
        f = open(name, 'a', encoding = 'utf-8')
        f.write(a + "\n")
        stroka += 1
</code>
Проблема в вашем коде была в том, что вы не закрывали файл перед выходом из программы. Из-за этого последняя строчка не сохранялась.


Метод класса срабатывает только на последнем экземпляре python
У меня вопрос в следующем:
При нажатии на левую кнопку мыши должно фиксироваться попадание, но почему то оно фиксируется только по одному кубику.
Код прилагаю.
<code>
from tkinter import *
import random

class Rectangle:
    def __init__(self, canvas, coord, fill, outline=None):
        self.x = random.randint(-5, 5)
        self.y = random.randint(-5, 5)
        self.canvas = canvas
        self.outline = outline if outline is not None else fill
        self.fill = fill
        self.canvas_id = self.canvas.create_rectangle(coord, outline=self.outline, fill=self.fill)

        self.canvas.bind('<Button-1>', self.click)

    def draw(self):
        if (self.canvas.coords(self.canvas_id)[0] < 1 or self.canvas.coords(self.canvas_id)[2] > 700):
            self.x = self.x * (-1)
        elif (self.canvas.coords(self.canvas_id)[1] < 1 or self.canvas.coords(self.canvas_id)[3] > 400):
            self.y = self.y * (-1)
        self.canvas.move(self.canvas_id, self.x, self.y)
        self.canvas.after(35, self.draw)

    def click(self, event):
        x = event.x
        y = event.y
        print(self.canvas_id)
        if (x < self.canvas.coords(self.canvas_id)[2] and x > self.canvas.coords(self.canvas_id)[0]) and (
                y < self.canvas.coords(self.canvas_id)[3] and y > self.canvas.coords(self.canvas_id)[1]):
            print('Target')
            #self.canvas.delete(self.canvas_id)

root = Tk()
root.geometry('800x500')
root.title('Курсовая работа')

c = Canvas(width=700, height=400, bg='black')
c.place(x=50, y=10)

rectangle = [Rectangle(c, (10, 20, 40, 50), fill='red') for i in range(8)]
for rec in rectangle:
    rec.draw()

# Кнопки запуска, остановки и выхода из программы
vars = IntVar()
vars.set(0)
r1 = Radiobutton(text='СТАРТ', indicatoron=0, variable=vars, value=1, font='Times 15', bg='green')
r2 = Radiobutton(text='СТОП', indicatoron=0, variable=vars, value=0, font='Times 15',  bg='yellow')
r1.place(x=50, y=430)
r2.place(x=150, y=430)

root.mainloop()
</code>

Вы в «цикле» создали 8 объектов -
rectangle[0], ...,
rectangle[7].
При создании каждого из них выполняется (в методе
__init__()) команда

self.canvas.bind('<Button-1>', self.click)

self.canvas для каждого из них тот же самый объект —
c. Но
self.click нет, потому что этот метод специфичен для каждого объекта — он тестирует совпадение клика мышей только для этого объекта.
Значит, после создания нового и нового объекта вы всякий раз переписываете связь между кликом мышей и функцией, которую он должен выполнить, а в конце клик будет связанный только с процедурой для последнего объекта.

self.click в методе
.bind() будет просто
rectangle[7].click!

Исправление:
Удалите эту команду из метода
__init__() и тем самым и определение метода
click() из определения класса. Код метода
click() используйте в функции клик, т.е. вне определения класса, где-то после создания объекта
c (типа Canvas) и списка объектов
rectangle:

def click(event):
    x = event.x
    y = event.y
    for rec in rectangle:
        if (x < rec.canvas.coords(rec.canvas_id)[2] and x > rec.canvas.coords(rec.canvas_id)[0]) and (
                y < rec.canvas.coords(rec.canvas_id)[3] and y > rec.canvas.coords(rec.canvas_id)[1]):
            print('Target')

Затем свяжите клик мышей с этой функцией:

c.bind('<Button-1>', click)

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

def click(event):
    x = event.x
    y = event.y
    for rec in rectangle:
        x1, y1, x2, y2 = rec.canvas.coords(rec.canvas_id)
        if (x1 < x < x2) and (y1 < y < y2):
            print('Target')


5D is not a valid coordinate or range openpyxl
Программа должна считывать значчения из 16 ячеек и получать среднее.

wbb = openpyxl.load_workbook(r'C:\Users\user\Desktop\Гаврилов-2D.xlsx')
sheets = wbb.sheetnames
for sheet in sheets:
    print(sheet)
sheet = wbb.active
rowm=sheet.max_row
colm=sheet.max_column
tabl=numpy.zeros((rowm, colm))
sumsq=0
for br in range (1, colm//4):
    for ni in range (1, rowm//4):
        sumsq=0
        for vwq in range(1, 16):
            mm=ni*4+vwq%4
            nn=br*4+int(vwq/4)
            msi=chr(mm+ord('0'))
            nsi=chr(nn+ord('A')-1)
            print(msi)
            print(nn, nsi)
            print (br,ni,vwq)
            dops=sheet[msi+nsi].value
            sumsq=sumsq+dops/16
        tabl[br, ni]=sumsq

Но выводит следующее:

5
4 D
1 1 1

Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\excelсокращение\main.py", line 52, in <module>
    print_hi('PyCharm')
  File "C:\Users\user\PycharmProjects\excelсокращение\main.py", line 39, in print_hi
    dops=sheet[msi+nsi].value
  File "C:\Users\user\PycharmProjects\excelсокращение\venv\lib\site-packages\openpyxl\worksheet\worksheet.py", line 295, in __getitem__
    min_col, min_row, max_col, max_row = range_boundaries(key)
  File "C:\Users\user\PycharmProjects\excelсокращение\venv\lib\site-packages\openpyxl\utils\cell.py", line 135, in range_boundaries
    raise ValueError(msg)
ValueError: 5D is not a valid coordinate or range

Почему такая ошибка и как сделать рабочее?

"5D" - это неправильное имя для диапазона в Excel, должно быть "D5", поэтому нужно изменить порядок подстрок:
dops=sheet[msi+nsi].value --> dops=sheet[nsi+msi].value


Ошибка opencv python. Распознавание лиц
У меня есть код который распознаёт лица.
код:

import cv2

face_cascade_db = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()
    #img = cv2.imread("IMG_20191012_145410_3.jpg")
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = face_cascade_db.detectMultiScale(img_gray, 1.1, 19)
    for (x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0),2)

    cv2.imshow('rez', img)
    #cv2.waitKey()
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

и выдаёт ошибку:

[ERROR:[email protected]] global persistence.cpp:512 cv::FileStorage::Impl::open Can't open file: 'C:\Users\admin\Desktop\Alex\thonny-4.1.1-windows-portable\lib\site-packages\cv2\data\haarcascade_frontalface_default.xml' in read mode

Надо просто поменять название своей модели.


Конвертировать координаты ЕГРН в географические координаты
Попытался сам хоть немного разобраться, но уже "поплыл" и запутался в край. Есть координаты из выписок/КПТ ЕГРН по типу таких - "x 536359.03" и "y 2205836.12". Нашел сайт, который переводит эти координаты в географические. По данным с сайта, географические координаты "Ш 56.37917" и "Д 43.83337" и координаты получились верными. Так как таких координат из ЕГРН у меня в дальнейшем будет много, хотел сделать в Python.
Нашел систему координат, которые в ЕГРН, называется "МСК-52 зона 2 Нижегородская область [MB:6335202]" (путем проб и ошибок...) и его "PROJ.4" на сайте - "+proj=tmerc +lat_0=0 +lon_0=44.55 +k=1 +x_0=2250000 +y_0=-5714743.504 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs". Выяснил,что  "PROJ.4", который выше указал, это по ГОСТ 51794-2008 (по листал документацию... там пипец) и он отменен, сейчас как понял ГОСТ 32453-2013, для него "PROJ.4" не нашел, а писать его по ГОСТ 32453-2013, черт ногу сломит...
Пробовал на бум подобрать на сайте "PROJ.4", на сайте в 1 окно (Ввод системы координат / проекция) ввел вышенаписанный "PROJ.4", во 2 окно подбирал "PROJ.4" по Российской федерации, но я так думаю не все так просто.
Помогите пожалуйста.
Вот мой код:
<code>
import pyproj
# Создаем объект проекции для системы координат Гаусса-Крюгера
proj_gk = pyproj.Proj("+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0,0,0 +units=m +no_defs")

# МСК-52 Нижегородская область
proj_msk52 = pyproj.Proj("+proj=tmerc +lat_0=0 +lon_0=44.55 +k=1 +x_0=2250000 +y_0=-5714743.504 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs")

# Создаем объект проекции для географических координат (широта, долгота)
proj_geo = pyproj.Proj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")

# Задаем координаты в системе Гаусса-Крюгера
x = 536359.03
y = 2205836.12

# Производим преобразование координат из системы Гаусса-Крюгера в МСК-52 Нижегородская область
x_msk52, y_msk52 = pyproj.transform(proj_gk, proj_msk52, x, y)

# Производим преобразование координат из МСК-52 Нижегородская область в географические координаты
lon, lat = pyproj.transform(proj_msk52, proj_geo, x_msk52, y_msk52)

print("Широта: ", lat)
print("Долгота: ", lon)
</code>

нашел статью сайт. Нашел комментарий пользователя:

Цитата:
Задача перехода от «плоской системы координат» к WGS84 делится на две части — сначала переход от проекции к той системе координат из которой она получена, а потом уже переход из той системы координат к WGS84 (если изначальная система координат была иной). - SpiderEkb

Написал вот такой код:

import pyproj

x = 536359.03
y = 2205836.12

# МСК-52 зона 2 Нижегородская область
proj_msk_52 = pyproj.Proj('+proj=tmerc +lat_0=0 +lon_0=44.55 +k=1 +x_0=2250000 +y_0=-5714743.504 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs')
lon, lat = proj_msk_52(x, y, inverse=True)
# WGS84
proj_wgs84 = pyproj.Proj('+proj=longlat +datum=WGS84 +no_defs')
# из МСК-52 в WGS84
lon, lat = pyproj.transform(proj_msk_52, proj_wgs84, lon, lat)
print(lat)
print(lon)

Все равно выдает координаты левые "47.475971502889465 14.519519023494398", а нужно получить "Ш 56.37917" и "Д 43.83337". Все таки, чувство такое, что ошибка в proj_msk_52, указан код "PROJ.4" по ГОСТ 51794-2008, а нужно ГОСТ 32453-2013


Какой режим работы с файлом использовать, чтобы считать и перезаписать Json Python
В начале работы программы есть маленький
json, содержащий
false.
Программа должна вывести изначальное содержимое
json, перезаписать (а не просто добавить в конец) новое значение и вывести уже его.

from json import dump, load

with open('temp.json', '???') as f:
    print(load(f)) # False
    dump(True, f)
    print(load(f)) # True

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

Откройте файл в режиме чтения ('r')
Прочитайте
Закройте
Откройте в режиме записи ('w')
Запишите
Закройте

Не мудрствуйте лукаво! :-) Самый простой путь - самый надёжный.