Как сделать проверку на наличие COM порта в системе?
Есть функция, которая в бесконечном цикле читает некоторые данные из COM порта. Нужно сделать так, чтобы при обрыве связи(пропадании COM порта в системе) функция ожидала появления порта и продолжала считывать данные. Если кто-то может помочь - буду безмерно благодарен. С except бился весь день - лучший результат это зависание цикла при следующем коде:

    def read_com_port():
        ser = serial.Serial('COM4', baudrate=9600, timeout=0)  # настройка порта
        while True:
            try:
                lines = ser.readline()
                print(lines.decode('UTF-8').strip())
                lines1 = str(lines.decode('UTF-8'))
                lines1 = lines1.rstrip()
                if lines1.split('=', 1)[0] == 'gerkon_down':
                    print('match!!! gerkon_down = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'gerkon_up':
                    print('match!!! gerkon_up = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'gerkon_alarm':
                    print('match!!! gerkon_alarm = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'Position relay1_on_off':
                    print('match!!! Position relay1_on_off = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'Position relay2':
                    print('match!!! Position relay2 = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'Position relay3_alarm':
                    print('match!!! Position relay3_alarm = ' + str(lines1.split('=', 1)[1]))
                if lines1.split('=', 1)[0] == 'status':
                    print('match!!! status = ' + str(lines1.split('=', 1)[1]))
                if not lines:
                    sleep(2.0)
            except Exception as e:
                continue
                pass
run = read_com_port()

Попробовал сделать по совету @eri, но к сожалению при отключении COM порта сразу же вылетает с exception. Новый код:

def read_com_port():
  while True:
    ser = serial.Serial('COM4', baudrate=9600, timeout=0)  # настройка порта
    while True:
        try:
            lines = ser.readline()
            print(lines.decode('UTF-8').strip())
            lines1 = str(lines.decode('UTF-8'))
            lines1 = lines1.rstrip()
            if lines1.split('=', 1)[0] == 'gerkon_down':
                print('match!!! gerkon_down = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'gerkon_up':
                print('match!!! gerkon_up = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'gerkon_alarm':
                print('match!!! gerkon_alarm = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'Position relay1_on_off':
                print('match!!! Position relay1_on_off = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'Position relay2':
                print('match!!! Position relay2 = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'Position relay3_alarm':
                print('match!!! Position relay3_alarm = ' + str(lines1.split('=', 1)[1]))
            if lines1.split('=', 1)[0] == 'status':
                print('match!!! status = ' + str(lines1.split('=', 1)[1]))
            if not lines:
                sleep(2.0)
        except Exception as e:
            break
    sleep(1.0)

run = read_com_port()

Ошибка:

Traceback (most recent call last):
  File "D:/Java work/eclipse/test/New_vision/Testing/reading_COM.py", line 77, in <module>
    run = read_com_port()
  File "D:/Java work/eclipse/test/New_vision/Testing/reading_COM.py", line 48, in read_com_port
    ser = serial.Serial('COM4', baudrate=9600, timeout=0)  # настройка порта
  File "C:\Users\Noutbook\AppData\Local\Programs\Python\Python38\lib\site-packages\serial\serialwin32.py", line 33, in __init__
    super(Serial, self).__init__(*args, **kwargs)
  File "C:\Users\Noutbook\AppData\Local\Programs\Python\Python38\lib\site-packages\serial\serialutil.py", line 244, in __init__
    self.open()
  File "C:\Users\Noutbook\AppData\Local\Programs\Python\Python38\lib\site-packages\serial\serialwin32.py", line 64, in open
    raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port 'COM4': FileNotFoundError(2, 'Не удается найти указанный файл.', None, 2)

Добавь ещё один while True перед подключением порта и в конце после вложенного цикла sleep(1). В эксепшан напишите break вместо continue
<code>
def read_com_port():
    while True:
        try:
            ser = serial.Serial('COM4', baudrate=9600, timeout=0)
        except Exception as e:
            print('open error', e)
            sleep(1.0)
        while True:
            try:
                lines = ser.readline()
                parse(lines) #вынеси в функцию
                if not lines:
                    sleep(2.0)
            except Exception as e:
                print('read error', e)
                break

run = read_com_port()
</code>


Как передать значение переменной из одного метода класа 1 в другой медот класа 2
Необходимо перенести значение
dW1 из класса
Regularization метода
l1_grad.
Ниже указано два класса.

class Regularization:
    """
    Regularization class

    Arguments:
    lambda_1 -- regularization coeficient for l1 regularization
    lambda_2 -- regularization coeficient for l2 regularization
    """
    def __init__(self, lambda_1, lambda_2):
        self.lambda_1 = lambda_1
        self.lambda_2 = lambda_2

    def l1(self, W1, W2, m):
        """
        Compute l1 regularization part

        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
        l1_term -- float, check formula (6)
        """
        ### START CODE HERE ###
        return (self.lambda_1/(m)) * (np.linalg.norm(W1, ord=1) + np.linalg.norm(W2, ord=1))
        ### END CODE HERE ###

    def l1_grad(self, W1, W2, m):
        """
        Compute l1 regularization term

        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
         dict with l1_grads "dW1" and "dW2"
            which are grads by corresponding weights
        """
        ### START CODE HERE ###
        dW1 = self.lambda_1/m*np.sign(W1)

        dW2 = self.lambda_1/m*np.sign(W2)

        l1_grads = {"dW1": dW1,
                 "dW2": dW2}
        return(l1_grads)
        ### END CODE HERE ###

    def l2(self, W1, W2, m):
        """
        Compute l2 regularization term

        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
        l2_term: float, check formula (6)
        """
        ### START CODE HERE ###
        return (self.lambda_2 / (m * 2) * (np.sum(np.square(W1)) + np.sum(np.square(W2))))
        ### END CODE HERE ###

    def l2_grad(self, W1, W2, m):
        """
        Compute l2 regularization term

        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
        l2_grads: dict with keys "dW1" and "dW2"
        """
        ### START CODE HERE ###
        dW1 = self.lambda_2/m*W1

        dW2 = self.lambda_2/m*W2

        l2_grads = {"dW1": dW1,
                 "dW2": dW2}
        return(l2_grads)
        ### END CODE HERE ###

class NeuralNetwork:
    """
    Arguments:
    n_features: int -- Number of features
    n_hidden_units: int -- Number of hidden units
    n_classes: int -- Number of classes
    learning_rate: float
    reg: instance of Regularization class
    """
    def __init__(self, n_features, n_hidden_units, n_classes , learning_rate, reg=Regularization(0.1, 0.2), sigm=Sigmoid()):
        self.n_features = n_features
        self.n_classes = n_classes
        self.learning_rate = learning_rate
        self.n_hidden_units = n_hidden_units
        self.reg = reg
        self.sigm = sigm
        self.W1 = None
        self.b1 = None
        self.W2 = None
        self.b2 = None

        self.initialize_parameters()

    def initialize_parameters(self):
        """
        W1 -- weight matrix of shape (self.n_hidden_units, self.n_features)
        b1 -- bias vector of shape (self.n_hidden_units, 1)
        W2 -- weight matrix of shape (self.n_classes, self.n_hidden_units)
        b2 -- bias vector of shape (self.n_classes, 1)
        """
        np.random.seed(42)

        ### START CODE HERE ###
        W1 = np.random.randn(self.n_hidden_units, self.n_features) * 0.01
        b1 = np.zeros((self.n_hidden_units, 1))
        W2 = np.random.randn(self.n_classes, self.n_hidden_units) * 0.01
        b2 = np.zeros((self.n_classes, 1))
        self.W1 = W1
        self.b1 = b1
        self.W2 = W2
        self.b2 = b2
        return{"W1": W1,
                  "b1": b1,
                  "W2": W2,
                  "b2": b2}
        ### END CODE HERE ###

    def forward_propagation(self, X):
        """
        Arguments:
        X -- input data of shape (number of features, number of examples)

        Returns:
        dictionary containing "Z1", "A1", "Z2" and "A2"
        """
        # Implement Forward Propagation to calculate A2 (probabilities)
        ### START CODE HERE ###
        Z1 = np.add(np.matmul(self.W1, X), self.b1)
        A1 = self.sigm(Z1)
        Z2 = np.add(np.matmul(self.W2, A1), self.b2)
        A2 = self.sigm(Z2)
        cache = {"Z1": Z1,
             "A1": A1,
             "Z2": Z2,
             "A2": A2}
        ### END CODE HERE ###

        return {
            'Z1': Z1,
            'A1': A1,
            'Z2': Z2,
            'A2': A2
        }

    def backward_propagation(self, X, Y, cache):
        """
        Arguments:
        X -- input data of shape (number of features, number of examples)
        Y -- one-hot encoded vector of labels with shape (n_classes, n_samples)
        cache -- a dictionary containing "Z1", "A1", "Z2" and "A2"

        Returns:
        dictionary containing gradients "dW1", "db1", "dW2", "db2"
        """
        m = X.shape[1]

        # Retrieve A1 and A2 from dictionary "cache".
        ### START CODE HERE ###
        A1 = cache["A1"]
        A2 = cache["A2"]
        ### END CODE HERE ###

        # Calculate gradients for L1, L2 parts using attribute instance of Regularization class
        ### START CODE HERE ###
        # **Необходимо перенести значение dW1 с класса Regularization метода l1_grad**

        ### END CODE HERE ###

        # Backward propagation: calculate dW1, db1, dW2, db2 (using obtained L1, L2 gradients)
        ### START CODE HERE ###
        dZ2 = A2 - Y
        dW2 = (1 / m) * np.dot(dZ2, A1.T)
        db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
        dZ1 = np.multiply(np.dot(self.W2.T, dZ2), 1 - np.power(A1, 2))
        dW1 = (1 / m) * np.dot(dZ1, X.T)
        db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)
        grads = {"dW1": dW1,
             "db1": db1,
             "dW2": dW2,
             "db2": db2}
        ### END CODE HERE ###

        return {
            'dW1': dW1,
            'db1': db1,
            'dW2': dW2,
            'db2': db2}

    def update_parameters(self, grads):
        """
        Updates parameters using the gradient descent update rule

        Arguments:
        grads -- python dictionary containing gradients "dW1", "db1", "dW2", "db2"
        """
        # Retrieve each gradient from the dictionary "grads"

        ### START CODE HERE ###
        dW1 = grads["dW1"]
        db1 = grads["db1"]
        dW2 = grads["dW2"]
        db2 = grads["db2"]
        ## END CODE HERE ###

        # Update each parameter
        ### START CODE HERE ###
        W1 = W1 - learning_rate * dW1
        b1 = b1 - learning_rate * db1
        W2 = W2 - learning_rate * dW2
        b2 = b2 - learning_rate * db2

        parameters = {"W1": W1,
                      "b1": b1,
                      "W2": W2,
                      "b2": b2}
        return (parameters)
        ### END CODE HERE ###

Сделайте
l1_grads атрибутом класса
Regularization:

class Regularization:
    def __init__(self, lambda_1, lambda_2):
        self.lambda_1 = lambda_1
        self.lambda_2 = lambda_2
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.l1_grads = {
            "dW1": 0,
            "dW2": 0
        }
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

...

import numpy as np

class Regularization:
    """ Regularization class
    Arguments:
    lambda_1 -- regularization coeficient for l1 regularization
    lambda_2 -- regularization coeficient for l2 regularization
    """

    def __init__(self, lambda_1, lambda_2):
        self.lambda_1 = lambda_1
        self.lambda_2 = lambda_2
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.l1_grads = {
            "dW1": 0,
            "dW2": 0
        }
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def l1(self, W1, W2, m):
        """ Compute l1 regularization part
        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
        l1_term -- float, check formula (6)
        """

        ### START CODE HERE ###
        return (self.lambda_1/(m)) * (np.linalg.norm(W1, ord=1) + \
            np.linalg.norm(W2, ord=1))
        ### END CODE HERE ###

# +++ l1_grad
    def l1_grad(self, W1=1, W2=2, m=3):
        """ Compute l1 regularization term
        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
         dict with l1_grads "dW1" and "dW2"
            which are grads by corresponding weights
        """
        ### START CODE HERE ###
        dW1 = self.lambda_1 / m * np.sign(W1)

        dW2 = self.lambda_1 / m * np.sign(W2)

        self.l1_grads = {                                     # +++ self.
            "dW1": dW1,
            "dW2": dW2
        }
        return (self.l1_grads)                                # +++ self.
        ### END CODE HERE ###

    def l2(self, W1, W2, m):
        """ Compute l2 regularization term
        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
        l2_term: float, check formula (6)
        """

        ### START CODE HERE ###
        return (self.lambda_2 / (m * 2) * (np.sum(np.square(W1)) + \
            np.sum(np.square(W2))))
        ### END CODE HERE ###

    def l2_grad(self, W1, W2, m):
        """ Compute l2 regularization term
        Arguments:
        W1 -- weigts of shape (n_hidden_units, n_features)
        W2 -- weigts of shape (output_size, n_hidden_units)
        m -- n_examples

        Returns:
        l2_grads: dict with keys "dW1" and "dW2"
        """
        ### START CODE HERE ###
        dW1 = self.lambda_2/m*W1

        dW2 = self.lambda_2/m*W2

        l2_grads = {"dW1": dW1,
                 "dW2": dW2}
        return(l2_grads)
        ### END CODE HERE ###

class Sigmoid:
    pass

class NeuralNetwork:
    """
    Arguments:
    n_features: int -- Number of features
    n_hidden_units: int -- Number of hidden units
    n_classes: int -- Number of classes
    learning_rate: float
    reg: instance of Regularization class
    """

    def __init__(self,
        n_features=1,
        n_hidden_units=2,
        n_classes=1 ,
        learning_rate=0.123,
        reg=Regularization(0.1, 0.2),
        sigm=Sigmoid()
    ):
        self.n_features = n_features
        self.n_classes = n_classes
        self.learning_rate = learning_rate
        self.n_hidden_units = n_hidden_units
        self.reg = reg
        self.sigm = sigm
        self.W1 = None
        self.b1 = None
        self.W2 = None
        self.b2 = None

        self.initialize_parameters()

# +++
        print(f'class NeuralNetwork: reg.l1_grads = {self.reg.l1_grads}')  # +++

    def initialize_parameters(self):
        """
        W1 -- weight matrix of shape (self.n_hidden_units, self.n_features)
        b1 -- bias vector of shape (self.n_hidden_units, 1)
        W2 -- weight matrix of shape (self.n_classes, self.n_hidden_units)
        b2 -- bias vector of shape (self.n_classes, 1)
        """
        np.random.seed(42)

        ### START CODE HERE ###
        W1 = np.random.randn(self.n_hidden_units, self.n_features) * 0.01
        b1 = np.zeros((self.n_hidden_units, 1))
        W2 = np.random.randn(self.n_classes, self.n_hidden_units) * 0.01
        b2 = np.zeros((self.n_classes, 1))
        self.W1 = W1
        self.b1 = b1
        self.W2 = W2
        self.b2 = b2
        return   {"W1": W1,
                  "b1": b1,
                  "W2": W2,
                  "b2": b2}
        ### END CODE HERE ###

    def forward_propagation(self, X):
        """
        Arguments:
        X -- input data of shape (number of features, number of examples)

        Returns:
        dictionary containing "Z1", "A1", "Z2" and "A2"
        """
        # Implement Forward Propagation to calculate A2 (probabilities)
        ### START CODE HERE ###
        Z1 = np.add(np.matmul(self.W1, X), self.b1)
        A1 = self.sigm(Z1)
        Z2 = np.add(np.matmul(self.W2, A1), self.b2)
        A2 = self.sigm(Z2)
        cache = {"Z1": Z1,
             "A1": A1,
             "Z2": Z2,
             "A2": A2}
        ### END CODE HERE ###

        return {
            'Z1': Z1,
            'A1': A1,
            'Z2': Z2,
            'A2': A2
        }

    def backward_propagation(self, X, Y, cache):
        """
        Arguments:
        X -- input data of shape (number of features, number of examples)
        Y -- one-hot encoded vector of labels with shape (n_classes, n_samples)
        cache -- a dictionary containing "Z1", "A1", "Z2" and "A2"

        Returns:
        dictionary containing gradients "dW1", "db1", "dW2", "db2"
        """
        m = X.shape[1]

        # Retrieve A1 and A2 from dictionary "cache".
        ### START CODE HERE ###
        A1 = cache["A1"]
        A2 = cache["A2"]
        ### END CODE HERE ###

        # Calculate gradients for L1, L2 parts using attribute instance of Regularization class
        ### START CODE HERE ###

# **Необходимо перенести значение dW1 с класса Regularization метода l1_grad**
# +++
        print(self.reg.l1_grads)
        reg_l1_grads_dW1 = self.reg.l1_grads['dW1'] # +++ вот ваше значение dW1
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

        ### END CODE HERE ###

        # Backward propagation: calculate dW1, db1, dW2, db2 (using obtained L1, L2 gradients)
        ### START CODE HERE ###
        dZ2 = A2 - Y
        dW2 = (1 / m) * np.dot(dZ2, A1.T)
        db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)
        dZ1 = np.multiply(np.dot(self.W2.T, dZ2), 1 - np.power(A1, 2))
        dW1 = (1 / m) * np.dot(dZ1, X.T)
        db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)
        grads = {"dW1": dW1,
             "db1": db1,
             "dW2": dW2,
             "db2": db2}
        ### END CODE HERE ###

        return {
            'dW1': dW1,
            'db1': db1,
            'dW2': dW2,
            'db2': db2}

    def update_parameters(self, grads):
        """
        Updates parameters using the gradient descent update rule

        Arguments:
        grads -- python dictionary containing gradients "dW1", "db1", "dW2", "db2"
        """
        # Retrieve each gradient from the dictionary "grads"

        ### START CODE HERE ###
        dW1 = grads["dW1"]
        db1 = grads["db1"]
        dW2 = grads["dW2"]
        db2 = grads["db2"]
        ## END CODE HERE ###

        # Update each parameter
        ### START CODE HERE ###
        W1 = W1 - learning_rate * dW1
        b1 = b1 - learning_rate * db1
        W2 = W2 - learning_rate * dW2
        b2 = b2 - learning_rate * db2

        parameters = {"W1": W1,
                      "b1": b1,
                      "W2": W2,
                      "b2": b2}
        return (parameters)
        ### END CODE HERE ###

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
neuralNetwork = NeuralNetwork(1, 2)

neuralNetwork.reg.l1_grads
neuralNetwork.reg.l1_grad()

print(f'Hello neuralNetwork.reg.l1_grads = {neuralNetwork.reg.l1_grads}')
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


Как подставить html код в шаблон DetailView? Django
У меня есть модель, в которой хранится информация про статьи на сайт, я хочу что бы в поле с текстом статьи можно было вписывать html теги. Так как эта информация должна отображаться для разных статей, но с одним шаблоном в url у меня переход на страницу прописан так:

path('<int:pk>', views.game_page.as_view(), name='game_page')

Класс game_page :

class game_page(DetailView):
    model = Games
    template_name = 'games/game_page.html'
    context_object_name = 'i'

Пока что html код при вставке с помощью {{i.main_part}} выглядит как сам код и некоторые символы по типу < > в коде страницы отображаются через &.
Помогите, как исправить?

попробуйте так
<code>
{{i.main_part|safe}}
</code>


Создать пул соединения с бд postgresql и библиотекой asyncpg
Имеется готовый файл с командами для базы данных.
Я не понимаю как создать пул и использовать его в функциях postgresql.
Для подключения имеются данные хоста, порт, логин и пароль.
Вот, собственно, код:
<code>
class DBComm:
    async def select(self, conn):
        values = await conn.fetchrow('SELECT * FROM users')
        a = dict(values)
        data = [f"{k}-{v}" for k, v in values.items()]
        # print(data)
        text = "\n".join(data)
        # print(text)
        return text

    async def db_new_user(conn, use=True, uses=1):
        user = types.User.get_current()
        user_id = user.id
        full_name = user.full_name
        args = (user_id, use, full_name)
        await conn.execute('INSERT INTO users (user_id, use, full_name, uses) VALUES ($1, $2, $3, $4) RETURNING id',
                           user_id, use, full_name, uses)
        await conn.close()

    async def db_user_exists(conn):
        user = types.User.get_current()
        user_id = user.id
        result = await conn.execute('SELECT * FROM users WHERE user_id = $1', user_id)
        result = int(result.replace('SELECT', ''))
        await conn.close()
        return bool(result)

    async def db_usage(conn):
        user = types.User.get_current()
        user_id = user.id
        await conn.execute('UPDATE users  SET uses = uses + 1 WHERE user_id = $1', user_id)
        await conn.close()

    async def db_get_info(info, conn):
        user_id = int(info)
        print("userid", user_id)
        rer = await conn.fetchrow('SELECT * FROM users WHERE user_id = $1', user_id)
        a = dict(rer)
        data = [f"{k}-{v}" for k, v in rer.items()]
        # print(data)
        text = "\n".join(data)
        print(text)
        await conn.close()
        return text
</code>

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

class DBComm:
    def __init__(self, config: dict):
        self.pool = asyncpg.create_pool(**config)

    async def select(self):
        values = await self.pool.fetchrow('SELECT * FROM users') # пул сам выберет одно из доступных соединений
        a = dict(values)
        data = [f"{k}-{v}" for k, v in values.items()]
        # print(data)
        text = "\n".join(data)
        # print(text)
        return text

Вы можете явно получать соединение из пула методом
con = pool.acquire() и возвращать его
pool.release(con). Разумеется можно все делать с использованием контекстного менеджера.


Как приравнивать значение переменной к одному из элементов списка?
Вопрос заключается в следующем: Как приравнивать текстовую переменную к одному из элементов списка? Код:
<code>
denb = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']
n = input('Введите день недели: ')
for i in denb:
    if n == denb:
       print(i)
</code>
P.S. Задание: Напишите программу, которая принимает от пользователя день недели в виде строки и выводит его номер на экран.

Проверить вхождение можно двумя вариантами через метод списка
index() или через прямой поиск номера дня через нумерацию списка с помощью
enumerate() и дальнейшего сравнения строки

denb = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье']
n = input('Введите день недели: ').lower()

Через
index()

print(denb.index(n) + 1 if n in denb else 'Не тот день')

Через
enumerate()

print(next((idn + 1 for idn, d in enumerate(denb) if d == n), 'Не тот день'))


Что не так с путём?
Что ему надо то ?
файл создается в директории log/application.log
вот BASE_DIR:

BASE_DIR = Path(__file__).resolve().parent.parent

вот такой мой код в settings

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
    'require_debug_true': {
        '()': 'django.utils.log.RequireDebugTrue',
    }
},
'formatters': {
    'verbose': {
        'format':
        '{levelname} {asctime} {module} {message}',
        'style':
        '{',
    },
},
'handlers': {
    'console': {
        'level': 'DEBUG',
        'filters': ['require_debug_true'],
        'class': 'logging.StreamHandler',
    },
    'file': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'filename': 'C://Users/Admin/Django_projects/django_TZ/src/log/application.log',
        'formatters': 'verbose',
    }
},
'loggers': {
    'django.request': {
        'handlers': ['file'],
        'level': 'DEBUG',
        'propagate': False,
    },
    'django.db.backends': {
        'level': 'DEBUG',
        'handlers': ['file'],
    },
}
}

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

  Exception in thread django-main-thread:
Traceback (most recent call last):
  File "c:\users\admin\appdata\local\programs\python\python39\lib\logging\config.py", line 564, in configure
    handler = self.configure_handler(handlers[name])
  File "c:\users\admin\appdata\local\programs\python\python39\lib\logging\config.py", line 745, in configure_handler
    result = factory(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'formatters'

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

Traceback (most recent call last):
  File "c:\users\admin\appdata\local\programs\python\python39\lib\threading.py", line 954, in _bootstrap_inner
    self.run()
  File "c:\users\admin\appdata\local\programs\python\python39\lib\threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\Admin\Django_projects\django_TZ\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Admin\Django_projects\django_TZ\venv\lib\site-packages\django\core\management\commands\runserver.py", line 110, in inner_run
    autoreload.raise_last_exception()
  File "C:\Users\Admin\Django_projects\django_TZ\venv\lib\site-packages\django\utils\autoreload.py", line 87, in raise_last_exception
    raise _exception[1]
  File "C:\Users\Admin\Django_projects\django_TZ\venv\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    autoreload.check_errors(django.setup)()
  File "C:\Users\Admin\Django_projects\django_TZ\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Admin\Django_projects\django_TZ\venv\lib\site-packages\django\__init__.py", line 19, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "C:\Users\Admin\Django_projects\django_TZ\venv\lib\site-packages\django\utils\log.py", line 75, in configure_logging
    logging_config_func(logging_settings)
  File "c:\users\admin\appdata\local\programs\python\python39\lib\logging\config.py", line 809, in dictConfig
    dictConfigClass(config).configure()
  File "c:\users\admin\appdata\local\programs\python\python39\lib\logging\config.py", line 571, in configure
    raise ValueError('Unable to configure handler '
ValueError: Unable to configure handler 'file'

Я не вижу смысла в принципе указывать полный путь здесь

...
'file': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'filename': 'C://Users/Admin/Django_projects/django_TZ/src/log/application.log',
        'formatter': 'verbose',
    }

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

'file': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'filename': './src/log/application.log',
        'formatter': 'verbose',
    }

Здесь
. - это и есть ваша папка с проектом или
BASE_DIR. Здесь путь указывается относительно директории с проектом, что дает возможность не писать лишние конфигурации и следить за этим отдельно.
UPD В вопросе так же ошибка с ключом. Необходимо использовать ключ
formatter (в вопросе используется
formatters) при указании какой формат сообщения будет использован


Вопрос про перемножение
Вообщем, не могу сообразить , как написать цикл.

symbols = [
    ['x', 'y', 'z'],
    ['a', 'b', 's'],
    ['q', 'z', 't'],
    ['h', 'n', 'm'],
    ]
do_list = [1, 2, 3]

Мне нужно сделать так, чтобы подсписки symbols (например
['x', 'y', 'z']) имел всевозможные комбинации внутри этого списка с компонентами списка do_list в таком формате.

combination = [
    [['x', 1], ['y', 1], ['z', 1]],
    [['x', 1], ['y', 1], ['z', 2]],
    [['x', 1], ['y', 1], ['z', 3]],
    [['x', 1], ['y', 2], ['z', 2]],
    ......

    ]

То есть всевозможные комбинации с тремя константами из списка
do_list
Или укажите, пожалуйста, направление, в котором нужно искать.
Спасибо!

Родил. Через
itertools делаем все возможные комбинации
do_list, а потом через
zip() собираем в цикле.

import itertools

symbols = [
    ['x', 'y', 'z'],
    ['a', 'b', 's'],
    ['q', 'z', 't'],
    ['h', 'n', 'm'],
    ]
do_list = [1, 2, 3]

list_ = [[(c, n) for c, n in zip(s, r)]
         for s in symbols for r in list(itertools.product(do_list, repeat=len(s)))]

print(*list_, sep='\n')

Спасибо CrazyElf забыл, что можно из zip() не вытаскивать, а сразу преобразовать:

list_ = [list(zip(s, r)) for s in symbols for r in list(itertools.product(do_list, repeat=len(s)))]

Вывод:

[('x', 1), ('y', 1), ('z', 1)]
[('x', 1), ('y', 1), ('z', 2)]
[('x', 1), ('y', 1), ('z', 3)]
[('x', 1), ('y', 2), ('z', 1)]
[('x', 1), ('y', 2), ('z', 2)]
[('x', 1), ('y', 2), ('z', 3)]
...
[('h', 3), ('n', 3), ('m', 3)]

Расшифровываем строку:

list_ = [[(c, n) for c, n in zip(s, r)]
         for s in symbols for r in list(itertools.product(do_list, repeat=len(s)))]

Создаем массив с нумерацией от
[[1,1,1], [1,1,2], ... [3,3,3]]:

list(itertools.product(do_list, repeat=len(s)))

Далее в цикле извлекаем строки из массива
[[x, y, z], ...], параллельно пуская внутренний цикл по массиву
list(itertools... с извлечением строк
[1,1,1]...[3,3,3].

for s in symbols for r in list(itertools.product(do_list, repeat=len(s)))

На выходе имеем переменные
s = [x, y, z] и т.д. и
r = [1,1,1] и т.д.. Их объединяем через
zip(s, r) и преобразуем в список:

list(zip(s, r)) for s in symbols for r in list(itertools.product(do_list, repeat=len(s)))

И в конце все это собирается в один большой список:

[list(zip(s, r)) for s in symbols for r in list(itertools.product(do_list, repeat=len(s))))]


При скачивания видео из Youtube с помощью pytube и tkinter произойдёт ошибка. Почему?
Я создал графическую программу которая должен скачать видео из ютуб. Программа откроется но при нажатии на кнопку скачать выйдет такая ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\User\Desktop\Savetube\Savetube.py", line 28, in download
    yt = pytube.YouTube(link)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\pytube\__main__.py", line 71, in __init__
    self.video_id = extract.video_id(url)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\pytube\extract.py", line 162, in video_id
    return regex_search(r"(?:v=|\/)([0-9A-Za-z_-]{11}).*", url, group=1)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\pytube\helpers.py", line 127, in regex_search
    results = regex.search(string)
TypeError: expected string or bytes-like object

Не знаю почему.
Вот код программа:

from tkinter import
import pytube

root=Tk()
root.geometry('700x500')
root.resizable(width=False, height=False)
root.title("Save video from Youtube")

def func():
    root=Toplevel()
    root.title('Hello')
    root.geometry('300x200')

try:
    def main():
        global link, place
        lab=Label(root, text='Добавьте адрес для скачивания: ', font='Times 24')
        lab.grid(row=1, column=3)
        link=Entry(root, width=50, bd=3)
        link.grid(row=2, column=3)

        labe=Label(root, text='Выберите место для сохранения: ', font='Times 24')
        labe.grid(row=3, column=3)
        place=Entry(root, width=50, bd=3)
        place.grid(row=4, column=3)

        def download():
            yt = pytube.YouTube(link)
            stream = yt.streams.first()
            stream.download(place)

        download=Button(root, text="Скачать", width=10, height=3, command=download,
        bg='green', fg='black')
        download.grid(row=4, column=4)
except:
    exlab=Label(root, text='Извините произошла ошибка', font='Times 24')
    exlab.grid(row=6, column=3)

main()
root.mainloop()

Entry не может быть строкой, по этому нужно использовать
Entry.get() в твоем случае это:
link.get(),
place.get() то есть:

def download():
        yt = pytube.YouTube(link.get())
        stream = yt.streams.first()
        stream.download(place.get())


Почему не работает код для итерации нескольких списков?
<code>
word_list_none = ['ладно']
    x = ['ладно']
            for x in enumerate(word_list_none):
                print("sdsda")
</code>
Вывод программы всегда: sdsda, даже если в переменную word_list_none, записано другое значение, можете подсказать в чём проблема?

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

enumerate() возвращает индекс и значение, так что скорее всего имелось в виду что-то вроде:

for index, value in enumerate(my_list):
  if value == another_list[index]:
    print(value)


Возник теоретический вопрос
Предположим, что существует функция, куда подают два параметра.
<code>
def prices(pair, market):
</code>
pair всегда ждет строку формата "BTCUSDT'. По крайней мере у всех такое API и это удобно для работы.
Но, в семье не без урода.
У одной биржи, строчное обозначение 'BTC_USDT'
Возник вопрос. Как разделить строчное значение подобного формата? Ведь, невозможно объяснить машине, где вставлять нижнее подчеркивание между заглавными буквами. Нет даже словаря общего. А валюты у всех бирж разные.
Какие варианты можно придумать? Неужели писать словарь для слепых, где 'BTCUSDT' = 'BTC_USDT'
Возможен ли такой вариант?
Будет список валют и алгоритм будет склеивать две валюты друг с другом и сравнить со значением. Если значение равно, то берет первую валюту, вставляет нижнее подчеркивание и вторую.

Можно попробовать решить через замену с помощью регулярки входного тикета пары, организовав соответствующую функцию форматирования (очищаем входную строку и сравниваем с существующим сетом уникальных пар). А дальше ее использовать уже внутри функции
prices().

import re

TICKETS = ['BTC', 'USD', 'RUB']
PAIRS = set(t1 + t2 for t1 in TICKETS for t2 in TICKETS if t1 != t2)

def format_pair(pair_raw: str):
    pair_raw = re.sub('[\W+_]', '', pair_raw)
    try:
        return next(p for p in PAIRS if p in pair_raw)
    except StopIteration:
        return None

def prices(pair_raw, market):
    pair = format_pair(pair_raw)
    print(f'{pair}: {market}' if pair else 'Pair not exist')

responses_raw = ['BTC_USDT', 'EURUSD', '#B_TC_US_D']
for r in responses_raw:
    prices(r, 1.5)


Не отвечает на команду [закрыт]

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

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

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

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

При команде
/reg бот должен спросить имя. Вместо этого ничего. Даже не запоминает имя.

@bot.message_handler(commands=['reg', 'Reg'])
def echo_all(message):
        bot.send_message(message.from_user.id, "»Вы хотите зарегистрироваться? Отлично! Как вас зовут?")
        bot.register_next_step_handler(message, reg_name)

def reg_name(message):
    global name
    name = message.text

#Клавиатура
    keyboard = types.InlineKeyboardMarkup()
    key_yes = types.InlineKeyboardButton(text = "да", callback_data = "yes")
    keyboard.add(key_yes)
    key_no = types.InlineKeyboardButton(text = "нет", callback_data = "no")
    keyboard.add(key_no)
    question = "»вас зовут "+name+" ?"
    bot.send_message(message.from_user.id, text= question, reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
    if call.data == "yes":
        bot.send_message(call.message.chat.id, "»приятно познакомиться "+name+"!")
    elif call.data == "no":
        bot.send_message(call.message.chat.id, "»попробуйте ещё раз!")
        bot.send_message(call.message.chat.id, "»Вы хотите зрагеестрироваться? Отлично! Как вас зовут?")

step_example.py#L24

bot.register_next_step_handler принимает минимум два аргумента сообщение которое нужно отправить и функция к которой нужно перейти.
определите отправку сообщения как
msg, например.

@bot.message_handler(commands=['reg', 'Reg'])
def echo_all(message):
    msg = bot.send_message(message.from_user.id, "»Вы хотите зарегестрироваться? Отлично! Как вас зовут?")
    bot.register_next_step_handler(msg, reg_name)


Функция, которая сможет работать как метод [закрыт]

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

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

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

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

Хочу сделать что то вроде
2000000002.getInfo(), который возвращал бы информацию по коду. Возможно ли это? В гугле не нашел ничего.

Вам придется создать класс
<code>
class Number:
    def __init__(self, num):
        this.num = num

    def getInfo():
        #какой-то код
</code>
и создать его экземпляр. Иначе наверное никак


Проверить есть ли в списке два элемента
почему мне выдает YES данная конструкция
<code>
d = [1, 2, 3, 4, 5, ]
if 7 and 5 in d:
    print("YES")
else:
    print("NO")
</code>
причем если поставить 1 и 9 он будет работать корректно и выдаст NO

потому что 7 and 5 in d работает не так как ты думаешь. по сути ты говоришь если 7 это истина и 5 есть в списке, то YES. во втором случае ты считаешь что все корректно, только потому что 9 нет в списке и условие через and) т.е. суть в том что and или or связывают между собой условия, сначала вычисляется выражение слева, потом справа (а может и не вычисляться)

if 7 in d and 5 in d:
  print("Yes")

7 истина потому что не 0. Все что не 0 будет True, а 0 - False.
Тип bool это, кстати, тоже int. Где True это 1, а False это 0. И они легко конвертируются

int(True) == 1
bool(1) is True
bool(7) is True
["false", "true"][True] == "true"

Истинность последовательностей (list, tuple, dict and more) вычисляется через длину. Если длина последовательности больше нуля, то последовательность истинна. Строка это тоже последовательность.
Остальные классы (типы) могут имплементировать
__bool__() или
__len__() чтобы поддерживать определение истинности.
Порядок вычисления операций при сложных условиях запомнить очень просто. or спотыкается на правде, and - на лжи. Т.е. если в условии or, то пайтон не станет вычислять выражение справа если выражение слева истинно. Ведь все логично, если выражение слева истинно, то нам не нужно больше делать ничего, условие уже удовлетворяется. Тоже самое с and, если условие слева ложно, то условие справа нам не нужно считать. Независимо от результата мы уже знаем по какой ветке пойдет выполнение.

if (True) or (1/0):
    print("Ok")

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

if (False) and (1/0):
    print("Ok")

Тоже самое. Нам не нужно вычислять второе условие. Которое вызвало бы исключение.
Скобки я указал, чтобы было нагляднее.


Как отправить ответ на ответ из списка?
Проблема в том ,что бот не откликается на команду. Скорее всего дело в том, что я сравниваю строку со списком. Как исправить?
<code>

hi_words = ["Привет", "привет", "Хай"]

@bot.message_handler(func=lambda m: True)
def on_message(message):
    if message.text is hi_words:
        bot.send_message(message.from_user.id, "Привет")
</code>

Используй
in

if message.text in hi_words:
        bot.send_message(message.from_user.id, "Привет")


В чем возникает проблема при остановке запущенного файла?
Запускаю в PyCharm файл, который ищет COM порт и принимает из него информацию. Все работает отлично, но при остановке вылетает в консоли: Process finished with exit code -1. Почему не ноль? Что я делаю не так?
Код:
<code>
import glob
import sys
from time import sleep

import serial

def serial_ports():
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1) for i in range(256)]
    elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
        # this excludes your current terminal "/dev/tty"
        ports = glob.glob('/dev/tty[A-Za-z]*')
    elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform')

    result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    res = result[0]
    print(result[0])
    return res

ser = serial.Serial(str(serial_ports()), baudrate=9600, timeout=2)  # настройка порта

class COMPORTREAD():
    while 1:
        lines = ser.readline()
        print(lines.decode('UTF-8').strip())
        lines1 = str(lines.decode('UTF-8'))
        # print('lines1 = ' + lines1)
        # print( lines1.split('=', 1)[0])
        if lines1.split('=', 1)[0] == 'gerkon_down':
            print('match!!! gerkon_down = ' + str(lines1.split('=', 1)[1]))
        if lines1.split('=', 1)[0] == 'gerkon_up':
            print('match!!! gerkon_up = ' + str(lines1.split('=', 1)[1]))
        if lines1.split('=', 1)[0] == 'gerkon_alarm':
            print('match!!! gerkon_alarm = ' + str(lines1.split('=', 1)[1]))
        if not lines:
            sleep(10.0)
</code>

Ну вот эта красная кнопка посылает сигнал к завершению. Который интерпретируется как рантайм эррор. Это нормальное поведение. У тебя скрипт не может завершиться сам, на сколько я понимаю.


Как пропустить ожидание asyncio.sleep(), при этом можно было бы выбирать выполнять ли следующий код или нет
У меня есть следующий код:
<code>
import asyncio

async def test():
 print("Var1")
 await asyncio.sleep(10) #Первый таймер
 print("Var2")

test()
asyncio.sleep(3)
#Прервание таймера
</code>
Там, где написано "Прерывание таймера 1", нужно сделать так, чтобы первый таймер пропустился и не надо было ждать следующие 7 секунд. Но. Мне надо сделать так, чтобы можно было выбирать - выполнять ли дальнейший ход кода или нет.
Пожалуйста, помогите сделать такое.

<code>
import asyncio

async def test():
  print("Var1")
  await asyncio.sleep(10) #Первый таймер
  print("Var2")

loop = asyncio.get_event_loop()
task = loop.create_task(test())
loop.run_until_complete(asyncio.sleep(3))
task.cancel()
</code>
Асинхронные функции должны быть запущенны на цикле событий, чтоб работать. Это добавил в код. Если код уже выполняется синхронно - используйте asyncio.create_task и await вместо run_until_complete
То что Вам нужно - это прерывание таска через метод cancel()


Как узнать какое значение из словаря ближе всего к указанному значению?
Например, у меня есть словарь:

scores = {'player_1': 20, 'player_2': 16, 'player_3': 25, 'player_4': 20}
Как узнать какое из его значений ближе всего к 21?
Желательно сделать функцией

scores = {'player_1': 20, 'player_2': 16, 'player_3': 25, 'player_4': 20}
print(min(scores, key=lambda key:abs(scores[key]-21)))


Как добавить базу данных в игровой бот для телеграмма
Есть простой кликер бот для телеграм, как добавить базу данных sql.
То есть так чтобы количество кликов и уровень прокачки сохранялось в базу данных за конкретным пользователем, а при выводе информации брало значения из базы данных.
<code>
import telebot
from telebot import types
import sqlite3
bot=telebot.TeleBot("1837738147:AAEHDWsu8raDyF1pkwqwwBAtbOPDXdt_pEE")
chet=0
dob=1

@bot.message_handler(commands=["start"])
def priv(message):

    connect = sqlite3.connect('kliker.db')
    cursor = connect.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS login_id(
        id INTEGER
    )""")

    connect.commit()
    people_id=message.chat.id
    cursor.execute(f"SELECT id FROM login_id WHERE id={people_id}")

    user_id=[message.chat.id]
    cursor.execute("INSERT INTO login_id VALUES(?);",user_id)
    connect.commit()

    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton("кнопка🕹")
    item2 = types.KeyboardButton("информацияℹ")
    item3 = types.KeyboardButton("прокачка📈")
    markup.add(item1,item2,item3)

    bot.send_message(message.chat.id, 'добро пожаловать в мега кликер',reply_markup=markup)

@bot.message_handler(content_types=['text'])
def handler(message):
    global chet
    global dob
    if message.text == "кнопка🕹":
      chet+=dob
    if message.text == "информацияℹ":
      bot.send_message(message.chat.id,"информация\nсчёт: {0}\nза клик: {1}".format(chet,dob))
    if message.text == "прокачка📈":
      if chet>=10:
        dob+=1
        chet-=10
      else:
        bot.send_message(message.chat.id,"недостаточно кликов😥")
if __name__=="__main__":
    bot.infinity_polling()
</code>

Это должно работать:
<code>
import telebot
from telebot import types
import sqlite3

bot = telebot.TeleBot("1734369637:AAFtguRVj0jNZuMewRQ8w-A8yD_uwjWilbo")
chet = {}
dob = {}

def get(conn):
    cursor = conn.cursor()
    cursor.execute("SELECT * from login_id")
    result = cursor.fetchall()
    return result

def insert(conn, id, score, ups):
    cursor = conn.cursor()
    cursor.execute("""CREATE TABLE IF NOT EXISTS login_id(
        id INTEGER,
        score INTEGER,
        ups INTEGER
    )""")

    conn.commit()

    user_id = [id, score, ups]
    cursor.execute("INSERT INTO login_id VALUES(?,?,?);", user_id)
    conn.commit()

@bot.message_handler(commands = ["start"])
def priv(message):
    global chet
    global dob
    conn = sqlite3.connect('kliker.db')

    try:
        data = get(conn)
        for user in data:
            if message.chat.id in user:
                data = list(user)
                chet[data[0]] = data[1]
                dob[data[0]] = data[2]
            else:
                chet[message.chat.id] = 0
                dob[message.chat.id] = 1
                id = message.chat.id
                score = 0
                ups = 1
                insert(conn, id, score, ups)

        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        item1 = types.KeyboardButton("кнопка🕹")
        item2 = types.KeyboardButton("информацияℹ")
        item3 = types.KeyboardButton("прокачка📈")
        markup.add(item1, item2, item3)

        bot.send_message(message.chat.id, 'добро пожаловать в мега кликер', reply_markup = markup)

    except:
        print("[info] table is not exists")
        chet[message.chat.id] = 0
        dob[message.chat.id] = 1
        id = message.chat.id
        score = 0
        ups = 1
        insert(conn, id, score, ups)

@bot.message_handler(commands = ["save"])
def save(message):
    conn = sqlite3.connect('kliker.db')
    insert(conn, message.chat.id, chet.get(message.chat.id), dob.get(message.chat.id))

@bot.message_handler(content_types = ['text'])
def handler(message):
    global chet
    global dob
    print(chet, dob)
    if message.text == "кнопка🕹":
        chet[message.chat.id] = chet.get(message.chat.id) + dob.get(message.chat.id)
    if message.text == "информацияℹ":
        bot.send_message(message.chat.id,
                         f"информация\nсчёт: {chet.get(message.chat.id)}\nза клик: {dob.get(message.chat.id)}")
    if message.text == "прокачка📈":
        if chet.get(message.chat.id) >= 10:
            dob[message.chat.id] = dob.get(message.chat.id) + 1
            chet[message.chat.id] = chet.get(message.chat.id) - 10
        else:
            bot.send_message(message.chat.id, "недостаточно кликов😥")

if __name__ == "__main__":
    bot.infinity_polling()
</code>
Правда, после перезапуска бота надо писать /start, но думаю вам это поможет.


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

<code>
ad_features = {1:2, 2:3,3:4}
keys = ad_features.keys()
for i in keys:
    print(i, ad_features.get(i))
</code>
Думаю, вам это поможет


В Python cтолбец tfidf не принимает метод to_numpy()
Работаю с датаестом MovieLens: по столбцу TFIDF на тегах и жанрах предсказываю оценку, которую пользователь поставит фильму. Каждая картина у меня описывается двумя векторами - тегов и жанров:

создал векторный класс
count_vect = CountVectorizer() и обучил модель
X_genres = count_vect.fit_transform(genres_tags['Movie_genres']), также и для тегов;

тем и другим придал разные веса (создал объект
tfidf_transformer = TfidfTransformer() и обучил модель
X_tfidf_gen = tfidf_transformer.fit_transform(X_genres), также для тегов)

Далее намереваюсь методом np.hstack соединить 3 массива:

movieId и userId
вектор тегов
вектор жанров.

Прежде данные векторы пытаюсь из разряженных массивов преобразовать в обычные колонки библиотеки Numpy - получаю ошибку: to_numpy not found. В чем причина?

# объединим 2 массива колонок в одну матрицу (затем добавим третий)
X_gen_2 = X_tfidf_gen.to_numpy()           # здесь ошибка
X_tags_2 = X_tfidf_tags.to_numpy()         # здесь ошибка
hs = np.hstack( (X_gen_2, X_tags_2) )

Скорее всего у вас на выходе трансформера получается разреженная матрица, у неё нет метода
to_numpy. И вообще хорошо бы с такими матрицами работать отдельно, иначе вам может не хватить памяти. Например, выделить главные компоненты с помощью
TruncatedSVD (аналог
PCA для разреженных матриц) и соединять с остальными данными эти компоненты, а не всю матрицу.
Но если очень хотите, можете превратить матрицу в обычную с помощью метода
todense, но будьте готовы к тому, что у вас может резко кончиться память. Или что ML модели будут очень тяжело переваривать такие объёмы данных (много колонок). Хотя если у вас не очень много тэгов и жанров то я, возможно, зря вас пугаю проблемами.


Разделение для каждого написавшего пользователя без путаницы. vk api longpoll
Пишу игрового бота на vk api и столкнулся с проблемой, что не пойму, как позволить 2 и более пользователям одновременно взаимодействовать с ботом в разных местах, что из-за моей цели является обязательным параметром.
Для чуть большей понятности, приведу такой примерный отрывок кода(и чтоб избежать слишком сильного нагромождения, не буду в данном отрывке цитировать import'ы и т.п.). Пусть 1 пользователь будет печатать в месте "x", а второй только напишет боту
<code>
 for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
        ranbow = random.randint(1,999)
        ranbow2 = random.randint(1,999)
        ranbow3 = ranbow * ranbow2
        api.messages.send(user_id=event.user_id, message= "Кто ты?" , random_id = ranbow3)

        for event in longpoll.listen():
            if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
                if event.text == "Бублик":
                    ranbow = random.randint(1,999)
                    ranbow2 = random.randint(1,999)
                    ranbow3 = ranbow * ranbow2
                    api.messages.send(user_id=event.user_id, message= "Вкусный?" , random_id = ranbow3)
                    for event in longpoll.listen():
                        if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
                            #Пусть это будет место X
                            if event.text == "Да":
                                ranbow = random.randint(1,999)
                                ranbow2 = random.randint(1,999)
                                ranbow3 = ranbow * ranbow2
                                api.messages.send(user_id=event.user_id, message= "Круто тебе" , random_id = ranbow3)
                elif event.text == "Крутой пользователь stackoverflow, который читает это":
                    ranbow = random.randint(1,999)
                    ranbow2 = random.randint(1,999)
                    ranbow3 = ranbow * ranbow2
                    api.messages.send(user_id=event.user_id, message= "А поможешь с распределением?" , random_id = ranbow3)
                    for event in longpoll.listen():
                        if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:

                            if event.text == "Да":
                                ranbow = random.randint(1,999)
                                ranbow2 = random.randint(1,999)
                                ranbow3 = ranbow * ranbow2
                                messages.send(user_id=event.user_id, message= "Спасибо:3" , random_id = ranbow3)
                             if event.text == "Не-а":
                                ranbow = random.randint(1,999)
                                ranbow2 = random.randint(1,999)
                                ranbow3 = ranbow * ranbow2
                                messages.send(user_id=event.user_id, message= "Всё равно спасибки, что посмотрели!" , random_id = ranbow3)
</code>
Тогда получится, что второй пользователь свои сообщением заденет первого, от чего образуется каша, чего мне всовсем не нужно. Как сделать так, чтоб оба пользователя могли одновременно отвечать боту, притом ни одного из них не задело бы вторым

Я делал так и все работало

while True:
        try:
            for event in longpoll.listen():
                if event.type == VkEventType.MESSAGE_NEW:
                    if event.to_me:
                       Часть кода...

Я предполагаю, что это происходит из-за, что ты несколько раз пишешь следующее, т.е. создаешь новые циклы в цикле

 for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:


Разделение зависимостей для локальной разработки и рабочего сервера (pip, requirements.txt)
Имеем

Локальный проект, локальное виртуальное пространство
Git репозиторий
Рабочий проект (сервер), рабочее виртуальное пространство

Для создания списка зависимостей очень удобно использовать
pip freeze > requirements.txt на локальном компьютере. Через git закинул на рабочий сервер, а далее установил все зависимости.
Но сейчас решил потестировать различные модули и в локальное виртуальное пространство установил кучу python'ских пакетов, которые обязательно попадут в
requirements.txt, а затем в рабочее окружение. В действительности они там не нужны.
Есть ли готовое решения для управления двумя версиями зависимостей? Один для рабочего окружения, другой для локального использования. Может какой нибудь менеджер существует?

Вот один вариант разделения и наследования зависимостей, через включение файлов зависимостей.
Создаете файл
runtime-requirements.txt с зависимостями для прода.
Для локальной разработки создаете
dev-requirements.txt и туда в дополнение к зависимостям используемым чисто для разработки включаете строку:

-r runtime-requirements.txt

Она заставит pip включить все зависимости из
runtime-requirements.txt при выполнении
pip install -r dev-requirements.txt.
Оба файла хранятся в git, и меняются хоть вручную, хоть с помощью
pip freeze при добавлении новых зависимостей.
Обычно я использую даже три файла:
runtime.txt ->
test.txt ->
dev.txt.

test.txt - для использования на CI (всякие Hamcrest, testcontainers, factoryboy и прочее).
dev.txt -
ipdb,
django-debug-toolbar и т.п.


Необходимо добавить в массив элементы от 'Суммы премии' до определенного элемента
<code>
file = open('ZP3', 'r', encoding='UTF-8')
lines = file.readlines()
worker = []
premiy = []
counter = 0
for line in lines:
    if line == 'ПРЕМИЯ\n':
        del line
        break
    else:
        worker.append(line)
print(worker)
for line in range(len(lines)):
    if lines[line] == 'СУММА ПРЕМИИ\n':
        premiy.append(lines[line+counter])
        counter += 1
    elif line == '':
        break
print(premiy)
</code>
Я понимаю, что я каждую строку сравниваю с 'Сумма премии', но не могу понять как сделать, чтобы добавлять от "Сумма премии' до определенной строки.

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

is_copy_mode = False
for line in lines:
    if line == 'СУММА ПРЕМИИ\n':
        is_copy_mode = True
    elif line == '':
        break
    if is_copy_mode:
        premiy.append(line)

Ещё вариант, но если этих строк может не быть в списке, то вылетит исключение:

line1 = lines.index('СУММА ПРЕМИИ\n')
line2 = lines.index('', line1)
premiy = lines[line1:line2].copy()


Помогите оценить сложность алгоритма
<code>
from math import log2, gcd

a = 2**30
b = 2**31
all_simple = []
all_log2 = []
all_paras = []
all_paras2 = []
final_paras = []
paras_counter = 0

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

for i in range(a, b+1):
    if is_prime(i):
        all_simple.append(i)
</code>

Формально алгоритм работает за константу, то есть за
O(1), ибо в нём зафиксированы параметры
a и
b, но будем считать их переменными.
Функция
is_prime() являет собой простую проверку числа на простоту путём перебора делителей до
sqrt(num). Сложность
O(sqrt(num)) в худшем случае, то есть когда функции подаётся простое число.
Дальше идёт цикл, в котором перебираются числа от
a до
b включительно, простые из них закидываются в массив;
append(), если не ошибаюсь, работает в среднем за
O(1). Сразу сделаем верхнюю оценку в виде
O((b - a) * sqrt(b)). Но по факту алгоритм работает гораздо быстрее, так как полный перебор делителей до
sqrt(N) будет осуществляться лишь для простых чисел, которых всё меньше и меньше при стремлении к бесконечности.
Обратимся к статье о распределении простых. Там говорится, что количество простых на отрезке [1; n] растёт примерно как
n / ln(n). Адаптировав для нашего случая, получим, что на отрезке от
a до
b будет примерно
b / ln(b) - a / ln(a) простых, на которых будут перебираться все делители до корня. Получим примерную нижнюю оценку вида
O((b - a) + (b / ln(b) - a / ln(a)) * sqrt(a)). Здесь мы не учли случаи, когда на простоту проверяется квадрат простого — на них
is_prime() будет работать тоже достаточно долго.
Простите, я, наверное, довольно сумбурно написал. Дать точную оценку здесь весьма сложно из-за природы простых чисел.
Вообще получить список простых можно быстрее, применив решето Эратосфена (если достаточно маленькие числа и хватает памяти, но это не случай автора вопроса) или алгоритмы проверки на простоту (приведенный в коде
is_prime() проверяет через факторизацию) — Ферма, BPSW и множество других, но среди них много вероятностных и есть ломающиеся на особых числах — к примеру, тест Ферма не работает на числах Кармайкла. На худой конец, есть алгоритм Полларда, факторизующий за
O(N^1/4).


Ловить событие телеграм бот
Прошу помочь по телеграм боту

InlineKeyboardButton(
      text="✅ Добавить в корзину",
      callback_data='2',
InlineKeyboardButton(
      text="❌ Удалить из корзины",
      callback_data='3',
 )

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

call.message.reply_markup.inline_keyboard[0]

прошу помочь
вот код обработчика

@dp.callback_query_handler()
async def byuing_pear(call: CallbackQuery):
print(call.message)
    if call.message.reply_markup.inline_keyboard[0][0].text == '✅ Добавить в корзину':
        product_id = call.message.reply_markup.inline_keyboard[0][0].callback_data
        print('0')
        await call.message.answer(call.message)
    elif call.message.reply_markup.inline_keyboard[0][0].text == '❌ Удалить из корзины':
        product_id = call.message.reply_markup.inline_keyboard[0][0].callback_data
        print('1')

У Вас логика построения приложения неправильная. Зачем Вам обрабатывать текст кнопки, когда есть уникальный идентификатор
callback_data?
Плюс вот это:

@dp.callback_query_handler() значит, что абсолютно все коллбэки будут приходить в эту функцию, а оно вам надо? :)
Вместо этого используйте декоратор так:
@dp.callback_query_handler(text='1')
Это значит, что эта функция запустится только тогда, когда
callback_data у нажатой пользователем кнопки =
1.

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

cart_cb = CallbackData("Cart", "product_id", "action")

# Тут измените кнопки на свои, я просто привёл пример, как лучше назвать callback_data
buttons = [
    InlineKeyboardButton(text="✅ Добавить в корзину", callback_data=cart_cb.new(product_id=123, action="add")),
    InlineKeyboardButton(text="❌ Удалить из корзины", callback_data=cart_cb.new(product_id=123, action="delete"))
]

...

@dp.callback_query_handler(cart_cb.filter(action=["add"]))
async def add_to_cart_handler(call: CallbackQuery, callback_data: dict):
    product_id = int(callback_data.get("product_id")) # 123
    print('Сработало нажатие на кнопку "Добавить в корзину!"')

    # Здесь Ваша логика на добавление товара в корзину

@dp.callback_query_handler(cart_cb.filter(action=["delete"]))
async def delete_from_cart_handler(call: CallbackQuery, callback_data: dict):
    product_id = int(callback_data.get("product_id")) # 123
    print('Сработало нажатие на кнопку "Удалить из корзины!"')

    # Здесь Ваша логика на удаление товара из корзины

P.S. В примере используется фабрика коллбэков от aiogram, это очень удобно и практично, почитать подробнее можете здесь.


Как менять кнопки в Телеграм боте?
Как можно сделать так, чтобы если text == 'расписание', появлялись кнопки с днями недели?
<code>
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
MAIN_KEYBOARD = [['Расписание', 'Домашка']]
def text_action(update, context):
    text = update.message.text.lower()
    cid = update.effective_chat.id
    if text == 'расписание':
        pass```
</code>

def chunks(l, n):
    n = max(1, n)
    return list((l[i:i + n] for i in range(0, len(l), n)))

def create_markup(group_id, update):
    buttons = []

    if group_id == 0:
       buttons += ['кнопка1','кнопка2',...]
    elif group_id == 1:
       buttons += ['кнопка1','кнопка2',...]
    ...
    keyboard = [KeyboardButton(button) for button in buttons]
    if len(keyboard) > 3:
        keyboard = chunks(keyboard, 3)
    else:
        keyboard = [keyboard]
    markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True)
    return markup

def second_step(update, context):
    if text == '...':
            markup = create_markup(group_id=0, update=update)
            context.bot.send_message(chat_id=update.message.chat_id,
                                     text='...',
                                     reply_markup=markup)
    elif text == '...':
            markup = create_markup(group_id=1, update=update)
            context.bot.send_message(chat_id=update.message.chat_id,
                                     text='...',
                                     reply_markup=markup)


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

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

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

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

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

Дан список строк, в котором некоторые значения заканчиваются на '/'. Нужно такие значения и следующее за ними объединить в общую строку.
Пример:

['0.3/', '1.2/', '1.2/', '1.2', '11']

Результат:

['0.3/1.2/1.2/1.2', '11]

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

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

lst_in = ['0.3/', '1.2/', '1.2/', '1.2', '11']
lst_out = []
for x in lst_in:
    if lst_out and lst_out[-1].endswith('/'):
        lst_out[-1] += x
    else:
        lst_out.append(x)
print(lst_out)

Или вариант через
zip:

lst_in = ['0.3/', '1.2/', '1.2/', '1.2', '11']
lst_out = []
for curr,prev in zip(lst_in, ['']+lst_in):
    if prev.endswith('/'):
        lst_out[-1] += curr
    else:
        lst_out.append(curr)
print(lst_out)


Отобразить конкретные значения в pandas
Подскажите, пожалуйста, как можно вывести только конкретные значения при использовании функции
value_counts?
Код:

import pandas as pd
df = pd.read_csv("test.csv", delimiter=";", encoding="utf-8").fillna("Null")
df.head()
id = df["ID"].value_counts()
print(id)

исходный файл
CSV имеет два столбца.
получаю:

id
Count

1
532

2
2355

3
1235

4
6631

...
...

100
569

Как отобразить только
id которые необходимы, например,
20,30,40,50,60
Столбец
id имеет строковые значения, т.е. это не порядковый столбец.
Большое спасибо.

Как вариант вроде должно и так сработать. Если такие значения есть в индексе после применения
value_counts, т.е. они есть в
id в исходном
df:

vc = df["ID"].value_counts()
print(vc.loc[['20','30','40','50','60']])

Я заменил имя переменной/датафрейма с результатом применения
value_counts, потому что
id - это название встроенной функции языка питон, его лучше не использовать для своих переменных.


как в pandas на основе DatetimeIndex одного массива получить значения из другого массива ориентируясь по его DatetimeIndex
Есть дневные данные из файла
D, на основе которых создается серия, и квартальные данные
Q по которым так же создается серия в pandas.
Мне нужно, используя DatetimeIndex дневных данных, получить значения массива из квартальных данных. То есть, найти ближайшее значение, при этом DatetimeIndex квартального должен быть меньше или равен дневному (не должно быть "заглядывания вперёд").
Пример:

2018-06-30,    1207.4 #квартальное значение

2018-07-02 00:00:00, 1.58479 # ближайшее дневное

2018-07-02 00:00:00, 1207.4 #синхронизировали по времени значение из квартальных данных с дневным

Сейчас я использую основной цикл по D и вложенный в него цикл по Q.
Хотелось бы обойтись без циклов. Или быть может каким-либо образом numpy использовать, но у меня массивы разной длины.
Возможно, в pandas есть функция наподобие этой:

index = data1.index.get_loc('1991-10-15', "nearest")

но для массива.
P.S. Нужно именно быстрое получение данных. С помощью циклов понятно, как сделать.
Если есть ответ, как данную манипуляцию произвести в postgresql, то интересно было бы увидеть. Здесь задавал вопрос по этой теме.
Для лучшего понимания дополнил код функцией "def file", в которой циклы делают синхронизацию значений из квартальных данных с дневными. Если ее запустить, то наглядно видно, что мне необходимо. Данные бывают с различной частотой 7, 10 дней, месяц, квартал(не в одинаковые числа месяца).
Файлы закачал здесь: D , Q

    import numpy as np
    import pandas as pd

    df = pd.read_csv('D.csv',
                         index_col='DATE',
                         parse_dates=True,
                         infer_datetime_format=True)

    date = df.iloc[:, 0].index.date
    z = df.iloc[:, 3].values

    df1 = pd.read_csv('Q.csv',
                         index_col='DATE',
                         parse_dates=True,
                         infer_datetime_format=True)

    date1 = df1.iloc[:, 0].index.date
    z1 = df1.iloc[:, 0].values

    date_ = np.array(date, dtype=np.datetime64)
    data = pd.Series(z, index=date_)

    date_1 = np.array(date1, dtype=np.datetime64)
    data1 = pd.Series(z1, index=date_1)

    def file(v,n,dv,dn): #v = z, n = z1, dv = date, dn = date1
        z = np.copy(v)
        news = np.copy(n)
        date = dv
        date_n = dn
        N = len(date)
        N1 = len(date_n)
        x = N1 - 1
        global u
        u = 0

        for q in range(0, N):
            k = u
            for i in range(k, N1):
                if date_n[i - 1] <= date[q] and date_n[i] > date[q]:
                    u = i
                    z[q] = news[i - 1]
                    break
                if x == i and date[q] >= date_n[i]:
                    u = i
                    z[q] = news[i]
                    break

        return z

    zn = file(z,z1,date,date1)
    test_data = pd.Series(zn, index=date_)
    print(test_data)

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

import pandas as pd

df = pd.read_csv('D.csv',
                     index_col='DATE',
                     parse_dates=True,
                     usecols=[0, 4],
                     infer_datetime_format=True)

df1 = pd.read_csv('Q.csv',
                     index_col='DATE',
                     parse_dates=True,
                     infer_datetime_format=True)

df = df.resample("Q").last()
res = df1.join(df, how="inner")

получите res:

                 O        C
DATE
1991-03-31   493.8  108.400
1991-06-30   485.6  105.530
1991-09-30   492.5  106.300
1991-12-31   500.3   94.900
1992-03-31   504.4  102.060
...            ...      ...
2017-06-30  1179.0   86.355
2017-12-31  1191.5   87.939
2018-06-30  1207.4   81.947
2018-12-31  1225.3   77.250
2019-06-30  1237.9   75.763

[100 rows x 2 columns]

в котором в колонке "C" будут ближайшие дневные данные к имеющимся квартальным.
Если нужно наоборот, в дневной датафрейм добавить  данные квартального, то можно сделать так:

import pandas as pd

df = pd.read_csv('D.csv',
                     index_col='DATE',
                     parse_dates=True,
                     usecols=[0, 4],
                     infer_datetime_format=True)

df1 = pd.read_csv('Q.csv',
                     index_col='DATE',
                     parse_dates=True,
                     infer_datetime_format=True)

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

df1 = df1.reindex(pd.date_range(df1.index.max(), df.index.max()).union(df1.index), method="pad")

Ну и затем:

df1 = df1.resample("D").fillna(method="ffill")
df["Q"] = df1.loc[df1.index.intersection(df.index)]
df["Q"] = df["Q"].fillna(method="ffill")

тогда df будет:

                  C       Q
DATE
1991-02-04  102.230   489.0
1991-02-05  100.620   489.0
1991-02-06  100.010   489.0
1991-02-07  100.470   489.0
1991-02-08   99.650   489.0
...             ...     ...
2021-07-01   83.281  1237.9
2021-07-02   83.534  1237.9
2021-07-05   83.472  1237.9
2021-07-06   82.876  1237.9
2021-07-07   82.755  1237.9

[7849 rows x 2 columns]


Какие есть варианты соединения элементов списка?
<code>

a = ['lloo']
b = []

for i in a:
    for k in i:
        if k == 'l':
            k = 'L'
        b.append(k)

b = [''.join(b[:])
</code>
Есть вариант сделать без повторного обращения к b, чтоб сразу ['LLoo'] вывелось?

Пересоберите список с заменой через
replace строковой
l на
L

a = ['lloo']
b = [c.replace('l', 'L') for c in a]  # ['LLoo']


Как подсчитывать кол-во участников, эмодзи и каналов со всех серверов на которых состоит бот? (discord.py)
Как это реализовать, так чтобы оно ещё и обновлялось при добавлении эмодзи, людей, и каналов?

Получаем список всех серверов, где есть бот:
bot.guilds
Получаем список участников конкретного сервера:
guild.members
Получаем список эмоджи сервера:
guild.emojis
Получаем список каналов сервера:
guild.channels

Проверить,
голосовой канал или
текстовый можно через его атрибут
type.
Текстовый канал -
discord.ChannelType.text, Голосовой -
discord.ChannelType.voice

Получить информацию о создании нового канала можно при помощи события
on_guild_channel_create(channel)
Получить информацию о подключении нового участника можно при помощи события
on_member_join(member)
Получить информацию о создании нового emoji вроде бы как нельзя...

Далее выводим список нужно инфы через цикл
for

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!', intents = discord.Intents.all())

@bot.event
async def on_ready():
    number = 0
    for guild in bot.guilds:
        number += 1
        print(f'{number}. {guild.name}')

        print('Участники:')
        for member in guild.members:
            print(f'    {member.name}')

        print('Каналы:')
        voice = []; text = []
        for channel in guild.channels:
            if channel.type != discord.ChannelType.category:
                if channel.type == discord.ChannelType.text: text.append(channel)
                if channel.type == discord.ChannelType.voice: voice.append(channel)
        print(' Текстовые:')
        for channel in text:
            print(f'        {channel}')
        print(' Голосовые:')
        for channel in voice:
            print(f'        {channel}')

        print('Эмоджи:')
        for emoji in guild.emojis:
            print(f'    {emoji.name}')

        print(f'\n{"="*60}\n')

@bot.event
async def on_guild_channel_create(channel):
    print(f'На сервере {channel.guild} создали новый канал: {channel.name}')

@bot.event
async def on_member_join(member):
    print(f'На сервер {member.guild} зашел новый пользователь: {member.name}')

bot.run(TOKEN)

Не забудьте указать токен!


pandas: расчет дат начала и времени выполнения задач
Я решил распределить выполнение определенных задач по дням в зависимости от времени, затрачиваемого на задачи. В день выделяется 7 часов, задачи же могут занимать разное время, но только в целых числах (1 ч, 2 ч, 3 ч и т.д.).
У меня имеется data frame, где содержатся названия задач, дата начала, дата конца и время выполнения задачи. Как автоматически заполнить даты в data frame? Уже десятки вариантов перебрал.
Основная трудность для меня состоит в том, чтобы учитывать время задач. Например, длится она 16 часов. Значит, на ее выполнение понадобится 2 полных дня (по 7 часов) и 2 часа от третьего дня. Тогда для третьего дня остается свободных 5 часов, в которые можно начать работу над следующей задачей.
Думаю собрать словарь, где ключами выступает название задачи, а значениями - даты в зависимости от того, сколько длится одна задача. Словарь можно собрать из 2 списков, в которых хранятся даты и время на задачи. Возможно, думаю не в ту сторону, но голова уже отказывается выдавать решения, прошу помочь)
Так выглядит data frame:
<code>
                                              Title Start Date End Date  Description
1                                          Handover                               16
2                                     Project Setup                                8
3  Add localization two languages (English, Spanish)                               6
</code>

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

import pandas as pd

hours_per_day = 7

df = pd.DataFrame({"task":["task1", "task2", "task3"],
                   "start date":["2021-07-02", "2021-07-01", "2021-07-03"],
                   "duration":[16, 8, 6]})

df["start date"] = pd.to_datetime(df["start date"])

получаем исходный датафрейм:

    task start date  duration
0  task1 2021-07-02        16
1  task2 2021-07-01         8
2  task3 2021-07-03         6

дальше просто вычисляем дельту:

df["end date"] = df["start date"] + pd.to_timedelta(df["duration"]//hours_per_day, "d")

df:

    task start date  duration   end date
0  task1 2021-07-02        16 2021-07-04
1  task2 2021-07-01         8 2021-07-02
2  task3 2021-07-03         6 2021-07-03

UPDATE
после уточнения автора вопроса, выяснилось, что по сути необходимо построить последовательный work-flow для непрерывного выполнения задач. Это можно сделать как-нибудь так:

import numpy as np
import pandas as pd

# исходные данные
durations = [4, 8, 2, 16, 5]
hours_per_day = 7
start_date = "2021-07-01"

arr = np.array(durations)
bins = [0]
bins.extend([x[-1] for x in
             np.array_split(np.arange(np.sum(arr)), np.ceil(np.sum(arr)/hours_per_day))])
# [0, 6, 13, 20, 27, 34]
totals = np.cumsum(arr)
# [ 4 12 14 30 35]
idx = np.digitize(totals, bins, right=True)-1
# [0 1 2 4 5]
start_deltas = np.pad(idx, (1, 0))[:-1]
# [0 0 1 2 4] <-- искомые дельты

Далее конструируем датафрейм:

df = pd.DataFrame({"task":[f"task{x}" for x in range(len(durations))],
                   "duration": durations,
                   "delta":start_deltas})
df["start_date"] = start_date
df["start_date"] = pd.to_datetime(df["start_date"])
df["start_date"] = df["start_date"] + pd.to_timedelta(df["delta"], "d")
df["end_date"] = df["start_date"] + pd.to_timedelta(df["duration"]//hours_per_day, "d")

получаем df:

    task  duration  delta start_date   end_date
0  task0         4      0 2021-07-01 2021-07-01
1  task1         8      0 2021-07-01 2021-07-02
2  task2         2      1 2021-07-02 2021-07-02
3  task3        16      2 2021-07-03 2021-07-05
4  task4         5      4 2021-07-05 2021-07-05

Идея заключается в том, чтобы разбить всю ленту часов выполнения задач на бины (отрезки), ограниченные точками начала и конца рабочих часов в течение одного дня. соответственно, начальные и конечные точки этих задач в указанных бинах и будут соответствовать начальным и конечным датам.
UPDATE 2*
Если нужно из workflow исключить нерабочие дни, то можно сделать так:

from pandas.tseries.offsets import *

# вместо последних двух преобразований сделать:
df["start_date"] = df.apply(lambda x: x["start_date"] + BDay(pd.to_timedelta(x["delta"], "d").days), axis=1)
df["end_date"] = df.apply(lambda x: x["start_date"] + BDay(pd.to_timedelta(x["duration"]//hours_per_day, "d").days), axis=1)

получим df:

    task  duration  delta start_date   end_date
0  task0         4      0 2021-07-01 2021-07-01
1  task1         8      0 2021-07-01 2021-07-02
2  task2         2      1 2021-07-02 2021-07-02
3  task3        16      2 2021-07-05 2021-07-07
4  task4         5      4 2021-07-07 2021-07-07


Djnago. Получить количество Product в OrderItem по периоду даты
Всем доброго дня!
Столкнулся с банальной проблемой, и, возможно не знанием.
Задача:
Получить количество товаров по имени заказанных в определенный период.
Что сделано:
models.py

class OrderItem(models.Model):
CHOICES = (
    ('-', '------'),
    ('xs', 'XS'),
    ('xs/s', 'XS/S'),
    ('s', 'S'),
    ('s/m', 'S/M'),
    ('m', 'M'),
    ('m/l', 'M/L'),
    ('l/xl', 'L/XL')
)
order = models.ForeignKey(Order, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
product_size = models.CharField(max_length=250, choices=CHOICES, default='xs', verbose_name='Размер')
parameters = models.TextField(verbose_name='Дополнительные параметры', blank=True)
product_color = models.CharField(max_length=250, verbose_name='Цвет')
product_quantity = models.PositiveIntegerField(verbose_name='Количество', default=1)

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

views.py

class TopOrderItemView(ListView):
template_name = 'reports/top_product.html'
model = OrderItem

def get_context_data(self, **kwargs):
    context = super(TopOrderItemView, self).get_context_data(**kwargs)
    top_sellers_ = Product.objects.annotate(count=Count('orderitem')).order_by('-count')
    if self.request.GET.get('date_since'):
        since_date = self.request.GET.get('date_since')
        to_date = self.request.GET.get('date_to')
        top_sellers_ = top_sellers_.filter(orderitem__order__order_create__gte=since_date,
                                           orderitem__order__order_create__lte=to_date)

    context['orderitem_list'] = top_sellers_
    return context

tempalte.html

<form action="", method="get">
                                {% csrf_token %}
                                <input type="date", name="date_since", min="2018-01-01" required="true">
                                <input type="date", name="date_to" required="true">
                                <input type="submit", value="Filter">
                            </form>
                        </div>
                        <!-- /.card-header -->
                        <div class="card-body">
                            <table id="example1" class="table table-bordered table-striped">
                                <thead>
                                <tr>
                                    <th>Товар</th>
                                    <th>Данные</th>
                                </tr>
                                </thead>
                                <tbody>
                                {% for product in orderitem_list %}
                                    <tr>
                                        <td>{{ product.product_name }}</td>
                                        <td>{{ product.orderitem_set.count }}</td>

                                    </tr>
                                {% endfor %}

                                </tbody>

Сами товары фильтрует хорошо по периоду дат, но выдает количество товаров в orderitem всегда все что есть в БД.
Какая нужна помощь:
Мне нужно иметь количество товара в заказах именно только за период дат.
Буду очень благодарен за помощь! Спасибо!

    top_sellers_ = Product.objects.annotate(count=Count('orderitem')).order_by('-count')
    if self.request.GET.get('date_since'):
        since_date = self.request.GET.get('date_since')
        to_date = self.request.GET.get('date_to')
        top_sellers_ = top_sellers_.filter(orderitem__order__order_create__gte=since_date,
                                           orderitem__order__order_create__lte=to_date)

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

qs = Product.objects.all()

if self.request.GET.get('date_since'):
    since_date = self.request.GET.get('date_since')
    to_date = self.request.GET.get('date_to')
    qs = qs.filter(orderitem__order__order_create__gte=since_date, orderitem__order__order_create__lte=to_date)

top_sellers_ = qs.objects.annotate(count=Count('orderitem')).order_by('-count')


Рекурсия в python классах
Есть код:

class Bank:

    def __init__(self, N, R):
        Month = 12 * R

        def deposit(n, month):
            if month == 0:
                return n
            return deposit(n, month - 1) * (1 + 10 / 100 / 12)

        profit = deposit(N, Month)
        print(f'Сумма на счету к концу срока: {profit}')

Bank(14, 10)

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

class Investment:

    def __init__(self, N, R):
        self.N = N
        self.R = R
        self.Month = 12 * self.R

class Bank:

    def deposit(self, investment):
        if investment.Month == 0:
            return investment.N
        return investment.N + (investment.Month - 1) * (1 + 10 / 100 / 12)

vklad = Investment(14, 10)
bank = Bank()
print(bank.deposit(vklad))

Скажите, как правильно перенести рекурсию?

Решение:
<code>
class Investment:

    def __init__(self, N, R):
        self.N = N
        self.R = R
        self.Month = 12 * self.R

class Bank:

    def deposit(self, n, month):
        if month == 0:
            return n
        return self.deposit(n, month - 1) * (1 + 10 / 100 / 12)

bank = Bank()
vklad = Investment(14, 10)
print(bank.deposit(vklad.N, vklad.Month))
</code>


Export in Python
Появился такой вопрос: Можно ли использовать и есть ли вообще такая вещь, как export в Python ? Я хочу экспортировать функцию из одного файла в другой. В node js я бы использовал
export const function и
import { function }. Могу ли я сделать также в Python ?

Можно просто импортировать необходимый файл.
Например если файлы лежат в одном каталоге.
file2.py наш файл с функцией:

def pr():
    print("Hello!")

file.py сюда мы импортируем функцию:

import file2

file2.pr()


Как сделать нормальную ссылку на файлы с русским названием?
Беру url изображения, которое залито на форму, но, если у неё русское название, то есть: изображение.png, картинка.jpg и прочее, то полный url изображения будет таким:

/media/2021/07/08/%D0%B3%D0%BE%D1%80%D0%B5_%D0%BE%D1%82_%D1%83%D0%BC%D0%B0.jpg
Как можно преобразовать это в строку с нормальным названием?

Так работает, так называемый URL quoting, так как в урле ничего не-ASCII не принимается, все преобразуются в вот такой причудливый вид.
Как вариант, это можно преобразовать с использованием
urllib.parse.unquote():

>>> from urllib.parse import unquote
>>> unquote('/media/2021/07/08/%D0%B3%D0%BE%D1%80%D0%B5_%D0%BE%D1%82_%D1%83%D0%BC%D0%B0.jpg')
'/media/2021/07/08/горе_от_ума.jpg'


Как найти словарь с минимальным значением в python?
Есть несколько словарей:
<code>
d1 = {v: 1}
d2 = {v: 2}
d3 = {v: 3}
</code>
как найти словарь с минимальным значением v?

Как отметил товарищ @insolor, можно воспользоваться опциональным аргументом
key функции
min(list, key), с помощью которого будут проверяться ключи в словаре:

min([d1, d2, d3], key=lambda x: x['v'])


Как сделать так чтобы дата выводилась именно та которую я ввожу в переменную time TIME_ZONE = 'Asia/Bishkek' Например ввожу 12:00:00 а получаю 06:00 [закрыт]

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

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

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

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

И если кто то шарит как правильно сделать функцию резервирования(reservation, reservations) не особо понимаю.
<code>
class Reservation(models.Model):
    computer_club = models.ForeignKey('clubs.Club', models.CASCADE, related_name='club_reservation', null=True)
    seats = models.ForeignKey('clubs.Table', models.CASCADE, related_name='seats_reservation', null=True)
    owner = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='owner_reservation', null=True)
    time = models.DateTimeField('Введите время бронирования')
    time1 = models.DateTimeField('Время окончания бронирования', blank=True)
    using_time = models.PositiveSmallIntegerField('Введите на сколько часов вы садитесь')
    #reservation = models.IntegerField('Количество броней за день')

    class Meta:
        verbose_name = 'Бронирование'
        verbose_name_plural = 'Бронирование'

    def __str__(self):
        return f'{self.computer_club } {self.seats } {self.time } {self.using_time } {self.time1 } {self.owner }'

    def save(self, *args, **kwargs):
        time = self.time
        time += timedelta(hours=self.using_time)
        self.time1 = time
        super(Reservation, self).save()

    def reservations(self, *args, **kwargs):
        for i in self.reservation:
          if self.owner.i == Reservation:
            i += 1
            if self.owner.i == 5:
              print('Невозможно сделать больше 5 бронирований в день')

        super(Reservation, self)

    def reservation(self, *args, **kwargs):
        while True:
          if self.using_time == 0:
            print('Ошибка!')
            continue
          else:
            print('Бронь успешна')
            break
    reservation(using_time)```
</code>

В admin.py пропишите
<code>
from django.contrib import admin
from .models import Reservation

class ReservationAdmin(admin.ModelAdmin):
    list_display = ['pk', 'computer_club', 'seats', 'time', 'using_time', 'time1', 'owner' ]

admin.site.register(Reservation, ReservationAdmin)
</code>


Почему плохо вызывать `sum` на списке списков?
У меня есть длинный список состоящий из подсписков. Я хочу собрать все элементы подсписков в единый список. Например:

lst = [[i, i + 1] for i in range(10)]
print(lst)

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

flat = sum(lst, [])
print(flat)

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

Код короткий и понятный. Чем это может быть плохо?

В целом очень затратный способ по времени. На небольших списках незаметно, но на больших списках все становится плохо.
К примеру,
sum([[1, 2], [3, 4], ...], []) у нас раскладывается в ряд
[] + [1, 2] + [3, 4] + .... На каждой конкатенации создается новый список, стоящий
O(n) и так n-раз. В итоге имеем сложность
O(n^2). В случае же модификации списка. Мы имеем сложность, насколько понимаю,
O(n). Если ошибаюсь, то надеюсь меня поправят).
Сравним:

lst_1 = [[i, i + 1] for i in range(100)]
lst_2 = [[i, i + 1] for i in range(1000)]
lst_3 = [[i, i + 1] for i in range(10000)]

def flat(lst: list):
    return [item for row in lst for item in row]

def sum_lst(lst: list):
    return sum(lst, [])

На списке из 100 элементов имеем сопоставимый средний результат, но, начиная с 1к элементов, уже расходимся на порядок по среднему результату, а на 10к — уже два порядка:

Case: sum_1
---
Function: sum_lst
Total time = 0.00900042 sec
Best loop time = 2.9509e-05 sec
Average loop time = 9.00042e-05 sec
Repeats = 100

Case: flat_1
---
Function: flat
Total time = 0.00363718 sec
Best loop time = 3.2562e-05 sec
Average loop time = 3.63718e-05 sec
Repeats = 100

Case: sum_2
---
Function: sum_lst
Total time = 0.271297 sec
Best loop time = 0.00207202 sec
Average loop time = 0.00271297 sec
Repeats = 100

Case: flat_2
---
Function: flat
Total time = 0.0326995 sec
Best loop time = 0.000306655 sec
Average loop time = 0.000326995 sec
Repeats = 100

Case: sum_3
---
Function: sum_lst
Total time = 36.4801 sec
Best loop time = 0.336264 sec
Average loop time = 0.364801 sec
Repeats = 100

Case: flat_3
---
Function: flat
Total time = 0.384994 sec
Best loop time = 0.00275655 sec
Average loop time = 0.00384994 sec
Repeats = 100

gist с примером


Встроенная функция sum(). Не работает для списка списков
Если интересно, то задача возникла из необходимости объединить коды цветов точек в один список. То есть у меня 3n точек, идущих последовательно n штук одного цвета.  Естественно, я воспользовал автогенерацией (comprehensive list):

cc = [n * [color, ] for color in ['tab:blue', 'tab:orange', 'tab:green'] ]

Например при n == 2 получим:

cc

Out[24]:
[['tab:blue', 'tab:blue'],
 ['tab:orange', 'tab:orange'],
 ['tab:green', 'tab:green']]

теперь очевидно

cc[0] + cc[1] + cc[2]
Out[25]: ['tab:blue', 'tab:blue', 'tab:orange', 'tab:orange', 'tab:green', 'tab:green']

однако желаемое применение встроенной функции
sum() приводит к прерыванию.

sum(cc)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-175665ff078b> in <module>
----> 1 sum(cc)

TypeError: unsupported operand type(s) for +: 'int' and 'list'

Не понимаю   -  о каком "инте" здесь идет речь.
Протрите мне глаза пжста....
Выход я нашел:

import itertools
[el for el in itertools.chain(*cc)]
Out[33]: ['tab:blue', 'tab:blue', 'tab:orange', 'tab:orange', 'tab:green', 'tab:green']

Однако как говорит Хеттингер - "Должен быть лучший путь".  Ведь
sum() должна бы работать, не правда ли?

sum(iterable, start)
Return the sum of a 'start' value (default: 0) plus an iterable of
numbers

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

sum(cc, [])


Почему ошибка в случае 1?) [закрыт]

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

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

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

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

Вот код:
Случай 1:

print(1)
a = 1
print(a)
print(a + 1)

Случай 2:

a != 1
print(a)

Почему в Случае 2 ошибка???

Ошибка из-за того, что код:

a != 1

это значит, что
a не равняется 1, а:

a != 1
print(a)

невозможно вывести
a, потому что
a не принимает никакого значения!)


Генератор Python
Есть список, необходимо вывести этот список по очереди через генератор, еще и с подписями
<code>
my_list = (Хлеб, 2, 35, Молоко, 1, 53, Яйцо, 30, 300)
x = (i for i in my_list)
next(x)

Пример
next(x)
output: Название: Хлеб
next(x)
output: Кол-во: 2
next(x)
output: Цена: 35
и т.д.
</code>

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

my_list = ['Хлеб', 2, 35, 'Молоко', 1, 53, 'Яйцо', 30, 300, ]
fields = ['Название', 'Количество', 'Цена', ]

x = (print('{}: {}'.format(fields[ir % len(fields)], item)) for ir, item in enumerate(my_list))

for _ in my_list:  # Выводим в консоль
    next(x)

Или через
map и
lambda:

x = map(lambda f, m: print(f'{f}: {m}'), fields * (len(my_list) // len(fields)), my_list)

В итоге имеем что-то подобное:

Название: Хлеб
Количество: 2
Цена: 35
Название: Молоко
Количество: 1
Цена: 53
Название: Яйцо
Количество: 30
Цена: 300


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

dict = {'key1':{'key2':{'key3':'foo'}}}

И есть список с ключами, а так-же новое значение:

keys = ['key1','key2','key3']
new_value = 'bar'

Как с помощью функции поменять значение с foo на bar используя ключи из массива?
Пример:

change_dict(dict, keys, new_value)

Стоит учитывать, что длина пути может меняться.

data = {'key1':{'key2':{'key3':'foo'}}}

keys = ['key1','key2','key3']
new_value = 'bar'

item = data
for key in keys[:-1]:
    item = item[key]

item[keys[-1]] = new_value

print(data)


Как сделать автоматическое добавление в комбинированные списки?
Нужна помощь с частью кода переноса сочетания списков prices и items в список menu (как в примере). Буду очень благодарен за помощь
<code>
items = ["Arbuz = ", "Yabloko = ", "Morkovka = ", "Grusha = "] # товар

prices = [120.43, 10, 23.56, 92.41] #цена

menu = [] # комбо цены и товар. (Пример - Arbuz = 120.43)

size = (len(prices))

combo = " "

for combo in range(size):

    combo = items[0:size] + prices[0:size] # попытки запихнуть prices + items в menu
    menu.append(combo)

def adder(item, price):

    items.append(item)  # Добавление товара
    prices.append(price)

adder("Moloko = ", 200)

print(menu)
</code>

items = ["Arbuz", "Yabloko", "Morkovka", "Grusha"]
prices = [120.43, 10, 23.56, 92.41]

menu = []

for x, y in zip(items, prices):
    menu.append(f'{x} = {y}')

print('menu', menu)

>>> menu ['Arbuz = 120.43', 'Yabloko = 10', 'Morkovka = 23.56', 'Grusha = 92.41']

def add(item, price, menu_1):
    menu_1.append(f'{item} = {price}')
    return menu_1

print('add', add('salad', 234, menu))

>>> menu ['Arbuz = 120.43', 'Yabloko = 10', 'Morkovka = 23.56', 'Grusha = 92.41']
add ['Arbuz = 120.43', 'Yabloko = 10', 'Morkovka = 23.56', 'Grusha = 92.41', 'salad = 234']

zip

в идеале я хотел сделать так, что б в конечном результате оно
показывало Арбуз - 120 рублей 43 копейки , Яблоко - 10 рублей и т.д.

items = ["Arbuz", "Yabloko", "Morkovka", "Grusha"]
prices = [120.43, 10, 23.56, 92.41]

menu = []

for x, y in zip(items, prices):
    if isinstance(y, int):
        menu.append(f'{x} = {y} руб.')
    elif isinstance(y, float):
        menu.append(f'{x} = {str(y).split(".")[0]} руб. {str(y).split(".")[1]} коп.')

print('menu', menu)
>>> menu ['Arbuz = 120 руб. 43 коп.', 'Yabloko = 10 руб.', 'Morkovka = 23 руб. 56 коп.', 'Grusha = 92 руб. 41 коп.']

isinstance


Азбука Морзе на Python
Затрудняюсь написать код перевода списка

m = ['А Б В В']

в список вида

m = ['.-  -...  .--  .--']

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

def morze(symbol):

    if symbol == 'A':
        return '.-'

    if symbol == 'Б':
        return '-...'

    if symbol == 'В':
        return '.--'

    if symbol == ' ':
        return '  '

    else: return 0

И пробую вывести так:

for i in range(0,len(m)):

    print(morze(m[i]), end = " ")

Но конечно же ничего не работает. Есть рекомандация. Однако, она с синтаксисом Java, который мне абсолютно не знаком. Есть так же предложение такого вида. Но там используется функция get, что противоречит заданию.
Список вида

m = ['А', 'Б', 'В', 'В']

перевожу без проблем. Но нужно именно m = ['А Б В В'], где символы разделены не кавычками а пробелами.
Возможно ли это сделать?
Как синтаксически правильно реализовать посимвольный перевод на Python без использования вспомогательных функций?

вы можете попробовать сделать каждого члена списка ['А Б В В'] отдельным элементом: ['А', 'Б', 'В', 'В']
Затем вы можете работать с новым списком
<code>
m = ['А Б В В']
m = m[0].split()
print(m)
</code>