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

for line in file:
    line = line.strip()

strip() убирает вообще все лишние пробельные символы и в начале и в конце строки, в вашем случае достаточно было бы просто убрать последний символ
line = line[:-1] (я проверял, так тоже работает), но
strip() всё-таки более универсальный метод, обычно в питоне используют именно его, когда есть предположение о наличии лишних пробельных символов по краям строки.


Как получить такой срез numpy array
Есть такой массив:

arr = np.array(([[1, 2],[4, 5], [7,8]], ([[4, 3],[4, 5], [7,8]])))`

Мне нужно получить из этих двух вложенных массивов, вторую колонку. Из этого массива каждое второе число, например:
2, 5, 8, 3, 5, 8. Как
slice сделать? Подскажите пожалуйста. У меня
predict_proba выдаёт результаты для двух классов, и мне нужно в
roc_auc_score передать значение второй колонки, каждого класса.

Можно сделать такой срез, чтобы получить результат размерности
(2, 3):

In [410]: arr[:, :, 1]
Out[410]:
array([[2, 5, 8],
       [3, 5, 8]])

In [411]: arr[:, :, 1].shape
Out[411]: (2, 3)

или в виде 1D вектора:

In [412]: arr[:, :, 1].ravel()
Out[412]: array([2, 5, 8, 3, 5, 8])


Обновление кругового прогресс-бара PyQt5 получаемыми из цикла for значениями отдельного модуля
modalwin.py (основной)

import os
import sys
from PyQt5 import QtWidgets
from PyQt5.QtGui import QFont
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from script import archiveWork
from progressbar import PercentProgressBar

class DialogUnpacking(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.tiltewin = QFrame(self)
        self.tiltewin.resize(600, 250)
        self.tiltewin.setStyleSheet('''
            background-color: rgb(230, 230, 250);
            border: 0px solid;
            border-radius: 16px;
            color: rgb(255, 160, 122)
            ''')
        self.pathfolder = os.environ['USERPROFILE'] + '\Desktop'
        self.set_delete = False
        self.unpackingDirectory = True
        self.replacement = False

        fontArial = QFont('Arial', 18, 75)

        self.modalgrid = QtWidgets.QGridLayout(self.tiltewin)

        self.rbt_unpack = QButtonGroup()
        self.rbt_unpack_directory = QRadioButton('1 архив = 1 папка', self)
        self.rbt_unpack_directory.setFont(fontArial)
        self.rbt_unpack_directory.setChecked(True)
        self.rbt_unpack.addButton(self.rbt_unpack_directory, 0)
        self.rbt_unpack_directory.clicked.connect(self.evt_directory)
        self.modalgrid.addWidget(self.rbt_unpack_directory, 0, 0)
        self.rbt_unpack_files = QRadioButton('Без папок', self)
        self.rbt_unpack_files.setFont(fontArial)
        self.rbt_unpack.addButton(self.rbt_unpack_files, 1)
        self.rbt_unpack_files.clicked.connect(self.evt_directory)
        self.modalgrid.addWidget(self.rbt_unpack_files, 1, 0)

        self.chk_delete = QCheckBox('Удалять архивы', self)
        self.chk_delete.setFont(fontArial)
        self.modalgrid.addWidget(self.chk_delete, 0, 1)
        self.chk_delete.toggled.connect(self.evt_chkEnabled_del)
        self.chk_replacement = QCheckBox('Без перезаписи', self)
        self.chk_replacement.setFont(fontArial)
        self.modalgrid.addWidget(self.chk_replacement, 1, 1)
        self.chk_replacement.toggled.connect(self.evt_chkEnabled_rec)

        self.btn_unpack = QPushButton("Распаковать", self)
        self.btn_unpack.setFont(fontArial)
        self.btn_unpack.setFixedSize(150, 30)
        self.btn_unpack.clicked.connect(self.evt_unpacking)
        self.modalgrid.addWidget(self.btn_unpack, 3, 0)

        self.btn_close = QPushButton("Отмена", self)
        self.btn_close.setFont(fontArial)
        self.btn_close.setFixedSize(150, 30)
        self.btn_close.clicked.connect(self.modalWinHide)
        self.modalgrid.addWidget(self.btn_close, 3, 1)

    def evt_directory(self):
        '''
        Обработка событий для блока с радиокнопками
        '''
        checked_btn = self.rbt_unpack.checkedId()
        if checked_btn == 0:
            self.unpackingDirectory = True
        elif checked_btn == 1:
            self.unpackingDirectory = False

    def evt_chkEnabled_del(self, is_cheked):
        '''
        Обработка событий для чек-боксов
        '''
        if is_cheked:
            self.set_delete = True
        else:
            self.set_delete = False

    def evt_chkEnabled_rec(self, is_cheked):
        '''
        Обработка событий для чек-боксов
        '''
        if is_cheked:
            self.replacement = True
        else:
            self.replacement = False

    def evt_unpacking(self):
        '''
        Распкаковка всех архивов в директории
        '''
        self.rbt_unpack_directory.hide()
        self.rbt_unpack_files.hide()
        self.chk_delete.hide()
        self.chk_replacement.hide()
        self.btn_unpack.hide()
        self.btn_close.hide()

        self._value = 0
        self._widgets = []
        self._timer = QTimer(self, timeout=self.updateValue)
        self._widgets.append(PercentProgressBar(self, showPercent=False))
        self.modalgrid.addWidget(self._widgets[0])
        self._timer.start(100)

        archiveWork(
            path=self.pathfolder,
            unpackingDirectory=self.unpackingDirectory,
            replacement=self.replacement,
            delete=self.set_delete)
        # self.close()

    def updateValue(self):
        '''res = archiveWork(
            path=self.notation,
            unpackingDirectory=self.unpackingDirectory,
            replacement=self.replacement,
            delete=self.set_delete)
        print(res)
        for w in self._widgets:
            w.value = self._value
        self._value = res[0]
        if self._value == res[1]:'''
        for w in self._widgets:
            w.value = self._value
        self._value += 1
        if self._value > 100:
            self.close()

    def modalWinHide(self):
        self.close()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DialogUnpacking()
    window.show()
    sys.exit(app.exec_())

script.py

import os
import time
from zipfile import ZipFile

formats = ['zip', 'rar', 'cbr']

def archiveWork(path=None, unpackingDirectory=True, replacement=False, delete=False):
    if path is not None:
        os.chdir(path)
    else:
        path = os.getcwd()
        os.chdir(path)
    all_files = os.listdir()
    workfiles = []

    for i in all_files:
        fileformat = i[-3:]
        if fileformat in formats:
            workfiles.append(i)
    countfiles = 0
    for i in workfiles:
        fileformat = i[-3:]
        filename = i[:-4]

        filezip = ZipFile(path+"\\"+i)
        if unpackingDirectory == True:
            if replacement:
                if filename in workfiles:
                    counting = 1
                    while True:
                        if f'{filename} #{counting}' in os.listdir(path):
                            counting += 1
                        else:
                            rename = f'{filename} #{counting}'
                            os.rename(filename, rename)
                            break
            filezip.extractall(path+"\\"+filename)
        elif unpackingDirectory == False:
            if replacement:
                for file in filezip.namelist():
                    files_directory = os.listdir()
                    fileformat = file[-3:]
                    filename = file[:-4]
                    if file in files_directory:
                        counting = 1
                        while True:
                            if f'{filename} #{counting}.{fileformat}' in os.listdir(path):
                                counting += 1
                            else:
                                rename = f'{filename} #{counting}.{fileformat}'
                                os.rename(file, rename)
                                break
                    filezip.extract(file, path)
            else:
                filezip.extractall(path)
        filezip.close()
        countfiles += 1
        yield (countfiles, len(workfiles))
    if delete:
        for i in workfiles:
            os.remove(path+"\\"+i)

if __name__ == "__main__":
    archiveWork()

progressbar.py

import sys
from PyQt5.QtCore import pyqtProperty, QSize, Qt, QRectF
from PyQt5.QtGui import QColor, QPainter, QFont
from PyQt5.QtWidgets import QWidget

class PercentProgressBar(QWidget):
    MinValue = 0
    MaxValue = 100
    Value = 0
    BorderWidth = 8
    Clockwise = True
    ShowPercent = True
    ShowFreeArea = False
    ShowSmallCircle = False
    TextColor = QColor(255, 160, 122)
    BorderColor = QColor(255, 160, 122)
    BackgroundColor = QColor(255, 197, 150)

    def __init__(self, *args, value=0, minValue=0, maxValue=100,
                 borderWidth=8, clockwise=True, showPercent=True,
                 showFreeArea=False, showSmallCircle=False,
                 textColor=QColor(255, 160, 122),
                 borderColor=QColor(255, 160, 122),
                 backgroundColor=QColor(230, 230, 250), **kwargs):
        super(PercentProgressBar, self).__init__(*args, **kwargs)

        self.Value = value
        self.MinValue = minValue
        self.MaxValue = maxValue
        self.BorderWidth = borderWidth
        self.Clockwise = clockwise
        self.ShowPercent = showPercent
        self.ShowFreeArea = showFreeArea
        self.ShowSmallCircle = showSmallCircle
        self.TextColor = textColor
        self.BorderColor = borderColor
        self.BackgroundColor = backgroundColor

    def setRange(self, minValue: int, maxValue: int):
        if minValue >= maxValue:
            return
        self.MinValue = minValue
        self.MaxValue = maxValue
        self.update()

    def paintEvent(self, event):
        super(PercentProgressBar, self).paintEvent(event)
        width = self.width()
        height = self.height()
        side = min(width, height)

        painter = QPainter(self)
        painter.setRenderHints(QPainter.Antialiasing |
                               QPainter.TextAntialiasing)
        # координатный центр - средняя точка
        painter.translate(width / 2, height / 2)
        # 100x100 масштабирование
        painter.scale(side / 100.0, side / 100.0)
        self._drawCircle(painter, 50)
        # Нарисуйте дугу
        self._drawArc(painter, 50 - self.BorderWidth / 2)
        # Текст
        self._drawText(painter, 50)

    def _drawCircle(self, painter: QPainter, radius: int):
        radius = radius - self.BorderWidth
        painter.save()
        painter.setPen(Qt.NoPen)
        painter.setBrush(self.BackgroundColor)
        painter.drawEllipse(QRectF(-radius, -radius, radius * 2, radius * 2))
        painter.restore()

    def _drawArc(self, painter: QPainter, radius: int):
        # Нарисуйте дугу
        painter.save()
        painter.setBrush(Qt.NoBrush)
        # Изменить кисть
        pen = painter.pen()
        pen.setWidthF(self.BorderWidth)
        pen.setCapStyle(Qt.RoundCap)

        arcLength = 360.0 / (self.MaxValue - self.MinValue) * self.Value
        rect = QRectF(-radius, -radius, radius * 2, radius * 2)

        if not self.Clockwise:
            # против часовой стрелки
            arcLength = -arcLength

        # Нарисуйте оставшуюся прокрутку
        if self.ShowFreeArea:
            acolor = self.BorderColor.toRgb()
            acolor.setAlphaF(0.2)
            pen.setColor(acolor)
            painter.setPen(pen)
            painter.drawArc(rect, (0 - arcLength) *
                            16, -(360 - arcLength) * 16)

        # Нарисуйте текущую прокрутку
        pen.setColor(self.BorderColor)
        painter.setPen(pen)
        painter.drawArc(rect, 0, -arcLength * 16)

        # Нарисуйте небольшой круг перед дугой прогресса
        if self.ShowSmallCircle:
            offset = radius - self.BorderWidth + 1
            radius = self.BorderWidth / 2 - 1
            painter.rotate(-90)
            circleRect = QRectF(-radius, radius + offset,
                                radius * 2, radius * 2)
            painter.rotate(arcLength)
            painter.drawEllipse(circleRect)

        painter.restore()

    def _drawText(self, painter: QPainter, radius: int):
        painter.save()
        painter.setPen(self.TextColor)
        painter.setFont(QFont('Arial', 25))
        strValue = '{}%'.format(int(self.Value / (self.MaxValue - self.MinValue)
                                    * 100)) if self.ShowPercent else str(self.Value)
        painter.drawText(QRectF(-radius, -radius, radius * 2,
                                radius * 2), Qt.AlignCenter, strValue)
        painter.restore()

    @pyqtProperty(int)
    def minValue(self) -> int:
        return self.MinValue

    @minValue.setter
    def minValue(self, minValue: int):
        if self.MinValue != minValue:
            self.MinValue = minValue
            self.update()

    @pyqtProperty(int)
    def maxValue(self) -> int:
        return self.MaxValue

    @maxValue.setter
    def maxValue(self, maxValue: int):
        if self.MaxValue != maxValue:
            self.MaxValue = maxValue
            self.update()

    @pyqtProperty(int)
    def value(self) -> int:
        return self.Value

    @value.setter
    def value(self, value: int):
        if self.Value != value:
            self.Value = value
            self.update()

    @pyqtProperty(float)
    def borderWidth(self) -> float:
        return self.BorderWidth

    @borderWidth.setter
    def borderWidth(self, borderWidth: float):
        if self.BorderWidth != borderWidth:
            self.BorderWidth = borderWidth
            self.update()

    @pyqtProperty(bool)
    def clockwise(self) -> bool:
        return self.Clockwise

    @clockwise.setter
    def clockwise(self, clockwise: bool):
        if self.Clockwise != clockwise:
            self.Clockwise = clockwise
            self.update()

    @pyqtProperty(bool)
    def showPercent(self) -> bool:
        return self.ShowPercent

    @showPercent.setter
    def showPercent(self, showPercent: bool):
        if self.ShowPercent != showPercent:
            self.ShowPercent = showPercent
            self.update()

    @pyqtProperty(bool)
    def showFreeArea(self) -> bool:
        return self.ShowFreeArea

    @showFreeArea.setter
    def showFreeArea(self, showFreeArea: bool):
        if self.ShowFreeArea != showFreeArea:
            self.ShowFreeArea = showFreeArea
            self.update()

    @pyqtProperty(bool)
    def showSmallCircle(self) -> bool:
        return self.ShowSmallCircle

    @showSmallCircle.setter
    def showSmallCircle(self, showSmallCircle: bool):
        if self.ShowSmallCircle != showSmallCircle:
            self.ShowSmallCircle = showSmallCircle
            self.update()

    @pyqtProperty(QColor)
    def textColor(self) -> QColor:
        return self.TextColor

    @textColor.setter
    def textColor(self, textColor: QColor):
        if self.TextColor != textColor:
            self.TextColor = textColor
            self.update()

    @pyqtProperty(QColor)
    def borderColor(self) -> QColor:
        return self.BorderColor

    @borderColor.setter
    def borderColor(self, borderColor: QColor):
        if self.BorderColor != borderColor:
            self.BorderColor = borderColor
            self.update()

    @pyqtProperty(QColor)
    def backgroundColor(self) -> QColor:
        return self.BackgroundColor

    @backgroundColor.setter
    def backgroundColor(self, backgroundColor: QColor):
        if self.BackgroundColor != backgroundColor:
            self.BackgroundColor = backgroundColor
            self.update()

    def setValue(self, value):
        self.value = value

    def sizeHint(self) -> QSize:
        return QSize(100, 100)

Видел решения обновления через
threadSignal, но не уверен что это подходит в случае "саморучного" прогресс-бара. Да, и функция
archiveWork нужна именно в отдельном файле (в script.py), потому что скрипт может выполняться вне gui.
Нужно чтобы максимум полосы загрузки была длинна списка
workfiles из script.py, а шаг загрузки - одна итерация
archiveWork. Я попробовал осуществить обновление через yield, но в таком случае функция во первых будет запускаться всегда сначала, во вторых данные не возвращаются, а сама функция превращается в генератор, судя по ошибкам того кода, который я закоментировал в кавычки.
Подскажите пожалуйста, в каком направлении мне нужно думать?

У вас функция
archiveWork на самом деле являлась генератором, т.к. в ней был
yield, из-за чего просто так ее нельзя было вызвать как вы это делали (чтобы ее вызывать нужно было или в цикле ее прогнать, или вызвать ее в
next).
Плюс, добавил функцию для колбека
script.py

import os
from zipfile import ZipFile
from typing import Callable

formats = ['zip', 'rar', 'cbr']

def archiveWork(
        path=None,
        unpackingDirectory=True,
        replacement=False,
        delete=False,
        on_progress: Callable[[int, int], None] = None
):
    if path is not None:
        os.chdir(path)
    else:
        path = os.getcwd()
        os.chdir(path)
    all_files = os.listdir()
    workfiles = []

    for f in all_files:
        fileformat = f[-3:]
        if fileformat in formats:
            workfiles.append(f)
    countfiles = 0

    for i, f in enumerate(workfiles):
        on_progress(i, len(workfiles))

        fileformat = f[-3:]
        filename = f[:-4]

        filezip = ZipFile(path+"\\"+f)
        if unpackingDirectory == True:
            if replacement:
                if filename in workfiles:
                    counting = 1
                    while True:
                        if f'{filename} #{counting}' in os.listdir(path):
                            counting += 1
                        else:
                            rename = f'{filename} #{counting}'
                            os.rename(filename, rename)
                            break
            filezip.extractall(path+"\\"+filename)
        elif unpackingDirectory == False:
            if replacement:
                for file in filezip.namelist():
                    files_directory = os.listdir()
                    fileformat = file[-3:]
                    filename = file[:-4]
                    if file in files_directory:
                        counting = 1
                        while True:
                            if f'{filename} #{counting}.{fileformat}' in os.listdir(path):
                                counting += 1
                            else:
                                rename = f'{filename} #{counting}.{fileformat}'
                                os.rename(file, rename)
                                break
                    filezip.extract(file, path)
            else:
                filezip.extractall(path)
        filezip.close()
        countfiles += 1
        # yield (countfiles, len(workfiles))
    if delete:
        for f in workfiles:
            os.remove(path+"\\"+f)

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

class DialogUnpacking(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.tiltewin = QFrame(self)
        self.tiltewin.resize(600, 250)
        self.tiltewin.setStyleSheet('''
            background-color: rgb(230, 230, 250);
            border: 0px solid;
            border-radius: 16px;
            color: rgb(255, 160, 122)
            ''')
        self.pathfolder = os.environ['USERPROFILE'] + r'\Desktop'
        self.set_delete = False
        self.unpackingDirectory = True
        self.replacement = False

        fontArial = QFont('Arial', 18, 75)

        self.modalgrid = QtWidgets.QGridLayout(self.tiltewin)

        self.rbt_unpack = QButtonGroup()
        self.rbt_unpack_directory = QRadioButton('1 архив = 1 папка', self)
        self.rbt_unpack_directory.setFont(fontArial)
        self.rbt_unpack_directory.setChecked(True)
        self.rbt_unpack.addButton(self.rbt_unpack_directory, 0)
        self.rbt_unpack_directory.clicked.connect(self.evt_directory)
        self.modalgrid.addWidget(self.rbt_unpack_directory, 0, 0)
        self.rbt_unpack_files = QRadioButton('Без папок', self)
        self.rbt_unpack_files.setFont(fontArial)
        self.rbt_unpack.addButton(self.rbt_unpack_files, 1)
        self.rbt_unpack_files.clicked.connect(self.evt_directory)
        self.modalgrid.addWidget(self.rbt_unpack_files, 1, 0)

        self.chk_delete = QCheckBox('Удалять архивы', self)
        self.chk_delete.setFont(fontArial)
        self.modalgrid.addWidget(self.chk_delete, 0, 1)
        self.chk_delete.toggled.connect(self.evt_chkEnabled_del)
        self.chk_replacement = QCheckBox('Без перезаписи', self)
        self.chk_replacement.setFont(fontArial)
        self.modalgrid.addWidget(self.chk_replacement, 1, 1)
        self.chk_replacement.toggled.connect(self.evt_chkEnabled_rec)

        self.btn_unpack = QPushButton("Распаковать", self)
        self.btn_unpack.setFont(fontArial)
        self.btn_unpack.setFixedSize(150, 30)
        self.btn_unpack.clicked.connect(self.evt_unpacking)
        self.modalgrid.addWidget(self.btn_unpack, 3, 0)

        self.btn_close = QPushButton("Отмена", self)
        self.btn_close.setFont(fontArial)
        self.btn_close.setFixedSize(150, 30)
        self.btn_close.clicked.connect(self.modalWinHide)
        self.modalgrid.addWidget(self.btn_close, 3, 1)

        self.progress_bar = QProgressBar()
        self.progress_bar.setRange(0, 0)
        self.progress_bar.hide()
        self.modalgrid.addWidget(self.progress_bar, 4, 0, 1, 2)

    def evt_directory(self):
        '''
        Обработка событий для блока с радиокнопками
        '''
        checked_btn = self.rbt_unpack.checkedId()
        if checked_btn == 0:
            self.unpackingDirectory = True
        elif checked_btn == 1:
            self.unpackingDirectory = False

    def evt_chkEnabled_del(self, is_cheked):
        '''
        Обработка событий для чек-боксов
        '''
        if is_cheked:
            self.set_delete = True
        else:
            self.set_delete = False

    def evt_chkEnabled_rec(self, is_cheked):
        '''
        Обработка событий для чек-боксов
        '''
        if is_cheked:
            self.replacement = True
        else:
            self.replacement = False

    def evt_unpacking(self):
        '''
        Распкаковка всех архивов в директории
        '''
        self.rbt_unpack_directory.hide()
        self.rbt_unpack_files.hide()
        self.chk_delete.hide()
        self.chk_replacement.hide()
        self.btn_unpack.hide()
        self.btn_close.hide()

        # self._value = 0
        # self._widgets = []
        # self._timer = QTimer(self, timeout=self.updateValue)
        # self._widgets.append(PercentProgressBar(self, showPercent=False))
        # self.modalgrid.addWidget(self._widgets[0])
        # self._timer.start(100)

        self.progress_bar.show()
        QApplication.processEvents()

        def on_progress(i, total):
            print('on_progress', i, total)
            self.progress_bar.setRange(0, total)
            self.progress_bar.setValue(i)
            QApplication.processEvents()

        archiveWork(
            path=self.pathfolder,
            unpackingDirectory=self.unpackingDirectory,
            replacement=self.replacement,
            delete=self.set_delete,
            on_progress=on_progress
        )

        self.progress_bar.hide()

        # self.close()

    # def updateValue(self):
    #     '''res = archiveWork(
    #         path=self.notation,
    #         unpackingDirectory=self.unpackingDirectory,
    #         replacement=self.replacement,
    #         delete=self.set_delete)
    #     print(res)
    #     for w in self._widgets:
    #         w.value = self._value
    #     self._value = res[0]
    #     if self._value == res[1]:'''
    #     for w in self._widgets:
    #         w.value = self._value
    #     self._value += 1
    #     if self._value > 100:
    #         self.close()

    def modalWinHide(self):
        self.close()


Как правильно подставлять значения из переменных / списков / словарей в SQL запрос?
Все чаще стали появляться вопросы о том, как правильно подставить в SQL запрос значения из переменных и об ошибках, связанных с неправильной подстановкой значений.
Вот несколько примеров таких вопросов:

Почему при вставке в таблицу передаваемые значения воспринимаются как названия столбцов?
Как устранить ошибку "sqlite3.OperationalError: no such column: ..."?
Как экранировать SQL запрос, чтобы избежать SQL injections?
Как передавать параметр типа string в SQL запрос?
Как правильно заменить местозаполнители в запросе?
SQL запрос с несколькими условиями

Поэтому я решил создать новый обобщённый вопрос и более-менее канонический ответ для того, чтобы ссылаться на него в будущем. Данный ответ планируется расширять новыми подробностями и примерами.

Лучше всего использовать SQL запросы с использованием параметров:

cursor.execute("SELECT * FROM my_table WHERE id = ?", [123])
# parameter placeholder ------------------------> ^
# список/кортеж со значениями параметров -----------> ^^^^^

Какие преимущества приносит использование параметров?

Защита от SQL Injections. Смотрите пример
SQL Injectionвнизу.
правильное квотирование литералов в зависимости от их типа (пример со строками, пример с датами).
Оптимизация - сокращение времени работы SQL запроса. Благодаря использованию параметров следующие шаги не выполняются при повторном запуске (В зависимости от типа базы данных и от их настроек либо все либо некоторые из данных шагов будут пропущены при повторном выполнении):

проверка синтаксиса SQL запроса
проверка прав доступа к объектам БД
построение плана выполнения SQL запроса

Защита от переполнения/вытеснения кеша SQL запросов. Например "безобидный" запрос
qry = f"SELECT first_name, last_name FROM users WHERE id = {user_id}", который часто выполняется в нагруженной системе с различными значениями
user_id может вытеснить из кеша запросов полезные запросы. Если использовать
qry = f"SELECT first_name, last_name FROM users WHERE id = ?" - в кеше запросов сохранится только один запрос, т.к. его
checksum не изменяется вне зависимости от значения параметра.

Пример использования параметров в SQL запросе:

import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table lang (name, first_appeared)")

# This is the qmark style:
cur.execute("insert into lang values (?, ?)", ("C", 1972))

# The qmark style used with executemany():
lang_list = [
    ("Fortran", 1957),
    ("Python", 1991),
    ("Go", 2009),
]
cur.executemany("insert into lang values (?, ?)", lang_list)

# And this is the named style:
cur.execute("select * from lang where first_appeared=:year", {"year": 1972})
print(cur.fetchall())

con.close()

При таком подходе можно использовать
cursor.executemany() - это значительно быстрее и эффективнее по сравнению с вставкой в цикле по одной строке.
Стоит упомянуть о том, что параметризировать можно только значения, но не наименования объектов БД (таблиц, столбцов, индексов,
constraints, etc.). Для подстановки наименований БД придется использовать форматирование строк или же "хардкодировать" их.
Пример:

table_name = "my_table"
column_name = "id"
qry = f"SELECT max({column_name}) as max_val FROM {table_name}"
cursor.execute(qry)

В этом запросе невозможно параметризировать имя таблицы или имя столбца - их можно подставить при помощи форматирования строк.
К сожалению в Python нет единого стандарта стиля параметров (
paramstyle) БД - выбор
paramstyle зависит от реализации драйвера БД. В PEP-0249 указаны все возможные виды
paramstyle:

paramstyle
Meaning

qmark
Question mark style, e.g. ...WHERE name = ?

numeric
Numeric, positional style, e.g. ...WHERE name = :1

named
Named style, e.g. ...WHERE name = :name

format
ANSI C printf format codes, e.g. ...WHERE name = %s

pyformat
Python extended format codes, e.g. ...WHERE name = %(name)s

Вот список поддерживаемых
paramstyle для наиболее популярных драйверов БД в Python:

DB driver
paramstyle

sqlite3
qmark (
?), numeric (
:1)

cx_Oracle
named (
:name), numeric (
:1)

pymysql
format (
%s)

mysql.connector
format (
%s), pyformat (
%(name)s)

psycopg2
format (
%s), pyformat (
%(name)s)

pymssql
format (
%s), pyformat (
%(name)s)

PyODBC
qmark (
?)

Как динамически сформировать запрос с заранее неизвестным количеством
параметров (значения параметров заданы в виде списка)?

Например как передать параметры в следующий запрос с использованием
named
"paramstyle":

SELECT data FROM table WHERE data in (:param_name1, :param_name2, ...)

Можно динамически сформировать запрос и словарь с параметрами:

values = ['val_1', 'val_2', 'val_3']
param_names = [f"p{i}" for i in range(len(values))]
in_str = ", ".join(":" + p for p in param_names))
params = dict(zip(param_names, values))
qry = f"""SELECT * FROM table WHERE data in ({in_str})"""
cursor.execute(qry, params)

получим такие запрос и параметры:

In [82]: qry
Out[82]: 'SELECT * FROM table WHERE data in (:p0, :p1, :p2)'

In [83]: params
Out[83]: {'p0': 'val_1', 'p1': 'val_2', 'p2': 'val_3'}

Пример
SQL Injection (никогда так не делайте - это опасно):

id_ = input("Введите ID клиента: ")
cur.execute(f"SELECT first_name, last_name FROM customers WHERE id = {id_}")
print(cur.fetchall())

"Злобный хакер" может ввести следующее значение "id":
123 UNION ALL SELECT username, password FROM secure_logins
В итоге в базе данных выполнится следующий запрос:

SELECT first_name, last_name FROM customers WHERE id = 123
UNION ALL
SELECT username, password FROM secure_logins

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

id_ = int(input("Введите ID клиента: "))
cur.execute(f"SELECT first_name, last_name FROM customers WHERE id = ?", [id_])

В таком варианте сервер БД вернет сообщение об ошибке на попытку хакерской атаки.


Как отловить ошибку?
Программа падает с ошибкой если открыт результирующий файл

>    Traceback (most recent call last):
  File "C:/Users/User/PycharmProjects/ProjectSED/main.py", line 580, in comparison
    wb.save(f'{self.path}/Результат.xlsx')
  File "C:\Users\User\PycharmProjects\ProjectSED\venv\lib\site-packages\openpyxl\workbook\workbook.py", line 407, in save
    save_workbook(self, filename)
  File "C:\Users\User\PycharmProjects\ProjectSED\venv\lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook
    archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
  File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\zipfile.py", line 1251, in __init__
    self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'C:/Результат.xlsx'

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

df1 = pd.read_excel(self.filename, skiprows=2, header=None, usecols=[1, 2, 3, 14, 21]).drop(labels=[0,1,2,3,4,5],axis=0)
df2 = pd.read_excel(self.filename1, skiprows=2, header=None, usecols=[2, 3, 4, 5, 20]).drop(labels=[0,1,2,3,4,5,6,7,8,9,10],axis=0)
df3 = pd.read_excel(self.filename2, header=None, usecols=[3, 4, 5, 9, 12]).drop(labels=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],axis=0)

result = df1.loc[df1.ne(df2.to_numpy()).any(axis=1)]
result2 = df2.loc[df2.ne(df1.to_numpy()).any(axis=1)]
result3 = df1.loc[df1.ne(df3.to_numpy()).any(axis=1)]
result4 = df3.loc[df3.ne(df1.to_numpy()).any(axis=1)]

datafr = pd.concat([d.reset_index(drop=True) for d in [result, result3]], axis=0)
datafr1 = pd.concat([d.reset_index(drop=True) for d in [datafr, result2, result4]], axis=1)

try:
datafr1.to_excel(f'{self.path}/Результат.xlsx', engine='openpyxl', sheet_name='Лист', startrow=2,
            startcol=0, header=None, index=False)

except ValueError as ve:
             print(ve)

но безрезультатно, что может быть не так?

Так и нужно ловить
PermissionError, а не
ValueError.


Как получить фото от юзера через state TG
<code>
@dp.message_handler(state=bot.ppl)
async def ppl(message: types.Message, state=FSMContext):
    print('+')

@dp.message_handler(state=bot.ppl, content_types=['photo'])
async def ppl(message: types.Message, state=FSMContext):
    print('+')

await bot.ppl.set()
</code>
Пробовал всё,но когда отправляю фото  ничего не происходит.На state ничего не реагирует

Нужно тип указывать через types.ContentType:
<code>
@dp.message_handler(state=bot.ppl, content_types=types.ContentType.PHOTO)
async def ppl(message: types.Message, state=FSMContext):
    print('+')
</code>


Как узнать в какой кодировке данные или как правильно декодировать?
Есть значение, но неизвестно в какой кодировке. Требуется перекодировать в UTF-8. Можно ли как-нибудь узнать в какой кодировке или автоматически их правильно декодировать?
Пробовал так:

decodeName = name.encode(encoding='UTF-8', errors='replace')

Но, в ответе получаются кракозябры (например: Р”Р°СЂСЊСЏ), т.к. символы, которые не получилось закодировать - пропускались.
Пробовал сделать так:

decodeNameASCII = name.decode("ascii")
encodeNameUTF8 = decodeNameASCII.encode("utf-8", "ignore")

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

decodeNameASCI = name.decode("ascii")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

Пробовал так:

decodeNameCP1251 = name.decode("cp1251")

Выдает ошибку:

decodeNameCP1251 = name.decode("cp1251")
File ".....python2.7/encodings/cp1251.py", line 15, in decode
return codecs.charmap_decode(input,errors,decoding_table)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

Чисто теоретически можно попробовать угадать кодировку - путем подстановки, но, думаю, это жестко.
Python v2
Дополнение:

Выборка из БД:

# -*- coding: utf-8 -*-
....
from google.appengine.datastore.datastore_query import Cursor
cursor = self.request.get('cursor')
if cursor != 'undefined':
    cursor = Cursor(urlsafe=cursor)
    allRows, cursor, more = User.query().fetch_page(1000, start_cursor=cursor)
else:
    allRows, cursor, more = User.query().fetch_page(1000)

for rows in allRows:
    name = rows.name
    decodeName = name.encode(encoding='UTF-8', errors='replace')
    ....

Поле
name в таблице БД может быть пустым, полностью из английских букв, полностью из русских и в перемешку (рус+англ+цифры)

Запись в файл:

DataForCSV_File.append([decodeName, rows.email, rows.account_type])
f = StringIO()
csv.writer(f).writerows(DataForCSV_File)
file_name = 'dbUser.csv'

Более подробно формирование файла и выборка была в другом моем вопросе:

У меня получилось декодировать вашу строку следующими способами:
Python 3

'Р”Р°СЂСЊСЏ'.encode('cp1251').decode('utf-8')

Python 2

bytes('Р”Р°СЂСЊСЏ').decode('utf-8').encode('cp1251').decode('utf-8')

Ответ

Дарья


Почему после выхода из функции список не изменяется (даже с return)
Требуется вывести измененный список, где удалены нечетные числа, а четные целочисленно поделены пополам. (по условию функция не должна ничего возвращать, как и выводить (сделано для проверки))
<code>
def modify_list(l):
    l = list(filter(lambda x: not int(x) % 2, l))
    for i in range(len(l)):
        l[i] = l[i]//2

l = [10, 5, 8, 3]
modify_list(l)
print(l)
</code>

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

def modify_list(l):
    for i in range(len(l) - 1, -1, -1):
        if l[i] % 2:
            del l[i]
        else:
            l[i] //= 2

l = [10, 5, 8, 3]
modify_list(l)
print(l)

Вывод:

[5, 4]

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

for i in reversed(range(len(l))):


Проблема с выводом данных sqlite3
Я пытаюсь вывести данные с помощью fetchall().
Полный код:

cursor.execute(f'SELECT exchange_offer_id FROM exchange WHERE exchange_name = "finder"')
exchange = cursor.fetchall()
offers = exchange #тут все данные
print(offers)

Результат выглядит следующим образом:

[(4,), (3,)]

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

Можете просто список перебрать и достать первые значения.
<code>
cursor.execute(f'SELECT exchange_offer_id FROM exchange WHERE exchange_name = "finder"')
exchange = cursor.fetchall()
offers = [x[0] for x in exchange]
print(offers)
</code>


Можно ли в python сделать реакцию на "открытие" с помощью"? [закрыт]

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

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

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

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

Можно ли в python сделать реакцию на "открытие" с помощью"? То есть я допустим в проводнике открываю файл с помощью другой программы (своей) и как сделать так чтобы в этом случае выполнялось определенное действие с открытым файлом

По факту, "открыть с помощью" просто передает файл как аргумент запуска. Значит можно использовать
sys.args.
Как пример:

import sys

print(sys.argv)
input()

После перетащил файлик с именем
file.txt на мой
py:

['D:\\Programs\\Python\\0.py', 'D:\\Programs\\Python\\file.txt']


Как упросить конструкцию
Дано задание упросить конструкцию до 1 строки кода

with open('text.txt', 'a') as f:
    i = ' '
    while True:
        i = input()
        f.write(i + '\n')
        if i == '':
            break

У меня вышло упростить лишь до 2 строк кода

i = ' '
while bool(i): i = input(); open('text.txt', 'a').write(f'{i}\n')

while s := input():print(s, file=open('test.txt', 'a'))

либо так:

print(*iter(input, ''), sep='\n', file=open('test.txt', 'a'))

Если в
iter передать два аргумента, то он будет вызывать первый аргумент (
input), до тех пор, пока результат не будет равен второму аргументу (
'')


Почему-то выходит None в конце. Вместо return писал print(), но ошибку выдает. (Python)
Надо написать функцию
sequence(n), которая будет распечатывать последовательность чисел без использования цикла
for /
while.
Если задано число
n, выведите следующий последовательность чисел без использования цикла.
Мы уменьшаем число
n на
5, пока не достигнем отрицательного числа или
0.

list_of_numbers=[]

def sequence(n):
    list_of_numbers.append(n)
    if n<=0:
        print(list_of_numbers)
        return list_of_numbers.clear()
    return sequence(n-5)

print(sequence(16))

[16, 11, 6, 1, -4]
None

У вас же внешний вызов уже делает печать, зачем вам печатать два раза - внутри функции и снаружи? Вместо:

        print(list_of_numbers)
        return list_of_numbers.clear()

Просто верните список, и он напечатается снаружи функции, вместо
None:

        return list_of_numbers

А если вам нужно переиспользовать функцию, а значит всё же очищать как-то список, то определяйте пустой список внутри функции, а не снаружи, с помощью аргумента по умолчанию
None, а при рекурсивном вызове передавайте список в функцию в явном виде. В результате получится такой код:

def sequence(n, list_of_numbers=None):
    if list_of_numbers is None:
        list_of_numbers=[]
    list_of_numbers.append(n)
    if n<=0:
        return list_of_numbers
    return sequence(n-5, list_of_numbers)

print(sequence(16))


Процесс не завершается
По идее, код должен работать так: считываются имена всех открытых программ, и, если название программы есть в бан-листе, программа должна закрываться, но ничего не происходит...
вот код:
<code>
while True:

    for proc in psutil.process_iter():
        name = proc.name()
        banlist = ["calc.exe"]

        if name in banlist:
            print(name)
            os.system("taskkill /f /im  {name}")

        else:
            sleep(3)
</code>
PS: У меня Windows 10

Я подозреваю, что Вы хотели вставить вместо
{name} название программы, однако в таком варианте будет выполнен скрипт
taskkill /f /im {name} без указания на какой-либор файл.
Я предлагаю воспользоваться f-строками, т.е. в данном случае просто добавить
f перед начальными кавычками строки, вот так:

os.system(f"taskkill /f /im  {name}")


Совместимость версий Python и Django для существующего проекта
Программа создана на версиях: Python 3.8.6. и Django 3.1.2. Могу ли установить последние версии на новом компьютере или нужно использовать те же?

Вопрос широкий и требует детальной проработки относительно версии
django. Если обратиться к документации то можно увидеть, что сам
django не очень зависим от версии python.
Вы указали, что используете
django 3.1.2. Из приведенной выше ссылки становится понятно, что максимальная версия Python будет 3.9.
Документация
django говорит:

A.B is the feature release version number. Each version will be mostly backwards compatible with the previous release. Exceptions to this rule will be listed in the release notes.

Каждая версия, главным образом, обратно совместима с предыдущими релизами. Исключения, как правило, можно найти в примечаниях к выпуску. (ВАЖНО! читайте изменения в документации для django 3.2)
То есть в вашем случае
django можно обновить до версии 3.2 без пляски с бубнами и почти без риска. А данная версия совместима с python 3.10.
Релизы патчей (3я цифра в номере версии) совместима на 100% с предыдущей.
Заключение: установка на
django 3.2 и
python 3.10 должна пройти безболезненно.
PS
Я бы рискнул и жахнул бы новые версии на все со старта (естественно, на тесте). Потратил бы час времени, чтобы понять работает или нет. А затем бы уже делал выводы.


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

print("Для выхода из программы введите quit")
name = ''

while name != 'quit':
    name = input("Введите ваше имя: \n")
    if name != 'quit':
        print(f"Привет {name}")
        break
with open(filename,"a") as file_object:
    file_object.write(name + "\n" )

Файл не сохраняет результат в отформатированном виде пробовал использовать конструкцию
'f{name}\n'
Также после одной введённой строки выдаёт ошибку
Traceback (most recent call last):
File "", line 1, in
NameError: name 'Evgen' is not defined
Заранее спасибо за помощь.

print("Для выхода из программы введите quit")

# Спсиок куда будут добавляться строки
lines = []

while (name := input("Введите ваше имя: \n")) != 'quit':
    # Формируем строку
    line = f"Привет {name}"
    # Печатаем
    print(line)
    # Добавляем в список
    lines.append(
        line
    )
with open('guest_book.txt', "w") as file_object:
    # Объединяем символом перевода строки элемнты спска строк
    # И записываем их в файл
    file_object.write('\n'.join(lines))


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

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

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

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

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

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

Сначала мы определим
max_amount = 0 как максимальное число возрастающих элементов и
amount = 1 как текущее число элементов. Затем мы запустим цикл со второго элемента цикла (первый уже зачтён, отсюда и
amount = 1), внесём
last_elem как первый элемент массива и проведём следующие шаги:

Считаем следующий элемент массива как
elem и сравним его с предыдущим;
Если
elem > last_elem, то увеличиваем
amount на 1;
Если предыдущий шаг не прошёл, то, если
max_amount < amount, заменяем максимальную цепь на
amount. В любом случае цепь начинается заново, и тогда
amount = 1;
Если в списке есть элементы, переходим к следующему, иначе выходим из цикла.

Если мы вышли из цикла, то мы должны дополнительно сравнить оставшееся значение
amount с
max_amount и последовать шагу 3 (например, если список оканчивается возрастающей последовательностью:
[1, 9, 8, 10, 12, 13, 14]).


Как разделить элементы массива на элементы другого массива? Numpy
Мне надо разделить элементы двумерного массива разделить на элементы одномерного массива. т. е.:

a = np.array([
      [1, 2, 3],
      [6, 9, 8],
      [14, 3, 4],
      [0, 1, 9]
])

b = np.array([
      [1, 2, 3, 4]
])

надо разделить элементы каждого
i-того подмассива
a, на каждый
i-й элемент массива
b т. е.

a[0] = a[0] / b[0]
a[1] = a[1] / b[1]
a[2] = a[2] / b[2]
a[3] = a[3] / b[3]

но без перебора, без циклов, чтобы красиво и по
numpy-евски

Правда непонятно зачем
b сделан двойной вложенности (если будет одинарной, то убрать
[0]). Но всё равно как-то так:

c = a / b[0][:,None]

Результат.

array([[1.        , 2.        , 3.        ],
       [3.        , 4.5       , 4.        ],
       [4.66666667, 1.        , 1.33333333],
       [0.        , 0.25      , 2.25      ]])


Почему цикл for не работает? [закрыт]

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

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

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

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

Я совсем новичок в python, и совсем не понимаю, как работает цикл
for. Учусь по книге "Изучаем python" Эрика Мэтиза.
Вот код

i = ['a' 'b' 'c' 'd' 'e']
for i in letters:
    print(letters + ' this is letter')

В книге код работает

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician.title() + ", that was a great trick!")

Элементы списка перечисляются через запятую.
Имя списка -
letters.
Печатать элементы списка используя переменную цикла
i, которая на каждой итерации цикла принимает очередное значение из списка
letters.
(В общем, вы перепутали места
i и
letters)

letters = ['a', 'b', 'c', 'd', 'e']
for i in letters:
    print(i + ' this is letter')


как получить значение ключа в вложенном списке файла json?
Это фрагмент .json файла

[
    {
        "label": "Group",
        "ocr_text": "156123",
        "score": 0.26161095,
        "xmin": 670,
        "xmax": 735,
        "ymin": 705,
        "ymax": 720
    },
    {
        "label": "FIO",
        "ocr_text": "Петров Петр Петрович",
        "score": 0.48486748,
        "xmin": 533,
        "xmax": 737,
        "ymin": 728,
        "ymax": 753
    },
    {
        "label": "cipher",
        "ocr_text": "123456",
        "score": 0.45893905,
        "xmin": 684,
        "xmax": 736,
        "ymin": 764,
        "ymax": 779
    },
    {
        "label": "Work_name",
        "ocr_text": "Теория",
        "score": 0.09009137,
        "xmin": 272,
        "xmax": 733,
        "ymin": 440,
        "ymax": 465
    },
    {
        "label": "Theme",
        "ocr_text": "«Текст»",
        "score": 0.12318355,
        "xmin": 244,
        "xmax": 703,
        "ymin": 478,
        "ymax": 535
    }

Данный код позволяет получать мне значение 'ocr_text' в вложенном списке.

import requests
import json
from pprint import pprint
with open('response.json', 'r') as f:
    data_file = json.load(f)

def Work(data_file):
    work = data_file['result'][0]['prediction'][0]
    if work['label']=='Work_name':
        print(work['ocr_text'])
    elif work['label']=='Theme':
        print(work['ocr_text'])
    elif work['label']=='Group':
        print(work['ocr_text'])
    elif work['label']=='FIO_Students':
        print(work['ocr_text'])
    elif work['label']=='cipher':
        print(work['ocr_text'])
        return

Решение основано на полном обходе объекта и поиска заданного ключа, результат собрается в
list
Предварительная обработка элемента который может попасть в список
происходит в методе getDict где ключ и строка собираются в tuple
далее в getTree при условии что ключ совпадает происходит заполнение результата.
вывод:
['156123', 'Петров Петр Петрович', '123456', 'Теория', '«Текст»']

import requests
import json
from pprint import pprint

with open('response.json', 'r') as f:
  data_file = json.load(f)

class Scanner:
  def __init__(self, data):
    self.data = data
    self.result = []

  def extract(self, key):
    self.test = key
    self.get_tree(data)
    return self.result

  def get_tree(self, data):
    if isinstance(data, list):
      return self.get_list(data)
    elif isinstance(data, dict):
      return self.get_dict(data)
    elif self.is_primitive(data):
      return data
    self.append_to_result(data)
    return data

  def get_dict(self, obj):
    return list(
      map(lambda x: self.get_tree(tuple(x)), obj.items())
    )

  def get_list(self, arr):
    return list(
      map(lambda x: self.get_tree(x), arr)
    )

  def is_primitive(self, data):
    return type(data) in (int, str, bool, ...)

  def append_to_result(self, data):
    if isinstance(data, tuple):
      if isinstance(data[1], dict):
        self.get_tree(data[1])
      if isinstance(data[1], list):
        self.get_tree(data[1])
      elif data[0] == self.test:
        self.result.append(data[1])
    else:
      print('Error')

print(Scanner(data_file).extract('ocr_text'))

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

listTags = ['Work_name', 'Theme', 'Group', 'FIO_Students', 'cipher']
if work['label'] in listTags: print work['ocr_text']


Как открыть новую консоль, и ввести в неё команду
Как можно реализовать через python открытие новой консоли и ввода в неё команды?
Например, команда python main.py; Результат консоли не нужен.
Допустим, я запускаю start.py, результатом этой программы будет открытие новой консоли и запуска в ней нового скрипта main.py; Консоль с скриптом start.py можно будет закрыть, при этом main.py продолжит свою работу, потому что он запущен в другой консоли, и обособлен от первой(start.py).
Я нашёл код, открывающий консоль, но как ввести после этого команду, найти не смог
<code>
import subprocess
x = subprocess.Popen(['start', 'cmd'], shell = True)
x.wait()
</code>

Вот способ:
<code>
import os
os.system("start python main.py")
</code>


Python: как заблокировать клавиши для всего, кроме модуля keyboard?
У меня есть программа, которая должна подставлять определённые символы и комбинации символов при нажатии определённых клавиш:

import keyboard

while True:
    hotkey = keyboard.read_hotkey(suppress=False)
    if hotkey == 'j+k':
        keyboard.write('j + k')

(Я не использую
keyboard.add_hotkey(), потому что в дальнейшем в моих планах не конкретные горячие клавиши, а проверка на наличие определённых клавиш в hotkey. Но это не меняет ситуацию: add_hotkey() ведёт себя так же)
Я ожидаю, что при запуске этой программы, когда я буду одновременно нажимать j+k, скажем, в текстовом редакторе, будет печататься 'j + k'. Но я получаю 'jkj + k'. То есть сами клавиши j и k передаются текстовому редактору до срабатывания функции.
Если я сделаю:

keyboard.block_key('j')
keyboard.block_key('k')

, эти клавиши не будут обрабатываться и
read_hotkey.
Вопрос: возможно ли сделать так, чтобы определённые клавиши были заблокированы для всего, кроме listener-а в keyboard? То есть чтобы в момент работы программы эти клавиши не могли выполнять других функций?
UPD: Я обнаружил, что при заблокированных клавишах всё ещё срабатывает
keyboard.is_pressed(), и у меня родился вот такой код:

import keyboard

keyboard.block_key('j')
keyboard.block_key('k')

while True:
    if keyboard.is_pressed('j+k'):
        keyboard.write('j + k')

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

Чтобы клавиатура не тормозила нужно использовать следующий код:
<code>
from pynput import keyboard

def on_press(key):
    try:
        # Проверяем клавиши здесь
    except AttributeError:
        # Выводим сообщение об ошибке, если нужно

with keyboard.Listener(on_press=on_press) as listener:
    listener.join()
</code>
В данном случае вы всегда ожидаете нажатие клавиши не в основном потоке. Да, я знаю как организованы потоки в python и не буду сильно углубляться в эту тему, а просто дам код решения.


создание задержки клавишам в pygame
Я хочу сделать так, чтобы сигналы с клавиатуры считывались не сразу, то есть чтобы действие назначенное на нажатие той или иной клавиши происходило не сразу, а к примеру через 3 секунды после нажатия
вот пример кода:
<code>
key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            print('left key')
</code>

<code>
key = pygame.key.get_pressed()
    if key[pygame.K_LEFT]:
        pygame.time.delay(3000)
        print('left key')
</code>
Время в миллисекундах, т.е. 1000 = 1 секунде


Помогите разобраться с if,else Python [дубликат]

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

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

                                (3 ответа)

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

Задача---
Тарифный план мобильной связи включает в себя 50 минут разговоров
и 50 смс-сообщений за $15,00 в месяц. Каждая дополнительная минута
стоит $0,25, а каждое дополнительное сообщение – $0,15. Все счета за
телефон включают налог на поддержку кол-центров 911 в размере $0,44,
и общая сумма, включающая сумму отчислений кол-центрам, облагается
налогом в размере 5 %.Напишите программу, которая будет запрашивать у пользователя количество израсходованных за месяц минут разговора и смс-сообщений и отображать
базовую сумму тарификации, сумму за дополнительные мину-ты и сообщения, сумму отчислений кол-центрам 911, налог, а также итоговую сумму к оплате. При этом дополнительные звонки и сообщения необходимо выводить на экран только в случае их расходования. Убедитесь в том,
что все суммы отображаются в формате с двумя знаками после запятой.
Решение :
<code>
minutes=int(input('Please enter how many minutes did you use this month-> '))
sms=int(input('Please enter how many SMS did you send this month-> '))
payment=15
tax=0.44

if minutes or sms<=50:
        stanart_price=payment+((payment+tax)*0.05)
        print('Tax is for 911 is',tax,'USD')
        print('Total tax is','%.2f'%((payment+tax)*0.05),'USD')
        print('You will pay','%.2f'%stanart_price,'USD')
elif minutes>50:
        add_mins=0.25
        add_sms=0.15
        min_not_in_tafif=minutes-50
        sms_not_in_tafif=sms-50
        add_min_price=((min_not_in_tafif)*add_mins)
        add_sms_price=((sms_not_in_tafif)*add_sms)
        full_price=payment+add_sms_price+add_min_price+((payment+add_sms_price+add_min_price)*0.05)
        print('You basic tarif is 50 min,and 50 sms for',payment,'USD')
        print('Tax is for 911 is',tax,'USD')
        print('Total tax is','%.2f'%((payment+add_sms_price+add_min_price)*0.05),'USD')
        print('You spend additional',min_not_in_tafif,'mins,and addtional',sms_not_in_tafif,'SMS')
        print('Full price is','%.2f'%full_price,'USD')
elif sms>50:
        add_mins=0.25
        add_sms=0.15
        min_not_in_tafif=minutes-50
        sms_not_in_tafif=sms-50
        add_min_price=((min_not_in_tafif)*add_mins)
        add_sms_price=((sms_not_in_tafif)*add_sms)
        full_price=payment+add_sms_price+add_min_price+((payment+add_sms_price+add_min_price)*0.05)
        print('You basic tarif is 50 min,and 50 sms for',payment,'USD')
        print('Tax is for 911 is',tax,'USD')
        print('Total tax is','%.2f'%((payment+add_sms_price+add_min_price)*0.05),'USD')
        print('You spend additional',min_not_in_tafif,'mins,and addtional',sms_not_in_tafif,'SMS')
        print('Full price is','%.2f'%full_price,'USD')
</code>
Но я никак не могу понять в чем моя ошибка. Например если ввести minutes и sms, менее 50 или 50 все работает отлично, или если ввести оба значения больше - все тоже работает отлично. Но не работает с разноплановыми значениями, если одно ввести 15 а другое 65 то cрабатывает только первый if. Помогите пожалуйста разобраться, спасибо!

В первом
if у вас написано:

minutes or (sms <= 50)

оператор
or выполняется самым  последним, и поэтому у вас идет проверка не равна ли переменная
minutes 0 или меньше ли
sms 50.
Если вы хотите что бы у вас было условие -
хотя бы 1 из 2 переменных < 50 то его надо записывать так:
minutes < 50 or sms < 50. В данный момент у вас было условие
minutes которое всегда выдавало
True, если
minutes не равно 0, поэтому у вас почти всегда выполнялся первый
if.
Если вы хотите чтобы обе переменные были меньше 50, то условие
minutes < 50 and sms < 50


Как создать большое поле для ввода текста?
Как создать большое поле для ввода текста в tkinter?
Вот например:
<code>
import tkinter as tk

window = tk.Tk()

e = tk.Entry(window) # Но там только 1 строчка!!!
e.pack() # Но там только 1 строчка!!!

window.mainlooop()
</code>
Как сделать многострочное текстовое поле в tkinter и получать с него введенный текст?

Можно использовать
tkinter.Text.
Например:

import tkinter as tk

window = tk.Tk()

def get_text(event=None):
    text = text_widjet.get("1.0", END)
    label_text.config(text=text)

text_widjet = tk.Text(window)
text_widjet.pack()

label_text = tk.Label(window)
label_text.pack()

Button('Вывести текст в Label', command = get_text).pack()

window.mainloop()


Как в mock.assert_called_with сделать читабельное сравнение списков?
Как сделать, чтобы при вызове assert_called_with(param) выдавался читабельный результат, если param - это список? Чтобы было видно, какие именно элементы списка различаются.
Пример:

from unittest.mock import patch

def func1(param):
    pass

def test1():

    with patch('test1.func1') as mock1:
        func1(['a', 'b'])
        mock1.assert_called_with(['f', 'b'])

pytest test1.py

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

Expected: func1(['f', 'b'])
Actual: func1(['a', 'b'])

1. Пример читабельного результата:

def test_1():
    assert ['a', 'b'] == ['f', 'b']

pytest test1.py

Вывод:

At index 0 diff: 'a' != 'f'

2. Пример читабельного результата:

from unittest import TestCase

TestCase().assertListEqual(['a', 'b'], ['f', 'b'])

Вывод:

First differing element 0:
'a'
'f'

Можно вытащить из
mock информацию о самом вызове как объект (или список всех  вызовов), и делать проверку не в unittest стиле (через вызов метода), а в pytest стиле (через assert). В результате сравнение объектов и отображение разницы будет происходить средствами pytest, а не модуля unittest.mock.
Примеры:

from unittest.mock import call

...

assert mock1.call_args == call(['f', 'b'])  # Проверяем аргументы последнего вызова
assert mock1.call_args.args == (['f', 'b'],)  # Проверяем позиционные аргументы (для проверки именованных параметров нужно использовать kwargs)
assert mock1.call_args_list == [call(['f', 'b'])]  # Проверяем все вызовы и все их аргументы

Первый вариант по какой-то причине выдает такой текст:

>           assert mock1.call_args == call(['f', 'b'])
E           AssertionError: assert call(['a', 'b']) == call(['f', 'b'])
E             (pytest_assertion plugin: representation of details failed: /home/insolor/.local/lib/python3.8/site-packages/_pytest/assertion/util.py:417: ValueError: too many values to unpack (expected 2).
E              Probably an object has a faulty __repr__.)

Но второй и третий варианты успешно выдают более-менее читаемое отображение:

>           assert mock1.call_args.args == (['f', 'b'],)
E           AssertionError: assert (['a', 'b'],) == (['f', 'b'],)
E             At index 0 diff: ['a', 'b'] != ['f', 'b']
E             Use -v to get the full diff

>           assert mock1.call_args_list == [call(['f', 'b'])]
E           AssertionError: assert [call(['a', 'b'])] == [call(['f', 'b'])]
E             At index 0 diff: call(['a', 'b']) != call(['f', 'b'])
E             Use -v to get the full diff

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

>           assert mock1.call_args.args == (['f', 'b'],)
E           AssertionError: assert (['a', 'b'],) == (['f', 'b'],)
E             At index 0 diff: ['a', 'b'] != ['f', 'b']
E             Full diff:
E             - (['f', 'b'],)
E             ?    ^
E             + (['a', 'b'],)
E             ?

>           assert mock1.call_args_list == [call(['f', 'b'])]
E           AssertionError: assert [call(['a', 'b'])] == [call(['f', 'b'])]
E             At index 0 diff: call(['a', 'b']) != call(['f', 'b'])
E             Full diff:
E             - [call(['f', 'b'])]
E             ?         ^
E             + [call(['a', 'b'])]
E             ?

Документация: unittest.mock начиная с Mock.call_args


Закрытие консоли при запуске программы
Столкнулся с такой проблемой: написал программу с помощью PyQt5, она отлично работает, с помощью pyinstaller сделал .exe файл, так как буду регулярно пользоваться им, и при запуске экзешника, помимо его открывается консоль. Можно ли как-то заблокировать открытие консоли?
Заранее благодарю

Надо при сборке добавить флажок
--noconsole:

python pyinstaller.py --noconsole <ваш скрипт>.py


Как сделать логотип на сайте гиперссылкой на главную страницу?
Провел настройку статический файлов. Логотип на сайт подгрузился корректно.

<img src="{% static 'main/img/logo.png' %}" alt="Лого">
Как сделать его гиперссылкой на главную страницу?

Осмелюсь предположить, что вам может подойти такой вариант

<a href=""><img src="{% static 'main/img/logo.png' %}" alt="Лого"></a>


Как решить задачу на приватный модификатор доступа в Python?
Уже достаточно долго сижу над задачей и не впервые сталкиваюсь с непониманием последних 2 пунктов.

Сделайте у класса из предыдущего упражнения закрытыми все его поля.

Добавьте методы get и set для всех полей. Поскольку полей всего 4, то должно быть 4 метода get и 4 метода set.

Убедитесь, что доступа к полям уже нет за пределами класса.

Проверьте работу методов get и set.

Сделайте закрытый метод printlog(), в котором с помощью функции print() выводите значение переданного параметра.

В методах get и set вызывайте метод printlog с параметром: «Запрошено свойство NAME» (для методов get) или «Изменено свойство NAME» (для методов set). Вместо NAME должно быть подставлено имя соответствующего свойства.

Поскольку мне требуется 5 и 6 пункты, а в начале указано другое упражнение, прикреплю и свой код без последних двух пунктов.
<code>
class Pryg:
    __lehi = [0, 0]
    __shir = 0
    __dlin = 0
    def __init__(self, lehi, shir, dlin):
        self.__lehi = lehi
        self.__shir = shir
        self.__dlin = dlin
        self.__printlog()
    def getLEHI(self):
        return self.__lehi
    def getSHIR(self):
        return self.__shir
    def getDLIN(self):
        return self.__dlin
    def setLEHI(self, lehi):
        self.__lehi = lehi
    def setSHIR(self, shir):
        self.__lehi = shir
    def setDLIN(self, dlin):
        self.__lehi = dlin
    def __str__(self):
        return "Прямоугольник с координатами (" + str(self.lehi[0]) + ";" + str(self.lehi[1]) + ") шириной " + str(self.shir) + "и высотой " + str(self.dlin)
    def S(self):
        return self.shir * self.dlin
    def P(self):
        return (self.shir + self.dlin) * 2
p1 = Pryg([10, 20], 15, 10)
#p1.=__lehi #Не работает
#p1.__shir #Не работает
#p1.__dlin #Не работает
print(p1.getLEHI())
print(p1.getSHIR())
print(p1.getDLIN())
p1.setLEHI([11, 21])
p1.setSHIR(16)
p1.setDLIN(10)
</code>

В принципе, тут и написано, что нужно решать в лоб:

В методах get и set вызывайте метод printlog с параметром: «Запрошено
свойство NAME» (для методов get) или «Изменено свойство NAME» (для
методов set). Вместо NAME должно быть подставлено имя соответствующего
свойства.

Пример:

class Pryg:
    __lehi = [0, 0]
    __shir = 0
    __dlin = 0

    def __init__(self, lehi, shir, dlin):
        self.__lehi = lehi
        self.__shir = shir
        self.__dlin = dlin

    def __printlog(self, is_setter: bool, name: str):
        print(f'{"Изменено" if is_setter else "Запрошено"} свойство {name}')

    def getLEHI(self):
        self.__printlog(False, 'lehi')
        return self.__lehi

    def getSHIR(self):
        self.__printlog(False, 'shir')
        return self.__shir

    def getDLIN(self):
        self.__printlog(False, 'dlin')
        return self.__dlin

    def setLEHI(self, lehi):
        self.__printlog(True, 'lehi')
        self.__lehi = lehi

    def setSHIR(self, shir):
        self.__printlog(True, 'shir')
        self.__lehi = shir

    def setDLIN(self, dlin):
        self.__printlog(True, 'dlin')
        self.__lehi = dlin

Результат:

Запрошено свойство lehi
[10, 20]
Запрошено свойство shir
15
Запрошено свойство dlin
10
Изменено свойство lehi
Изменено свойство shir
Изменено свойство dlin


Чего не хватает в регулярном выражении?
Есть список

urls = ['abc.ru/v2', 'abc.com/er.tyre.6/title/86348', 'ab.com/test/ertg.yeg/title/86348', 'abc.com/feed?app_id=57655', 'bcd.ru/467', 'abc.com/shth/5583628', 'abc.com/jhydhf']

С помощью кода

urls = [url for url in urls if re.search(r'((abc\.com/|ab\.com/)+[\.a-zA-Z\d]+(/title/\d{5})+)', url) and not re.search(r'[?=%-]', url)]

Получаю следующий результат

['abc.com/er.tyre.6/title/86348']

Чего не хватает в регулярке, чтобы 'ab.com/test/ertg.yeg/title/86348' тоже вошла в итоговый список?
test - это слово, которое может встретиться в ссылке 0 или 1 раз
P.S. вчера задавала подобный вопрос, но не до конца разобралась

Попробуем разобраться что не так с выражением:

((abc\.com/|ab\.com/)+[\.a-zA-Z\d]+(/title/\d{5})+)

Сама по себе группа
(abc\.com/|ab\.com/) отличается только одним символом
c в адресе, ее можно заменить на
abc?\.com/ - вопросительный знак в данном случае является квантификатором на 0 или 1 вхождение предыдущего символа.
Так же, в случае если test - это статичная часть url и должна всегда быть такой где адрес состоит из четырех вложенностей, то следует добавить новую группу
(test/)? c квантификатором аналогичный 0 или 1 вхождение. Группу можно сделать не захватываемой добавив в начале группы
?:. Тогда выражение будет иметь вид:

(abc?\.com/(?:test/)?[\.a-zA-Z\d]+(/title/\d{5}))

Пример: regex101.com/v2
Если же вложенность адреса
test не статичная и имя не известно, то следует сделать новую группу
(?:/[\.a-zA-Z\d]+){1,2} поставив квантификатор на 1 или 2 совпадения. Тогда выражение будет иметь вид:

(abc?\.com(?:/[\.a-zA-Z\d]+){1,2}(/title/\d{5}))

Пример: regex101.com/v1
upd после комментария: Если адреса подразумеваются разные, типа domain.com/ или niamod.ru, то группу конечно же нужно оставить:

//для первого случая
((?:abc\.com|ab\.com)/(?:test/)?[\.a-zA-Z\d]+(/title/\d{5}))

//для второго случая
((?:abc\.com|ab\.com)(?:/[\.a-zA-Z\d]+){1,2}(/title/\d{5}))


Код на Python выдаёт ошибку
<code>
word = input()
print(len(word))
if word >= 6:
    print(word.upper())
elif word != 6:
    print('Неправильно')
else:
    print('error')***
</code>

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

Делал вот такую задачку и не знаю какая у меня ошибка

Вы увеличиваете регистр слова в тех случаях, когда длина строки больше или равна 6, хотя в условии требуется, чтобы длина была строго равна 6.
Плюс ещё нет массива (напомню, что в Python за него можно поставить список).
UPD: по просьбе автора прилагаю код:
<code>
word = input() # вводим слово
print(len(word)) # выводим длину слова
lst = [] # создаём массив/список

if len(word) == 6: # если длина строки равна 6 (длина берётся с помощью len() )
    upper_word = word.upper() # увеличиваем регистр строки
    lst.append(upper_word)    # и добавляем его в список с помощью append
# иначе пишем elif/else и делаем что-то другое
print(lst)
</code>


Почему не работает matplotlib? [закрыт]

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

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

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

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

Я пытаюсь построить простой график

import numpy as np
import matplotlib.pyplot as plt
plt.plot([0, 2, 1, -1, -2, 2, 3, 1, 0, 2, 0])
plt.show()

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

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-548d62c4e367> in <module>()
----> 1 plt.plot([0, 2, 1, -1, -2, 2, 3, 1, 0, 2, 0])
      2 plt.show()

5 frames
/usr/local/lib/python3.7/dist-packages/matplotlib/figure.py in __init__(self, figsize, dpi, facecolor, edgecolor, linewidth, frameon, subplotpars, tight_layout, constrained_layout)
    346             frameon = rcParams['figure.frameon']
    347
--> 348         if not np.isfinite(figsize).all() or (np.array(figsize) <= 0).any():
    349             raise ValueError('figure size must be positive finite not '
    350                              f'{figsize}')

TypeError: 'list' object is not callable

Везде такая ошибка, в google colab, jupyter notebook, pycharm

Ваш код в таком виде, как вы его показали, прекрасно работает без ошибок. Я смог воспроизвести вашу ошибку только вот таким образом:

import numpy as np
import matplotlib.pyplot as plt

np.array = [1,2,3] # <- Вместо метода np.array теперь у нас список!

plt.plot([0, 2, 1, -1, -2, 2, 3, 1, 0, 2, 0])
plt.show()

Проверьте остальной ваш код. У меня такое впечатление, что вы где-то ошиблись и вместо чего-то такого:

array = [1,2,3]

Или такого:

arr = np.array([1,2,3])

Написали:

np.array = [1,2,3]

Другой вариант - можно таким же образом сломать
np.isfinite. Если же сломать другие функции, которые вызываются в этой же строке:
np.any или
np.all, то ошибка выйдет раньше, на другом фрагменте кода, так что скорее всего сломан именно
np.array.


Работа кнопок в TKinter на Python в ООП
Такой вопрос.
Попробовал я как то сделать "Лист персонажа" для StarFinder через Python.
Перебрал кучу вариантов и пришел к тому, что через классы проще всего написать и вообще создать нужное мне меню в TKinter. Однако не могу теперь понять. Как при нажатии на кнопки (+) или (-) в меню, добавлять и убавлять значения соответствующих "навыков"? Или как присвоить пустой области необходимое мне значение? Чтоб потом можно было с ним работать дальше.
Я не прошу переделывать весь код, но если сможете хотя бы на коротком примере объяснить, буду признателен.
В идеале при нажатии кнопки (+) на против соответствующего навыка значение должно увеличиваться на 1, при нажатии (-) соответственно убавляться на 1.
И в строках напротив слов Сила, Ловкость и т.д. ввести чисто запись значений через клавиатуру.
<code>
from tkinter import*
from tkinter.ttk import Combobox
spec = ['Сила','Ловкость','Выносливость','Интеллект','Мудрость','Харизма']
skills = ['Акробатика','Атлетика','Биологические науки','Блеф','Внимание',
          'Выживание','Дипломатия','Запугивание','Инженерное дело',
          'Компьютеры','Культура','Ловкость рук','Маскировка','Медицина',
          'Мистицизм','Пилотирование','Проницательность','Профессия',
          'Профессия(2)','Скрытность','Физические науки']
player_data=['Имя персонажа','Уровень','Раса','Класс','Тема','Мировоззрение',
             'Имя игрока']

class Data(Tk):
    def __init__(self):
        super().__init__()
        r = 0
        c = 1
        c2 = 2
        self.geometry('900x900')
        self.config(bg='gray35')
        self.title("Лист персонажа")
        self.fr1= Frame(self,bg='black')
        self.fr1.place(x=10,y=10)
        for i in player_data:
            r += 1
            self.lbl = Label(self.fr1, text=i,bg='black',fg='gold').grid(row=r, column=c)
            if i == 'Имя персонажа':
                self.name = Entry(self.fr1).grid(row=r, column=c2)
            elif i == 'Уровень':
                self.ur=Combobox(self.fr1,values=(1,2,3,4,5,6,7,8,9,10,
                                                 11,12,13,14,15,16,17,18,19,20)).grid(row=r, column=c2)
            elif i == 'Раса':
                self.race=Combobox(self.fr1,values=('Не выбрано','Андроид','Веск','Исок',
                                                  'Касат','Лашунт','Человек','Ширен')).grid(row=r, column=c2)
            elif i == 'Класс':
                self.klass=Combobox(self.fr1,values=('Не выбрано','Механик',
                                                  'Мистик','Оперативник','Посланник','Солдат','Солярион'
                                                  ,'Техномант')).grid(row=r, column=c2)
            elif i == 'Тема':
                self.teme=Combobox(self.fr1,values=('Без темы','Ас','Ксеноискатель','Кумир','Наёмник',
                                                   'Охотник за головами','Покоритель космоса',
                                                   'Преступник','Священник','Учёный')).grid(row=r, column=c2)
            elif i == 'Мировоззрение':
                self.mir= Combobox(self.fr1,values=('Не выбрано','ПД','НД','ХД','ПН','Н','ХН','ПЗ','НЗ','ХЗ')).grid(row=r, column=c2)
            elif i == 'Имя игрока':
                self.pl_name= Entry(self.fr1).grid(row=r, column=c2)
            if r == 3:
                r=0
                c+=2
                c2+=2
        self.fr2 = Frame(self, bg='black')
        self.fr2.place(x=10, y=80)
        for i in spec:
            r += 1
            self.lbl = Label(self.fr2, text=i, bg='black', fg='gold').grid(row=r, column=c)
            self.ent_spec = Entry(self.fr2).grid(row=r, column=c2)
            self.mod = Label(self.fr2, text='  +0',bg='black', fg='gold').grid(row=r, column=c2+1)
        self.fr3 = Frame(self, bg='black')
        self.fr3.place(x=10, y=220)

        for i in skills:
            r+=1
            self.lblskill = Label(self.fr3, text=i, bg='black', fg='gold').grid(row=r, column=c)
            self.lbl_skill = Label(self.fr3, text=0, bg='black', fg='gold').grid(row=r, column=c2)
            self.appskill = Button(self.fr3, text='+', bg='black', fg='gold').grid(row=r, column=c2+1)
            self.subtskill = Button(self.fr3, text='-', bg='black', fg='gold').grid(row=r, column=c2+2)

kvent=Data()

kvent.mainloop()
</code>

Есть несколько подходов...

Работать непосредственно с атрибутами виджетов. Т.е. получать значение из атрибута, скажем
text у
Label, при помощи метода
get(), менять его, и заносить обратно методом
set().

Создать Tk-переменную нужного типа, и проассоциировать её с виджетом при помощи параметра
textvariable=. Тогда меняя эту переменную, её значение будет автоматически отображаться в виджете. Например, для вашей таблицы навыков, это может выглядеть так:

        self.skills_values = {}
        for i in skills:
            r+=1
            var = IntVar()
            self.skills_values[i] = var  # сохраним переменную в словарь чтобы потом можно было получить значение по названию скила
            Label(self.fr3, text=i, bg='black', fg='gold').grid(row=r, column=c)
            Label(self.fr3, textvariable=var, bg='black', fg='gold').grid(row=r, column=c2)
            Button(self.fr3, text='+', bg='black', fg='gold', command=lambda var=var: self.increase(var)).grid(row=r, column=c2+1)
            Button(self.fr3, text='-', bg='black', fg='gold', command=lambda var=var: self.decrease(var)).grid(row=r, column=c2+2)

    def increase(self, var):
        var.set(var.get() + 1)
    def decrease(self, var):
        var.set(var.get() - 1)

Для
Entry, в принципе, делается аналогично. Если нужно хранить текст, то используйте
StringVar.


Почему этот код работает не так как надо? [закрыт]

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

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

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

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

Это кусок из моего кода, почему-то он не работает, или работает не так, как надо. Этот код должен считать кол-во единиц в строке, но при выводе он всегда выводит "0".
<code>
cb = 0
for a in "1011":
    if a == 1:
        cb += 1
print(cb)
</code>

Потому что при проходе по циклу у Вас в
a будет сохранять символ строки
"1101", а сравнивать его будете с числом. Сравнивайте
a c
'1' либо приводите
a к целому типу (
int(a)), и проблема будет решена.


Есть код для парсинга файла с подсчётом повторяющихся слов, но при сохранении результата сохраняется только последнее слово
<code>
with open('text.txt', 'r') as f:
    for line in f:
        for word in line.split():
            a = (str(word) + ' ' + str(line.count(word)))
            print(a)
with open('text_out.txt', 'w', encoding="utf8") as f:
    f.write(a)
f.close()
</code>

У вас каждый раз
a перезаписывается. Вот исправление.

a = ''
with open('text.txt', 'r') as f:
    for line in f:
        for word in line.split():
            a += (str(word) + ' ' + str(line.count(word))) + '\n'
            print(a)
with open('text_out.txt', 'w', encoding="utf8") as f:
    f.write(a)
f.close()


Напишите функцию которая генерирует матрицу размером m*n случайными целыми числами в диапазоне [-50,50] [закрыт]

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

 Скорее всего, данный вопрос не соответствует тематике Stack Overflow на русском, согласно правилам описанным в справке.

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

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

<code>
from random import randint
def create_random_array(m,n):
  m = int(input())
  n = int(input())
  a = []
  for i in range (m+1):
      for j in range(n+1):
           a =randint(-50,50)
return(a)
</code>

from random import randint

def create_random_array(m,n):
    a = []
    for i in range (m):
        new_row = []
        for j in range(n):
            new_row.append(randint(-50,50))
        a.append(new_row)
    return(a)

Ошибки:

Либо передавайте размер матрицы при вызове функции, либо
inputами. Выберите что то одно
Чтобы добавлять элемент в список есть метод
append

В действительности функцию можно сократить до пары строк, но думаю, что вам будет сложно понять. Обратитесь к такой штуке как List Comprehensions
Вызов

create_random_array(5,10)

Результат

[[24, 13, -17, 41, 21, 29, 33, 23, -2, 3],
[48, 15, 9, 1, 30, 12, -11, 31, 23, -10],
[-5, -3, -20, -17, -2, 7, -44, 14, 29, -46],
[13, -9, -2, -25, 20, 33, 32, -6, -47, 27],
[-34, 19, -8, -17, 50, 39, -23, -26, -24, -28]]

UPD
Код покороче и для новичков не всегда ясен

def create_random_array(m,n):
    return [[randint(-50,50) for row in range(n)] for i in range(m)]

но выполняет ту же функцию


Пытаюсь сделать анализ настроения с нейросетью по статье - выходит Ексепшн
Делаю анализ настроения комментариев по статье сайта.Код до эксепшена:

# %%
import os

import numpy as np

# For DataFrame object
import pandas as pd

# Neural Network
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

# Text Vectorizing
from keras.preprocessing.text import Tokenizer

# Train-test-split
from sklearn.model_selection import train_test_split

# History visualization
# %matplotlib inline
import matplotlib.pyplot as plt

# Normalize
from sklearn.preprocessing import normalize

# %%

# %%
# switch to google colab
flag_google_colab = False
# /switch to google colab

if flag_google_colab:
    from google.colab import drive
    drive.mount('/content/gdrive')
    google_colab_prefix_data_folder = '/content/gdrive/MyDrive/Colab Notebooks/'
else:
    google_colab_prefix_data_folder = ''

fold_csv = google_colab_prefix_data_folder + 'data/labeled.csv'
fpickle = google_colab_prefix_data_folder + 'learned.pkl'

# %%
df = pd.read_csv(fold_csv)
print(df.head())

# %%
# Теперь удалим символы новой строки из текстовых данных
def delete_new_line_symbols(text):
    text = text.replace('\n', ' ')
    return text

df['comment'] = df['comment'].apply(delete_new_line_symbols)
print(df.head())
# %%
# Приведем колонку toxic к целочисленному виду
target = np.array(df['toxic'].astype('uint8'))

# %%
tokenizer = Tokenizer(num_words=50000,
                      filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n',
                      lower=True,
                      split=' ',
                      char_level=False)
#print(Tokenizer.__doc__)
"""
Text tokenization utility class.

    This class allows to vectorize a text corpus, by turning each
    text into either a sequence of integers (each integer being the index
    of a token in a dictionary) or into a vector where the coefficient
    for each token could be binary, based on word count, based on tf-idf...

    # Arguments
        num_words: the maximum number of words to keep, based
            on word frequency. Only the most common `num_words` words will
            be kept.
        filters: a string where each element is a character that will be
            filtered from the texts. The default is all punctuation, plus
            tabs and line breaks, minus the `'` character.
        lower: boolean. Whether to convert the texts to lowercase.
        split: str. Separator for word splitting.
        char_level: if True, every character will be treated as a token.
        oov_token: if given, it will be added to word_index and used to
            replace out-of-vocabulary words during text_to_sequence calls

    By default, all punctuation is removed, turning the texts into
    space-separated sequences of words
    (words maybe include the `'` character). These sequences are then
    split into lists of tokens. They will then be indexed or vectorized.

    `0` is a reserved index that won't be assigned to any word.
"""

# %%
tokenizer.fit_on_texts(df['comment'])
matrix = tokenizer.texts_to_matrix(df['comment'].to_numpy(), mode='count')

На последенй строчке эксепшн, что то о большом массиве:
ValueError: array is too big;
arr.size * arr.dtype.itemsize is larger than the maximum possible size.

ValueError                                Traceback (most recent call last)
d:\user_win_home\code\python_new4\analiz_nastr\app.py in <module>
      97 tokenizer.fit_on_texts(df['comment'])
----> 98 matrix = tokenizer.texts_to_matrix(df['comment'].to_numpy(), mode='count')
      99 """
      100 binary — вернёт массив, состоящий из 0 и 1, где каждый флаг будет отвечать за то, присутствует определённое слово в тексте.
      101 count — простой счетчик слов

D:\user_win_home\code\python_new3\test_keras_gensim\envs\lib\site-packages\keras_preprocessing\text.py in texts_to_matrix(self, texts, mode)
    374         """
    375         sequences = self.texts_to_sequences(texts)
--> 376         return self.sequences_to_matrix(sequences, mode=mode)
    377
    378     def sequences_to_matrix(self, sequences, mode='binary'):

D:\user_win_home\code\python_new3\test_keras_gensim\envs\lib\site-packages\keras_preprocessing\text.py in sequences_to_matrix(self, sequences, mode)
    404                              'before using tfidf mode.')
    405
--> 406         x = np.zeros((len(sequences), num_words))
    407         for i, seq in enumerate(sequences):
    408             if not seq:

ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size.

Как это решить, исправить?

Я так понимаю, вы пытаетесь из разреженных матриц сделать обычные. Не знаю как работают с текстами в
Keras и нейросетях вообще, но вообще говоря такое делать не нужно - после токенизации могут получиться миллионы (ну или как минимум десятки тысяч) фич/столбцов. Держать в памяти обычные матрицы такого размера, учитывая что и сэмплов тоже могут быть миллионы - нереально. Да и обрабатывать такие объёмы будет невозможно. Работайте непосредственно с разреженными матрицами, модели
Scikit-learn это умеют, наверняка и
Keras тоже должен уметь. Либо сильно ограничивайте число выходных признаков при токенизации, но будьте тогда готовы и к возможному сильному падению качества. Можно ещё попробовать понизить размерность данных после токенизации с помощью
PCA, это может и не сильно ударить по качеству, если повезёт. Но в
PCA опять же нужно передавать разреженную матрицу после токенизации.
Возможно, в
Keras нужно смотреть в сторону каких-то генераторов и батчей. Например, там есть в токенизаторе
texts_to_sequences_generator. Генераторы обрабатывают данные "на лету" и не потребляют столько памяти, сколько готовые данные полного объёма.


Переменные функции Python живут между вызовами функции? [дубликат]

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

python mutable default параметры

                                (1 ответ)

Необычное поведение области видимости: изменяемый аргумент по умолчанию [дубликат]

                                (3 ответа)

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

Есть функция в Python:

def to_list(val, default_list=[]):
    default_list.append(val)
    return default_list

Я немного сбит с толку, потому что

print(to_list('a'))
print(to_list('v'))

Возвращают соответственно:

['a']
['a', 'v']

Почему список
default_list доступен с содержимым сохранённым из предыдущего вызова (содержит
'a')? Ведь область видимости функции очищается после её выполнения. А
default_list часть этой области видимости и должен был быть очищен после первого вызова. Нет? Почему он сохранился?
Благодарю.

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

def to_list(val, default_list=None):
    if default_list is None:
        default_list = []
        default_list.append(val)
    return default_list

print(to_list('a'))
print(to_list('v'))

Напечатает:

['a']
['v']

В описании функции нельзя объявлять список так:

def to_list(val, default_list=[]):

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

Создание списка


Как исправить ошибку в коде?
Запись числа 338 в системе счисления с основанием N содержит 3 цифры и оканчивается на 2. Чему равно максимально возможное основание системы счисления?
<code>
for i in range(3,1000):#перебираю основания систем счисления
  f=338
  s=''
  while f>0:#цикл переводит число в нужную систему счисления
    s=s+str(f%i)
    f=f//i
  if len(s)==3 and s[0]=="2":#s[0] , а не s[-1] тк питон задом наперед печатает числа
    print(i)
</code>
ответ: 16
но если делать перебор до 1000, то самое большое основание системы счисления это 338

А вы проверьте, что у вас в
s получается. Заметьте, что для систем счисления с основанием больше
10 при добавлении очередного элемента в строку в неё в каких-то случаях будет добавляться не один "знак", а больше (если остаток будет больше
9). Поэтому нельзя мерить количество знаков количеством элементов такой строки. Добавляйте элементы в список, а не в строку и проверяйте свойства списка. И тогда ваш код будет работать правильно и даст такой вывод:

7
8
12
14
16

но если делать перебор до 1000, то самое большое основание системы
счисления это 338

Но почему же? Разве основание системы счисления не может быть больше числа, которое в нём отображается? Я вполне могу написать, например,
1 в десятичной системе счисления или там
7 в шестнадцатеричной. А если вы имели в виду ответы вашего неправильного кода, то они вообще другие,
338 там в списке ответов нет.


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

def tst(arg1,arg2):
    arg1 += 15
    arg2 = 17
    return arg1, arg2

abc = 15
zxc = 15
tst(abc,zxc)

print(abc, zxc) выводит:
abc = 15, zxc = 15
В функции ниже я хочу повлиять на две переменные через аргументы. В переменную по аргументу arg_ret_index я хочу переназначить значение. Переменная по ключу arg_dict это словарь и я хочу добавить новое значение к существующему ключу в этот словаарь. Поидее манипуляция с добавлением нового значения в ключ не должна сработать. Потому что это словарь из глобальной переменной, но значение всё равно добавляется. Обьясните плз почему так происходит?)

def ZTE_HO_index(arg_dict, arg_key, arg_ret_index, start_i, finish_i):
    for i in range(start_i, finish_i):
        if i not in arg_dict[str(arg_key)]:
            arg_ret_index = i
            arg_dict[str(arg_key)] = arg_dict.get(str(arg_key), []) + [i]
            break
    return arg_ret_index

Вы должны присвоить значения глобальным переменным:
<code>
def tst(arg1,arg2):
    arg1 += 15
    arg2 = 17
    return arg1, arg2

abc = 15
zxc = 15
abc, zxc = tst(arg1=abc, arg2=zxc)
print(abc, zxc) # выведет (30, 17)
</code>


Порядковая сортировка в словаре python СРОЧНО!
У меня есть python словарь с данными, мне нужно рассортировать этот словарь по значению из ключа STATUS, а именно сделать так, чтобы записи были последовательно данным из ключа:

CHECKED
DONE
REJECTED

Одна из проблемм с которой я столкнулся это невозможность переставить данные в нужном мне порядке.
<code>
{
'kfe': {'WRITE-KEY': 'kfe', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'tfP', 'TIME-DATE-RECORDING': 'none', 'STATUS': 'CHECKED', 'ATTACHED-TEXT': 'none', 'MESSAGE-ID': 0},

'zrq': {'WRITE-KEY': 'zrq', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'Tex', 'TIME-DATE-RECORDING': '00:14:26 | 19-01-2022', 'STATUS': 'REJECTED', 'ATTACHED-TEXT': 'Вооввлвд', 'MESSAGE-ID': 35114},

'2rx': {'WRITE-KEY': '2rx', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': '0LU', 'TIME-DATE-RECORDING': '23:15:56 | 18-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': '', 'MESSAGE-ID': 34970},

'jwV': {'WRITE-KEY': 'jwV', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'SAd', 'TIME-DATE-RECORDING': '23:14:12 | 18-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': '', 'MESSAGE-ID': 34945},

'ucB': {'WRITE-KEY': 'ucB', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'Fdq', 'TIME-DATE-RECORDING': '00:14:14 | 19-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': 'Ушшвшв', 'MESSAGE-ID': 35103}
}
</code>

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

d = {
'kfe': {'WRITE-KEY': 'kfe', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'tfP', 'TIME-DATE-RECORDING': 'none', 'STATUS': 'CHECKED', 'ATTACHED-TEXT': 'none', 'MESSAGE-ID': 0},
'zrq': {'WRITE-KEY': 'zrq', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'Tex', 'TIME-DATE-RECORDING': '00:14:26 | 19-01-2022', 'STATUS': 'REJECTED', 'ATTACHED-TEXT': 'Вооввлвд', 'MESSAGE-ID': 35114},
'2rx': {'WRITE-KEY': '2rx', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': '0LU', 'TIME-DATE-RECORDING': '23:15:56 | 18-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': '', 'MESSAGE-ID': 34970},
'jwV': {'WRITE-KEY': 'jwV', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'SAd', 'TIME-DATE-RECORDING': '23:14:12 | 18-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': '', 'MESSAGE-ID': 34945},
'ucB': {'WRITE-KEY': 'ucB', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'Fdq', 'TIME-DATE-RECORDING': '00:14:14 | 19-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': 'Ушшвшв', 'MESSAGE-ID': 35103}
}

sort_dict = dict(sorted(d.items(), key=lambda item: item[1]['STATUS']))
print(sort_dict)

--------
{
'kfe': {'WRITE-KEY': 'kfe', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'tfP', 'TIME-DATE-RECORDING': 'none', 'STATUS': 'CHECKED', 'ATTACHED-TEXT': 'none', 'MESSAGE-ID': 0},
'2rx': {'WRITE-KEY': '2rx', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': '0LU', 'TIME-DATE-RECORDING': '23:15:56 | 18-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': '', 'MESSAGE-ID': 34970},
'jwV': {'WRITE-KEY': 'jwV', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'SAd', 'TIME-DATE-RECORDING': '23:14:12 | 18-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': '', 'MESSAGE-ID': 34945},
'ucB': {'WRITE-KEY': 'ucB', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'Fdq', 'TIME-DATE-RECORDING': '00:14:14 | 19-01-2022', 'STATUS': 'DONE', 'ATTACHED-TEXT': 'Ушшвшв', 'MESSAGE-ID': 35103},
'zrq': {'WRITE-KEY': 'zrq', 'USER-ID': 639141904, 'WHO-WROTE': 'Jn<', 'TASK-KEY': 'Tex', 'TIME-DATE-RECORDING': '00:14:26 | 19-01-2022', 'STATUS': 'REJECTED', 'ATTACHED-TEXT': 'Вооввлвд', 'MESSAGE-ID': 35114}
}

Пояснение: сначала берутся все пары "ключ-значение" словарей (благодаря
d.items()), затем они сортируются по ключу лямбда-функции
lambda item: item[1]['STATUS'] — она берёт поле 'STATUS' значений подсловарей и сортирует последние именно по этому полю. Далее отсортированный полученный список становится словарём, который и отправляется на вывод. Вроде бы так


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

np.array([ '0 -28.935262435621514', '1 63.62401061069032', '2 27.068955469757185', '3 25.723129715500633',....])

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

x  = [ '0', '1' , '2' , '3' ,...]

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

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

С применением NumPy: используем
numpy.vectorize. Суть заключается в том, что сначала берётся лямбда-функция, делящая строку по пробелам и возвращающая первый элемент образованного списка. С помощью
vectorize эта функция обрабатывает каждый элемент numpy-массива и добавляет результат в отдельный numpy-массив
first.
Без применения NumPy: просто проходим циклом по массиву и применяем ту же функцию с разделом и взятием первого элемента с ручным добавлением в массив.

import numpy as np

n = np.array(['0 -28.935262435621514', '1 63.62401061069032', '2 27.068955469757185', '3 25.723129715500633'])

# Вариант 1
first = np.vectorize(lambda s: s.split()[0])(n)

print(first)

# Вариант 2
second = []
for s in n:
  second.append(s.split()[0])
print(second)


Как с помощью Selenium спарсить класс html элемента
С помощью следующей строки кода я могу спарсить текст html элемента:
<code>
x=driver.find_element_by_xpath("/html/body/div[1]/header/div/div[5]/div[3]/div[2]/div[1]/div[2]").text
</code>
Есть ли способ таким же образом получить класс элемента?

Для того чтобы спарсить класс используйте:
<code>
x= driver.find_element_by_xpath("/html/body/div[1]/header/div/div[5]/div[3]/div[2]/div[1]/div[2]").get_attribute('class')
</code>


Фрактальные списки в Python, или Почему это так работает?
Я тут столкнулся с учебной задачей (не волнуйтесь, вопрос не про то, как ее сделать, я ее уже сделал), где нужно сделать бесконечный список следующим образом:
[0, *список*, *список еще раз*, 2]

fractal = [0, 2]
fractal.insert(1, fractal)
fractal.insert(2, fractal)

Я эту задачу решил, но не понимаю как она работает. По идее оно просто должно вставить список [0, 2], но вставляет вместо него рекурсивный список. Как это происходит?

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

a = []
a.append(a)
print(a)
print(a[0][0][0][0][0][0][0])

Выводит:

[[...]]
[[...]]


Атрибуты класса (self и class_name)
Почему при обращении к атрибуту класса
car_count через
self и
Car получаются разные результаты?

class Car:
    car_count = 1

    def start(self, name, model):
        print("Двигатель заведен")
        self.name = name
        self.model = model
        self.car_count += 1
        print(self.car_count)
        print(Car.car_count)

car = Car()
car.start("Car1", "Model2")

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

Двигатель заведен
2
1

self.car_count и
Car.car_count это разные атрибуты\поля класса?

При обращение
Car.car_count вы обращаетесь к полю класса. Если данное поле не переопределять, то оно всегда будет равно еденице, как константа
Если вы вызываете
car = Car(), то вы создаете уже объект класса, который имеет свое значение для
car_count, которое вы назначаете через
self
Ещё проще - это два совершенно разных объекта.


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

coins = [(230, 150), (730, 150)]
я вывожу элемент этого списка:

print(coins[0])
ожидаемый результат:

230, 150
результат который я получаю:

(230, 150)

Можно применить оператор распаковки итерируемого объекта (здесь — кортежа) в аргументы, лежащие в объекте — префиксном * (вот здесь инфа по этому и не только). Он как раз распакует Ваш кортеж до
230, 150 без скобок.

print(*coins[0])

---

230, 150 # скобочки исчезли


Как найти n делителей факториала?
Есть факториал числа(n!). Как найти n делителей  факториала, чтобы их сумма была рана факториалу
Пример:
<code>
3! = 1*2*3 = 6 = 1+2+3 (1, 2, 3 — делители 6)
4! = 1*2*3*4 = 24 = 1+3+8+12  (1, 3, 8, 12 — делители 24)
</code>

Пусть
N! = sum(a[i]), тогда
(N + 1)! = (N + 1) * sum(a[i]). Причем так как
a[i] делит
N!, то
(n + 1) * a[i] делит
(N + 1)!. Таким образом, по разложению
N! в сумму
N делителей мы можем построить разложение
(N + 1)! в сумму
N делителей. Осталось как-то добавить один делитель.
Рассмотрим первые разложения:

3! = 3  + 2  + 1

4! = 12 + 8  + 3  + 1

5! = 60 + 40 + 15 + 4 + 1

Пусть минимальным делителем в разложении
N будет
1, тогда в разложении
(N + 1)! на
N делителей минимальным будет
N + 1. Причем его можно разбить на сумму
N и
1, которые очевидно являются делителями
(N + 1)! и при этом не встречаются в разложении до этого, так как меньше
N + 1, который был минимальным.
Получаем следующий алгоритм:

N = 10
a = [3, 2, 1]
for n in range(3,  N):
    for i in range(n):
        a[i] *= n + 1
    a[i] -= 1
    a.append(1)
print(a) #[1814400, 1209600, 453600, 120960, 25200, 4320, 630, 80, 9, 1]

# CHECK
from math import factorial
F = factorial(N)
print(sum(a) == F and len(a) == N and len(set(a)) == N and all(F % i == 0 for i in a)) #True