Нужен совет, как лучше реализовать модель статей и файлов на django? [закрыт]

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

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

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

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

Всем добрый день. Пришел за советом.
Как лучше реализовать модели статьи и файлы, где будут одинаковые поля, но файлы будут лишь отличаться тем, что там будет на 2-3 поля больше. Категории те же самые.
Может сделать одну модель, но не заполнять некоторые поля, которые предназначены для файла? Но тут возникает то, что в файлах больше полей - мешать будут.
А фильтровать потом как их отдельно? Скорее только по категориям.
А возможно ли сделать так, чтоб допустим при добавлении с админки, или с сайта, мы могли выбрать будет это файл или статья? И для тех в последствии выводить нужные поля?
Если есть пример такой штуки, скиньте пожалуйста для изучения.

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

class BaseModel(models.Model):
    field1 = ...
    ...

    class Meta:
        abstract = True

class FileModel(BaseModel):
    file_field = ...
    ...

class Article(BaseModel):
    article_field = ...

фильтровать сможешь как обычно

   Article.objects.filter(...)
   FileModel.objects.filter(...)

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

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article

class FileForm(forms.ModelForm):
    class Meta:
        model = FileModel

и тогда во view, который отвечает за редактирование

def file_or_article_edit_view(request, object_type='file'):
    available_form_classes = {
       'file': FileForm,
       'article': ArticleForm,
    }
    form_class = available_form_classes.get[object_type]
    form = form_class(request.POST or None)
    if request.POST and form.is_valid():
          form.save()

    return render(request, 'template_name.html', {
        'form': 'form',
    })


Как последовательно посчитать сумму n элементов в массиве?
Пример: есть список
change(3,5,7,1,6,8,2,4)  и в нем мне надо сложить последовательные группы - "окна" - по 3 элемента от каждого элемента в списке:

3+5+7 ==> 5+7+1 ==> 7,1,6 ==> 1,6,8

и т.д.`
Как это можно реализовать?

Если вы хотите реализовать сумму элементов в скользящем окне из трех элементов:

data = [3,5,7,1,6,8,2,4]
res = [sum(data[i:i+3]) for i in range(len(data))]
print(res);

Вывод:
[15, 13, 14, 15, 16, 14, 6, 4]

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

print( [data[i:i+3] for i in range(len(data))] )

Вывод:
[[3, 5, 7], [5, 7, 1], [7, 1, 6], [1, 6, 8], [6, 8, 2], [8, 2, 4], [2, 4], [4]]


Как отсортировать словарь по убыванию?
Есть словарь:

users_database = {
'609629735': {'balance': 1, 'full_name': 'Anonymous Anonymously'},
'639141904': {'balance': 32, 'full_name': '𝓜𝓪𝔁𝓲𝓶'}
}

Как его можно отсортировать по убыванию значения в 'balance'?
Мне необходимо получить:

users_database = {
'639141904': {'balance': 32, 'full_name': '𝓜𝓪𝔁𝓲𝓶'},
'609629735': {'balance': 1, 'full_name': 'Anonymous Anonymously'}
}

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

users_database = {k: users_database[k]['balance'] for k in sorted(users_database, key=users_database.get('balance'), reverse=True)}

и

users_database = sorted(users_database, key=lambda x: int(x['balance']))

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

Для сортировки данных в Python используют встроенную функцию sorted():

res = dict(sorted(users_database.items(),
                  key=lambda x: x[1].get("balance"),
                  reverse=True))

результат:

In [281]: res
Out[281]:
{'639141904': {'balance': 32, 'full_name': '𝓜𝓪𝔁𝓲𝓶'},
 '609629735': {'balance': 1, 'full_name': 'Anonymous Anonymously'}}


спарсить json данные
Имеется вот такой вид json. Нужно спарсить каждый "description"

{
    "orders": [{
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "9cd5f01fd3ed41a384faf04f28e79fb0",
        "orderId": "F2102211351463616",
        "createdAtMillis": 1613915506904,
        "updatedAtMillis": 1613915812732,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "Rage 2",
            "quantity": 1,
            "sellerName": "Bethesda Softworks LLC",
            "amount": "€0.00",
            "price": 0,
            "offerId": "26c8bec5ae4f44b6b942b9564e81cafc",
            "namespace": "2736ab9fec9c4a93a7a2872ed5154d4b"
        }],
        "merchantGroup": "EGS_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "f2131f08c7b84846a20b24b3c7b2c0cd",
        "orderId": "F2102211351122654",
        "createdAtMillis": 1613915472074,
        "updatedAtMillis": 1613915781238,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "Absolute Drift",
            "quantity": 1,
            "sellerName": "Funselektor Labs INC",
            "amount": "€0.00",
            "price": 0,
            "offerId": "0c90d229f27a4251beee8b4776a8fb44",
            "namespace": "9d2f484bbec64aa8ad234b3199dcaf1c"
        }],
        "merchantGroup": "EGS_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "352482c2e2154a9b9fdcc88844ef0c97",
        "orderId": "F2101161925140636",
        "createdAtMillis": 1610825114658,
        "updatedAtMillis": 1610825430967,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "STAR WARS™ Battlefront™ II: Celebration Edition",
            "quantity": 1,
            "sellerName": "Electronic Arts",
            "amount": "€0.00",
            "price": 0,
            "offerId": "ea7721c6c2694e72813d3661bc68a2cb",
            "namespace": "b156c3365a5b4cb9a01a5e1108b4e3f4"
        }],
        "merchantGroup": "EGS_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "8ade8367038f466680ac409314558f18",
        "orderId": "F2012230623264687",
        "createdAtMillis": 1608704606373,
        "updatedAtMillis": 1608704924545,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "Metro: 2033 Redux",
            "quantity": 1,
            "sellerName": "Koch Media",
            "amount": "€0.00",
            "price": 0,
            "offerId": "0dfa5a4398bb44c8b1ac34e5f248fab9",
            "namespace": "petunia"
        }],
        "merchantGroup": "EGS_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "8aa6235d14074563888b7f5f42d5ba36",
        "orderId": "F2012180536511836",
        "createdAtMillis": 1608269811295,
        "updatedAtMillis": 1608270144128,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "Cities: Skylines",
            "quantity": 1,
            "sellerName": "Paradox Interactive",
            "amount": "€0.00",
            "price": 0,
            "offerId": "bf83aee67dd1475fb6bf2c8563f14b70",
            "namespace": "6009be9994c2409099588cde6f3a5ed0"
        }],
        "merchantGroup": "EGS_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "54f46a5a8a5d40fe8aa52a96da3b6ee3",
        "orderId": "F2012020608280986",
        "createdAtMillis": 1606889308864,
        "updatedAtMillis": 1606889627698,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "MudRunner",
            "quantity": 1,
            "sellerName": "Focus Home",
            "amount": "€0.00",
            "price": 0,
            "offerId": "7aea960be7dd4d86a9b30cf5daa03eeb",
            "namespace": "6bff1c13a8884b518bd44acaf691ddba"
        }],
        "merchantGroup": "EGS_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "b321270fbcf34ca8ad41146adad32d14",
        "orderId": "A2011161441388942",
        "createdAtMillis": 1605537698556,
        "updatedAtMillis": 1605537778444,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 799,
        "presentmentAmount": "€7.99",
        "items": [{
            "description": "1,000 V-Bucks",
            "quantity": 1,
            "sellerName": "Epic Games",
            "amount": "€7.99",
            "price": 799,
            "offerId": "ede05b3c97e9475a8d9be91da65750f0",
            "namespace": "fn"
        }],
        "merchantGroup": "FN_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": false,
        "receiptId": null,
        "orderId": "F2011101619334264",
        "createdAtMillis": 1605025173158,
        "updatedAtMillis": 1605025173229,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "Throwback Axe",
            "quantity": 1,
            "sellerName": "Epic Games",
            "amount": "€0.00",
            "price": 0,
            "offerId": "4a238a27ef134a60bbaf2fbccb5bfad0",
            "namespace": "fn"
        }],
        "merchantGroup": "FN_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": false,
        "receiptId": null,
        "orderId": "F2009241523041436",
        "createdAtMillis": 1600960984697,
        "updatedAtMillis": 1600960984767,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "Rocket League®",
            "quantity": 1,
            "sellerName": "Psyonix LLC",
            "amount": "€0.00",
            "price": 0,
            "offerId": "02d44be4c21c4ce094c6151133c91482",
            "namespace": "9773aa1aa54f4f7b80e44bef04986cea"
        }],
        "merchantGroup": "EGS_MKT"
    }, {
        "orderStatus": "COMPLETED",
        "canSendReceipt": true,
        "receiptId": "2f0e7924d6fe429488c6fdd7e5c18327",
        "orderId": "F2009221625553636",
        "createdAtMillis": 1600791955220,
        "updatedAtMillis": 1600792258377,
        "parentOrderId": null,
        "currency": "EUR",
        "price": 0,
        "presentmentAmount": "€0.00",
        "items": [{
            "description": "Watch Dogs 2",
            "quantity": 1,
            "sellerName": "Ubisoft Entertainment",
            "amount": "€0.00",
            "price": 0,
            "offerId": "60d05e5e3a154257a22d6d49810b4b89",
            "namespace": "angelonia"
        }],
        "merchantGroup": "EGS_MKT"
    }],
    "count": 10,
    "start": 0,
    "total": 42
}

Пытаюсь спарсить вот так:

r = request.get(html)
data = json.loads(r.text)
disc = data['orders']['items']['description']
print(disc)

Ну и собственно не парсит.
Получаю такую ошибку
indices must be integers or slices, not str

Воспользуйтесь dpath:

from dpath import util as dpu  # pip install dpath

r = request.get(html)
data = r.json()
res = dpu.values(data, "**/description")

результат:

In [273]: res
Out[273]:
['Rage 2',
 'Absolute Drift',
 'STAR WARS™ Battlefront™ II: Celebration Edition',
 'Metro: 2033 Redux',
 'Cities: Skylines',
 'MudRunner',
 '1,000 V-Bucks',
 'Throwback Axe',
 'Rocket League®',
 'Watch Dogs 2']


Python как достать название полей класса
<code>
class W:
    def __init__(self, first, second):
        self.first = first
        self.second = second
</code>
как сделать output "first, second"

class W:
    def __init__(self, first, second):
        self.first = first
        self.second = second

W(None, None).__dict__.keys()


Python Как достать название переменной переданной в аргументы функции
<code>
def sample(objectName):
    # variable_name==objectName
    variable_name = [k for k, b in locals().items() if b == []][0]
    return variable_name
name=[]
print(sample(name))#output = objectName, а мне нужно чтоб name

</code>
Есть какие-то способы?

Имена переменных функции Вам могут быть нужны если вы передаете именованный параметр:

def fun(name):
    print(name)

s = "Hello"
fun(s) # Как позиционный
fun(name = s) # как именованный

# относительно списка
l = ["a", "b", "c"]

for i in l:
    fun(i)

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


где найти учебник или руководство по изучению Prettytable
нигде в интернете не могу найти самоучитель или руководство по изучению prettytable. Желательно подробно и в русской версии. Как делать в таблице расчеты, регулировать ширину строк, перенос строк, делать ссылки и прочее. Подскажите, пожалуйста.

В идеале неплохо бы прочитать официальную документацию PrettyTable.

Так же вот есть неплохой туториал.

Туториал с GitHub.

Небольшой видеоролик с кратким туториалом.


неправильная запись в файл, засписывается только последнее значение
Не могу понять, не варит на ночь глядя бошка вообще. Смысл в том, что использую f строки, с помощью них создаётся 6 файлов типа
result2_hostname1
result2_hostname2
result2_hostname3 и т.д. В каждом из этих файлов есть строки. Хочу взять все эти файлы, и объединить в один.
С помощью моего варианта скрипта, в конечном виде в
print(line) вижу всё как я хотел, а когда делаю
f_out.write(line) записывается только результат последнего файла, т.е. строки из
result2_hostname6.
Нужны все строки во всех файлах, в одном конечном.
Вариант моего скрипта:

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
file = open('C:/Users/sx01/Desktop/Python3/13/new/hosts.txt', 'r')
for line in file:
    info = {}
    info['ip'], info['hostname'], *_ = line.split()

    try:
        with open(f'C:/Users/sx01/Desktop/Python3/13/new/result2_{info["hostname"]}') as f_in, open(f'C:/Users/sx01/Desktop/Python3/13/new/result_good','w') as f_out:
            for line in f_in:
                print(line)
                f_out.write(line)

    except Exception as e:
        error_log = str(e)
        print('error_log')

file.close()

Потому что результат print() остаётся на экране навсегда, а флаг w при открытии файла говорит о том, что каждый раз содержимое файла перезаписывется.
Так что запись в файл правильная. Нужно просто использовать правильный режим работы с файлом.
Ещё на тему
Запись файла в цикле while на python


Как сделать чтобы бот «ответил» на нажатие пользователя на определенный элемент в клавиатуре (telebot)?
Нужно чтобы бот отвечал при нажатии на кнопку 'Give me a random number, please' определенное сообщение.
Трудность состоит в том, что я не знаю как сделать так, чтобы бот что-то ответил на нажатие кнопки
Код:
<code>
import random

keyboard1 = telebot.types.ReplyKeyboardMarkup(True, True)
keyboard1.row('Give me a random number, please')
number = random.random()

bot = telebot.TeleBot("APIKEY")

@bot.message_handler(commands=['start'])
def send_welcome(message):
    bot.send_message(message.chat.id, "Hi, this is a bot which can send u a random number \nEnjoy!", reply_markup=keyboard1)
    if message.text.lower() == ("Give me a random number, please"):
        bot.send_message(message.chat.id, number)

bot.polling() ```
</code>

Ваше условие приводит входящий текст к нижнему регистру, но проверяется с разным:

message.text.lower() == ("Give me a random number, please"):

Надо

message.text.lower() == ("give me a random number, please"):


python как читать текст из файла по тире
как с помощью python прочитать текст который разделен тире например у меня есть txt файл в нем написаная такая информация:
--time рандомная цифра
как сделать чтобы программа открыла файл и написала рандомную цифру которая в файле

import re

with open('test.txt', 'r') as file:

    s = re.findall('--time \d+', file.read())
    for i in s:
        print(i.split()[1])

test.txt

 rr --time 423423  fsd
hf --time 423865423 fsdfs
vb --time 423424523 dfsdf
--time 654
--time 345  dfsdfs
--time 42534

вывод:

423423
423865423
423424523
654
345
42534


Как заменить в списке 0 на NaN?
Нахожу замену
NaN на 0, а вот наоборот, не нахожу.
Как заменить заначения в списке на
Nan?

[0,
 0,
 0,
 0,
 0,
 0,
 0,
 0]

Для обычного (
"vanilla Python") списка:

res = [x if x else float("nan") for x in lst]

Пример:

In [256]: lst = [0,1,0,2,0,0,3]

In [257]: res = [x if x else float("nan") for x in lst]

In [258]: res
Out[258]: [nan, 1, nan, 2, nan, nan, 3]


Надо взять первый элемент каждого списка
<code>
b = [el[0] for el in a]
</code>


Как найти все теги по вхождению в название класса с помощью BeautifulSoup Python?
Дана структура:

<td class='1234_sfsfs'><span eu='333'></span></td>
<td class='1234_fddfd'><span eu='fkdjnv'></span></td>
<td class='1234_bjnieujrini'><span eu='kdfjnvk'></span></td>
<td class='11234_fddfd'><span eu='dkdv'></span></td>
<td class='fddfd'><span eu='vd'></span></td>

Как можно с помощью BeautifulSoup найти все теги
td у которых в названии класса есть
'1234_', далее внутри них найти тег
<span> у него уже достать имя атрибута
eu

soup.find_all('td', class_='?')find('span').get('eu')

from bs4 import BeautifulSoup
import re

html_doc = """<td class='1234_sfsfs' eu='333'></td>
<td class='1234_fddfd' eu='fsvs'></td>
<td class='1234_bjnieujrini' eu='bbbbc'></td>
<td class='11234_fddfd' eu='fsvs'></td>
<td class='fddfd'></td>"""

soup = BeautifulSoup(html_doc, 'html.parser')

links = [item['eu'] for item in soup.findAll('td', attrs={'class':re.compile("1234_")})]

for i in links:
    print(i)


Преобразовние списка [дубликат]

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

Как преобразовать массив в лист

                                (1 ответ)

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

Как преобразовать
a = array([1921, 1922, 1924]) в
b = [1921, 1922, 1924]

Если
array - это numpy.ndarray, то можно воспользоваться методом ndarray.tolist():

b = a.tolist()

результат:

In [246]: b
Out[246]: [1921, 1922, 1924]

UPD: в отличие от использования
list(arr),
arr.tolist() будет ожидаемо работать для двухмерных и более матриц:

In [247]: a = np.arange(6).reshape(2,3)

In [248]: a
Out[248]:
array([[0, 1, 2],
       [3, 4, 5]])

In [249]: list(a)
Out[249]: [array([0, 1, 2]), array([3, 4, 5])]

In [250]: a.tolist()
Out[250]: [[0, 1, 2], [3, 4, 5]]


Django, обновить данные поля по идентификатору
Есть страница с информацией, со своим id,
не получается обновить данные по идентификатору
выдаёт ошибку 'str' object has no attribute 'id'
views.py
<code>
def page(request, pk):
    item = Act.objects.get(pk=pk)

    if request.method == 'POST':
        enter_act(self=pk)
        return redirect('main')

    return render(request, 'act_page/act_page.html', {"item": item})

def enter_act(self):
    with connection.cursor() as cursor:
        cursor.execute('UPDATE main_act SET descr=123 WHERE id = %s', [self.id])
</code>
Если написать WHERE id = id ,то все поля descr будут иметь значение 123, а мне нужно только то, которое редактируем

Используйте мощь ORM
<code>
Act.objects.filter(pk=pk).update(descr=123)
</code>


Как при помощи js или python получить размер окна браузера и передать этот размер в css файл?
Как при помощи js или python получить размер окна браузера и передать этот размер в css файл ?
Предположим у меня есть следующий блок div:

    <div class="saitpage"></div>

и css файл:

    .saitpage {
       margin-left: здесь должен быть размер окна;
    }

Как мне передать полученный размер окна в css файл ?

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

const pageWidth = document.documentElement.scrollWidth;
document.querySelector('.saitpage').style.marginLeft = pageWidth + 'px';

.saitpage {
  width: 100px;
  height: 100px;
  background: red;
}

<div class="saitpage"></div>


Как выбрать строки, содержащие в столбце данные, которые есть в столбце другого фрейма данных?
Есть фрейм
df1:

    a   b   c   d
0  23   4  34  12
1  24  25  34   2
2  43  11  77  87
3  34   2   2  34
4   3  55  19  11
5  42  74  29  44
6  54   9  11  12

и
df2:

    b
0   4
1  11
2   2
3   9

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

    a   b   c   d
0  23   4  34  12
2  43  11  77  87
3  34   2   2  34
6  54   9  11  12

Мой код возвращает вообще булевы значения:

import pandas as pd

df1 = pd.DataFrame([[23, 4, 34, 12], [24, 25, 34, 2], [43, 11, 77, 87],
                   [34, 2, 2, 34], [3, 55, 19, 11], [42, 74, 29, 44], [54, 9, 11, 12]])
df2 = pd.DataFrame([[4], [11], [2], [9]])
df1.rename({0: 'a', 1: 'b', 2: 'c', 3: 'd'}, axis=1, inplace=True)
df2.rename({0: 'b'}, axis=1, inplace=True)

df3 = df2['b'].isin(df1['b'])

print(df3)


Хотел сделать миграции после создания модели user в приложение user и вот что
Люди, попытался сделать миграции
<code>
python manage.py migrate
    Traceback (most recent call last):
      File "manage.py", line 22, in <module>
        main()
      File "manage.py", line 18, in main
        execute_from_command_line(sys.argv)
      File "/home/ilya/Рабочий стол/REST/venv/lib/python3.8/site-
   packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
      File "/home/ilya/Рабочий стол/REST/venv/lib/python3.8/site-
   packages/django/core/management/__init__.py", line 395, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/home/ilya/Рабочий стол/REST/venv/lib/python3.8/site-
   packages/django/core/management/base.py", line 330, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/home/ilya/Рабочий стол/REST/venv/lib/python3.8/site-
   packages/django/core/management/base.py", line 371, in execute
        output = self.handle(*args, **options)
      File "/home/ilya/Рабочий стол/REST/venv/lib/python3.8/site-
   packages/django/core/management/base.py", line 85, in wrapped
        res = handle_func(*args, **kwargs)
      File "/home/ilya/Рабочий стол/REST/venv/lib/python3.8/site-
   packages/django/core/management/commands/migrate.py", line 95, in handle
        executor.loader.check_consistent_history(connection)
      File "/home/ilya/Рабочий стол/REST/venv/lib/python3.8/site-
   packages/django/db/migrations/loader.py", line 302, in check_consistent_history
        raise InconsistentMigrationHistory(
    django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial
    is applied before its dependency user.0001_initial on database 'default'.
</code>

У кого такая же проблема - надо было просто удалить все миграции вручную!
Спасибо  Captain Mountain

удалите все файлы прошлых миграций и сделайте заново makemigrations и migrate – Captain Mountain


Как поочередно записать в файл списки и строку?
Есть два списка и одна строка:

l1 = ["g", "gg", "ggg"]
l2 = ["1", "11", "111"]
s1 = ("some text")

нужно записать в файл это все так чтобы получилось вот это:

g
some text
1
gg
some text
11
ggg
some text
111

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


Подскажите, пожалуйста, как сделать так, чтобы при подключении к голосовому каналу в лог-канал отправлялся embed c временем подключения
<code>
data = time.strftime('%x')
enter_time = time.strftime('%X')
@bot.event
async def on_voice_state_update(member,before,after):
    global enter_time
    global data
    global mess
    if after.channel != None:
        if after.channel.id == 817812456155381820:
            log_voice_channel = bot.get_channel(817800317856907314)
            emd = discord.Embed(title='Оповещение о подключении пользователя  к голосовому каналу',colour=0xd90000)
            emd.add_field(name='Пользователь:',value=member.mention)
            emd.add_field(name='Время подключения:',value=enter_time,inline=False)
            emd.add_field(name='Дата подключения:',value=data,inline=False)
            await log_voice_channel.send(embed = emd)
</code>

Вам необходимо поместить переменные data и enter_time внутрь функции. У Вас получится:
<code>
@bot.event
async def on_voice_state_update(member,before,after):
   data = time.strftime('%x')
   enter_time = time.strftime('%X')
   if after.channel != None:
       if after.channel.id == 817812456155381820:
           log_voice_channel = bot.get_channel(817800317856907314)
           emd = discord.Embed(title='Оповещение о подключении пользователя  к голосовому каналу',colour=0xd90000)
           emd.add_field(name='Пользователь:',value=member.mention)
           emd.add_field(name='Время подключения:',value=enter_time,inline=False)
           emd.add_field(name='Дата подключения:',value=data,inline=False)
           await log_voice_channel.send(embed=emd)
</code>


Как заполнить список с NaN?
Как получить список
list с 100
NaN?

list = [NaN,NaN,NaN,NaN,NaN,NaN ........ ]

nan можно получить так:
float('nan'). Для получения списка повторяющихся элементов можно использовать или list comprehension:

x = [float('nan') for _ in range(100)]

или
repeat из
itertools:

from itertools import repeat

x = list(repeat(float('nan'), 100))

или через "умножение" списка:

x = [float('nan')] * 100


Сумма цифр шестнадцатеричного числа [закрыт]

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

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

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

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

Найти однозначное число которое получается вычислением суммы цифр шестнадцатеричного числа(беззнаковое) n (повторно).
Пример:

40820A2 -> 4 + 0 + 8 + 2 + 0 + A + 2 = 1A;
1A -> 1 + A = B

Т.е. происходит преобразование

40820A2 -> B

Ы?

print(hex(int(input(),16)%15))

С учетом замечания @Danis

r = int(input(),16)%15
print(hex(r if r > 0 else 15))

Да, еще если исходное значение 0 - то 0...


Удалить лишние символы в list python
мне нужно записывать данные из txt в sqlite3.
С этим я разобрался
<code>
print("Введите полную ссылку к txt файлу, например D:\\Codding\\Work\\Python ")
Ab = input("Введите сюда ")

con = sqlite3.connect("D:\\Codding\\Work\\Python\Works\\Bot for searching\\base.bd")
curs = con.cursor()
blb = open(Ab, 'r', encoding='utf-8')

file_data = [i.strip('\n').split(';') for i in blb]

curs.executemany('INSERT INTO dann_Vk VALUES (?, ?, ?, ?, ?, ?, ?)', file_data )
con.commit()
print("Успешно")

</code>
Также мне нужно, чтобы в одном столбце удалялись автоматом лишние символы, например везде записаны номера вот так: (8)9765431271
А в базу записывалось вот так: 89765431271
Как это реализовать?

как вариант

import re
oldstr = "(8)324729472"
newstr = re.sub('[()]', '', oldstr)
print(newstr)

вот может поможет:

file_data = [re.sub('[()]', '', i).strip('\n').split(';') for i in blb]


Как сделать правильный поворот объекта?
Я хотел сделать небольшую демку на pygame. В моей демке есть летящие ножи, при нажатии на клавишу b, они появляются.
<code>
def knife(list, key):
    surf = pygame.image.load("knife.png")
    surf = pygame.transform.scale(surf, (80, 20))
    rect = surf.get_rect(bottomright=(list, 630))
    if knifeRotate == "left":
        surf = pygame.transform.flip(surf, True, False)
    sc.blit(surf, rect)

if keys[pygame.K_b] and (xKnife < 1280 or xKnife > 0):
    knife = True

if knife == True:
    Diego.knife(xKnife, keys)
if keys[pygame.K_RIGHT] and not keys[pygame.K_LEFT]:
    x += speed
    sprite += 1
    knifeRotate = "right"
elif keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT]:
    x -= speed
    sprite += 1
    knifeRotate = "left"
else:
    sprite = 0
</code>
Мне нужно чтобы при их вызове они летели в одну сторону, но если нож не исчез и ходишь влево или вправо, он изменяет траекторию своего полёта.
Как это исправить?
Если я дал недостаточно информации, напишите пожалуйста.

# прежде всего нужно убедится что переменная будет меняться
knife = keys[pygame.K_b] and (xKnife < 1280 or xKnife > 0)

if knife == True: # это условие должно быть общим мне кажется
    Diego.knife(xKnife, keys)
    if keys[pygame.K_RIGHT] and not keys[pygame.K_LEFT]:
        x += speed
        sprite += 1
        knifeRotate = "right"
    elif keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT]:
        x -= speed
        sprite += 1
        knifeRotate = "left"
    else:
        sprite = 0


О случае спискового включения над несколькими списками
Любая определённая функция, к примеру:

def sum(x,y):
    sume = 0
    x = 0
    x += (x[i] - x[i-1])**2
    y = 0
    y += (y[i] - y[i-1])**2
    sume = (x+y)**0.5
    return sume

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

[sum(i,j) for i,j in zip(x,y)]

где х и у:

x = random.randint(5,100)
y = random.randint(5,100)

вывод сообщает, что 'int' object is not iterable. Я подумал, что причина в том, что локальные и глобальные одним именем (в функции локальные действительно int). Но переименование действия не возымело. Сам подход не верен? спасибо

Все верно, вы передали в zip числа в качестве аргументов, что не соответствует его сигнатуре
Полагаю, вы хотели передать туда что-то такое:
<code>
x = range(random.randint(5,100))
y = range(random.randint(5,100))
</code>


О математической функции от нескольких аргументов
Положим, надо посчитать (b-a)/2 * (f(a) - f(b)), где f - любая функция.
<code>
def func(f1, f2, a, b):
    dif = f1 - f2
    approx = (b - a)/2 * dif
    return approx
from math import cos
a = 0
b= 1
f1 = cos(a)
f2 = cos(b)
func (f1, f2, 0,1)
</code>
это можно было сделать как-то рациональнее? спасибо

def func(f,a,b):
    dif = f(a) - f(b)
    return (b - a)/2 * dif

Так достаточно рационально?

print(func(cos,0,1))


Как достать из строки все до :
Есть txt файл с подобным содержанием

Taichtamuu:z5US6pqrGiH7Mh:[email protected]
Keaksagimi:jMMZwDViXa85XtG:Vebnap[email protected]
Liepnalot:gsUvuXcatlVoR:[email protected]
Gevimnyuov:rlnYyvEk6kLthA:[email protected]
Siihzidari:pS8HvYg6lQUcp:Levabaane1[email protected]
Keebapitn:VVHW3MD9oX4u7ox:[email protected]

нужно из этого создать 3 списка с вот таким содержанием

1 список ["Taichtamuu", "Keaksagimi", "Liepnalot", "Gevimnyuov", "Siihzidari", "Keebapitn"]
2 список ["z5US6pqrGiH7Mh", "jMMZwDViXa85XtG", "gsUvuXcatlVoR", "rlnYyvEk6kLthA", "pS8HvYg6lQUcp", "VVHW3MD9oX4u7ox"]
3 список ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "Leva[email protected]", "[email protected]"]

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

С помощью
циклов и
split'ов.

user_names = [] # Создаем список для юзернеймов

passwords = [] # Для паролей

mails = [] # Для почт

with open('somr_file', 'r', encoding='utf-8') as input_file: # Открываем нужный файл
    input_data = input_file.read().split('\n') # Читаем его и делим на строки.

    for line in input_data:
        splitted_line = line.split(':') # Делим строку по знаку ':'
        user_names.append(splitted_line[0])
        passwords.append(splitted_line[1])
        mails.append(splitted_line[2])
        # Добавляем 1 полученное слово после деление в список user_names, 2 - в passwords, 3 - в mails.

print(user_names)
print(passwords)
print(mails)

#Выводим на экран.


Как узнать максимальный размер шрифта текста который может поместиться в прямоугольник (Pygame)?
Я хочу сделать кнопку на pygame. Мне известны её ширина и длина, а также количество символов в тексте. Кнопка состоит из прямоугольника и текста в нём. Форматирование текста: идеально посередине %. Для этого мне нужно определить: какой максимальный размер шрифта может поместиться в прямоугольнике.
% = одно и то же значение для промежутка между верхом поверхности текста и верхом кнопки (аналогично с низом), для промежутка между левым краем поверхности текста и левым краем кнопки (аналогично с правым). Эти промежутки не обязательно равны.
<code>
class button:
    def init(self, width, height, text):
        self.rect = pygame.Rect(0, 0, width, height)
        self.text_surface = pygame.font.SysFont('consolas', ТУТ РАЗМЕР ШРИФТА).render(text, False, (0, 0, 0))

    def draw(self):
        pg.draw.rect(win, (255, 255, 255), self.rect)

        ## Второй аргумент функции blit отвечает за "идеально посередине"
        win.blit(self.text_surface, ((self.rect[2] - self.text_surface.get_rect()[2]) // 2, (self.rect[3] - self.text_surface.get_rect()[3]) // 2)
</code>
Если всё ещё не понятно (что скорее всего правда), то, коротко, проблема в том что я хочу отрисовать текст посередине и в границах кнопки а если сделать его слишком большим или слишком маленьким, то текст будет выходить за рамки

Возможно, код слишком громоздкий, но он рабочий. Размер учитывается и по вертикали и по горизонтали.
<code>
def get_diff(font_name,standart_size,ind=0):
    '''
    Функция получает разницу в пикселях, достаточной для изменения размера шрифта на 1 пункт в нужном измерении
    ind=0 - по оси x
    ind=1 - по оси y
    '''
    x=pygame.font.SysFont(font_name, standart_size).render(".", False, (0, 0, 0)).get_size()[ind]
    y=x
    newSize,i=0,0
    while y==x:
        newSize=standart_size+i
        y=pygame.font.SysFont(font_name, newSize).render(".", False, (0, 0, 0)).get_size()[ind]
        i+=1
    return newSize-standart_size

class button:
    def __init__(self, width, height, text,font_name="consolas",stpos=[0,0]):
        self.rect = pygame.Rect(0, 0, width, height)
        self.stpos=stpos

        # Получение стандартных размеров для буквы, конкретного шрифта
        width_simb,height_simb=pygame.font.SysFont(font_name, 10).render(".", False, (0, 0, 0)).get_size()
        diff_x,diff_y=get_diff(font_name,10),get_diff(font_name,10,ind=1)
        #Максимальное увеличение надписи для упаковки
        size=(width//diff_x)

        self.text_surface = pygame.font.SysFont(font_name, size).render(text, False, (255,255,255))
        surf_size=self.text_surface.get_size()

        #"Упаковка" надписи в вертикальные границы
        if self.text_surface.get_height()>height:
            while surf_size[1]>height:
                self.text_surface = pygame.font.SysFont(font_name, size).render(text, False, (255,255,255))
                surf_size=self.text_surface.get_size()
                size-=1
        #"Упаковка" надписи в горизонтальные границы
        if self.text_surface.get_width()>width:
            while surf_size[0]>width:
                self.text_surface = pygame.font.SysFont(font_name, size).render(text, False, (255,255,255))
                surf_size=self.text_surface.get_size()
                size-=1
        '''
        После упаковки может остаться 2 пикселя до границы кнопки
        Примечание: для шрифта "consolas" упаковка не требуется
        '''
    def draw(self):
        '''
        Добавлен параметр self.stpos для стартовой позиции
        '''
        pygame.draw.rect(win, (0, 0, 255), [self.stpos[0],self.stpos[1],self.rect.width,self.rect.height])
        win.blit(self.text_surface, (self.stpos[0]+(self.rect[2] - self.text_surface.get_rect()[2]) // 2, self.stpos[1]+(self.rect[3] - self.text_surface.get_rect()[3]) // 2))

</code>


автозапуск программы python
есть программа, скомпилированная далее в .exe файл
пытаюсь сделать так, чтобы если оно было активно, то при перезапуске пк, автоматически открывалось
придумал такой вариант:
программа стартанула, записала себя в автозапуск, перед "нормальным" завершением работы программы она удалила себя из автозапуска.
как сделать так, чтобы программа сама себя добавила в автозапуск и при нормальном завершении удалила себя оттуда?
код программы:
<code>
import tkinter
master = tkinter.Tk()
canvas = tkinter.Canvas(master, bg='blue', height=300, width=600)
canvas.pack()
master.mainloop()
</code>

Например так:
<code>
import sys
import os
import tkinter

path = sys.argv[0]
file_name = path.split('\\')[-1]
startup_path = '"%Appdata%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\"'

os.system(f'copy {path} {startup_path}') # копируем себя

root = tkinter.Tk()
root.mainloop()

os.system(f'del {startup_path+file_name}') # удаляем себя
</code>


Заменить значение у ключа, если оно None
Есть словарь
d, некоторые значения которого могут быть
None. Как заменить определённое значение ключа
k на
v, если оно равно
None?

d = {'k1': None, 'k2': 42}
k = 'k1'
v = 42

if d[k] is None:
    d[k] = v

Проблема в том, что тут 2 доступа по ключу. Можно ли сделать это за 1 доступ?

вариант 1:

d[k] = v if d[k] is None else d[k]

вариант 2:

d = dict((key, v if key == k and value is None else value) for key, value in d.items())

вариант 2 хорош тем, что если ключ
k отсутствует в словаре, то не будет ошибки, а для первого случая пришлось бы делать код:

if k in d:
    d[k] = v if d[k] is None else d[k]

или вообще:

if k in d and d[k] is None:
    d[k] = v


Как достать переменную из функции Python?
Дана структура:
<code>
m = 0
def a():
    i = 2
</code>
Как можно вытащить переменную i из функции и ее переприсвоить m?

У функций своя область видимости, получить доступ к внутренним переменным из вне не получится. Но функция может возвращать значение/значения
<code>
def a():
    i = 2
    return i

m = a()
</code>


Удаление ненужных символов из pandas
У меня огромный объем данных (155000 текстовых комментариев). Для последующего обучения нужно убрать ненужные символы (#,&,XX/XXXX итд). Делаю я обработку данных с помощью следующей функции:
<code>
file = pd.read_csv('X_train.csv',sep = ',', parse_dates=['Date received'])

def preprocessor(text):
    l = len(text)
    for i in range(l):
        text[i] = text[i].lower()
        text[i] = re.sub("x{2}", " ", text[i])
        text[i] = rg.sub(r'[^\pL\p{Space}]', " ", text[i])

title = file['title']
preprocessor(title)
</code>
title - это столбец с комментариями (т.е. с текстом, который нужно будет в дальнейшем использовать в модели Машинного обучения).
Но выполняется это очень-очень долго.
Как можно ускорить процесс?

Попробуйте использовать метод .replace вместо цикла:

df = pd.read_csv('X_train.csv',sep = ',')
df = df.replace(to_replace ='[^\pL\p{Space}]', value = '', regex = True)

Если хотите работать с определенной колонкой, то:

df = df['title'].replace(to_replace ='[^\pL\p{Space}]', value = '', regex = True)


Парсинг строк на Python 3.x
Я хочу написать парсер строк, но я реально не знаю, какой модуль использовать и как это реализовать
То есть я хочу получить из, например,
hello --world -N -w 5 --Num 5 3 2 и т. д. список
["hello", "big-flag:world", "flag:N", ["flag:w", "5"], ["big-flag:Num", "5"], "3", "2"]
Если ещё разделение по пробелам понятно, то как сделать флаги и другие элементы - не очень

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

class FToken(object):
    """Единица лексического разбора; абстрактный базовый класс.

    Токен имеет свой тип T, по которому его можно идентифицировать, и
    свое значение value.

    Для использования вам необходимо определить класс токена и как
    параметр передать его тип.

    class MyToken(FToken, type="MyType"):

    В этом классе необходимо переопределить статические методы can_parse
    и parse, принимающие один аргумент - экземпляр FParser.

    Метод can_parse всех дочерник классов будут вызываться в том порядке,
    в котором эти классы объявлены. Например, в следующем примере класс
    TEXT никогда не признается токеном.

    class MyToken(FToken, type="MyType"):
        @staticmethod
        def can_parse(parser):
            return True
        // ...

    class TEXT(FToken, type="text"):
        // ...
    """
    T = "unknown"

    def __init__(self, value=None):
        """Конструктор.

        @param value Какое угодно значение токена.
        """
        self.value = value

    def __str__(self):
        """Возвращает интерпретацию токена как строку."""
        return self.T

    _childs = list()
    def __init_subclass__(cls, type: str="unknown"):
        """Инициализирует и регистрирует наследников."""
        super().__init_subclass__()
        cls.T = type
        cls._childs.append(cls)

    @staticmethod
    def can_parse(parser):
        """Проверяет, возможно ли пролексировать этот токен.

        @param parser Экземпляр FParser.
        @return Возвращает True, если возможно; иначе, False.
        """
        return False

    @classmethod
    def parse(cls, parser):
        """Лексирует этот токен.

        @param parser Экземпляр FParser.
        @return Возвращает полученный токен или None.
        """
        raise NotImplementedError()

#''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#

class FTWhitespaces(FToken, type="whitespaces"):

    @staticmethod
    def can_parse(parser):
        return (parser.char.isspace())

    @classmethod
    def parse(cls, parser):
        def _():
            return parser.char.isspace()
        parser.parse_by_condition(_)
        return None

class FTParam(FToken, type="param"):

    def __str__(self):
        return self.T + ":" + self.value

    @staticmethod
    def can_parse(parser):
        return (parser.char in "'\"" or parser.char.isalnum())

    @classmethod
    def parse(cls, parser):
        value = str()
        if parser.char in "'\"":
            pair = parser.char
            parser.advance()
            def _():
                return (parser.char != pair)
            value = parser.parse_by_condition(_)
            parser.eat(pair)
        else:
            value = parser.parse_keyword()
        return cls(value)

class FTBigFlag(FToken, type="big-flag"):

    def __str__(self):
        return self.T + ":" + self.value

    @staticmethod
    def can_parse(parser):
        return (parser.char == '-' and parser.peek() == '-')

    @classmethod
    def parse(cls, parser):
        parser.eat('--')
        key = parser.parse_keyword()
        return cls(key)

class FTFlag(FToken, type="flag"):

    def __str__(self):
        return self.T + ":" + self.value

    @staticmethod
    def can_parse(parser):
        return (parser.char == '-')

    @classmethod
    def parse(cls, parser):
        parser.eat('-')
        key = parser.parse_keyword()
        return cls(key)

#''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#

class FParser(object):
    """Парсер строк аргументов.
    """

    def __init__(self, arguments: str):
        self._tokens = list()

        self.data = arguments
        self.index = -1
        self.char = None
        if len(arguments) != 0:
            self.advance()
            self._parse()
            self._dispose()

    def advance(self, n: int=1):
        """Продвижение вперед.

        Продвигает переменные вперед; переход к следующему символу.

        @param n На сколько символов продвинуться.
        """
        self.index += n

        if self.index >= 0 and self.index < len(self.data):
            self.char = self.data[self.index]
        else:
            self.char = None

    def eat(self, victim: str):
        """Поедает ключевую фразу.

        Если ожидаемая и фактическая фраза расходятся, то вызывается
        синтаксическое исключение.
        """
        for char in victim:
            if self.char != char:
                raise SyntaxError("Unexcepted syntax error.")
            self.advance()

    def peek(self):
        """Предпросмотр следующего символа.

        @return Возвращает следующий символ или None.
        """
        self.advance()
        ch = self.char
        self.advance(-1)
        return ch

    def parse_by_condition(self, condition):
        """Получает ключевую фразу.

        Ключевая фраза состоит из любых символов, добавляемых, если
        функция condition возвращает истину (True).

        Пример использования смотрите в коде FParser.parse_keyword.

        @param condition Функция-условие, отвечающая за остановку ключевой фразы. Для этого должна вернуть False.

        @return Возвращает ключевую фразу.
        """
        keyword = str()
        while self.char != None and condition() == True:
            keyword += self.char
            self.advance()
        return keyword

    def parse_keyword(self):
        """Получает ключевое слово.

        @return Возвращает ключевое слово.
        """
        def _():
            return not self.char.isspace()
        return self.parse_by_condition(_)

    def _parse(self):
        while self.char != None:
            index = self.index
            for token_cls in FToken._childs:
                if token_cls.can_parse(self):
                    self._tokens.append(token_cls.parse(self))
                    break;
            if index == self.index:
                '''
                Что произошло?
                 - был вызван token_cls.parse, но он ни шиша не сделал.
                 - ни один token_cls.can_parse не вернул True.
                Что делать?
                 - Вызовем абстрактное исключение лексирования.
                '''
                print(self._tokens)
                raise SyntaxError(f"Неверный синтаксис на позиции {self.index + 1}")

    def _dispose(self):
        self.index = None
        self.char  = None
        self.data  = None
        # Примечание: self._tokens удаляется при getter'е свойства result.

    @property
    def result(self):
        """Выдает результат лексирования.

        Анализирует полученные токены и превращает их в конечный результат.
        """
        if '_result' in dir(self):
            return self._result
        result = list()
        require_param = False
        for token in self._tokens:
            if token == None:
                continue # whitespaces и другой мусор.

            if require_param == True:
                if not isinstance(token, FTParam):
                    break # Go to raise
                result[len(result) - 1].append(token.value)
                require_param = False
                continue

            if isinstance(token, FTParam):
                result.append(token.value)
            elif isinstance(token, (FTBigFlag, FTFlag)):
                if token.value in ("w", "Num"):
                    result.append([str(token), ])
                    require_param = True
                else:
                    result.append(str(token))
            else:
                '''
                Программист добавил токены, но не добавил способ их
                обработки в конечный результат.
                '''
                raise NotImplementedError()
        if require_param == True:
            raise Exception("Флаг с параметром не имеет параметра.")

        _tokens = None
        self._result = result
        return result

#''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#

import os
def GetArgsStr():
    result = str()
    for arg in os.sys.argv:
        if ' ' in arg:
            result += "'" + arg + "'"
        else:
            result += arg
        result += ' '
    return result.rstrip(' ')

def main():
    arguments = GetArgsStr()
    #print("Command line: \"" + arguments + "\"")
    parser = FParser(arguments)
    print(parser.result)

if __name__ == "__main__":
    main()

Пример командной строки запуска скрипта:

C:\Users\Shamus_Rezol\Desktop\fargparse>python example.py --world -N -w 5 --Num 5 3 2

Выходные данные:

Command line: "example.py --world -N -w 5 --Num 5 3 2"
['example.py', 'big-flag:world', 'flag:N', ['flag:w', '5'], ['big-flag:Num', '5'], '3', '2']

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

obj = FParser("example.py --world -N -w 5 --Num 5 3 2")
obj.result

Я не учел, что параметр может начинаться со специального символа '/'. Исправить это возможно в
tokens.py,
FTParam,
can_parse. Однако с параметрами вида 'C:/Users' проблем не будет.
Возможно, не учел я и много других мелочей.


Selenium получить скрытое значение
Допустим есть скрытое поле
input:

<input type="hidden" id="any_token" value="03AGdBq24Ar4jBudapX_">

Я бы использовал обычный поиск по
xpath и получил бы значение:

token_place = driver.find_element_by_xpath(xpath='//*[@id="any_token"]')
token = token_place.get_attribute('value')

Но поле скрыто и этот метод не подходит.
Как получить значение этого поля через JS или любыми другими способами?

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

iframe = driver.find_element_by_xpath(xpath='path_iframe')
driver.switch_to.frame(iframe)


Как задать два знака после запятой?
<code>
from prettytable import PrettyTable

table = PrettyTable()

box = list(range(1, 6))
wine_wort = [i*.85 for i in box]
sugarl = [i*.142 for i in box]
sugarkg = [i/.62 for i in sugarl]
juice = [i*.86 for i in wine_wort]
fruite = [i/.6 for i in juice]

columns = {
    'Емкость,л': box,
    'Сусло,л': wine_wort,
    'В т.ч.сахара': sugarl,
    'Нужно сахара': sugarkg,
    'В т.ч. сока': juice,
    'Нужно фруктов': fruite,
}

for key, item in columns.items():
    table.add_column(key, item)

print(table)
</code>
Результат: в каждой графе, где указано количество, немеренное количество знаков после запятой. Как оставить только два?

Вы можете использовать стили, конкретно
float_format.
Пример (UPD):

from prettytable import PrettyTable

table = PrettyTable()

box = list(range(1, 6))
wine_wort = [i*.85 for i in box]
sugarl = [i*.142 for i in box]
sugarkg = [i/.62 for i in sugarl]
juice = [i*.86 for i in wine_wort]
fruite = [i/.6 for i in juice]

columns = {
    'Емкость,л': box,
    'Сусло,л': wine_wort,
    'В т.ч.сахара': sugarl,
    'Нужно сахара': sugarkg,
    'В т.ч. сока': juice,
    'Нужно фруктов': fruite,
}

for key, item in columns.items():
    table.add_column(key, item)
    table.float_format[key] = '.2'  # <------

print(table)


Как отсортировать словарь по значениям ключей, если эти значения могут повторяться?
Имеется словарь, где ключ - слово в тексте, а его значение - количество раз, которое оно встречается в нём. Причем разные слова могут встречаться одинаковое число раз. Как можно отсортировать в таком случае слова в порядке уменьшения их частоты?

for el in sorted(dict_.items(), key=lambda el:-el[1]):
    print(el)

dict_ - это ваш словарь


Можно ли вернуть значение функции в переменную являющуюся аргументом этой функции?
<code>
a= 2
b = 3

def test(val):
   val += 2
   return val

test(a)
test (b)

print (a) #результат должен быть 4
print (b) #результат должен быть 5
</code>

Передача аргументов в python работает также, как присваивание.

Если ты передаешь переменную изменяемого типа (list, set, dict) в функцию, функция получает ссылку на сам объект, с которым можно делать все, что душе будет угодно и после завершения функции в контексте вызова переменные будут хранить ссылки на уже измененный объект. Но если внутри функции перепривязать к локальной переменной ссылку на другой объект, контекст вызова ничего об этом не узнает, а после завершения функции, исходная переменная будет содержать ту же самую ссылку, какая была до вызова.

Если ты передаешь объект неизменяемого типа (int, float, str, tuple...) в функцию, ты по-прежнему не можешь перепривязать ссылку из контекста вызова функции, но и изменить сам объект у тебя тоже не получится.

Попробую это прояснить на примере из вопроса же:

int - неизменяемый тип

a = 2

def test(val):
   val += 2
   return val # в переменной val будет 4

test(a)
print(a) #результат будет 2

a - это ссылка на объект
2. При вызове
test локальная переменная
val тоже ссылается на этот объект. Когда мы делаем
val += 2, или, то же самое, что
val = val + 2, мы конструируем объект
4 и ссылку на него кладем в
val.
Однако после выхода из функции ссылка
a по-прежнему указывает на объект
2.
Как же можно, все-таки, добиться желаемого поведения?
Просто вернуть значение, ну это очевидно:

a = 2

def test(val):
   val += 2
   return val

a = test(a)

print(a) #результат будет 4

Вспомним "The zen of python" - явное лучше, чем неявное. Поэтому этот способ наиболее предпочтителен.
Но если, действительно, ну очень хочется избежать явного возврата значения из функции и изменять само значение прямо в теле функции, можно использовать ключевое слово
global. Однако, это троянский конь в истинном смысле, неизвестно какие ошибки в программе он может породить. Здравствуйте бессонные ночи отладки. Не рекомендуется.
А еще можно обернуть значение в изменяемый тип данных - например, список:

a = [2]

def test(val):
   val[0] += 2

test(a)

print(a[0]) #результат будет 4

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

How do I pass a variable by reference?
How do I write a function with output parameters (call by reference)?


Проблема в алгоритме рекурсивного поиска
<code>
d={'global': {'a': 10, 'b': 4, 'func': {'n': "foo", 'x': 'spam', 'func_f': {"d": 0}, 'min': {"c": 5}} }}
def search(d, skey):
    print("search(  %s  )" % d)
    for i in d:
        if i==skey:
            print("return %s" % d[i])
            return d[i]
        else:
            if type(d[i])==dict:
                return search(d[i], skey)

print(search(d, 'func_f'))

print(search(d, 'min'))

Output:

search(  {'global': {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}}  )
search(  {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}  )
search(  {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}  )
return {'d': 0}
{'d': 0}

search(  {'global': {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}}  )
search(  {'a': 10, 'b': 4, 'func': {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}}  )
search(  {'n': 'foo', 'x': 'spam', 'func_f': {'d': 0}, 'min': {'c': 5}}  )
search(  {'d': 0}  )
None # хотя я ожидал {"c": 5}

</code>
ссылка на вопрос

возвращать значение надо лишь в том случае если функция что то нашла
<code>
d={'global': {'a': 10, 'b': 4, 'func': {'n': "foo", 'x': 'spam', 'func_f': {"d": 0}, 'min': {"c": 5}} }}
def search(d, skey):
    print("search(  %s  )" % d)
    for i in d:
        if i==skey:
            print("return %s" % d[i])
            return d[i]
        else:
            if type(d[i])==dict:
                res = search(d[i], skey)
                if res != None:
                    return res

print(search(d, 'func_f'))

print(search(d, 'min'))
</code>


что надо передать в return view post django
что надо возвращать в return в post?
ошибка: ValueError: The view plugins.views.ViewCurrentPlugins didn't return an HttpResponse object. It returned None instead.
views.py
<code>
class ViewCurrentPlugins(DetailView):
    model = Plugins
    context_object_name = 'plugins'
    template_name = 'plugins/plugins_detail_view.html'
    context_object_name = 'plugins_item'

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['tag'] = self.kwargs['tag']
        context['form'] = RelatedPluginForm()
        return context

    def post(self, request, **kwargs):
        form = RelatedPluginForm(request.POST)
        related_id = request.POST['related']

        if form.is_valid():)
            self.plugin = self.get_object()
            self.plugin.related.add(related_id)
            self.plugin.save()
            return
        else:
            return
</code>

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

return HttpResponseRedirect(...)

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

return self.render_to_response(self.get_context_data(form=form))

только в Вашем случае, возможно, придется передавать все необходимые параметры для формирования контекста.
Так же можно дополнительно подправить метод
get_context_data, заменив формирование формы для контекста, что бы данные введенные пользователем не терялись

context['form'] = kwargs.get('form', RelatedPluginForm())


Вывод числа пар одинаковых элементов в списке
Пожалуйста помогите с программкой. Надо написать программу, которая запрашивает слова пока не введется пустая строка, а затем выводится количество пар.
Но нельзя использовать функции
max(),
sort(),
count() и в таком духе, а также никакие библиотеки.

counter = 0
a = input()
while 1:
    a = input().split()
    if a == '':
        break
for i in range(len(a)):
    for j in range(i + 1, len(a)):
        if a[i] == a[j]:
            counter += 1

print(counter)

вот что у меня получился за код, но это не работает корректно и не могу найти в чем проблема.

У тебя условие выхода из цикла некорректное.
Как вариант можно сделать так:
<code>
counter = 0
a = []
while 1:
    z = input()
    if z == '':
        break
    else:
        a.append(z)
for i in range(len(a)):
    for j in range(i + 1, len(a)):
        if a[i] == a[j]:
            counter += 1
print(counter)
</code>


Почему моя функция возвращает None? [дубликат]

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

Почему из функции возвращается None

                                (2 ответа)

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

<code>
d={"a": {"f": {"tmp": {"er": 3}, "n": 10}}}
def search(d, skey):
    print("debug: ", d)
    for i in d:
        if i==skey:
            print(d[i])
            return d[i]
        else:
            search(d[i], skey)
print(search(d, 'f'))
</code>
Данная функция предназнасена для нахождения ключа skey в словаре.
Но она возвращает None вместо словаря в котором содержится ключ, в то время как на экран выводится словарь.
Как так?

Вызов функции из самой себя тоже должен быть с
return видимо:

else:
    return search(d[i], skey)

Иначе если первый
return сработает после вызова функции самой из себя он вернёт управление в место вызова функции, и когда цикл кончится потом, функция в итоге ничего не вернёт, а значит вернёт
None.


Как сделать аргумент master необязательным в функции инициации виджета tkinter python?
Вопрос вроде бы простой, но я не знаю, как его решить.
Есть код:

import tkinter as tk

class MainWindow(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

class MyButton(tk.Button):
    global root

    def __init__(self, master=root):
        tk.Button.__init__(self, master)
        self.pack()

root = MainWindow()
frame1 = tk.Frame(root)
frame1.pack()
button1 = MyButton()
button2 = MyButton(master=frame1)
root.mainloop()

Хочу, чтобы работали оба варианта при вызове функции
__init__ в классе MyButton:

Если аргумент master не указан, то используется значение этого аргумента по умолчанию master=root

button1 = MyButton()

Если указано значение аргумента master, то оно используется вместо значения по умолчанию

button2 = MyButton(master=frame1)
Происходит ошибка

NameError: name 'root' is not defined

в строке
def __init__(self, master=root):

Укажите
None как параметр по-умолчанию. При передаче
None в качестве родительского элемента tkinter считает родительским главное окно (первый созданный объект
Tk, если он существует, или создает новый). Детали реализации можно посмотреть в
tkinter/__init__.py (вкратце, первый созданный объект
Tk записывается в глобальную переменную
_default_root, потом это значение используется как родитель по умолчанию). Для передачи параметров в родительский класс можно использовать функцию
super(), в этом случае не нужно будет передавать
self:

import tkinter as tk

class MainWindow(tk.Tk):
    def __init__(self):
        super().__init__()

class MyButton(tk.Button):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()

root = MainWindow()
frame1 = tk.Frame(root)
frame1.pack()
button1 = MyButton()
button2 = MyButton(master=frame1)
root.mainloop()


Как получить текст с строки в python [дубликат]

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

Удалить все символы после запятой .replace(",*", "")

                                (7 ответов)

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

Есть текст:
<code>
Вадим 22 годика. Полицейский в 32 отделении
</code>
Как можно получить текст 'Полицейский в 32 отделении' от точки с пробелом?

text = 'Вадим 22 годика. Полицейский в 32 отделении'
text.split('. ')[1]


PyInstaller: как использовать файлы, которые находятся внутри .exe
У меня имеется вот такая структура файлов:

Папка sounds
Папка images
settings.json
coordinates.json
lib.py (основной скрипт)

Для того, что бы создать .exe файл, я использую такую команду:

pyinstaller --add-data sounds;sounds --add-data images;images --add-data coordinates.json;. --add-data settings.json;. --hidden-import pynput.keyboard._win32 --hidden-import pynput.mouse._win32 --onefile lib.py

(--hidden-import'ы необходимы, ибо без них не работает импорт модуля pynput)
Однако после запуска .exe выдается ошибка, что файла
settings.json не существует. Но если закинуть этот файл в папку уже с exe'шником, то все срабатывает.
Та же самая история с файлом
coordinates.json и файлами в папках
sounds и
images (вместо звуков проигрывается стандартный звук ошибки windows, а изображения просто не находятся).
Вопрос: можно ли, и если да, то как читать/воиспроизводить/изменять файлы, находящиеся внутри .exe?
Если же изменять их нельзя, то как можно создать что-то ввиде загрузчика? То есть создать папку где-нибудь в
appdata и туда загрузить эти файлы. (Имеется ввиду все это сделать должен скрипт).
Заранее благодраю, С уважением.

Как оказалось, все гениально и не очень - просто.
В самой документации
PyInstaller все описано. А именно: при запуске exe'шника все внутренности программы распаковываюся во временную папку windows. Соответсвенно, в скрипте нужно обращаться к ним. Вот как это нужно сделать (код из официально документации):

def resource_path(relative_path):
    # Получаем абсолютный путь к ресурсам.
    try:
        # PyInstaller создает временную папку в _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

А далее использовать эту функцию везде, где мы указываем путь к файлам, которые должны будут лежать в exe'шнике. Например:

path_to_the_images = resourse_path('images')


Удалить столбцы при соблюдении условия
Мне необходимо записать файл на основе другого. В исходном файле есть значения 'ND' нужно исключить столбцы, где встречаются такие данные. Пробовал искать методом "np.isnan" он не находит все такие столбцы. Поэтому использую:

 qqq = np.sum(np.where(z1 == 'ND'))
    if (qqq > 0):
        count+=1
        #df.drop(df.columns[[j]], axis=1, inplace=True)

но не получается удалить столбцы при помощи df.drop.
Файл с данными находится здесь файл
Весь код:

import pandas as pd
import numpy as np

df = pd.read_csv('FRB.csv')
a = df.shape
count = 0
print("a=", a)
for j in range(0, a[1]):
    z1 = df.iloc[:, j].values
    qqq = np.sum(np.where(z1 == 'ND'))
    if (qqq > 0):
        count+=1
        #df.drop(df.columns[[j]], axis=1, inplace=True)
    print("j=", j, "qqq=", qqq, type(qqq), "len(z1)=", len(z1))

a = df.shape
print(count, "a=", a)

Воспользуйтесь параметром pd.read_csv(..., na_values=["ND"]) - при помощи этого параметра можно и нужно указывать все значения (дополнительно к значениям по умолчанию:
‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’.), которые должны восприниматься как
NaN:

df = pd.read_csv("FRB.csv", header=None, na_values=["ND"]).dropna(axis=1)

результат:

In [70]: df.shape
Out[70]: (372, 82)


Правильное строение цикла для красивого progress bar
Хочу использовать progress bar, который рисует в таком формате:
X/Y, где
X - текущая итерация,
Y - последняя итерация. Цикл должен работать от начальной до конечной итерации включительно.
Например, если
X = 1,
Y = 5, то должно выводится:
1/5 -> 2/5 -> 3/5 -> 4/5 -> 5/5 (без 0 и 6, т.е. не сколько выполнено, а на какой итерации мы сейчас).
Пробую так:

import contextlib
import time

import tqdm

start = 1
end = 5
cur = start
condition = start <= end

with contextlib.closing(tqdm.tqdm(initial=start, total=end)) as progress_bar:
    while condition:
        time.sleep(1)

        cur += 1
        progress_bar.update()
        condition = cur <= end

Однако после
5/5 он из-за лишнего апдейта рисует
6 и останавливается. Можно как-то избежать этого последнего
6 без двойной проверки в цикле?

Вот так вроде нормально отрабатывает:

cur += 1
condition = cur <= end
if condition:
    progress_bar.update()

Получается, что
update на последней итерации цикла уже лишний (именно он выставляет и отображает значение
6), его надо как-то исключить.
Можно чуть сократить код, если вспомнить, что True = 1, False = 0:

cur += 1
condition = cur <= end
progress_bar.update(condition)

Вариант без двойной проверки условия:

with contextlib.closing(tqdm.tqdm(initial=start, total=end)) as progress_bar:
    while True:
        time.sleep(1)

        cur += 1
        if cur > end:
            break

        progress_bar.update()


numpy: сумма случайной строки матрицы равна 1
Я генерирую рандомный массив float-чисел от 0 до 1 с шагом 0.01 и размерностью матрицы 7 на 14. С этим у меня проблем не возникло и по коду ниже все работает.
Но я не могу понять как сделать так, чтобы сумму строки из матрицы была равна ровно 1 и не более. Кто может подсказать как это сделать ?
<code>
random_float_array = np.random.choice(np.arange(0, 1+0.5*0.01, 0.01), size=(7,14))
print('Matrix A\n',np.round(random_float_array,2))
</code>

Так разделите каждую из строк на сумму её элементов. Как-то так вроде:
<code>
random_float_array / random_float_array.sum(axis=1).reshape(-1,1)
</code>


Удалить одинаковые строки определенных столбцов двух датафреймов
Датафрейм df1:

     A    B   C    D
0  256    4  24   51
1   24   25  34  200
2  300   12  45   11
3   34   19   2   34
4   75   76  19   11
5   42   89  29  101
6   54  104  11   12

Датафрейм df2:

     E
0   25
1   12
2  104
3   12

Необходимо из датафрейма df1 удалить все строки, содержащие в столбце В элементы, которые встречаются в столбце Е датафрейма df2.
Мой код:

import pandas as pd

df1 = pd.DataFrame([[256, 4, 24, 51], [24, 25, 34, 200], [300, 12, 45, 11],
                   [34, 19, 2, 34], [75, 76, 19, 11], [42, 89, 29, 101], [54, 104, 11, 12]])
df1.rename({0: 'A', 1: 'B', 2: 'C', 3: 'D'}, axis=1, inplace=True)

df2 = pd.DataFrame([[25], [12], [104], [12]])
df2.rename({0: 'E'}, axis=1, inplace=True)

for row1 in df1.B:
    for row2 in df2.E:
        if row1 == row2:
            df1.drop(row1)
print(df1)

выдает ошибку "KeyError: '[25] not found in axis'"
Что не так?

Не работайте с
Pandas циклами, это очень неэффективно. Там есть все средства, чтобы делать всё "векторно", просто и красиво:

df1 = df1.loc[~df1.B.isin(df2.E)]

    A   B   C   D
0   256 4   24  51
3   34  19  2   34
4   75  76  19  11
5   42  89  29  101

~ - это отрицание

isin - функция, для проверки вхождения в
Pandas.Series другой
Series или списка.
Как обычно, в
Pandas проще всё сделать с помощью фильтрации данных по условию, главное правильно составить условие.
А ошибка в вашем коде связана с тем, что вы перебираете значения из столбца, а функция
drop по умолчанию считает, что ей передали индекс(ы) элементов, которые нужно удалить. И, конечно, в столбце
B нет индекса
25 (а элемент есть).


Как добавлять элементы в список суммируя только с определенными индексами?
Дан список:

A = [0, 0, 0, 0, 0]

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

for j in i:
    B = [1, 3, 4, 5, 6]

После этого список A обновится до
A = [1, 3, 4, 5, 6], при втором проходе мы получили список с другими значениями
B = [3, 3, 3, 3, 3] и они должны суммироваться с уже имеющимися в
A, то есть должно получится
A = [4, 6, 7, 8, 9]

Стандартный метод перебора индексов списка с помощью
range и
len:

for i in range(len(B)):
    A[i] += B[i]

Либо можно использовать
enumerate:

for i, x in enumerate(B):
    A[i] += x


Как добавить список в sql запрос
Имеется sql запрос, который я отправляю в бд, но проблема заключается в том, что я не могу добавить список в фильтр, подскажите как можно решить данную проблему.
<code>
    if cursor is not None:
        sql = f"""
        SELECT
            id_users,
            date,
            info,
            actions
        FROM
            name_table
        WHERE `id_task` IN '{list_values}'

        """
        cursor.execute(sql)
        response_db = cursor.fetchall()
</code>

Правильный ответ содержится в комментариях, я лишь дополню.
Перед тем как подать список в запрос его необходимо перевести в строку, а точнее преобразовать к такому виду
'1,2,3,4', а после вставить уже в сам запрос
WHERE FIND_IN_SET(id_task, '1,2,3,4')


Не могу сделать форму для поиска в django3
вот мой views

from django.shortcuts import render
from .models import *
from django.views.generic import ListView

# simplePost

# Create your views here.
def index(req):
  posts = simplePost.objects.all()
  data = {
      "posts": posts
  }
  return render(req, 'main/index.html', data)

class search(ListView):
  def get_queryset(self):
      return simplePost.objects.filter(title=self.request.GET.get('q'))

  def get_context_data(self, *args, **kwargs):
      context = super().get_context_data(*args, **kwargs)
      context["q"] = self.request.GET.get('q')

      return context

Вот
simplePost_list.html (результаты поиска должны быть здесь)

{% extends '../base/base.html' %}
{% block title %}
Результат Поиска
{% endblock %}
{% block content %}
     <div class="content">
     {% for i in context %}
         <div class="post important_{{ i.important }}">
             <h3 class="title">{{ i.title }}</h3>
             <p class="text">{{ i.text }}</p>
             <b class="date">{{ i.date }}</b>
         </div>
     {% endfor %}
     </div>
{% endblock %}

сама форма

<form action="{% url 'search' %}" method="get" class="search-form" required="">
  {% csrf_token %}
  <input type="search" name="q" class="search" placeholder="Поиск записей
  в блоге">
</form></li>

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

Очень странная фраза поиска работает правильно но ничего не выводиться
На самом деле скорее всего у вас поиск и работает правильно. Но вы ошиблись с выводом результата поиска в шаблон.
Вместо
{% for i in context %} надо писать
{%for i in object_list%}
Но конечно лучше будет в класс поиска (во
views) добавить что-то вроде

context_object_name="result_serch"

и тогда в шаблоне

{%for i in result_serch%}

P.S. подробнее о
context_object_name в документации


Бот, работающий одновременно в VK и Discord
Кратко о проблеме:
Есть код для бота дискорда, который успешно подключается и работает.
Есть код для бота вк, который успешно подключается и работает.
Нет кода для бота, который успешно работает в вк и дискорде!
<code>
import discord

import vk_api
import vk
from vk_api import VkUpload
from vk_api.utils import get_random_id

vk_session = vk_api.VkApi(token='TOKEN')
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
longpoll = VkBotLongPoll(vk_session, 'ID')
vk = vk_session.get_api()
from vk_api.longpoll import VkLongPoll, VkEventType
Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()

def vk():
    for event_vk in longpoll.listen():
        print('Event')

client = discord.Client()

@client.event
async def on_ready():
    await client.change_presence(status=discord.Status.idle)
    print('Connected')

vk()
client.run('TOKEN')
</code>
Выглядит это примерно так. И в зависимости от того, что происходит раньше - vk() или client.run() зависит, какой из ботов работает. Подскажите, пожалуйста, в каком направлении копать? Я совсем новичок в программировании, и моя проблема скорее всего в том, что по незнанию я не замечаю какую-то совсем очевидную причину.
UPD1:
После некоторых тестов выяснилось, что проблема, вероятно, в том, что не происходят никакие другие события, если longpoll.listen(). Тогда вопрос в том, как делать это асинхронно.

Используйте мультипоточность.
<code>
import discord

import vk_api
import vk
from vk_api import VkUpload
from vk_api.utils import get_random_id
from threading import Thread # Импортируем нужную библиотеку

vk_session = vk_api.VkApi(token='TOKEN')
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
longpoll = VkBotLongPoll(vk_session, 'ID')
vk = vk_session.get_api()
from vk_api.longpoll import VkLongPoll, VkEventType
Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()

def vk():
    for event_vk in longpoll.listen():
        print('Event')

client = discord.Client()

@client.event
async def on_ready():
    await client.change_presence(status=discord.Status.idle)
    print('Connected')

vk()
#client.run('TOKEN') # Это заменяем на то, что ниже.

# +++
def run_ds_bot():  # создаем отдельную функцию для запуска бота Discord
    client.run('TOKEN')

thr1 = Thread(target=vk) # Создаем поток с функцией vk()
thr2 = Thread(target=run_ds_bot) # Создаем поток с функцией run_discord_bot()
thr1.start() # Запускаем поток с функцией vk()
thr2.start() # Запускаем поток с функцией run_discord_bot()
</code>


Ошибка звука Питон

import speech_recognition as sr
import os, sys, webbrowser, pygame
from gtts import gTTS

def talk(words):
    print(words)
    os.system("say" + words)

talk("Hello")

итог

"sayHello" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

os.system выполняет команду в субшелле.
Проще говоря, вы пытаетесь выполнить команду
sayHello в командной строке Windows, а такой команды попросту не существует.
Если же вы пытаетесь преобразовать текст в речь, то попробуйте использовать библиотеку
pyttsx3.
Вот, как может выглядеть код:

import pyttsx3

engine = pyttsx3.init()

def speak(input_data):
    engine.say(input_data)
    engine.runAndWait()
    engine.stop()

def text_to_speech():
    text = input('Введите текст: ')
    if text:
        speak(text)

while True:
    text_to_speech()


Подскажите как привязать код python к telegram bot (aiogram)
Здорова всем. Пишу telegram_bot который бы скачивал mp3 с YouTube и отправлял пользователю аудио в дальнейшем хочу написать будильник, чтобы пользователь сам решал под какую музыку вставать.
Код для скачивания с YouTube , он работает замечательно проблема в том, что не могу понять как правильно его 'подвязать' к aiogram_bot, при добавлении этого куска кода к aiogram_bot скачивания не происходит.

from __future__ import unicode_literals
import youtube_dl

audio = str(input('link url '))
ydl_opts = {'postprocessors': [{'key': 'FFmpegExtractAudio','preferredcodec': 'mp3','preferredquality': '192'}]}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download([audio])

Сам телеграм бот.

from __future__ import unicode_literals
import youtube_dl
import keybords as kb
import logging

from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from config import *
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import Message
from aiogram.dispatcher.filters import Command

import os
import nest_asyncio

logging.basicConfig(level=logging.INFO)
bot = Bot(token = API_TOKEN_Music_bot )
dp = Dispatcher(bot, storage=MemoryStorage())

nest_asyncio.apply()

# аналог input() in the python
class Form(StatesGroup):
    music_link = State()

@dp.message_handler(commands=['music'])
async def alarm(message: types.Message):
    await bot.send_message(message.from_user.id, "Plsm,input link for downloads mmusic")
    await Form.music_link.set()

@dp.message_handler(state=Form.music_link)
async def answerDay(message: types.Message, state: FSMContext):
    answer_mmusic_link = message.text
    await state.update_data(answer_mmusic_link1 = answer_mmusic_link )
    answer_mmusic_link1 =  data.get("answer_music_link1")

    ydl_opts = {'postprocessors': [{'key': 'FFmpegExtractAudio','preferredcodec': 'mp3','preferredquality': '192'}]}
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        audio = ydl.download([answer_mmusic_link1])
    await bot.download_file('/home/dus/Desktop/musica', "answer_mmusic_link1")
    await state.finish()
if __name__ =='__main__':
    executor.start_polling(dp,skip_updates=(True))

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


Как удалить строки по разным условиям?
Есть фрейм данных и мне нужно удалить из него строки, в которых значение столбца
А более 50. Эта операция успешно выполняется кодом:

import pandas as pd
import numpy as np
df = pd.DataFrame([[256, 4, 24, 51], [24, 25, 34, 200], [300, 12, 45, 11],
                   [34, 19, 2, 34], [75, 76, 19, 11], [42, 89, 29, 101], [54, 104, 11, 12]])
df.rename({0: 'A', 1: 'B', 2: 'C', 3: 'D'}, axis=1, inplace=True)
df_without_noise = df.drop(np.where(df['A'] > 250)[0])

и получается

    A    B   C    D
1  24   25  34  200
3  34   19   2   34
4  75   76  19   11
5  42   89  29  101
6  54  104  11   12

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

df_without_noise = df_without_noise.drop(np.where(df_without_noise['В'] > 50)[0])

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

KeyError: '[2] not found in axis'

При этом, в столбце
В присутствуют значения более 50.
Как удалить строки с ними?
Должно получиться:

    A    B   C    D
1  24   25  34  200
3  34   19   2   34

Также можно воспользоваться методом DataFrame.query():

df_without_noise = df.query("A <= 250 and B <= 50")

результат:

In [28]: df_without_noise
Out[28]:
    A   B   C    D
1  24  25  34  200
3  34  19   2   34


Как открыть файл, котороый находится выше по каталогу?
Путь питон скрипта:
папка1\папка2\скрипт.py
из этого скрипта, с помощью
os.open, надо открыть текстовый документ который лежит по пути

папка1\текстовый файл.txt как это реализовать?

Import

from pathlib import Path

Code

BASE_DIR = Path(__file__).resolve().parent.parent
os.open(f'{BASE_DIR}/папка1/текстовый файл.txt')


mypy пропускает несоответствие типов внутри метода

def func1(a_value: int) -> None:
    """Тест1."""
    print(a_value)

def func2():
    """Тест2."""
    value_b = func1('11')
    print(value_b + 10)

func2()

при проверке mypy не выдает никаких ошибок, считает, что все в порядке.
Если же после вызова
func2 добавить строчку:

value_b = func1('11')

то сразу же идут сообщения об ошибках:

error: "func1" does not return a value
error: Argument 1 to "func1" has incompatible type "str"; expected "int"

Почему mypy игнорирует ошибки внутри метода
func2 ?

mypy по умолчанию не проверяет код внутри функций, у которых нет аннотаций (это позволяет добавлять аннотации постепенно - см. Summary of gradual typing в PEP 483).
Выдержка из документации:

No errors reported for obviously wrong code
There are several common reasons why obviously wrong code is not flagged as an error.

The function containing the error is not annotated. Functions that do not have any annotations (neither for any argument nor for the return type) are not type-checked, and even the most blatant type errors (e.g.
2 + 'a') pass silently. The solution is to add annotations. Where that isn’t possible, functions without annotations can be checked using
--check-untyped-defs.

То есть, если второй функции указать возвращаемое значение
-> None или при вызове mypy добавить флаг
--check-untyped-defs, тогда код внутри второй функции начнет проверяться:

$ mypy --check-untyped-defs test.py
test.py:8: error: "func1" does not return a value
test.py:8: error: Argument 1 to "func1" has incompatible type "str"; expected "int"
Found 2 errors in 1 file (checked 1 source file)

Для любителей хардкора также могу порекомендовать флаг
--strict, при его включении выдаст целых 4 ошибки:

$ mypy --strict test.py
test.py:6: error: Function is missing a return type annotation
test.py:6: note: Use "-> None" if function does not return a value
test.py:8: error: "func1" does not return a value
test.py:8: error: Argument 1 to "func1" has incompatible type "str"; expected "int"
test.py:12: error: Call to untyped function "func2" in typed context
Found 4 errors in 1 file (checked 1 source file)

Включение
--strict эквивалентно включению следующих флагов (список получен с помощью запуска
mypy -h):
--warn-unused-configs,
--disallow-any-generics,
--disallow-subclassing-any,
--disallow-untyped-calls,
--disallow-untyped-defs,
--disallow-incomplete-defs,
--check-untyped-defs,
--disallow-untyped-decorators,
--no-implicit-optional,
--warn-redundant-casts,
--warn-unused-ignores,
--warn-return-any,
--no-implicit-reexport,
--strict-equality.
Собственно, нужную опцию
--check-untyped-defs изначально нашел добавлением всех этих флагов и запуском с удалением флагов по одному.


Как создать новый столбец на основе содержания другого?
Внутри df есть столбец
Дата_ТА_все, который либо Nan, либо дата.
Мне нужно каким-то образом создать третий столбец
ТА_был.
В столбце 'ТА_был' нужно:

записать "0", если в столбце 'Дата_ТА_все' - Nan,
записать "1", если в столбце 'Дата_ТА_все' - дата.

Подскажите, как правильно это можно сделать?
Пробовал через функцию lambda, но я не знаю каким общим признаком объединить дату в столбце 'Дата_ТА_все'.

     ID УЕ   Дата_ТА_все
0   2110453   2021-02-18
1   2109466   2021-02-06
2   2109467   2021-02-06
3   2109468   2021-02-06
4   2109410   2021-02-06
   ...  ... ...
94  2110959   2021-02-24
95  2110945   2021-02-24
96  2110945   2021-02-24
97  2110946   2021-02-24
98  2111034   2021-02-25

Воспользуйтесь методом Series.notna():
<code>
df['ТА_был'] = df['Дата_ТА_все'].notna().astype('int8')
</code>


Как написать данную строчку на языке python
Допустим, есть такая строчка на Паскале:
<code>
a: array ['A'..'Z'] of integer;
</code>
Как эта строчка должна быть записана на Python?

import string
d = {i: int() for i in string.ascii_uppercase}
print (d)


Как с помощью Selenium искать класс определенного порядка?
Дана подобная структура:

<div class='N'>
    <div class='S'></div>
    <div class='S'></div>
    <div class='S'></div>
</div>
<div class='N'>
    <div class='S'></div>
    <div class='S'></div>
</div>
<div class='N'>
    <div class='S'></div>
    <div class='S'></div>
    <div class='S'></div>
    <div class='S'></div>
</div>

Как можно найти, например, только 2 или только 3 по счету
class='N'. Классов N не обязательно будет 3 на странице. Так, например, я пробую найти 2 по счету
class='N' и в нем перебрать все
class='S', но это не работает. Получается,что
class='S' ищется на всей странице, а не конкретно во втором
class='N'. Кто знает, как можно решить проблему?

two = driver.find_elements_by_xpath("//div[@class='N'][2]")
 i = two.find_elements_by_xpath("//div[@class='S']")
     for j in i:
         j.click()
         time.sleep(2)


Как удалить строки, если в них много NaN?
Есть фрейм вида:

 a   b   c    d
NaN  4  NaN  NaN
24   25  34  NaN
NaN  12 NaN  NaN
34  NaN  2    34
NaN NaN  19   11
42  NaN  29  NaN
54  NaN  11   12

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

 a   b   c    d
24   25  34  NaN
34  NaN  2    34
54  NaN  11   12

Мой код:

import pandas as pd
import numpy as np

df = pd.DataFrame([[np.NaN, 4, np.NaN, np.NaN], [24, 25, 34, np.NaN], [np.NaN, 12, np.NaN, np.NaN],
                   [34, np.NaN, 2, 34], [np.NaN, np.NaN, 19, 11], [42, np.NaN, 29, np.NaN], [54, np.NaN, 11, 12]])
df.rename({0: 'a', 1: 'b', 2: 'c', 3: 'd'}, axis=1, inplace=True)
columns_count = df.shape[1] # Считаем число столбцов
for row in df:
    NaN_count = 0
    for i in row:
        if i == None:
            NaN_count +=1
    if NaN_count >= columns_count:
        df = df.drop(index=[row]) # Удаляем строку
print(df)

Почему-то не удаляет строки.

threshold = df.shape[1] // 2

res = df.loc[df.isna().sum(axis=1).lt(threshold)]

результат:

In [13]: res
Out[13]:
      a     b     c     d
1  24.0  25.0  34.0   NaN
3  34.0   NaN   2.0  34.0
6  54.0   NaN  11.0  12.0


Как прочитать все сообщения в беседе ВК с помощью бота?
Описание: имеется беседа в ВК с 3+ собеседниками, туда добавлен бот от моей группы; боту выданы все права, выбрана самая актуальная версия longpool.
Задача: необходимо получить все сообщения, которые были ранее написаны в беседе. Подскажите, пожалуйста, как это можно реализовать? Буду рад любой помощи!
Попробовано: уже получилось запросить информацию о беседе с помощью запроса
method('messages.getConversationsById', {'peer_ids': 2000000000 + id, 'unread': 0, 'filter': 'all', 'extended': 1}), но данный запрос не выводит информации о СООБЩЕНИЯХ пользователей.
Был опробован запрос
messages.getHistory, но он не работает по причине того, что запрос происходит в многопользовательской беседе, а не в личных сообщениях группы.
Еще был опробован запрос
messages.getDialogs, но, как говорится в официальной документации ВК, что он устарел и лучше его не использовать.

Проблема в том, что у ботов-сообществ история переписки в беседах не сохраняется, поэтому у всех сообщений id = 0 и метод вызвать не получится. Можно попробовать user-token, но для его получения требуется обращение в тех. поддержку ВК.
UPDATE. Произвести сбор всех сообщений можно с помощью метода "getMessageById"


Оптимизация кода калькулятора
Есть код. В классе
App прописана форма и калькулятор. Решил вынести часть кода калькулятора #логика в отдельный класс, и оставить часть кода, которая просто создаёт кнопки через цикл. Но при попытки сделать это столкнулся с множественными ошибками. Выходит, или я делаю то, что не должен, или не понимаю как правильно пользоваться этим.
Как я пробовал сделать:
Создаём отдельный класс типа
class Scal:. Пробовал также добавить
@staticmethod, но это никак не помогло. Вставляем в него "логику", кнопки оставляем в форме где они и должны быть. Поскольку
calc_entry остаётся в классе
App, то дописываю везде
App()., так же как и перед
tab3.
В эту же строку добавлял
cmd = lambda x=i: >>Scal().<<calc(x)
Вопрос думаю понятен: как разделить данный код и можно ли?
Так же буду признателен за какую-либо иную оптимизацию кода<3
Делюсь исходно рабочим кодом:

import numpy as np
import pandas as pd
from tkinter import *
import tkinter as tk
from tkinter import ttk
import tkinter.messagebox as mb

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        #self = Tk()
        self.title("Матрицы для детей")
        self.geometry('745x250')

        tab_control = ttk.Notebook(self)
        tab1 = ttk.Frame(tab_control)
        tab2 = ttk.Frame(tab_control)
        tab3 = ttk.Frame(tab_control)

        tab_control.add(tab1, text='Матрицы')
        tab_control.add(tab2, text='Вектора')
        tab_control.add(tab3, text='Скаляры')

        tab_control.pack(expand=1, fill='both')

        self.spin0 = Spinbox(tab1, from_=0, to=9, width=5)
        self.spin0.grid(column=0, padx=25, row=0)

        self.spin1 = Spinbox(tab1, from_=0, to=9, width=5)
        self.spin1.grid(column=1, padx=50, row=0)

        self.spin2 = Spinbox(tab1, from_=0, to=9, width=5)
        self.spin2.grid(column=2, padx=70, row=0)

        #self.spin0_0 = Spinbox(tab2, from_=0, to=9, width=5)
        #self.spin0_0.grid(column=1, padx=0, row=0)

        #self.spin0_1 = Spinbox(tab2, from_=0, to=9, width=5)
        #self.spin0_1.grid(column=2, padx=25, row=0)

        ### матрицы
        btn = Button(tab1, text='Матричное произведение', width=25, command=Matrix().martix_multiply)
        btn.grid(row=2, column=0, padx=0, pady=5)

        btn = Button(tab1,  text='Сложение', width=25, command=Matrix().summ)
        btn.grid(row=2, column=1, padx=0, pady=5)

        btn = Button(tab1,  text='Матрица на скаляр', width=25, command=Matrix().on_scal)
        btn.grid(row=2, column=2, padx=0, pady=5)

        btn = Button(tab1,  text='Вектор на матрицу', width=25, command=Matrix().vector)
        btn.grid(row=2, column=3, padx=0, pady=5)

        btn = Button(tab1, text='Поэлементное произведение', width=25, command=Matrix().multiply)
        btn.grid(row=3, column=0, padx=0, pady=5)

        btn = Button(tab1,  text='След и определитель', width=25, command=Matrix().opredelitel)
        btn.grid(row=3, column=1, padx=0, pady=5)

        btn = Button(tab1,  text='Обратная матрица', width=25, command=Matrix().inv_matrix)
        btn.grid(row=3, column=2, padx=0, pady=5)

        btn = Button(tab1,  text='Транспонирование', width=25, command=Matrix().transposition)
        btn.grid(row=3, column=3, padx=0, pady=5)

        ### вектора
        btn = Button(tab2, text='Вектор на скаляр', width=25, command=Vector().vector_on_scal)
        btn.grid(row=2, column=0, padx=0, pady=5)

        btn = Button(tab2,  text='Поэлементное Сложение', width=25, command=Vector().summ_vector)
        btn.grid(row=2, column=1, padx=0, pady=5)

        btn = Button(tab2,  text='Поэлементное Умножение', width=25, command=Vector().mul_vector)
        btn.grid(row=2, column=2, padx=0, pady=5)

        btn = Button(tab2,  text='Вектор на матрицу', width=25, command=Matrix().vector)
        btn.grid(row=2, column=3, padx=0, pady=5)

        btn = Button(tab2, text='Скалярное произведение', width=25, command=Vector().scal_mul)
        btn.grid(row=3, column=0, padx=0, pady=5)

        btn = Button(tab2,  text='Векторное произведение', width=25, command=Vector().mull_vect)
        btn.grid(row=3, column=1, padx=0, pady=5)

        btn = Button(tab2,  text='Длина вектора', width=25, command=Vector().length_vect)
        btn.grid(row=3, column=2, padx=0, pady=5)

        btn = Button(tab2,  text='Проверка сонаправленности', width=25, command=0)
        btn.grid(row=3, column=3, padx=0, pady=5)

        btn = Button(tab2,  text='Проверка на ортогональность', width=25, command=0)
        btn.grid(row=4, column=0, padx=0, pady=5)

        # логика
        def calc(key):
            global memory
            if key == "=":
                # исключение написания слов
                str1 = "-+0123456789.*/)("
                if calc_entry.get()[0] not in str1:
                    calc_entry.insert(END, "First symbol is not number!")
                    mb.showerror("Error!", "You did not enter the number!")
                # исчисления
                try:
                    result = eval(calc_entry.get())
                    calc_entry.insert(END, "=" + str(result))
                except:
                    calc_entry.insert(END, "Error!")
                    mb.showerror("Error!", "Check the correctness of data")

            # очищение поля ввода
            elif key == "C":
                calc_entry.delete(0, END)

            elif key == "±":
                if "=" in calc_entry.get():
                    calc_entry.delete(0, END)
                try:
                    if calc_entry.get()[0] == "-":
                        calc_entry.delete(0)
                    else:
                        calc_entry.insert(0, "-")
                except IndexError:
                    pass

            elif key == "π":
                calc_entry.insert(END, math.pi)

            elif key == "Exit":
                tab3.after(1, App.tab3.destroy)
                sys.exit

            elif key == "xⁿ":
                calc_entry.insert(END, "**")

            elif key == "sin":
                calc_entry.insert(END, "=" + str(math.sin(int(calc_entry.get()))))

            elif key == "cos":
                calc_entry.insert(END, "=" + str(math.cos(int(calc_entry.get()))))

            elif key == "(":
                calc_entry.insert(END, "(")

            elif key == ")":
                calc_entry.insert(END, ")")

            elif key == "n!":
                calc_entry.insert(END, "=" + str(math.factorial(int(calc_entry.get()))))

            elif key == "√2":
                calc_entry.insert(END, "=" + str(math.sqrt(int(calc_entry.get()))))

            else:
                if "=" in calc_entry.get():
                    calc_entry.delete(0, END)
                calc_entry.insert(END, key)

        ### кнопки
        bttn_list = [
            "7", "8", "9", "+", "*",
            "4", "5", "6", "-", "/",
            "1", "2", "3", "=", "xⁿ",
            "0", ".", "±", "C",
            "Exit", "π", "sin", "cos",
            "(", ")", "n!", "√2", ]
        r = 1
        c = 0
        for i in bttn_list:
            rel = ""
            cmd = lambda x=i: calc(x)
            ttk.Button(tab3, text=i, command=cmd, width=10).grid(row=r, column=c)
            c += 1
            if c > 4:
                c = 0
                r += 1

        calc_entry = Entry(tab3, width=33)
        calc_entry.grid(row=0, column=0, columnspan=5)

if __name__ == "__main__":
    read_a = pd.read_csv('first.csv', sep=";", header=None)
    read_b = pd.read_csv('second.csv', sep=";", header=None)
    app = App()
    app.mainloop()

Первый очевидный шаг - вытащить функцию
calc из
__init__, сделать для начала отдельным методом того же класса, чтобы в
__init__ осталось только создание графического интерфейса.
Вложенными удобно делать небольшие функции, но такие огромные функции вложенными лучше не делать: получается, что, текст метода
__init__ внезапно прерывается огромной функцией
calc, а после нее идет еще достаточно большой кусок метода. Читать такой код очень неудобно.

Можно пообъединять if-ы с
calc_entry.insert(END, какой-то символ), чтобы получилось примерно так:

elif key in {"(", ")", ...}:
    calc_entry.insert(END, key)

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

funcs = {"sin": math.sin, "cos": math.cos, ...}

...

elif key in funcs:
   calc_entry.insert(END, "=" + str(funcs[key](int(calc_entry.get()))))

Создание кнопок для матриц и векторов можно делать циклами - по аналогии с созданием кнопок из
bttn_list, только в этом же списке можно хранить надпись кнопки и ее обработчик, например
('Матричное произведение', Matrix().martix_multiply)

Если перешли к ООП, то не используйте
global - записываете значения в поля объекта

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

Создание и заполнение каждого отдельного таба можно выделить в отдельные классы

Пример с вынесенным наружу calc (куски кода, касающиеся заполнения первых двух табов, вырезал, чтобы не мешали пониманию):

from tkinter import *
import tkinter as tk
from tkinter import ttk
import tkinter.messagebox as mb
import math

functions = {
    "sin": math.sin,
    "cos": math.cos,
    "n!": math.factorial,
    "√2": math.sqrt
}

# логика
def calc(key, text):
    if key == "=":
        # исчисления
        result = eval(text)
        return text + "=" + str(result)
    # очищение поля ввода
    elif key == "C":
        return ""

    elif key == "±":
        if "=" in text:
            return ""
        try:
            if text[0] == "-":
                return text[1:]
            else:
                return "-" + text
        except IndexError:
            pass

    elif key == "π":
        return text + math.pi

    elif key == "xⁿ":
        return text + "**"

    elif key in functions:
        return text + "=" + str(functions[key](int(text)))

    # elif key in {"(", ")"}:  # Будет обработано в else
    #     return text + key

    else:
        if "=" in text:
            text = ""

        return text + key

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        #self = Tk()
        self.title("Матрицы для детей")
        self.geometry('745x250')

        tab_control = ttk.Notebook(self)
        tab1 = ttk.Frame(tab_control)
        tab2 = ttk.Frame(tab_control)
        tab3 = ttk.Frame(tab_control)

        tab_control.add(tab1, text='Матрицы')
        tab_control.add(tab2, text='Вектора')
        tab_control.add(tab3, text='Скаляры')

        tab_control.pack(expand=1, fill='both')

        self.spin0 = Spinbox(tab1, from_=0, to=9, width=5)
        self.spin0.grid(column=0, padx=25, row=0)

        self.spin1 = Spinbox(tab1, from_=0, to=9, width=5)
        self.spin1.grid(column=1, padx=50, row=0)

        self.spin2 = Spinbox(tab1, from_=0, to=9, width=5)
        self.spin2.grid(column=2, padx=70, row=0)

        calc_entry = Entry(tab3, width=33)
        calc_entry.grid(row=0, column=0, columnspan=5)

        ### кнопки
        bttn_list = [
            "7", "8", "9", "+", "*",
            "4", "5", "6", "-", "/",
            "1", "2", "3", "=", "xⁿ",
            "0", ".", "±", "C",
            "Exit", "π", "sin", "cos",
            "(", ")", "n!", "√2", ]
        r = 1
        c = 0
        for i in bttn_list:
            rel = ""

            def command(key=i):
                if key == "Exit":
                    tab3.after(1, App.tab3.destroy)
                    sys.exit(0)

                try:
                    result = calc(key, calc_entry.get())
                except Exception as ex:
                    mb.showerror("Error!", "Check the correctness of data")
                    raise
                else:
                    calc_entry.delete(0, tk.END)
                    calc_entry.insert(0, result)

            ttk.Button(tab3, text=i, command=command, width=10).grid(row=r, column=c)
            c += 1
            if c > 4:
                c = 0
                r += 1

if __name__ == "__main__":
    app = App()
    app.mainloop()