Требуется перевести с языка Python на C++ [закрыт]

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

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

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

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

Алгоритм 1:

def dijkstra(graph, start):
  """
  Args:
    graph: Граф, представленный в виде списка смежности.
    start: Начальная вершина.

  """

  # Создаем словарь расстояний до вершин.
  distances = {}
  for vertex in graph:
    distances[vertex] = float("inf")
  distances[start] = 0

  # Создаем множество посещенных вершин.
  visited = set()

  # Создаем очередь приоритетов для вершин, которые еще не посещены.
  pq = [(0, start)]

  while pq:
    (distance, vertex) = heapq.heappop(pq)
    if vertex in visited:
      continue

    for to in graph[vertex]:
      if distances[to] > distances[vertex] + 1:
        distances[to] = distances[vertex] + 1
        heapq.heappush(pq, (distances[to], to))

    # Отмечаем вершину как посещенную.
    visited.add(vertex)

  return distances

Алгоритм 2:

def count_connected_components(graph):
    num_vertices = len(graph)
    visited = [False] * num_vertices
    num_components = 0

    for vertex in range(num_vertices):
        if not visited[vertex]:
            num_components += 1
            dfs(graph, vertex, visited)

    return num_components

Алгоритм 1

#include <iostream>
#include <vector>
#include <queue>
#include <set>

using namespace std;

typedef pair<int, int> pii;

vector<int> dijkstra(vector<vector<int>> graph, int start)
{
    vector<int> distances(graph.size(), -1);
    distances[start] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push(make_pair(0, start));
    while (!pq.empty())
    {
        pii p = pq.top();
        pq.pop();
        int vertex = p.second;
        if (distances[vertex] != -1 && distances[vertex] < p.first)
        {
            continue;
        }
        for (size_t i = 0; i < graph[vertex].size(); i++)
        {
            int neighbor = graph[vertex][i];
            int distance = p.first + 1; // assuming all edges have weight 1
            if (distances[neighbor] == -1 || distance < distances[neighbor])
            {
                distances[neighbor] = distance;
                pq.push(make_pair(distance, neighbor));
            }
        }
    }
    return distances;
}

int main()
{
    vector<vector<int>> graph(5);
    graph[0].push_back(1);
    graph[0].push_back(2);
    graph[1].push_back(2);
    graph[1].push_back(3);
    graph[2].push_back(3);
    graph[3].push_back(4);
    vector<int> distances = dijkstra(graph, 0);
    for (size_t i = 0; i < distances.size(); i++)
    {
        cout << "Distance to vertex " << i << " is " << distances[i] << endl;
    }
    return 0;
}

Алгоритм 2

#include <iostream>
#include <vector>

using namespace std;

void dfs(vector<vector<int>> graph, int vertex, vector<bool> &visited)
{
    visited[vertex] = true;
    for (int i = 0; i < graph[vertex].size(); i++)
    {
        int next_vertex = graph[vertex][i];
        if (!visited[next_vertex])
        {
            dfs(graph, next_vertex, visited);
        }
    }
}

int count_connected_components(vector<vector<int>> graph)
{
    int num_components = 0;
    vector<bool> visited(graph.size(), false);
    for (int i = 0; i < graph.size(); i++)
    {
        if (!visited[i])
        {
            dfs(graph, i, visited);
            num_components++;
        }
    }
    return num_components;
}

int main()
{
    vector<vector<int>> graph = {{1, 2}, {0, 2}, {0, 1}, {3}, {4}, {6}, {5}};
    int num_components = count_connected_components(graph);
    cout << "Number of connected components: " << num_components << endl;
    return 0;
}


aiogram 3 нужно сформировать ссылку [закрыт]

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

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

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

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

Сделал ответ бота с картинками товаров, т.е.
await bot.send_media_group(chat_id=msg.from_user.id, media=[...])
Появляются 9 картинок.
При нажатии на картинку внизу идет описание(caption). в последней строке хочу сделать ссылку на этот товар. Нажимая на эту ссылку бот присылает новое сообщение, с более детальным описанием товара и фотографиями с разных ракурсов и инлайт кнопкой "Оплатить".
Как сформировать ссылку?

Как сделать именно то, что нужно - не знаю. Могу предложить использовать команды по типу /img1, /img2 и тд. А в caption соответственно их добавить. При нажатии бот будет выполнять команду в соответствии с изображением.


Минимальное значение выведенных словарей
В задаче необходимо было разделить рандомный числовой ряд (я установил предел до 10 чисел со значениями до 100) на 2 части, таким образом чтобы разность сумм элементов этих частей была минимальна. В результате получил набор словарей, где ключ - кортеж из 2 частей, на который распределяется числовой ряд, и разность этих частей в значении словаря. Необходимо определить и вывести минимальную разность. Я пытаюсь вывести ключ/значение словаря, в котором разность минимальна. Проблема в том что все словари разделены между собой. Возможно ли как-то их объединить, загнать под единый список? Заранее благодарю.
<code>
from random import randint
import itertools

mylist_1 = []
for k in range(randint(1, 10)):
    mylist_1.append(randint(1, 100))
print(mylist_1)

sumlist = sum(mylist_1)
half_numb = round(sumlist / 2)
print(half_numb)
print()

myset_1 = set(mylist_1)
for i in range(1, len(mylist_1)):
    for j in itertools.combinations(mylist_1, i):
        if sum(list(j)) in range(half_numb - 15, half_numb + 15):
            myset_2 = set(j)

            myset_3 = myset_1 - myset_2
            mytuple = (tuple(myset_2), tuple(myset_3))
            result = sum(list(myset_2)) - sum(list(myset_3))

            diff = abs(result)
            mydict = {mytuple: diff}
            print(mydict)
</code>

На сколько я Вас понял, Ваша проблема заключается в том, что вот в этой строке:

mydict = {mytuple: diff}

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

mydict = {}

а строку присвоения переписать:

mydict[mytuple] = diff

Получите единую коллекцию, потом найдете минимум среди значений, если я правильно понял Вашу логику.


Визуализация данных в таблице с помощью flet
Имеется двухмерный массив с данными из БД.
Подскажите, как отобразить всю полученную информацию в виде таблицы с помощью flet.
Заранее спасибо. P.s. Пробовал воспользоваться DataTable, а именно пытался загнать формирование строк в цикл, но безуспешно…

Заполнение таблицы flet.DataTable данными из двухмерного массива:
<code>
table = ft.DataTable(
        columns=[
            ft.DataColumn(ft.Text("1")),
            ft.DataColumn(ft.Text("2")),
            ft.DataColumn(ft.Text("3"))

        ],

    )
for i in range(len(arr)):

    table.rows = table.rows  + [
            ft.DataRow(
                cells=[
                    ft.DataCell(ft.Text(arr[i][0])),
                    ft.DataCell(ft.Text(arr[i][1])),
                    ft.DataCell(ft.Text(arr[i][2])),

                ],
            ),]
</code>


Ошибка в коде discord.py
Должен выдавать карточку пользователя

@bot.command(name='user')
async def card_user(ctx):
    await ctx.channel.purge(limit = 1)
    img = Image.new('RGBA', (400, 200), '#2aff00')
    url = str(ctx.author.avatar_url)[:-10]

    response = requests.get(url, stream=True)
    response = Image.open(io.BytesIO(response.content))
    response = response.convert('RGBA')
    response = response.resize((100, 100), Image.ANTIALIAS)
    img.paste(response, (15, 15, 115, 115))

    idraw = ImageDraw.Draw(img)
    name = ctx.author.name
    tag = ctx.author.discriminator

    headline = ImageFont.truetype('calibri.ttf', size=20)
    undertext = ImageFont.truetype('calibri.ttf', size=12)

    idraw.text((145, 15), f'{name}#{tag}', font=headline)
    idraw.text((145, 50), f'ID: {ctx.author.id}', font=undertext)

    img.save('user_card.png')

    await ctx.send(file = discord.File(fp='user_card.png'))

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

AttributeError: 'Member' object has no attribute 'avatar_url'

В указанной вами ошибке указано, что объект класса
Member не имеет атрибута
avatar_url. Поэтому попробуйте изменить
ctx.author.avatar_url на
ctx.author.avatar.url.
Ознакомиться с классом
Member можно в документации.


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

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

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

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

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

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

Не уверен, что правильно понял вопрос, но, например.
Если надо, что бы цикл for отрабатывал до конца, вне зависимости от превышения временного лимита, то:

import time
a = 0
time_limit = 5
start = time.time()
while time.time() - start <= time_limit:
    for i in range(100):
        a += i ** 2
    print(f'\r{a}', end='')

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

for i in range(100):
    if time.time() - start > time_limit:
        break
    a += i ** 2
    # или сюда break с условием


Пустой кортеж в Python
Почему в Python
() - пустой кортеж, список с пустым кортежем внутри это
[()], но при этом при выполнении такого кода

l = [1,2,3]
l[:] = ()
print(l)

интерпретатор выведет пустой список? Функция
len() также выдает, что список пустой

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

l = [1, 2, 3]
l[0] = ()
print(l)
# Выведет: [(), 2, 3]

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

l = [1, 2, 3, 4, 5]
l[:2] = (9, 9)
print(l)
# Выведет: [9, 9, 3, 4, 5]

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

l = [1, 2, 3, 4, 5]
l[:2] = ()
print(l)
# Выведет: [3, 4, 5]

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

l = [1, 2, 3]
l[:] = [()]
print(l)
# Выведет: [()]


Что может вызвать ошибку при работе программы?
#Вводится неизвестное кол-во строк, в них нужно перевернуть слова вокруг себя ( asd! -> dsa! ), а знаки препинания оставить на месте. 5 тестов. 4 - правильно, 1 - ошибка во время исполнения ( буквы только латинские )
<code>
   import sys

   def revwrd(w): # Ф-я переворота слова
       rw = ''
       nn = len(w)
       for i in range(nn):
           rw += w[nn - 1 - i]
       return rw

   def rev(sr): # Функция для выполнения задачи в 1 строке
       wrd = '' # переменная, чтобы хранить буквы от знака до следующего знака
       nsr = '' # переменная для преобразованной строки
       for el in sr: # пройдёмся по каждому элементы строки
           if 'a' <= el <= 'z' or 'A' <= el <= 'Z': # если элемент строки - добавляем в *слово*
               wrd += el
           else:
               if wrd != '': # если элемент не буква, то если *слово* не пустое, перевернув, добавим его, иначе добавим элемент с которым работает ( Если не написано специально отдельный if, почему-то первый знак после слова не добавляется )
                   nsr += revwrd(wrd)
                   wrd = ''
               if wrd == '':
                   nsr += str(el)
       return nsr # возвращаем новую строку

   s = [] # переменная для ввода текста
   ns = [] # переменная для изменённого текста
   n = 0 # переменная для счёта кол-ва строк
   for line in sys.stdin.readlines(): # построчный ввод текста ( пока не встретим ctrl + D )
       s.append(line) # прибавляем к переменной текста строку
       n += 1
   for i in range(n):  # изменяем текст по строкам и сохраняем его в новой переменной
       ns.append(rev(s[i]))
   for i in range(n): # выводим изменённый текст
       print(ns[i], end='')
</code>

s = '''А роза, упала на лапу АЗОРА! Bird! on tree. '''  # Строка текста
zn = '.,!@#$%^&*()?>< '  # Знаки препинания

#Убираем знаки препинания вместо их ставим например *, делим по словам, переворачиваем каждое слово и соединяем в строку
rev = ''.join([el[::-1] for el in ''.join([el if el not in zn else '*' for el in s]).split('*') if el != ''])
res = ''
count = 0
for el in s:
    if not (el in zn):
        res += rev[count]
        count += 1
    else:
        res += el

print(res)

А азор, алапу ан упал АРОЗА! driB! no eert.


Решение геометрической задачи
У меня имеется задача:
Имеются 2 прямых дороги, заданные точками начала и конца AB и CD соответвтенно. Точка представляет собой географическую координату (широта и долгота). Нужно попасть из точки A в точку D. Перемещаться можно только по дорогам. Необходимо реализовать функцию route_exist, которая возвращает истину в случае существования такого маршрута.
Эту задачу необходимо реализовать на python
Я очень не силен в геометрии и даже не могу понять как просто устно реализовать данную задачу
Может кто помочь?
Смог задать только классы
<code>
@dataclass
class Point:
    latitude: float # Широта
    longitude: float # Долгота

@dataclass
class Road:
    start_point: Point
    end_point: Point

def route_exist(road_1: Road, road_2: Road) -> bool:
     pass
</code>

Любая пара точек, если они различные и не диаметрально противоположные, задаёт на сфере большой круг, который определяется плоскостью, построенной на центре сферы и этих двух точках. Плоскость задаётся нормальным вектором n: n = c×d, где c и d - точки задающие плоскость (трехмерные вектора единичной длины), × - векторное произведение.
Дуга между точками a и b пересечёт большой круг, если скалярные произведения an = n · a и bn = n · b имеют разные знаки.
Пусть оказалось что an < 0 < bn (если это не так, поменяем их местами чтобы стало так). Тогда можно вычислить точку на плоскости большого круга между a и b. Эта точка равна bna - anb. Если эту точку (вектор) нормализовать, получим точку пересечения дуги от a до b с большим кругом заданным с и d.
Вычислим iab - пересечение дуги ab с большим кругом cd.
Вычислим icd - пересечение дуги cd с большим кругом ab.
Возможны следующие ситуации:

iab не существует, так как дуга ab не пересекает большой круг cd. Тогда дуги ab и cd не пересекаются.
Пример: a = 10°, 10°, b = 20°, 10° - кусок меридиана в северном полушарии. с = 0°, 0°, d = 0°, 20° - кусок экватора.

icd не существует, так как дуга cd не пересекает большой круг ab. Тогда дуги ab и cd не пересекаются.
Пример: a = 10°, 10°, b = -10°, 10° - кусок меридиана в районе экватора. с = 0°, 20°, d = 0°, 30° - кусок экватора.

iab и icd существуют обе и диаметрально противоположны. Дуги ab и cd не пересекаются, хотя каждая из них пересекает большой круг другой дуги. Бывает.
Пример: a = 10°, 0°, b = -10°, 0° - кусок нулевого меридиана в районе экватора. с = 0°, 170°, d = 0°, -170° - кусок экватора с противоположной стороны.

iab и icd существуют и совпадают. Пересечение найдено. Ура!
Пример: a = 10°, 10°, b = -10°, 10° - кусок меридиана. с = 0°, 0°, d = 0°, 20° - кусок экватора.

Код реализует описанный алгоритм. Все случаи где решение может выродится (совпадающие точки, противолежащие точки) нормально обрабатываются. Единственная ситуация, которая не обработана - когда обе дуги лежат на одном большом круге. Программа в этом случае возвращает что пересечения нет, даже если дуги перекрываются.
<code>
import math

# скалярное произведение
def dot(a, b):
    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]

# векторное произведение
def cross(a, b):
    return                         \
        a[1] * b[2] - a[2] * b[1], \
        a[2] * b[0] - a[0] * b[2], \
        a[0] * b[1] - a[1] * b[0]

# (широта, долгота) -> (x, y, z)
def to_3d(lat_long_deg):
    lat, long = map(math.radians, lat_long_deg)
    lat_c = math.cos(lat)
    return lat_c * math.cos(long), lat_c * math.sin(long), math.sin(lat)

def are_intersected(arc1, arc2):

    # это не настоящее пересечение круга и дуги
    # вектор, который возвращается:
    #   сонаправлен с точкой пересечения, если пересечение есть
    #   равен нулю, если пересечения нет
    # этого достаточно для финального теста
    def intersection(circle, arc):
        n = cross(*circle)
        a, b = arc
        a_n = dot(n, a)
        b_n = dot(n, b)
        if a_n > b_n:
            a, b = b, a
            a_n, b_n = b_n, a_n
        if a_n <= 0 <= b_n:
            return                       \
                b_n * a[0] - a_n * b[0], \
                b_n * a[1] - a_n * b[1], \
                b_n * a[2] - a_n * b[2]
        # fake intersection
        return 0, 0, 0

    arc1_3d = tuple(map(to_3d, arc1))
    arc2_3d = tuple(map(to_3d, arc2))

    # если оба вектора не нули
    # и если они сонаправлены,
    # то их скалярное произведение будет больше нуля.
    # в этом случае дуги пересекаются
    return dot(
        intersection(arc1_3d, arc2_3d),
        intersection(arc2_3d, arc1_3d)
    ) > 0

print(are_intersected(
    ((10, 10), (20, 20)),
    ((20, 10), (10, 20))
))
</code>


Нужно сделать таблицу из 3-х столбцов - рекомендательную систему
Есть список cо значениями(id разных курсов) - он будет первым столбиком в таблице из 3-х колонок
Например:

course = [515, 572, 570, 551, 490, 515, 566, 551, 489, 551, 566]

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

{(551, 566): 797,
 (515, 551): 417,
 (489, 551): 311,
 (523, 551): 304,
 (566, 794): 290,
 (489, 515): 286,
 (490, 566): 253,
 (490, 551): 247,
 (570, 752): 247,
 (569, 572): 216,
 (515, 523): 213}

Нужно сделать таблицу/датафрейм, где 1-я колонка будет состоять из списка курсов, 2-я и 3-я колонки будут заполняться как "курс для рекомендаций №1"(самый популярный) и "курс для рекомендаций №2"(второй по популярности)
По идее нужна функция, в которую будет подаваться id курса, а возвращается 2 курса, с которым поданный на вход курс чаще всего попадался. Если курс поданный на вход функции есть в ключе словаря - добавляем запись в список и возвращаем 2 самых частотных значения. Если нет, то нужно рекомендовать самые популярные курсы в словаре. Подойдет любое решение, не обязательно что я описал
Что-то вроде этого наверно должно получиться но это не точно:)

def recommendations(course_id):
    recommendation_list = []
    for i in popular_couple.keys():
        if i[0] == course_id:
            recommendation_list.append((i, popular_couple[i]))
        if i[1] == course_id:
            recommendation_list.append((i, popular_couple[i]))
        else:
            return popular_couple[0]
        return recommendation_list

Например, если на вход функции подается id 551, то функция должна в словаре взять пару этого числа - т.е. 566 и положить куда-то(в список как вариант), далее во второй строке взять 515 и добавить это число в список, после 3-я строка добавить в список 489, после 523, из пятой строки добавлять нечего и т.д. после посчитать кол-во одинаковых значений и выдать топ 2 значения. Нужно счетчик еще добавить похоже. В общем суть я понял что нужно, а как реализовать это пока нет


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

self.ui.line1.setMaxLength(4)
self.ui.line2.setMaxLength(6)
self.ui.line3.setMaxLength(8)

Но простого ограничения длины не хватает для удобства.
Написаны функции, которые отлавливают количество введённых символов:

self.ui.line1.textEdited.connect(self.Change4)

def Change4(self):
        if len(self.ui.line1.text())==4:
            self.ui.lineStatus.setText("УРА") #вопрос..
            return

Что сюда вставить, чтобы после ввода нужного количества символов, было не "ура", а принудительный перевод курсора на
line2 или
line3 (чтобы порядок именно задавался, например
line1-line3-line2)?

<code>
class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.line1 = QtWidgets.QLineEdit()
        self.line2 = QtWidgets.QLineEdit()

        self.line1.textEdited.connect(self.checkLen)
        self.line1.setMaxLength(4)                      # Тоже необходимо

        self.vbox = QtWidgets.QVBoxLayout(self)

        self.vbox.addWidget(self.line1)
        self.vbox.addWidget(self.line2)

        self.show()

    def checkLen(self):
        if len(self.line1.text()) == 4:
            self.line2.setFocus()           # Вместо "self.line2" ваше значение
</code>
Как-то так, будут вопросы задавайте


Python, количество путей по обходу матрицы, проверяющая система пишет, что при запуске кода происходит ошибка выполнения
я написала код по следующей задаче:

Черепаха хочет переползти из левого верхнего угла поля размером N на M клеток
( 1 ≤ N , M ≤ 1000 ) в правый нижний. За один шаг она может переместиться на
соседнюю клетку вправо или на соседнюю клетку вниз. Определите, сколькими
различными способами Черепаха может добраться до цели.

Поскольку количество способов, которое нужно найти, может быть очень велико,
вычислите его по модулю 10 6 + 7 , то есть найдите остаток от деления этого
числа на 10 6 + 7 .

Входные данные
Входная строка содержит два натуральных числа: размеры поля N и M ,
разделённые пробелом ( 1 ≤ N , M ≤ 1000 ).

Выходные данные
Программа должна вывести одно число: количество различных маршрутов
из левого верхнего угла поля в правый нижний по модулю 10 6 + 7 .

Примеры
входные данные
20 20
выходные данные
16385

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

n, m=map(int, input().split())
a=[[1]*m for i in range(n)]
for i in range(1, n):
    for j in range(1, m):
        a[i][j]=a[i-1][j]+a[i][j-1]
print((a[n-1][m-1])%(10**6+7))

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

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

 a[i][j]=(a[i-1][j] + a[i][j-1]) % 1000007

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

n, m=map(int, input().split())
a=[[1]*m for i in range(2)]
for i in range(1, n):
    last = (i + 1) % 2
    current = i % 2
    for j in range(1, m):
        a[current][j]=(a[last][j] + a[current][j-1]) % 1000007
print(a[(n-1)%2][m-1])


В чем смысл uvicorn? django python
У меня есть следующий view:
<code>
async def index(request: HttpRequest):
    await sleep(10)
    return HttpResponse('test')
</code>
Читая документацию django и различные гайды, я запустил свой проект через uvicorn, что бы как я на тот момент думал "в моем проекте асинхронность начала работать как задумывалась"
Но когда я вызвал этот view я не заметил никакой разницы между работой через uvicorn и работы через manage.py runserver.
Так в чем же смысл uvicorn и как его правильно понять?
Так в чем

Uvicorn — это веб-сервер поддерживающий протокол ASGI для Python.
Следущая команда:

manage.py runserver

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


Возможно ли получить из одной строки другую с заменой символом по определённым правилам?
Задача. Вася придумал игру для умного телевизора: можно сколько угодно раз выбрать две произвольные буквы латинского алфавита и заменить в строке все вхождения первой буквы на вторую, а второй — на первую. Так при выборе буквы a и b строка abc превратится в bac. Если выбрать буквы a и x, то строка abc превратится в строку xbc. Цель игры состоит в том, чтобы получить из строки s1 строку s2.
К сожалению, Вася умеет только генерировать гениальные идеи, но не программировать. Он придумал много пар строк s1 и s2. Для каждой пары определите, возможно ли получить из строки s1 строку s2 по правилам игры.
Формат ввода
В первой строке задано число t (1 ≤ t ≤ 100) — количество пар строк, придуманных Васей. В следующих 2t строках вводятся t пар слов равной длины, разделенных переводом строки и состоящих из строчных латинских букв — s1 и s2 соответственно.
Гарантируется, что суммарная длина всех слов не превосходит 105 символов.
Формат вывода
Для каждой пары слов выведите YES, если из s1 можно получить s2 по правилам игры и NO в противном случае.
Я пробовал делать по-разному. Например, так, как показано ниже. Однако, проходит только один тест (предполагаю, что тот, который и показан). За любые идеи буду очень благодарен. Может быть, какие-то случаи я пропустил?
<code>
import re

t = int(input())
s12_list = []
s1_list = []
s2_list = []

for _ in range(2*t):
    s12 = input().split()
    s12_list.append(s12)

for i in range(2*t):
    if i % 2 == 0:
        s1_list.append(s12_list[i])
    else:
        s2_list.append(s12_list[i])

s1_list = re.sub(r"[''\[\] ]", '', str(s1_list))
s2_list = re.sub(r"[''\[\] ]", '', str(s2_list))
s1_list = s1_list.split(',')
s2_list = s2_list.split(',')

for l in range(len(s1_list)):
    for w in range(len(s1_list[l])):
        bufervar1 = s1_list[l][w]
        bufervar2 = s2_list[l][w]
        for r in range(len(s1_list[l])):

            if s1_list[l][r] == s1_list[l][w]:
                s1_list[l] = s1_list[l].replace(s1_list[l][r], str(bufervar2))

for p in range(len(s1_list)):
    if (s1_list[p] == s2_list[p]) == True:
        print('YES')
    else:
        print('NO')
</code>

Если я правильно понял задачу, то можно предложить такой вариант. Проверяется однозначность соответствия букв первой и второй строки.
Не помешало бы приведение примеров и ссылки на точное условие и систему проверки, если она свободно доступна.
<code>
def check(s, t):
    if len(s) != len(t):
        return  'NO'
    dicts = {}
    dictt = {}
    for pair in zip(s, t):
        if dicts.setdefault(pair[0], pair[1]) != pair[1]:
            return 'NO'
        if dictt.setdefault(pair[1], pair[0]) != pair[0]:
            return 'NO'
    return 'YES'
</code>


Вариация задачи о рюкзаке, цикл while не заканчивается (python)
Решала задачу:

Пират нашел на захваченном корабле N золотых слитков, каждый из
которых имеет значительный вес ( W i для слитка с номером i ).
Во время боя захваченный корабль получил серьёзные повреждения
и вот-вот затонет. Пират может увезти на шлюпке на свой корабль
только C килограммов груза. Какие слитки он должен выбрать,
чтобы увезти как можно больше золота?

Входные данные
Первая строка содержит грузоподъёмность шлюпки пирата C в
килограммах ( 1 ≤ C ≤ 5000 ). Во второй строке записано количество
найденных золотых слитков N ( 1 ≤ N ≤ 100 ). В третьей строке
записано N натуральных чисел: массы каждого слитка, разделённые
пробелами, в порядке возрастания (неубывания).

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

Примеры
входные данные
800
4
200 400 500 700
выходные данные
700
500 200

Кажется, это вариация задачи о рюкзаке, написала код:

n=int(input())
m=int(input())
a=list(map(int, input().split()))
ans=[]
while sum(ans)<n:
    u=0
    for i in a:
        if sum(ans)+i<=n and i>u and i not in ans:
            u=i
    ans.append(u)
print(sum(ans))
print(ans)

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

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

def pirate(C, weights):
    a =[0]*(C+1)
    a[0] = -1

    for w in weights:
        for i in range(C, w-1,-1):
             if a[i-w] and a[i] == 0:
                a[i] = w

    #print(a)  #можно вывести для контроля

    idx = C
    while a[idx]==0:
        idx -= 1

    maxx = idx
    res = []
    while idx:
        res.append(a[idx])
        idx -= a[idx]
    return maxx, res

print(pirate(800, [100, 320, 320, 610]))

>>>740, [320, 320, 100]


Ошибка запуска exe файла созданного с помощью pyinstaller
Из python скрипта создал exe файл при помощи pyinstaller. Использовал команду: pyinstaller --onefile --noconsole --collect-all reportlab.graphics.barcode script.py (т.к. изначально exe файл ругался на отсутствие reportlab.graphics.barcode).
Но теперь exe файл стал ругаться на отсутствие libdmtx-64.dll. Сама dll на лежит на диске по пути ...AppData\Local\Programs\Python\Python310\Lib\site-packages\pylibdmtx
Подскажите пожалуйста, как правильно скомпилировать exe, чтобы не итоговый файл не ругался на отсутствие libdmtx-64.dll.

Чтобы включить libdmtx-64.dll в итоговый exe файл при использовании PyInstaller, вам нужно указать опцию
--add-binary при вызове команды. Это позволит скопировать указанный файл в папку сборки приложения. В вашем случае, вы также можете указать опцию
--hidden-import=libdmtx для того, чтобы явно включить модуль libdmtx в процесс компиляции.
Вот как будет выглядеть команда для компиляции с учетом libdmtx-64.dll:

pyinstaller --onefile --noconsole --collect-all reportlab.graphics.barcode --add-binary "C:\путь_к_файлу\libdmtx-64.dll;." --hidden-import=libdmtx script.py

Где C:\путь_к_файлу\libdmtx-64.dll замените на полный путь к файлу libdmtx-64.dll на вашем компьютере.
Таким образом, при запуске итогового exe файла, libdmtx-64.dll должен быть доступен и не вызывать ошибку об отсутствии


Видимость переменной после if
Помогите пожалуйста решить задачу.
<code>
info_9 = kont_info.find(class_="section__info_sl").get_text(strip=True)
kont_info = soup.find_all(class_="blockInfo__section_sl section")[14]
info_7 = kont_info.find(class_="section__title_sl").get_text(strip=True)
if info_7 == "Телефон":
    info_71 = kont_info.find(class_="section__info_sl").get_text(strip=True)
</code>
При создании словаря переменная info_71 не определяется. Как я полагаю, переменная info_71 в дальнейшем не определяется из-за if-а. Не могли бы подсказать, как сделать так, чтобы переменная info_71 отображалась только при наличии в блоке info_7 слова "Телефон".

Из комментариев я сформировал для вас ответ.
Используйте конструкцию
in для поиска подстроки в строке.

info_9 = kont_info.find(class_="section__info_sl").get_text(strip=True)
kont_info = soup.find_all(class_="blockInfo__section_sl section")[14]
info_7 = kont_info.find(class_="section__title_sl").get_text(strip=True)

if 'Телефон' in info_7: # вот здесь мы поменяли условие
    info_71 = kont_info.find(class_="section__info_sl").get_text(strip=True)

А для того, чтобы не было проблем с отсутствием переменной
info_71, вы можете проинициализировать её заранее.

info_9 = kont_info.find(class_="section__info_sl").get_text(strip=True)
kont_info = soup.find_all(class_="blockInfo__section_sl section")[14]
info_7 = kont_info.find(class_="section__title_sl").get_text(strip=True)
info_71 = '' # вот здесь мы задали переменную пустой строкой
if 'Телефон' in info_7:
    info_71 = kont_info.find(class_="section__info_sl").get_text(strip=True)


Хочу сделать вывод из excel в word только первой строки. Вроде разобрался как диапазон поставить, но вывести не получается, как это в цикле указать?
то что в коментах, это попытки сделать по разному
<code>
import openpyxl
import aspose.words as aw

book = openpyxl.open("NCR_2022_2.xlsx", read_only=True)

wb = openpyxl.reader.excel.load_workbook(filename = "NCR_2022_2.xlsx")
#print(wb.sheetnames)
wb.active = 0
sheet = wb.active

#print(sheet['A1'].value)

doc = aw.Document()

# create a document builder object
builder = aw.DocumentBuilder(doc)
#cells = sheet['A1': 'BB1']
#builder.write(sheet['1'].value)
builder.list_format.apply_number_default()
#for column in range(0, sheet.max_column):
for i in range(1,2):
    builder.write(sheet['A' + str(i)].value)
    builder.write(" \n")
</code>

Не совсем понятно что у вас не получается

import openpyxl
import aspose.words as aw

wb = openpyxl.open("NCR_2022_2.xlsx", read_only=True)
sheet = wb.active

doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.list_format.apply_number_default()

for cell in sheet['1']:
    builder.write(cell.value)
    builder.write(" \n")

doc.save("output.docx")

Тут не нужен какой-то мудрёный цикл с
range. Просто
sheet['x'], где х это номер строки, заберёт всю. Нумерация с единицы начинается.


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

Для объединения слов в один столбец в каждой ячейке, вы можете использовать метод str.split() для разделения строк по запятым, а затем метод explode() для превращения списка слов в отдельные строки. Затем можно снова объединить строки с помощью метода groupby() и apply() с функцией ','.join для получения одного слова в каждой ячейке. Вот пример кода:

import pandas as pd

# Пример исходного датафрейма с одним столбцом
data = {'words': ['apple,orange', 'banana', 'grape,kiwi,mango', 'pear']}
df = pd.DataFrame(data)

# Разделение строк по запятым и превращение списка в отдельные строки
df['words'] = df['words'].str.split(',')

# Превращение списка слов в отдельные строки
df = df.explode('words')

# Объединение слов обратно в одну строку с помощью groupby и apply
df = df.groupby(level=0)['words'].apply(','.join).reset_index()

print(df)

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

   index   words
0      0   apple
1      1  orange
2      2  banana
3      3   grape
4      3    kiwi
5      3   mango
6      4    pear


Где находится код функции import python?
Хотел бы посмотреть исходный код самой функции import... хочу посмотреть тоесть как он работает изнутри, подскажите как найти этот код...

import - это не функция, а ключевое слово (оператор) языка Python.
Посмотреть исходный код (на языке С) можно здесь.
Объяснение работы - здесь.


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

result = []
coins = ["BTC", "USDT", "ETH"]
list_bank = ["BUY", "SELL"]
list_bank1 = ["RosBankNew", "TinkoffNew", "QIWI"]
for asset in coins:
    for tradeType in list_bank:
        for payTypes in list_bank1:
            binance(asset, tradeType, payTypes)
            result.append(binance(asset, tradeType, payTypes))
            result.sort()

Вывод получается вот такой:

 ['169476.60', '170340.00', '170720.10', '171700.00', '171700.00', '174250.00', '2676000.00', '2678381.76', '2684827.02', '2699980.00', '2700000.00', '2725000.00', '91.94', '92.02', '92.04', '92.08', '92.12', '92.48']

Мне нужно, что бы каждый результат выводился с названием переменных, которые были применены в цикле.
Например возьмём первый результат из списка: 169476.60, мне нужно что бы вывелось примерно так:
169476.60 Buy RosBankNew или Sell RosBankNew.
Мне нужно подписать каждый результат переменными, которые были применены. Всем хорошего настроения! Надеюсь на вашу помощь)

Ну тогда и добавляйте кортежем все нужные поля, а не только цену:
<code>
result.append((binance(asset, tradeType, payTypes), asset, tradeType, payTypes))
</code>
И сортировку делайте уже после завершения циклов, зачем вы на каждом шаге цикла сортируете, ни к чему это.
Кстати, сортировка у вас не числовая, а лексикографическая, как вы уже, наверное, заметили. Потому что у вас строки, а не числа.


Что такое __peg_parser__?
У меня установлен Python 3.9. При исследовании встроенных модулей Python с помощью интерпретатора я обнаружил следующее непонятное явление:

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', '__peg_parser__', 'and', ... , 'yield']

Стало интересно, что это за peg_parser.

    File "<stdin>", line 1
      help(__peg_parser__)
           ^
    SyntaxError: You found it!

Может, это пасхалка какая-нибудь? Или от этого пегпарсера есть и практическая польза?

peg_parser – это пасхалка (Easter egg) в языке Python.
Если попробовать вызвать
help(__peg_parser__) или обратиться к этому атрибуту напрямую, Python вызовет исключение SyntaxError с сообщением "You found it!" («Вы нашли это!»). Это было спрятано разработчиками языка Python как шуточный отклик на попытки исследовать
__peg_parser__.


Что означает :> в строке форматирования {a:>30}?
<code>
print(f"Товар:{a:>30}")
</code>

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

a = "яблоко"
print(f"Товар:{a:>30}")
a = "яяяяблоко"
print(f"Товар:{a:>30}")
a = "яяяяяяяяяяблоко"
print(f"Товар:{a:>30}")

Вывод в терминале:

Товар:                        яблоко
Товар:                     яяяяблоко
Товар:               яяяяяяяяяяблоко

P.S. Если выйти за пределы 30 символов, то форматирование перестанет работать

a = "яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяблоко"
print(f"Товар:{a:>30}")

Вывод на терминале:

Товар:яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяблоко


Преобразовать два списка в один
Есть два списка с именами, телефонами и ключами

(BMW, AUDI, Berlin, Praga),

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

name = ['Alex:Praga:BMW', 'Kolya:Berlin:Audi', 'Greg:Paris:Ford', 'John:Paris:Ford']
phone = ['74957758888:Berlin:Audi', '74999224831:Paris:Ford', '74952122159:Praga:BMW']

result = ['Alex:74952122159', 'Kolya:74957758888', 'Greg:74999224831', 'John:74999224831']

Я не особо уверен в правильности вашей архитектуры, но допускаю, что двум людям может принадлежать один номер. Тогда можно реализовать следующий алгоритм. Соберем каждое значение и разобьем по
:, а затем сверим ключи имён и ключи телефонов (
name_key и
phone_key соответственно)

def get_matching_phones(name_list, phone_list):
    output_list = []
    for name_entry in name_list:
        name_parts = name_entry.split(':')
        name_key = name_parts[1] + ':' + name_parts[2]

        for phone_entry in phone_list:
            phone_parts = phone_entry.split(':')
            phone_key = phone_parts[1] + ':' + phone_parts[2]

            if name_key == phone_key:
                output_list.append(f"{name_parts[0]}:{phone_parts[0]}")
                break

    return output_list

Я немного изменил входные данные, чтобы обогатить тест.

name = ['Alex:Praga:BMW', 'Kolya:Berlin:Audi', 'Greg:Paris:Ford', 'John:Paris:Ford', 'Acinit:Samara:Lada', 'Acinit:Berlin:Audi']
phone = ['74957758888:Berlin:Audi', '74999224831:Paris:Ford','79053455232:Samara:Lada', '74952122159:Praga:BMW','74999212345:Berlin:Audi']

result = get_matching_phones(name, phone)
print(result)

Вывод в терминале:

['Alex:74952122159', 'Kolya:74957758888', 'Greg:74999224831', 'John:74999224831', 'Acinit:79053455232', 'Acinit:74957758888']

p.s. здесь мы можем видеть проблему того, что у
Acinit ожидаются по ключу
Berlin:Audi номер
74999212345, но вместо этого он берет самый первый в списке подходящий аргумент, а именно номер
Kolya -
74957758888.
Если данное считается ошибкой, сообщите об этом в комментариях


Продолжение цикла(парсинга) при отсутствии элемента
Не могли бы подсказать как сделать так, чтобы при отсутствии элемента парсинг продолжался? Вопрос о Python.
<code>
    time_info = soup.find_all(class_="row block")[2]
    info_20 = time_info.find_all(class_="section__info")[0]
    info_21 = time_info.find_all(class_="section__info")[1]
    info_22 = time_info.find_all(class_="section__info")[2]
</code>
То есть во время парсинга на странице не всегда есть info_22, выдается ошибка и парсинг завершается. Заранее спасибо.

В твоем случае если элемент будет не найден, выбьет ошибку -
KeyError.
Обращаешь нужный блок кода в
try/except:

try:
    time_info = soup.find_all(class_="row block")[2]
    info_20 = time_info.find_all(class_="section__info")[0]
    info_21 = time_info.find_all(class_="section__info")[1]
    info_22 = time_info.find_all(class_="section__info")[2]
except KeyError:
    pass # Здесь можно отправлять лог в терминал, что элемент не найден

Если метод
find() вернет None и ты у него будешь вызывать какие-то методы (.find(), .text, find_next_sibling()), получишь -
AttributeError


Aiogram. Второй хендлер не работает после регистрации первого
Есть код разбитый по файлам. На каждый файл в идее должен быть один хендлер.
1й файл

@dp.message_handler()
async def create_guild_page_6(message: types.Message, state: FSMContext):
    try:
        async with state.proxy() as data:
            if data['name']:
                if IsSubscriber(await bot.get_chat_member(chat_id='@chatid', user_id=message.from_user.id)):
                    if message.text == 'Промокод':
                        buttons = [types.InlineKeyboardButton(text='Далее', callback_data='create_guild_page_7')]
                        kb = types.InlineKeyboardMarkup().add(*buttons)
                        cursor.execute(f"INSERT INTO guilds VALUES ({message.from_user.id}, '{data['name']}', {0}, "
                                       f"{0}, {0}, {10})")
                        base.commit()
                        await message.answer_photo(photo=Luna, caption='Текст', reply_markup=kb)
                        await state.finish()
                else: await message.answer('Сначала нужно подписаться)')
    except KeyError: pass

2й файл

@dp.message_handler()
async def up_guild_lvl_to_1_1(message: types.Message):
    name = cursor.execute(f"SELECT guild_name FROM guilds WHERE owner_id ={message.from_user.id}").fetchone()
    lvl = cursor.execute(f"SELECT guild_lvl FROM guilds WHERE owner_id ={message.from_user.id}").fetchone()
    if name != None and message.text == 'Помощь':
        if lvl[0] == 0:
            buttons = [types.InlineKeyboardButton(text='Далее', callback_data='up_guild_lvl_to_1_2')]
            kb = types.InlineKeyboardMarkup(resize_keyboard=True).add(*buttons)
            await message.answer_photo(photo=Luna, caption='Текст', reply_markup=kb)

Проблема в том, что сообщение "Промокод" бот обрабатывает и запускает первый хендлер, а "Помощь" - нет. Я в курсе про порядок инициализации хедлеров в init, если поменять местами, то будет наоборот "Помощь" - видит, "Промокод" - нет.
Прошу помощи в решении данной проблемы.
P.S. если нужно больше информации - пишите

Решение простое:

@dp.message_handler(text=['Промокод', 'промокод'])
async def answer_on_media(message: Message):
    await message.answer('Я сработал, потому что ты отправил мне "Промокод"')

@dp.message_handler(text=['Помощь', 'помощь'])
async def answer_on_media(message: Message):
    await message.answer('Я сработал, потому что ты отправил мне "Помощь"')

@dp.message_handler()
async def answer_on_media(message: Message):
    await message.answer("Я сработал, потому что два верхних хэндлера не сработали")

раз вы отлавливаете по тексту, то пусть хэндлер и ловит этот текст. А в самой функции проверку
if message.text == убирайте


Сохранение отслеживаемых объектов в TensorFlow через Checkpoint
Видимо, не совсем понимаю концепцию, как должен работать train.Checkpoint() в TF.
В документации сказано, что Checkpoint служит для сохранения отслеживаемых объектов. Итак, tf.Variables у нас именно такой.
<code>
var = tf.Variable([False] * 8, name="var")

saver = tf.train.Checkpoint()
save_path = saver.save("checkpoint")

var[0].assign(True)

saver.restore(save_path)
print(var)
</code>
Т.е. у меня есть отслеживаемая переменная var. Это вектор из булевых значений. Я создаю чекпоинт, сохраняю состояние. Далее изменяю переменную, загружаю сохраненное состояние, но переменная остается прежней, с изменениями. Вероятно, очень глупый вопрос, но пытаюсь понять, как это должно работать.

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

saver = tf.train.Checkpoint(var=var)
var[0].assign(True)
saver.restore(save_path).assert_consumed()

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

ckpt = tf.train.Checkpoint(step=tf.Variable(1), W1=model.W1, b1=model.b1, b_out=model.b_out)

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

manager = tf.train.CheckpointManager(ckpt, 'PATH', max_to_keep=3)

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

ckpt.step.assign_add(1)
if int(ckpt.step) % 100 == 0:
    save_path = manager.save()

Чтобы восстановить состояние переменных из чекпоинта, используем restore:

ckpt.restore(PATH).assert_consumed()


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

Напишите программу, которая по данным числам A и n записывает
представление числа A в n-разрядном двоичном дополнительном коде.

Входные данные
Первая строка входных данных содержит число A, вторая строка –– число
n, при этом 2 ≤ n ≤ 16, −2^n−1 ≤ A ≤ (2^n−1)−1 .

Выходные данные
Программа должна вывести строку из n символов, содержащих запись числа
A в n-разрядном двоичном дополнительном коде, первый символ –– старший
знаковый разряд.

Примеры
входные данные
3
8

выходные данные
00000011
входные данные
57
8

выходные данные
00111001

Мой код:

def binar(x, n):
    ans=""
    while x>0:
        ans+=str(x%2)
        x//=2
    ans="0"*(n-len(ans))+(ans[::-1])
    return ans
A=int(input())
n=int(input())
print(binar(A, n))

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

def binar(x, n):
    ans = ""
    for i in range(n):
        ans = "01"[x%2] + ans
        x //= 2
    return ans

print(binar(10, 8))
print(binar(-10, 8))

00001010
11110110


Не работает проверка на команду Discord py
Хочу сделать проверку, чтобы бот проверял из базы данных достаточно ли у пользователя единиц чести(honor), тоесть больше или равно, после чего выдавал ему роль по команде, в моем же случае бот всегда выдает пользователю роль, даже если у него недостаточно чести, никаких ошибок в консоль не выдает.
<code>
@client.command(aliases = ['captain'])
@commands.has_role('Дозорный')
async def __mrole1(ctx):
    if cursor.execute("SELECT honor FROM users2 WHERE honor >= 100000"):
        author = ctx.message.author
        guild = client.get_guild(тут стоит айди сервера)
        role = guild.get_role(тут стоит айди роли)
        await author.add_roles(role)
    else:
        await ctx.send('У вас недостаточно репутации')

</code>

cursor.execute() возвращает объект курсора, а не результат выполнения запроса. Поэтому условие всегда будет True, даже если записей в бд нет.
Вам нужно получить результат, например, с помощью
fetchone() или
fetchall()


Telegram бот реализация обратной связи/отзывов (Python, Aiogram)
Проблема простая, но реализовать не так просто. Есть телеграм бот, который просто отвечает на нажатия инлайн кнопок от пользователя. Нужно реализовать инлайн кнопку обратной связи.(отзыв о работе бота, предложения, жалобы) Пользователь нажимает на нее - может написать только текст, который потом отправляется по id админу. Проблема в том, что если пользователь не нажал на кнопку "Оставить отзыв", то ему выдает ответ типа "я вас не понимаю, пользуйтесь кнопками", а сообщение, которое отправил пользователь удаляется,  последущие сообщения, стикеры, видео и тд от пользователя просто удаляются, а ответ "я вас не понимаю, пользуйтесь кнопками" остается висеть один, не дублируясь на каждое мусорное сообщение от пользователя.
Если кнопка нажата, у пользователя появляется возможность написать текст, текст отправляется админу, ответ от бота пользователю "Спасибо за отзыв". Причем отзыв пользователь может писать только текстом, на видео, стикеры и тд, ответ типа "отзывы принимаются только в текстовом формате"
Пробовал реализовать через fsm, однако не работало так, как задумано, пользователь просто не мог написать сообщение, даже при нажатой кнопке "Оставить отзыв"
<code>
from aiogram import *
from aiogram.types import *
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

bot = Bot(token="123456")
dp = Dispatcher(bot)

class FeedbackState(StatesGroup):
    waiting_for_feedback = State()

action_menuKB = InlineKeyboardMarkup(row_width=2) \
    .add(InlineKeyboardButton("Оставить отзыв 📝", callback_data="feedback"))

@dp.callback_query_handler(lambda c: c.data == "feedback")
async def show_feedback_message(cbq: CallbackQuery, state: FSMContext):
    await bot.answer_callback_query(cbq.id)

    await cbq.message.answer("Ваш отзыв будет передан администратору. Введите пожалуйста сообщение: ")

    await FeedbackState.waiting_for_feedback.set()

    await state.update_data(expecting_feedback=True)

@dp.message_handler(state=FeedbackState.waiting_for_feedback, content_types=ContentTypes.TEXT)
async def handle_feedback_message(message: Message, state: FSMContext):
    data = await state.get_data()
    if "expecting_feedback" in data and data["expecting_feedback"]:
        admin_user_id = 123456

        user_id = message.from_user.id
        feedback_message = message.text

        await bot.send_message(admin_user_id, f"Новый отзыв от {user_id}:\n{feedback_message}")
        await message.answer("Спасибо за отзыв! Ваше сообщение было передано администратору.")

        await state.finish()

        await state.update_data(expecting_feedback=False)
    else:
        await message.delete()
        await message.answer("Я не понимаю вашего сообщения "
                             "\nПожалуйста, используйте кнопки.",
                             reply_markup=action_menuKB)

if __name__ == "__main__":
    from aiogram import executor

    executor.start_polling(dp, skip_updates=True)
</code>
Хочу понять иду ли по правильному пути, что стоит добавить, лучший ли вариант использовать стэйты, и почему не работает момент отличия включенной кнопки от случайного "мусорного текста", когда пользователь не хотел оставлять обратную связь.
Благодарю

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

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

если все так, то данную задумку я бы реализовал вот так:
<code>
from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery, Message
from aiogram.utils import executor

bot = Bot(token="TOKEN")
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
ADMIN_ID = '' # ID администратора

class FeedbackState(StatesGroup):
    waiting_for_feedback = State()

action_menuKB = InlineKeyboardMarkup(row_width=2) \
    .add(InlineKeyboardButton("Оставить отзыв 📝", callback_data="feedback"))

cancel_KB = InlineKeyboardMarkup(row_width=2) \
    .add(InlineKeyboardButton("Не хочу оставлять отзыв 🚫", callback_data="cancel_feedback"))

@dp.message_handler(commands=['start'])
async def start(message: Message):
    await message.answer('Приветствую! Для того, чтобы оставить отзыв нажмите кнопку снизу', reply_markup=action_menuKB)

@dp.callback_query_handler(text="feedback")
async def show_feedback_message(call: CallbackQuery):
    await call.message.answer("Ваш отзыв будет передан администратору. Введите пожалуйста сообщение: ")
    await FeedbackState.waiting_for_feedback.set()

@dp.message_handler(state=FeedbackState.waiting_for_feedback)
async def handle_feedback_message(message: Message, state: FSMContext):
    await bot.send_message(ADMIN_ID, f"Новый отзыв от {message.from_user.id}:\n{message.text}")
    await message.answer("Спасибо за отзыв! Ваше сообщение было передано администратору.")
    await state.finish()

@dp.message_handler(content_types=['text', 'document', 'photo', 'video', 'video_note', 'sticker', 'voice'])
async def answer_without_kb(message: Message):
    await message.delete()
    await message.answer("Я не понимаю вашего сообщения "
                         "\nПожалуйста, используйте кнопки.",
                         reply_markup=action_menuKB)

@dp.callback_query_handler(state='*', text="cancel_feedback")
async def cancel_feedback(call: CallbackQuery, state: FSMContext):
    await call.message.answer('Отменено! Если все же захотите оставить отзыв - отправьте команду /start')
    await state.finish()

@dp.message_handler(state='*', content_types=['document', 'photo', 'video', 'video_note', 'sticker', 'voice'])
async def answer_on_media(message: Message):
    await message.answer("Я принимаю только текстовые сообщения", reply_markup=cancel_KB)

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)
</code>
имейте ввиду, что последние три хэндлера должны располагаться в самом низу


Как мне запустить 2 процесса одновременно?
Я делаю будильник на питоне и мне нужно запустить 2 процесса. Первый должен выводить окно, а второй запускать звук.
process1 и
process2, несмотря на multiprocessing запускаются поочередно, а не одновременно. Вот код:

#import for time
from datetime import datetime
#import for interface
from tkinter import *
#import for parallel use
from multiprocessing import *
#import functions
from alarm_interface import window
from alarm_sound import alarm_sound

#Function that checks valid time
def valid_alarm(val_al):
    if int(str(val_al[0:2]))>23 or int(str(val_al[3:5]))>59:
        return "Invalid time"
    else:
        return "Pass"

#Main programm that asks user for title and time for alarm

while True:
    print('Title of the alarm clock:',end=' ')
    name_of_alarm=input('')

    print('Select the desired time. Enter the hour and minute')

    print('Hour:',end='')
    user_time_hour=int(input()[0:2])

    print('Minute:',end='')
    user_time_min=int(input()[0:2])

    user_time="{:02d}:{:02d}".format(user_time_hour,user_time_min)

    #Checking valid time
    if valid_alarm(user_time)=="Invalid time":
        print(valid_alarm(user_time))
    else:
        print(("The alarm clock is set to {:02d}:{:02d}").format(user_time_hour,user_time_min))
        break

#Main programm that compares current time and user time
while True:

    current_time=str(datetime.now().time())[:5]

    if current_time==user_time:
        print(name_of_alarm)
        #multiprocessing
        process1=Process(target=alarm_sound())
        process2=Process(target=window())

        process2.start()
        process1.start()
        process2.join()
        process1.join()

А можно делать не процессы, а потоки, то есть использовать
threading.Thread:

from threading import Thread

...

process1 = Thread(target=alarm_sound)
process2 = Thread(target=window)

process1.start()
process2.start()

...

Также обратите внимание на то что в
target передаётся функция без скобок.


Поиск N первых простых чисел. Код ушёл в бесконечный цикл
я написала код по задаче:

Напишите программу, которая выводит на экран первые N простых чисел.

Входные данные
Входная строка содержит число N .

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

Примеры
входные данные
10
выходные данные
2 3 5 7 11 13 17 19 23 29

Код:

def is_prime(n):
    q=2
    while q*q<=n:
        if n%q==0:
            return False
        q+=1
    return True
n=int(input())
ans=[2]
q=3
while len(ans)<n:
    if is_prime(q):
        ans.append(q)
        q+=2
print(*ans)

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

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

while len(ans)<n:
    if is_prime(q):
        ans.append(q)
    q+=2

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

n=int(input())
prime_count = 1
print(2, end = ' ')
q = 3
while prime_count<n:
    if is_prime(q):
        print(q, end = ' ')
        prime_count += 1
    q+=2

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

n=int(input())
ans = [2]*n
prime_count = 1
q=3
while prime_count < n:
    idx = 0
    isprime = True
    while ans[idx]*ans[idx]<=q:
        if q % ans[idx] == 0:
            isprime = False
            break
        idx += 1
    if isprime:
        ans[prime_count] = q
        prime_count += 1
    q+=2
print(*ans)


Как отключить превью ссылки при копировании сообщения?

await bot.send_message()

имеет аргумент disable_web_page_preview, который задаёт отключение превью веб страницы, на которую ведёт ссылка.

await bot.copy_message()

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

Могу предложить такой вариант

import re # Не забудьте импортировать библиотеку

@dp.message_handler()
async def copy_mess(message: types.Message):
    regex = r"(?P<domain>\w+\.\w{2,3})"
    url = re.search(regex, message.text)
    if url:
        await bot.send_message('<ID куда пересылать>', message.text, parse_mode='HTML', disable_web_page_preview=True)
    else:
        await bot.copy_message('<ID куда пересылать>', message.chat.id, message.message_id)

Суть такая - если сообщение содержит ссылку, то получаем текст сообщение и отправляем с помощью обычной отправки
await bot.send_message() с указанием
disable_web_page_preview=True. А если сообщение не содержит ссылку, то просто пересылаем его с помощью
await bot.copy_message()


Почему не срабатывает условие !=?
Написал код бота модератора для тг-канала, который должен удалять комментарии подписчиков, содержащие слово из словаря. При этом пропускать любые комментарии администратора, в т.ч. содержащие любое слово из словаря. В итоге удаляет все комментарии. id админа получаю из файла cfg.py. Подскажите, в чем ошибка кода?

@dp.message_handler()
async def mess_handler(message: types.Message):
    text = message.text.lower()
    while str(message.from_user.id) != cfg.ADMIN_ID:
        for word in cfg.WORDS:
            if word in text:
                await message.delete()

А в таком варианте кода, бот вообще не удаляет любые комментарии:

@dp.message_handler()
async def mess_handler(message: types.Message):
    text = message.text.lower()
    for word in cfg.WORDS:
        if word in text:
            if message.from_id != cfg.ADMIN_ID:
                pass
            else:
                await message.delete()

Такой вариант кода тоже не работает и комментарии не удаляет - TypeError: 'bool' object is not iterable:

@dp.message_handler()
async def mess_handler(message: types.Message):
    text = message.text.lower()
    for word in cfg.WORDS and str(message.from_user.id) != '@***':
        if word in text:
            await message.delete()

Могу предложить "грубый", но рабочий вариант:

mat = ['один', 'два', 'три', 'пять']

@dp.message_handler()
async def process_start(message: types.Message):
    if str(message.from_user.id) != cfg.ADMIN_ID and any(x in message.text.lower() for x in mat):
        await message.reply("Не матерись!!!")
        await message.delete()
    else:
        pass

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


Нужно получить результирующий набор продуктов без этого продукта
в двух наборах присутствует одинаковый набор продуктов, как реализовать результирующий набор без этого продукта
вот код
<code>
def __sub__(self, other):
    if isinstance(other, int):
        return Products(self.products, self.bonuses - other)
    elif isinstance(other, Products):
        new_products = {}
        for key in self.products:
            if key in other.products:
                pass
            for product, price in self.products.items():
                if product not in new_products:
                    new_products[product] = price
            for product, price in other.products.items():
                if product not in new_products:
                    new_products[product] = price
            return Products(new_products)
        return new_products
</code>

Если я правильно понял задачу:
<code>
def __sub__(self, other):
  # Объявляем выходной массив
  result = {}

  # Перебираем продукты из исходного массива
  for product, price in self.products.items():
    # Проверяем что продукта нет в дополняющем массиве
    if product not in other.products:
      result[product] = price

  # Перебираем продукты из дополняющего массива
  for product, price in other.products.items():
    # Проверяем что продукта нет в исходном массиве
    if product not in self.products:
      result[product] = price

  # Возвращаем новый объект [Products] с данными из обоих массивов
  return Products(result)
</code>


Код на python не всегда работает верно
я написала код по задаче:

Дан массив a длины n, вы можете сделать не более k
операций следующего типа: выбрать 2
различных элемента в массиве, прибавить 1
к первому и вычесть 1 из второго.
После применения операции все элемента a
должны остаться неотрицательными.
Какой лексикографически минимальный массив можно
получить? Массив xлексикографически меньше чем
массив y, если есть индекс i такой, что
xi<yi, и xj=yjдля всех 1≤j<i. Проще говоря,
для первого такого i, где массивы различны, xi<yi.

Входные данные
В первой строке записано одно целое число
t (1≤t≤20) – количество наборов входных данных.

В первой строке каждого набора входных
данных записаны 2целых числа n и k
(2≤n≤100, 1≤k≤10000) — размер массива
и максимальное количество операций.

Во второй строке каждого набора входных
данных записаны n целых чисел a1, a2, …, an
(0≤ai≤100) — элементы массива a.

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

Пример
входные данные
2
3 1
3 1 4
2 10
1 0
выходные данные
2 1 5
0 1

Но на некоторых тестах он выдает неверный ответ, мой код:

n=int(input())
for i in range(n):
    a, b=map(int, input().split())
    s=list(map(int, input().split()))
    if s.count(0)==a-1:
        print("0 "*(a-1), end="")
        print(max(s))
    else:
        x=0
        y=a-1
        while s[x]>0 and s[y]>0 and b>0 and s.count(0)<a-1:
            s[x]-=1
            s[y]+=1
            b-=1
            if s[x]==0:
                x+=1
            if s[y]==0:
                y-=1
        print(*s)

Не знаю что делать, помогите пожалуйста доработать и улучшить код!!!

Главная идея в вашем коде правильная: брать единички как можно левее и перемещать их как можно правее. Но есть ошибки:

Тест с массивом
1 1 0 оставляет его без изменений. Хотя есть меньший ответ -
0 0 2. Причина в условии
s[y]>0. Оно лишнее и только мешает. Если последний элемент массива ноль, почему мы отказываемся помещать туда единички? Убираем условие.

Тест с массивом
0 1 0 1 оставляет его без изменений. Хотя меньший ответ -
0 0 0 2. Причина в условии
s[x]>0. Прерывать цикл из-за нуля в текущей позиции неправильно. Справа от нуля могут быть числа, которые ещё можно обработать. Но ноль в
s[x] как-то обрабатывать нужно. Поставим условие внутри цикла:

        while b>0 and s.count(0)<a-1:
            if s[x] == 0:
                x += 1
            else:
                s[x]-=1
                s[y]+=1
                b-=1
                if s[x]==0:
                    x+=1
                if s[y]==0:
                    y-=1

Условие
if s[y]==0: никогда не выполняется.
s[y] или уже был больше нуля или только что получил дополнительную единицу. Убираем его.

Условие
if s[x]==0: было полезным и осталось полезным. Но аналогичное условие уже есть в начале тела цикла. Убираем его:

        x=0
        y=a-1
        while b>0 and s.count(0)<a-1:
            if s[x] == 0:
                x += 1
            else:
                s[x]-=1
                s[y]+=1
                b-=1

Условие
s.count(0)<a-1 полезное, но его можно заменить более простым условием -
x < y. Пока
x меньше
y можно продолжать попытки переносить единицы, иначе цикл надо останавливать. Ещё одна причина - новое условие считается быстрее.

Что делает
if s.count(0)==a-1: в начале программы? Он оптимизирует ситуацию когда в массиве почти все нули. Нужно ли оно? Нет, без него можно обойтись. Программа станет медленнее (но только в специальном случае) и проще. Удаляем:

n=int(input())
for i in range(n):
    a, b=map(int, input().split())
    s=list(map(int, input().split()))
    x=0
    y=a-1
    while b>0 and x < y:
        if s[x] == 0:
            x += 1
        else:
            s[x]-=1
            s[y]+=1
            b-=1
    print(*s)

Последняя версия стала работать правильно. Она ещё и проще. Но это не повод останавливаться.

Почему мы переносим единички по одной? Можно перенести сразу
min(s[x], b) единичек. Окажется что условие внутри цикла не нужно:

    while b>0 and x < y:
        m = min(s[x], b)
        s[x] -= m
        s[y] += m
        b -= m
        x += 1

Условие
b>0 стало не нужно. Оно делает программу немного быстрее, но усложняет. Если его удалить, цикл
while можно заменить на
for ... range:

n=int(input())
for i in range(n):
    a, b=map(int, input().split())
    s=list(map(int, input().split()))
    y=a-1
    for x in range(y):
        m = min(s[x], b)
        s[x] -= m
        s[y] += m
        b -= m
    print(*s)

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

t = int(input())
for _ in range(t):
    n, k = map(int, input().split())
    x = list(map(int, input().split()))
    for i in range(n - 1):
        m = min(x[i], k)
        x[i] -= m
        x[n - 1] += m
        k -= m
    print(*x)


почему то посреди кода просто пропускается четный индекс, задание из checkio
там где assert все норм, но в строчке, кт я перед example написал, ответ получается -1476, а не 1968. Пробовал с помощью отладки посмотреть, что не так, а там индекс именно числа "84"(т.е. 16) проверку на четность индекса не проходит и код его пропускает.
само задание:
"Дан массив целых чисел. Нужно найти сумму элементов с четными индексами (0-й, 2-й, 4-й итд), затем перемножить эту сумму и последний элемент исходного массива. Не забудьте, что первый элемент массива имеет индекс 0.
Для пустого массива результат всегда 0 (ноль)."
<code>
def checkio(array: list[int]) -> int:
    if not array:
        return 0
    a = []
    for i in array:
        if array.index(i) % 2 == 0:
            a.append(i)
    return sum(a)*array[-1]

print(checkio([-37, -36, -19, -99, 29, 20, 3, -7, -64, 84, 36, 62, 26, -76, 55, -24, 84, 49, -65, 41])) #должно в итоге получиться 1968
print("Example:")
print(checkio([0, 1, 2, 3, 4, 5]))

# These "asserts" are used for self-checking
assert checkio([0, 1, 2, 3, 4, 5]) == 30
assert checkio([1, 3, 5]) == 30
assert checkio([6]) == 36
assert checkio([]) == 0

print("The mission is done! Click 'Check Solution' to earn rewards!")
</code>

Потому что метод
index возвращает позицию первого вхождения элемента. В списке
[-37, -36, -19, -99, 29, 20, 3, -7, -64, 84, 36, 62, 26, -76, 55, -24, 84, 49, -65, 41] у вас дублируется элемент
84, поэтому сумма считается неправильно.
Поправьте функцию

def checkio(array: list[int]) -> int:
    if not array:
        return 0
    a = []
    for i in range(len(array)):
        if i % 2 == 0:
            a.append(array[i])
    return sum(a)*array[-1]

Результат:

1968
Example:
30
The mission is done! Click 'Check Solution' to earn rewards!


Как правильно оформить импорт множества модулей на python?
Вот здесь я прочитал, что когда импортируешь модули, каждый импорт нужно располагать на отдельной строчке. То есть нельзя писать

import os, sys

а нужно

import os
import sys

У меня возник следующий вопрос. Я пишу большую программу, в которой используется 11 стандартных модулей Python. И что же мне — ради улучшения читабельности каждый импорт располагать на отдельной строчке?

Вы можете создать
__init__ файл, в котором прописать все импорты.
init.py

import os
import sys

main.py

from __init__ import *

print(os.__doc__)
print(sys.__doc__)

Подробнее в документации


Пропадет ли встроенная функция pow() при импорте одноименной функции из библиотеки math?
Если импортировать
math.pow() с помощью кода

from math import pow
то я больше не смогу обращаться ко встроенной функции
pow()?

Да, при импорте
from math import pow стандартная функция будет перекрыта. Это причина, почему не следует злоупотреблять импортом в глобальное пространство имен.
Если нельзя, но очень хочется:

>>> old_pow=pow
>>> from math import pow
>>> print( old_pow(10, 2, 3) )
1

или

>>> from math import pow
...
>>> from builtins import pow as old_pow
>>> print( old_pow(10, 2, 3) )
1


Какая разница между pow() и math.pow()?
Опишите подробно, какая разница между встроенной функцией pow() и функцией pow() из библиотеки math?

У встроенной функции
pow, в отличие от
math.pow есть необязательный аргумент
mod.
С заданным аргументом
mod результат вызова эквивалентен следующему коду:

pow(base, exp) % mod

но вычисляется эффективнее.
Также
math.pow работает с дробными числами, а
pow - с целыми:

>>> pow(2, 3)
8
>>> math.pow(2, 3)
8.0

Иногда это отличие может быть полезно.
Подробнее в документации по встроенной функции
pow и по функции
math.pow.


Сделал авто кликер, вчера работал идеально, сегодня просыпаюсь, решил потестить в приложениях, не работает [закрыт]

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

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

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

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

python: can't open file 'C:\Users\Name\AU.py': [Errno 2] No such file or directory

Код:
file:///C:/Users/777/Documents/Phytone/Games/SampGui/AU.py

Видимо, в момент запуска вы находитесь в каталоге
C:\Users\Name, и Python ищет файл там.
Вам нужно перейти в каталог, в котором находится этот файл (
AU.py), и выполнить команду
python AU.py. Перейти в каталог можно командой
cd <ИМЯ КАТАЛОГА>.


Почему при таком срезе выводится последний элемент?
<code>
users_messages = ['I love my dog', 'I want to run', 'I want a hotdog', 'I want to sleep']
print(users_messages[:2:-1])
</code>

У Вас есть элементы с индексами 0, 1, 2, 3. Шаг -1 означает проход с конца. Вот Вы и идёте с конца до второго элемента (правая граница не включается). А так как нет индексов больше 3, то и выводится только один последний элемент. Добавьте в конец списка ещё элемент, тогда напечатается два:)


Код выдаёт на python неверный ответ
решала следующую задачу:

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

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

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

Но мой код на некоторых тестах выдаёт неверный ответ, помогите пожалуйтста, мой код:

n, w, b=map(int, input().split()) # 0=белый, 1=чёрный, 2=не выбран
x=min(w, b)
if w>b:
    u=1
else:
    u=0
a=list(map(int, input().split()))
ans=0
for i in range(n//2+(n%2)):
    if a[i]==0:
        if a[n-i-1]==1:
            ans=-1
            break
        elif a[n-i-1]==2:
            ans+=w
            a[n-i-1]=0
    #
    elif a[i]==1:
        if a[n-i-1]==0:
            ans=-1
            break
        elif a[n-i-1]==2:
            ans+=b
            a[n-i-1]=1
    #
    elif a[i]==2:
        if a[n-i-1]==0:
            ans+=w
            a[i]=0
        elif a[n-i-1]==1:
            ans+=b
            a[i]=1
        elif a[n-i-1]==2:
            ans+=x
            a[i]=u
            a[n-i-1]=u
print(ans)

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

ans+=2*x

за исключением случая, когда
i == n-i-1

elif a[n-i-1]==2:
        c = x if i==n-i-1 else 2*x
        ans+= c
        a[i]=u
        a[n-i-1]=u #ну это ни на что не повлияет


Не понимаю откуда к числу добавилось + 1
Работаю с кодом и ниоткуда берётся + 1 к числу с которым я работал. Это действие происходит в конце работы программы. То есть у неё есть число 1 то есть 2 элемент списка но почему число превращается в 2

asda = 7

c = 5

v = []

e = c - 1

q = len(v)

h = []

f = q * 2

k = (c - len(v))

w = (c - len(v) - 1)

x = c * 2

for i in range(1, asda + 1):
    v.append(i)

running = True
while running:
    print(v)
    n = c - len(v)
    if q == 1:
        running = False
        break
    if len(v) + len(v) == c:
        n = 0
    if len(v) < c:
        print(n - 1, 'Это оно')   # Вот в этом месте
        v.pop(n - 1)              # Почему отказывается удалять
        print(n - 1, 'Это оно2')  # И просто код продолжается, Хотя должен удалиться первый элемент(Вся магия происходит на последним действии)
        h.append(v[0])
    if len(v) >= c - 1:
        v.pop(c - 1)
        h.append(v[0])
        v.append(h[0])
        v.pop(0)
        h.pop(0)

Выводит код

[1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 6, 7, 1]
[3, 4, 6, 1, 2]
[4, 6, 1, 3]
0 Это оно
0 Это оно2
[6, 1, 3]
1 Это оно
1 Это оно2  # Вот здесь показывает элемент который должен быть удалён
[6, 3]  # Оно собственно не удаляется(Главный вопрос почему не удаляется)
2 Это оно  # И херакс эта цифра уже 2

Вопрос почему в конце работы кода не удаляется 1 элемент списка(Написал в комментариях где работа кода меня не устраивает)

Итак, вы проходите проверку
if len(v) < c: со списком
[4, 6, 1, 3]. Значение
n при этом равно 1 (
n = c - len(v))
Выполнено удаление элемента с индексом 0. Идем на следующую итерацию. Список
[6, 1, 3], значение
n равно
5-3=2. Повторяем первый абзац:
Итак, вы проходите проверку
if len(v) < c: со списком
[6, 1, 3]. Значение
n при этом равно 2 (
n = c - len(v)).
Выполнено удаление элемента с индексом 1. Идем на следующую итерацию. Список
[6, 3], значение
n равно
5-2=3.
Теперь вы проходите проверку
if len(v) < c: со списком
[6, 3]. Значение
n при этом равно 3 (
n = c - len(v)).
Получается, вы хотите удалить элемент с индексом 2 из списка
[6, 3]. Если вы умеете напиться их пустой чашки, наверное, сможете и это сделать... Но Python не умеет удалять из списка то, чего там нет...
Так понятно, что у вас происходит? Ровно то, что написано...


Как отделить роль крестика от роли кнопки во всплывающем окне?
У меня есть всплывающее окно:

...

popup = QMessageBox(self)
popup.setWindowTitle("Заголовок")
popup.move(400, 300)
popup.setText("Текст")

agreeButton = popup.addButton("Agree", QMessageBox.ButtonRole.YesRole)

popup.setDefaultButton(agreeButton)
popup.exec()
if popup.clickedButton() == agreeButton:
    print("Кнопка 'Agree' нажата")
...

По идее, только после нажатия на кнопку
Agree
оно должно выводить
Кнопка 'Agree' нажата, но почему-то оно также выводит это сообщение если нажать на крестик закрытия окна.
Возможно как-то совпадают роли, но я пробовал поставить для кнопки роли
YesRole,
NoRole и
ApplyRole, но во всех случаях нажатие на крестик тоже провоцировало вывод текста.

Проблема возникает из-за того, что закрытие всплывающего окна (QMessageBox) при нажатии на крестик или клавишу Esc по умолчанию интерпретируется как нажатие кнопки "Отмена" (Cancel). В вашем коде проверка
popup.clickedButton() == agreeButton будет истинной и при закрытии окна.
Чтобы решить эту проблему, вам нужно изменить стандартное поведение кнопки "Отмена" для всплывающего окна. Можно сделать это, установив флаг
QMessageBox.RejectRole для кнопки "Отмена".
Вот исправленный код:

popup = QMessageBox(self)
popup.setWindowTitle("Заголовок")
popup.move(400, 300)
popup.setText("Текст")
agreeButton = popup.addButton("Agree", QMessageBox.ButtonRole.YesRole)
cancelButton = popup.addButton("Cancel", QMessageBox.ButtonRole.RejectRole)
popup.setDefaultButton(agreeButton)
popup.exec()

clickedButton = popup.clickedButton()
if clickedButton == agreeButton:
    print("Кнопка 'Agree' нажата")
elif clickedButton == cancelButton:
    print("Кнопка 'Cancel' нажата")

Теперь проверка
clickedButton == agreeButton будет истинной только при нажатии кнопки "Agree", а не при закрытии окна.


Как выполнять асинхронные функции циклично каждые 30 минут, час?
У меня есть телеграмм бот, мне нужно чтобы о каждые 2 минуты проверял базу данных
В этой базе хранится список заявок бронирования, у каждой заявки есть время на которое пользователь забронировал что-либо, нужно чтобы бот сверял время и по истечению времени(чтобы заявка не была просроченной) удалял ее автоматически и присылал пользователю уведомление о том что его заявка истекла
За это отвечает функция

await check_requests()

Не await я не могу сделать так как в процессе своей работы она отправляет сообщения пользователю(а эта функция( await bot.send_message() ) всегда асихронна
я пользуюсь вот таким таймером:

async def checking():
     threading.Timer(60, await check_requests()).start()

и я хочу вызывать функцию в моей основной функции, чтобы это выглядело как-то вот так:

if __name__ == "__main__":
     await checking()
     executor.start_polling(dispatcher, skip_updates=True)

как мне это сделать? Или лучше как-то по-другому реализовать ее работу?
На данный момент я включаю работу этой функции при вводе команды /start
Вот таким образом:

await checking()

и мне выдает такую ошибку:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Users\Serg\AppData\Local\Programs\Python\Python311\Lib\threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "C:\Users\Serg\AppData\Local\Programs\Python\Python311\Lib\threading.py", line 1394, in run
    self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable

threading.Timer - сразу нет. заменяется на loop.call_later
await внутри Timer тоже выполняется сразу, нужна лямбда, но асинхронных лямбд не бывает. разве что create_task  там вставлять.
Но проще
<code>
async def sheduler(period, fu,  *args, **kw):
    while True:
        await asyncio.sleep(period)
        await fu( *args, **kw)

loop = asyncio.new_event_loop() #или asyncio.get_event_loop() если уже есть запущенный луп.

task = loop.create_task(sheduler(60*60, check_requests))

loop.run_forever() # или основной луп бота.
</code>


return self.client._interaction_lookup[self._command_name] KeyError: 'latestsong'
Делаю дискорд бота для своего сервера. Не знаю почему, но резко вылезла эта ошибка. Использую библиотеку interactions.py (последняя версия) для своего бота.
Код:

import interactions
from interactions import slash_command, SlashContext, Embed

# остальной код

@slash_command(description="Get the latest song from KGDPS that has been uploaded to the servers", group_name="extra", group_description="Commands connected with KGDPS Website")
async def song(ctx: SlashContext):
  async with aiohttp.ClientSession() as session:
    async with session.get(f"{link}/bot/latestSong.php") as song:
        song_text = await song.text()

        discordEmbed = Embed(title="Последняя песня с KGDPS", description="Последняя песня с KGDPS", color="#ffffff")

        song_data = song_text.split()
        discordEmbed.add_field(name="ID", value=song_data[3].replace(",", ""), inline=True)
        discordEmbed.add_field(name="Name", value=song_data[5], inline=True)

        await ctx.send(embed=discordEmbed)

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

Task exception was never retrieved
future: <Task finished name='Task-69' coro=<Client._dispatch_interaction() done, defined at /home/runner/bot/venv/lib/python3.10/site-packages/interactions/client/client.py:1763> exception=KeyError('latestsong')>
Traceback (most recent call last):
  File "/home/runner/bot/venv/lib/python3.10/site-packages/interactions/client/client.py", line 1788, in _dispatch_interaction
    if ctx.command:
  File "/home/runner/bot/venv/lib/python3.10/site-packages/interactions/models/internal/context.py", line 311, in command
    return self.client._interaction_lookup[self._command_name]
KeyError: 'latestsong'

Проблема не в коде, а как я понял, в группе. Строчки с ними и вызывали ошибки. Исправленный код:
<code>
@slash_command(description="Get the latest song from KGDPS that has been uploaded to the servers")
async def song(ctx: SlashContext):
      # код
</code>


Не получается создать табуляцию в коде на Python [закрыт]

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

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

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

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

Решил написать код, выводящий таблицу умножения промежутков чисел, вводимых пользователем. но на этапе начала столкнулся с проблемой: '/t' и '/n' не работают - не выводится ни пробела, ни отступа, ни переноса данных на новую строку, выводятся как обычные стринговые символы. С самим форматом отступа я пытался играться как мог: "/ t", " /t ", " / t " - ничего не помогло. Аналогично и с "/n".
<code>
print("*", "/t", "5")
Вывод: * /t 5

print("*", "/n", "5")
Вывод: * /n 5
</code>
Я работаю на Python 3.10, прога PyCharm. посерфив Интернет примерно полчаса не нашел ничего. Может дело в компиляторе? Обновить сам Python или PyCharm? Загрузить библиотеку?
Подскажите, что мне нужно делать.

Вы используете прямой слэш
/, а необходимо обратный
\.

print("*", "\t", "5")
print("*", "\n", "5")

Вывод:

*    5
*
 5


Как возвращать значение из потока внутри генератора, который является обёрткой для другого генератора
Предлагаю сначала взглянуть на неудачный код:

from threading import Thread
from typing import Generator

class MyClass:
    @staticmethod
    def wrapped_generator(generator: Generator, updating_delay: float):
        data = 0

        def thread_function(gen: Generator, delay: float):
            global data
            while True:
                data = next(gen)
                time.sleep(delay)

        thread = Thread(target=thread_function, args=[generator, updating_delay], daemon=True)
        thread.start()

        while True:
            yield data

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

>>> def my_gen():
...     a = 0
...     while True:
...         a += 1
...         yield a

>>> wrap_gen = MyClass.wrapped_generator(my_gen(), 1)
>>> next(wrap_gen)
0
>>> next(wrap_gen)
0
>>> data
5
>>> data
8
>>> next(wrap_gen)
0

Python создал глобальную переменную
data в модуле и поток её обновляет, не беря во внимание локальную
data генератора
wrapped_generator.
Я ещё много каких фишек не знаю в Python, поэтому прошу подсказать, как реализовать задуманное?

Спасибо andreymal за ответ! Работает, как ожидается.

global data →
nonlocal data


Игнорируется первая вводимая строка [закрыт]

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

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

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

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

Помогите новичку! Только начал изучать списки. Нужно создать произвольную матрицу, изначально не задавая кол-во строк и столбцов. Попробовал подобное решение, но не могу понять почему питон просто игнорирует первую введённую строку, и не добавляет её в список, хотя остальные добавляются без проблем.
<code>
a = []
while 1 > 0:
    n = input()
    if n == 'end':
        break
    else:
        n = list(map(int, input().split()))
        a.append(n)
print(a)
</code>

Как написали в комментариях, в блоке
else вы снова вызываете
input(), и не используете то, что запросили до проверки. В вашем коде ещё и возникает ошибка

ValueError: invalid literal for int() with base 10: 'end'

при вводе
end в чётной строке.
Для решения этих проблем, не запрашивайте ввод снова в блоке
else, а используйте прошлый:

a = []
while 1 > 0:
    n = input()
    if n == 'end':
        break
    else:
        n = list(map(int, n.split()))
        #                 ^ вместо `input()` здесь должно быть `n`
        a.append(n)
print(a)

Такая программа работает правильно:

1 2 3
4 5 6
7 8 9
end
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]


Преоброзование Python-кода в исполняемый файл внутри python программы
Как реализовать интерпретирование кода в виде строки в exe файл  в Python-скрипте. То есть:

Пользователь открывает Python-файл.
Внутри файла содержится строка.
Python программа преобразует ту строку в exe и сохраняет.

Если имелось в виду статичная строка, то элементарно,- байткод в переменную, затем
open(file.exe,w).write(byte_code).

data=b'here is bytecode'
with open('name.exe','wb') as exe:
  exe.write(data)

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


Из списка вытащить e-mail
Имеется список со словами, необходимо вернуть электронный адрес.
Условия прописал, но выпадает ошибка TypeError:

list indices must be integers or slices, not str

код:
<code>
text = "мое мыло [email protected]"
text = text.split()
for word in text:
    if text[word].count("@") == 1 and text[word][0] != "@" and text[word].count(".") > 0 and text[word].rfind(".") > text[word].find("@"):
        print(word)
</code>

Вы пытаетесь обратиться к элементам списка text по строковому индексу word, вместо целочисленного. В цикле for переменная word является элементом списка text, а не индексом

text = "мое мыло [email protected]"
text = text.split()

for i in range(len(text)):
  word = text[i]
  if word.count("@") == 1 and word[0] != "@" and word.count(".") > 0 and word.rfind(".") > word.find("@"):
    print(word)

Можно так же использовать регулярные выражение

import re

text = "мое мыло [email protected]"
email = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', text)

if email:
    print(email[0])


python list += str
Есть переменная типа list и  переменная типа str
<code>
lst = [1, 2]
string = 'ab'
lst = lst + string # TypeError: can only concatenate list (not "str") to list
lst += string # [1, 2, 'a', 'b']
</code>
Почему += позволяет это сделать?

+= и
+ это разные операторы, которые вызывают разные специальные (магические) методы.
Для
+= это
__iadd__. Он используется, когда мы хотим изменить существующий объект, если он изменяемый.
Для
+ это
__add__. В этом случае, как правило, создается новый объект.

list реализован на c, но принцип тот же. Вот в данном случае логика класса
list написана так, чтобы он интерпретировал
+= как добавление в список. Разработчики языка подумали о нашем удобстве.


Объясните как работает функция генератор
Я проходил курс и во время изучения генераторов и
yield встретил такой код с непонятным объяснением. Не могли бы вы построчно написать комментарии к функции и сделать общее объяснение

def find_word(file, word):
    g_indx = 0
    for line in file:
        indx = 0
        while (indx != -1):
            indx = line.find(word, indx)
            if indx > -1:
                yield g_indx + indx
                indx += 1

        g_indx += len(line)

Генераторы это итерируемые объекты, но не сохраняющие значения в память, а генерирующие новое значение при попытке получить следующий элемент (По генератору можно пройти циклом только 1 раз и нет доступа к индексам) когда в функции появляется
yield она, останавливает выполнение и передаёт объект в цикл.
К примеру при запуске этого кода:

def find_word(file, word):
    g_indx = 0  # Индекс начала строки в файле
    for line in file:  # Идём по каждой линии
        indx = 0  # Индекс слова в строке
        while (indx != -1):  # Пока есть слово
            indx = line.find(word, indx)  # Находим следующие слово
            if indx > -1:  # Если слово было найдено
                print('Found!')  # Добавил для наглядности
                yield g_indx + indx  # Возвращаем индекс от начала файла
                # Прибавляем к строчному индексу 1
                # Чтобы это слово не находилось find
                indx += 1
        # Добавляем к индексу начала строки её длину
        g_indx += len(line)

for index in find_word("строка 1\n2. строка 2\nТретья строка".splitlines(), "строка"):
    print(index)

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

Found! # Функция выполняется пока не найдёт слово
0      # После передаёт в цикл
Found! # И когда тело цикла отработало продолжает свою работу
11
Found!
26

Следующее значение генератора также можно получить с помощью функции
next(iter)


Число делителей факториала
я написала код по задаче:

По заданному натуральному числу N необходимо вычислить количество
натуральных чисел, которые есть делителями N! (факториала числа N).

Например, при N=4, N!=4·3·2·1=24. Это число имеет следующие делители:
1, 2, 3, 4, 6, 8, 12, 24. Таким образом, искомое количество составляет 8.

Напишите программу, которая по натуральному N, находит количество
делителей его факториала.

Формат входных данных

Единственная строка входного файла содержит одно целое число N (1≤N≤45).

Формат выходных данных

Единственная строка выходного файла должна содержать одно целое
число –найденное количество делителей числа N!

Примеры
входные данные
4
выходные данные
8

входные данные
3
выходные данные
4

Мой код:

from math import factorial
a=int(input())
n=factorial(a)
ans=0
q=1
while q*q<n:
    if n%q==0:
        ans+=2
    q+=1
if q*q==n:
    ans+=1
print(ans)

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

Подумайте вот о чём - для каждого очередного значения факториала
n! нет необходимости заново искать все множители огромного числа, нужно только учесть следующее -
n!= (n-1)!*n, и выяснить, как умножение на
n изменит число множителей. А для этого достаточно разложить на простые множители сравнительно небольшое значение
n и хранить степени уже имеющихся простых множителей, например, в словаре.
Формула для общего числа множителей будет такой:

F = (P2+1)*(P3+1)*(P5+1)*(P7+1)*(P11+1)...*(Pq+1)

где
Pk - степень простого множителя
k.
Например для 5!

 5! = 2^3 * 3 * 5
 Хранится  [3, 1, 1] или {2:3; 3:1; 5:1}
 F = 4 * 2 * 2 = 16

А для 6! на единицу увеличиваются степени двойки и тройки, так что список (в реальности словарь) степеней изменится так

 [4, 2, 1]) или  {2:4; 3:2; 5:1}

И ответ будет

 F = 5 * 3 * 2 = 30

Думаю, этой информации достаточно для решения
Пример нахождения степеней простых чисел:

from collections import Counter
def primes(n):
    res = Counter()
    d = 2
    while n > 1:
        m = 0   #степень множителя
        while n % d == 0:
            m += 1
            n //= d
        if m:
            res[d]  = m
        d += 2 if d > 2 else 1   #после двойки идём по нечётным
    return res

print(primes(840))

Counter({2: 3, 3: 1, 5: 1, 7: 1})

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


Не меняются значения переменных
Мне нужно создать рандомайзер на 3 числа, но я хочу сделать это в 2 файла, в одном механика рандома, в другом просто импорт и вывод чисел, такой код у меня есть:
вот сама механика
<code>
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
spin1 = random.choice(list)
spin2 = random.choice(list)
spin3 = random.choice(list)
data_lotery = {'spin1': spin1, 'spin2': spin2, 'spin3': spin3}
</code>
а в другом файле это просто выводится
Но при импорте в другой файл, значения не меняются, конечно, можно всю механику запихнуть к выводу, но это не красиво, можете подсказать еще пути решения?

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

Не следует использовать в качестве имён переменных зарезервированные в языке имена. В данном случае, Вы используете
list, который является этим самым зарезервированным именем.

Файл, в котором генерируются рандомные числа (
file1.py):

import random

numbers_list = list( range(0, 10) ) # генерирует список от 0 до 9

def generate_random_numbers():
    spin1 = random.choice(numbers_list)
    spin2 = random.choice(numbers_list)
    spin3 = random.choice(numbers_list)

    data_lotery = {
        "spin1": spin1,
        "spin2": spin2,
        "spin3": spin3,
    }

    return data_lotery

Файл, в котором данные числа запрашиваются (
file2.py):

from file1 import generate_random_numbers

data_lotery = generate_random_numbers() # запуск функции из первого файла

print(data_lotery) # Вывод полученных из функции чисел


Получить поля, объявленные в subclass
Допустим, есть класс:

class Base:
    a = 1

    def subclass_fields(self):
        return ... # здесь должно вернуться что-то типа {"b": 2}

и есть класс который отнаследовался от Base:

class MyClass(Base):
    b = 2

Я ожидаю, что метод
subclass_fields вернёт те поля и методы, которых нет в классе
Base, но которые были объявлены в каком-либо из сабклассов - например, при объявлении нового класса
MyClass2:

class MyClass2(MyClass):
    c = 3

c = MyClass2()
print(c.subclass_fields) # {"b": 2, "c": 3}

Могу предложить такой способ:

class Base:
    a = 1

class MyClass(Base):
    b = 2

class MyClass2(MyClass):
    c = 3

def get_subclacc_fields(obj):
    k = v = None
    for k, v in globals().items():
        try:
            if isinstance(obj, v):
                my_dir = set(dir(obj.__class__)) - set(dir(v)) # тут получаем все поля, которых нет у базового parent-а
                return {name: mc.__getattribute__(name) for name in my_dir} # а тут бежим по ним и забираем значения
        except:
            pass
    return dict()

mc = MyClass2()
print(get_subclacc_fields(mc))

Вывод:

{'c': 3, 'b': 2}

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