Проблема с выводом графика
Пытаюсь вывести график оцифрованной синусоиды, но бестолку- выводится только графическое окно без графика. Помогите, пожалуйста, разобраться.
<code>
import matplotlib.pyplot as plt
import matplotlib
from math import sin, pi
from pylab import *
import os

xmax = 10 #интервал в секундах
x = 0
freq = 4  #частота дискретизации в Гц
ff = 0.6
xstep = 1 / freq
bits = 6
mult = 1 << (bits - 1)
result = []

while x < xmax:
   y = math.sin(x*ff)
   dig = int(y * mult)
   result.append(dig)
   x += xstep
   plt.plot(x,y)
   plt.grid(True)
plt.show()
</code>

График нужно отрисовавать один раз, и нужно передавать список
<code>
import matplotlib.pyplot as plt
import matplotlib
from math import sin, pi
from pylab import *
import os

xmax = 10 #интервал в секундах
x = 0
freq = 4  #частота дискретизации в Гц
ff = 0.6
xstep = 1 / freq
bits = 6
mult = 1 << (bits - 1)
result = []

while x < xmax:
   y = math.sin(x*ff)
   dig = int(y * mult)
   result.append(dig)
   x += xstep

plt.plot(result)
plt.grid(True)
plt.show()
</code>


Решение задачи с помощью pandas python
Прохожу курс, застрял на заключительном тесте первого урока в главе "Анализ данных". Есть football.csv, содержащий информацию о футболистах. Необходимо найти, какое количество вратарей (значение "GK" в столбце "Position") в среднем играет за один клуб (столбец "Club"). Мой вариант решения:
<code>
import pandas as pd
data = pd.read_csv ('football.csv')
data = data [data.Position == "GK"].Club.value_counts ().mean ()
print (data)
</code>
При условии округления ответа до тысячных, получаем 2.544. Далее обратимся к подсказке и ответу от разработчиков курса: "Для ответа открой набор данных с футболистами создай сводную таблицу, содержащую сведения о количестве игроков, занимающих разные позиции в каждом клубе. Отсутствующие значения замени нулями". Правильный ответ оказался 2.525. Тут возникает множество вопросов. Во-первых, почему мой ответ неверный? Причем разница то небольшая, на уровне погрешности. Во-вторых, формируя сводную таблицу по подсказке из задачи, я столкнулся с такой проблемой: что записывать в values? В index я хотел записать клубы, в columns позиции игроков, агрегирующую функцию взять mean. Затем, проиндексировав сводную таблицу по индексу All, я бы извлек из получившегося результата данные только по голкиперам, и вот он ответ. Таким образом, что передавать в аргумент values? Ведь столбца, который вел бы подсчет по количеству разных позиций игроков в одном клубе нет.

попробуйте следовать подсказке:

res = (data
       .assign(x=1)
       .pivot_table(index="Club", columns="Position",
                    values="x", aggfunc="sum", fill_value=0)
       ["GK"]
       .mean())

результат:

In [309]: res
Out[309]: 2.5246153846153847

Очевидно в некоторых клубах нет вратарей и отсюда разница в ответах. Проверим догадку:

In [311]: data.assign(x=1).pivot_table(index="Club", columns="Position", values="x", aggfunc="sum", fill_value=0)["GK"].value_counts()
Out[311]:
3    279
2    218
1     77
4     65
5      5
0      5        # <---- NOTE: в пяти клубах нет вратарей!
6      1
Name: GK, dtype: int64


Почему бот не отвечает на сообщения в группе, хотя если писать ему напрямую, то всё работает?
Бот не отвечает на сообщения в группе (но если напрямую ему писать, то работает).
Я создала группу для теста, и у меня не получается его туда добавить.
<code>
import telebot
import config
import dbworker
bot = telebot.TeleBot(config.TOKEN)

name = '';
surname = '';
age = 0;
@bot.message_handler(content_types=['text'])
def start(message):
    if message.text == 'к':
        bot.send_message(message.from_user.id, "Как тебя зовут?");
        bot.register_next_step_handler(message, get_name); #следующий шаг – функция get_name
    else:
        bot.send_message(message.from_user.id, 'Напиши "к"');

def get_name(message): #получаем фамилию
    global name;
    name = message.text;
    bot.send_message(message.from_user.id, 'Какая у тебя фамилия?');
    bot.register_next_step_handler(message, get_surname);

def get_surname(message):
    global surname;
    surname = message.text;
    bot.send_message(message.from_user.id,'Сколько тебе лет?');
    bot.register_next_step_handler(message, get_age);

def get_age(message):
    global age;
def get_age(message):
    global age;
    while age == 0: #проверяем что возраст изменился
        try:
             age = int(message.text) #проверяем, что возраст введен корректно
        except Exception:
             bot.send_message(message.from_user.id, 'Цифрами, пожалуйста');
    from telebot import types
    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 = 'Тебе '+str(age)+' лет, тебя зовут '+name+' '+surname+'? пришла скупиться';
    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": #call.data это callback_data, которую мы указали при объявлении кнопки

        bot.send_message(call.message.chat.id, 'давай тебе что-то подберем : )');
    elif call.data == "no":
        bot.send_message(call.message.chat.id, 'нет : )');

def user_entering_age(message):
    # А вот тут сделаем проверку
    if not message.text.isdigit():
        # Состояние не меняем, поэтому только выводим сообщение об ошибке и ждём дальше
        bot.send_message(message.chat.id, "Что-то не так, попробуй ещё раз!")
        return
    # На данном этапе мы уверены, что message.text можно преобразовать в число, поэтому ничем не рискуем
    if int(message.text) < 5 or int(message.text) > 100:
        bot.send_message(message.chat.id, "Какой-то странный возраст. Не верю! Отвечай честно.")
        return
    else:
        # Возраст введён корректно, можно идти дальше
        bot.send_message(message.chat.id, "Когда-то и мне было столько лет...эх... Впрочем, не будем отвлекаться. "
                                          "Отправь мне какую-нибудь фотографию.")
        dbworker.set_state(message.chat.id, config.States.S_SEND_PIC.value)
@bot.message_handler(content_types=["photo"],
                     func=lambda message: dbworker.get_current_state(message.chat.id) == config.States.S_SEND_PIC.value)
def user_sending_photo(message):
    # То, что это фотография, мы уже проверили в хэндлере, никаких дополнительных действий не нужно.
    bot.send_message(message.chat.id, "Отлично! Больше от тебя ничего не требуется. Если захочешь пообщаться снова - "
                     "отправь команду /start.")
    dbworker.set_state(message.chat.id, config.States.S_START.value)@bot.message_handler(content_types=['text'])
def get_text_messages(message):
  if message.text == "Привет":
      bot.send_message(message.from_user.id, "Привет, сейчас я расскажу тебе гороскоп на сегодня.")
  elif message.text == "/help":
      bot.send_message(message.from_user.id, "Напиши Привет")
  else:
      bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")

@bot.message_handler(commands=["start"])
def cmd_start(message):
    state = dbworker.get_current_state(message.chat.id)
    if state == config.States.S_ENTER_NAME.value:
        bot.send_message(message.chat.id, "Кажется, кто-то обещал отправить своё имя, но так и не сделал этого :( Жду...")
    elif state == config.States.S_ENTER_AGE.value:
        bot.send_message(message.chat.id, "Кажется, кто-то обещал отправить свой возраст, но так и не сделал этого :( Жду...")
    elif state == config.States.S_SEND_PIC.value:
        bot.send_message(message.chat.id, "Кажется, кто-то обещал отправить картинку, но так и не сделал этого :( Жду...")
    else:  # Под "остальным" понимаем состояние "0" - начало диалога
        bot.send_message(message.chat.id, "Привет! Как я могу к тебе обращаться?")
        dbworker.set_state(message.chat.id, config.States.S_ENTER_NAME.value)
bot.remove_webhook()
bot.polling(none_stop=True,interval =0)
</code>

У ботов по-умолчанию включены настройки приватности.
Если бот в группе не администратор, то он видит только те сообщения, которые адресованы лично ему.
Т.е. сообщение
/start бот не получит, а
/start@MyBot - получит.
Есть 2 варианта решения:

Отключить
Privacy Mode в настройках бота у @BotFather
Дать боту права администратора


В чем ошибка? категории if python
Выводит сразу несколько категорий возрастов, например ввел 96 лет: мне выводит: молодость зрелость и только потом старость
<code>
age = int(input())
if age <= 13:
    print("детство")
if age >= 13 <= 24:
    print("молодость")
if age >= 25 <= 59:
    print("зрелость")
if age >= 91:
    print("старость")
</code>

Если почти ничего не менять, можно сделать вот так:

age = int(input())
if age <= 13:
    print("детство")
if 13 < age <= 24: # Это эквивалентно 13 < age and age <= 24
    print("молодость")
if 24 < age <= 59:
    print("зрелость")
if 59 < age <= 90:
    pass # ?
if 90 < age:
    print("старость")

Но очевидно, что можно не проверять уже проверенные условия:

age = int(input())
if age <= 13:
    print("детство")
elif age <= 24:
    print("молодость")
elif age <= 59:
    print("зрелость")
elif age <= 90:
    pass # ?
else:
    print("старость")


Почему действия не выполняются постепенно?
У меня программа рисует линии по вертикали и выставляет их по порядку с самых низких по высокие.
Почему сортировка проходит сразу а не постепенно?
<code>
import pygame

pygame.init()

sc = pygame.display.set_mode((1200,600))
FPS = 1
clock = pygame.time.Clock()

y = [230,240,270,210,300,220]

def draw(xOne,yOne,xTwo,yTwo,Width):
    pygame.draw.line(sc,(0,0,255),(xOne,yOne),(xTwo,yTwo), Width)

while True:
    sc.fill((255,255,255))
    draw(200,400,200,y[0],10)
    draw(250,400,250,y[1],10)
    draw(300,400,300,y[2],10)
    draw(350,400,350,y[3],10)
    draw(400,400,400,y[4],10)
    draw(450,400,450,y[5],10)

    for h in pygame.event.get():
        if h.type == pygame.QUIT:
            exit()
    for i in range(len(y)):

        for j in range(len(y) - i - 1):

            if y[j] < y[j+1]:
                y[j], y[j+1] = y[j+1], y[j]

    pygame.display.update()
    clock.tick(FPS)
</code>

for i in range(len(y)):

        for j in range(len(y) - i - 1):

            if y[j] < y[j+1]:
                y[j], y[j+1] = y[j+1], y[j]

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

for i in range(len(y) - 1):
    if y[i] < y[i + 1]:
        y[i], y[i + 1] = y[i + 1], y[i]


Почему у меня ошбика Syntax in my pygame code?
Ошибка:

line 35
    if <= current_ray NUM_RAYS - 1 and distance_to sprite < walls[current_ray][0]:
        ^
SyntaxError: invalid syntax

Код:

import pygame
from settings import *

class Sprites:
    def __init__(self):
        self.sprite_types = {
            'barrel':pygame.image.load("sprites/barrel/0.png").conver_alpha()}
        self.sprite_objects = [
            SpriteObject(self.sprite_types['barrel'], True,(7.1,2.1),1.8,0,4),
            SpriteObject(self.sprite_types['barrel'], True,(7.1,2.1),1.8,0,4),
        ]

class SpriteObject:
    def __init__(self, object , static , pos , shift , scale):
        self.object = object
        self.static = static
        self.pos = self.x,self.y = pos[0] * TILE, pos[1] * TILE
        self.shift = shift
        self.sclae = scale

    def object_locate(self,player,walls):
        dx , dy = self.x - player.x, self.y - player.y
        distance_to_sprite = math.sqrt(dx ** 2 + dy ** 2)

        theta =math.atan2(dy,dx)
        gamma = theta - player.angle
        if dx > 0 and 180 <= math.degress(player.angle) <= 360 or dx < 0 and dy < 0:
            gamma += DOUBLE_PI

        delta_rays = int(gamma / DELTA_ANGLE)
        current_ray = CENTER_RAY + delta_rays
        distance_to_sprite *= math.cos(HALF_FOV - current_ray * DELTA_ANGLE)

        if <= current_ray NUM_RAYS - 1 and distance_to sprite < walls[current_ray][0]:
            proj_height = int(PROJ_COEFF / distance_to sprite * self.scale)
            half_proj_height = proj_height // 2
            shift = half_proj_height * self.shift
            sprite_pos = (current_ray * SCALE - half_proj_height, HALF_HEIGHT - half_proj_height + shift)
            sprite = pygame.transform.scale(self.object,(proj_height,proj_height))
            return (distance_to_sprite, sprite,sprite_pos)
        else:
            return (False,)

if должен выглядеть так:

if a <= b:

а у вас :

if <= a b:

поэтому

if <= current_ray NUM_RAYS - 1

надо заменить:

if current_ray <= NUM_RAYS - 1


Как получить состояние с линейного датчика Rpi.GPIO?
Есть сборка из Rpi 4 и 2-х датчиков, которые определяют черную линию(если датчик над черной линией, то выдаёт 0, иначе подаёт сигнал 1). Не могу найти информацию по получению состояния этого датчика. То есть, мне надо посмотреть что выдаёт каждый из датчиков. Как такое реализовать?

Пример из вики амперки

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(2, GPIO.IN)

while True:
    time.sleep(0.5)
    button = GPIO.input(2)
    print(button)

Пояснение:
GPIO.setup(2, GPIO.IN) - назначаем второй пин на вход,
button = GPIO.input(2) - пишем значение в переменную.
! Обратите внимание, фактические номера ножек не соответсnвуют номерам GPIO, т.е. перед написанием программы загуглите распиновку, чтобы не было ошибок
Только в данном случае объявлен один вход. Соответственно вы назначаете столько сколько вам нужно и пишете значения ваших датчиков куда вам удобно.


Сортировка словаря по значениям в порядке убывания [закрыт]

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

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

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

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

Есть словарь с городами и их населением, никак не получается отсортировать по убыванию.
<code>
city = {
    "Kiyv":("2884000"),
    "Odessa":("993120"),
    "Tokyo":("9071577"),
    "Mexico City":("8874724"),
    "London":("8416500"),
    "Bogota":("7776845"),
    "Singapore":("5399200"),
    "Hong Kong":("7219700"),
    "Ankara":("5150072"),
    "Istanbul":("14377019"),
    "Lahore":("11318745"),
    "New York City":("8491079"),
    "Nanjing":("8187828"),
    "Rio de Janeiro":("6429923"),
    "Pune":("5049968"),
    "Tehran":("8154051"),
    "Abidjan":("4765000")
}

v = list(city.values())
v.sort#на выходе получается первый "Lahore", а должен "Istanbul"
k = list(city.items())
for i in v:
    for j in range(len(k)):
        if(i in k[j]):
            print(k[j])
</code>

print(*sorted(city.items(), key = lambda x: int(x[1]), reverse = True), sep = "\n")


Программа зависает из-за schedule
Подскажите, работаю с библиотекой
datetime и
schedule.
В определенное время должна сработать функция.
Для этого использую
schedule.
Я использую PyQt5 и при запуске этого самого
schedule окно зависает (написано "Не отвечает") и кликать на кнопки в окне нельзя.
Только ждать, пока
schedule закончится.
Смысл программы в том, что если ты указываешь время (например 14:50) и нажимаешь на кнопку, то программа должна в 14:50 вывести сообщение.
Поэтому использую
schedule.
Но повторюсь, окно зависает, а хотелось бы пока идет цикл, в окне нажимать и на другие кнопки.
После 14:50 и вывода сообщения программа отвисает и можно дальше кликать куда хочу, но пока выполняется schedule до 14:50 - кликать не получается, всё зависает./
Скажите, как избавиться от зависания?
UPDATE  (запускаете, указываете время на 1 или более минут больше от текущего и ждете, пока время не будет одинаковым: по МСК и то, которое указали

import sys
import time
from datetime import datetime

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import uic

import schedule

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(449, 208)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 40, 191, 31))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(250, 50, 171, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(340, 130, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 449, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Когда вывести сообщение:"))
        self.pushButton.setText(_translate("MainWindow", "Запуститть"))

class Example(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.go)
        self.f = False

    def write(self):
        print('красафчик')
        self.f = True

    def go(self):
        try:
            self.t = self.lineEdit.text()
            self.datetime_object = datetime.strptime(self.t, '%H:%M')
            print(self.datetime_object.time())
            print(datetime.now().time())
            print(self.datetime_object.time() == datetime.now().time())

            if self.datetime_object.time() > datetime.now().time():
                schedule.every().day.at(str(self.datetime_object.time())).do(
                    self.write)
                while self.f != True:
                    print('нет')
                    schedule.run_pending()
                    time.sleep(1)

            while self.f != True:
                if self.datetime_object.time() == datetime.now().time():
                    schedule.every().day.at(
                        str(self.datetime_object.time())).do(self.write())
                schedule.run_pending()
                time.sleep(0.5)

        except Exception as e:
            print(e)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    ex = Example()
    ex.show()

    sys.exit(app.exec_())

Вызов
time.sleep в коде вкупе с бесконечным циклом блокирует обработку событий приложения, поэтому оно не реагирует.
Самое быстрое решение без минимума изменения кода через использование
QApplication.processEvents() вместо
time.sleep:

...
            if self.datetime_object.time() > datetime.now().time():
                schedule.every().day.at(str(self.datetime_object.time())).do(
                    self.write
                )
                while not self.f:
                    # print('нет')
                    schedule.run_pending()
                    QApplication.processEvents()

            while not self.f:
                if self.datetime_object.time() == datetime.now().time():
                    schedule.every().day.at(
                        str(self.datetime_object.time())).do(self.write())
                schedule.run_pending()
                QApplication.processEvents()
...

Вызов
QApplication.processEvents() дает возможность обработать события приложения, возвращая ему активность.

Другой вариант -- отправить работу
schedule в отдельный поток, накидал пример через
QThread и сигналы:

from PyQt5.QtCore import QThread, pyqtSignal

...

class ScheduleThread(QThread):
    about_time = pyqtSignal(str)

    def add_time(self, time: str):
        schedule.every().day.at(time).do(
            lambda: self.about_time.emit(time)
        )

    def run(self):
        while True:
            schedule.run_pending()
            time.sleep(1)

class Example(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()

        self.setupUi(self)
        self.pushButton.clicked.connect(self.go)

        self.thread = ScheduleThread()
        self.thread.about_time.connect(self.write)
        self.thread.start()

    def write(self, time: str):
        print('красафчик', time)

    def go(self):
        try:
            t = self.lineEdit.text()
            datetime_object = datetime.strptime(t, '%H:%M')
            time_str = str(datetime_object.time())

            self.thread.add_time(time_str)

        except Exception as e:
            print(e)


ModuleNotFoundError: No module named 'sqlalchemy'
Использую Eclipse на Debian. Все необходимые модули типа

sqlalchemy
pymysql
pandas

установлены должным образом. Представленный код ниже прекрасно работал.

#!/usr/bin/python
# -*- coding: <utf-8> -*-
from sqlalchemy import create_engine
import pymysql
import pandas as pd

... код тела программы ...

Стоило установить на винт другую linux подобную систему, РЯДОМ (ПОВЕРХ) Debian как все слетело. Теперь при запуске выдает ошибку:

Traceback (most recent call last):
     File "/way_to_path/dataBases.py", line 3, in <module>
from sqlalchemy import create_engine
     **ModuleNotFoundError: No module named 'sqlalchemy'**

Ребята, как исправить проблему? Что могло пойти не так?

Попробуйте в своём файле поменять
#!/usr/bin/python на
#!/usr/bin/python3.
Вы установили пакеты для 3го питона (Requirement already satisfied: SQLAlchemy: /usr/local/lib/Python3.7/dist-packages ), а интерпретатором выбран питон версии 2 (показывает Python 2.7.16).


Метод isnumeric ()
Сейчас пишу программу для перевода из одной системы счисления в другую с данных, которые вводит сам пользователь. Хотелось бы сделать проверку того, что вводит пользователь. И я не могу понять какие значения в себя включает метод работы со строками isnumeric (), как я понял от 0-10 и также поддерживает римские, а есть еще какие-нибудь входящие в него знаки или что-то в таком роде?
P.S. Если сказать более объектно интересует именно знак + и -.
P.S.S. И еще хотелось бы узнать в чем разница между этими 3мя методами isdigit(), isnumeric(), isdecimal() ?

import re
re.match('[0-9\+\-]', s)

str.isdecimal()
Return True if all characters in the string are decimal characters and there is at least one character, False otherwise. Decimal characters are those that can be used to form numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. Formally a decimal character is a character in the Unicode General Category “Nd”.

str.isdigit()
Return True if all characters in the string are digits and there is at least one character, False otherwise. Digits include decimal characters and digits that need special handling, such as the compatibility superscript digits. This covers digits which cannot be used to form numbers in base 10, like the Kharosthi numbers. Formally, a digit is a character that has the property value Numeric_Type=Digit or Numeric_Type=Decimal.

str.isnumeric()
Return True if all characters in the string are numeric characters, and there is at least one character, False otherwise. Numeric characters include digit characters, and all characters that have the Unicode numeric value property, e.g. U+2155, VULGAR FRACTION ONE FIFTH. Formally, numeric characters are those with the property value Numeric_Type=Digit, Numeric_Type=Decimal or Numeric_Type=Numeric.

source


Найти все нечетные числа в списке и прибавить к ним число [закрыт]

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

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

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

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

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

Проходимся по каждому елементу с помощью
map().
Проверяем четное ли число или нет с помощью битовой операции and
x & 1 и прибавляем результат этой же операции (от либо 0, либо 1).

def find(arr):
    print([*map(lambda x: x + (x & 1), arr)])


Словарь в html таблицу python
Мне надо из словарь значений получить html таблицу. Взгляд упал на
jinja. Начал писать код, в итоге не знаю как получить то что я хочу.
У меня есть

array1 = [
    [datetime.datetime(2020, 10, 27, 12, 37), 'Саша'],
    [datetime.datetime(2020, 10, 28, 16, 2), 'Олег'],
    [datetime.datetime(2020, 10, 27, 16, 40), 'Саша'],
    [datetime.datetime(2020, 10, 27, 16, 41), 'Саша'],
    [datetime.datetime(2020, 10, 27, 12, 54), 'Костя'],
    [datetime.datetime(2020, 10, 27, 12, 27), 'Костя'],
    [datetime.datetime(2020, 10, 27, 12, 27), 'Олег'],
    [datetime.datetime(2020, 10, 27, 12, 54), 'Саша']
]

result = {}
for date, name in array1:
    if date.date() not in result:
        result[date.date()] = {}
    result[date.date()][name] = result[date.date()].get(name, 0) + 1

template = jinja2.Template("""\
<table class="table-2">
  <tr>
    <td>Отчет</td>
  {% for x in rows_1 %}
    <td>{{ x }}</td>
  {% endfor %}
  </tr>

  {% for y in name %}
    <tr>
        <td>{{ y }}</td>

    </tr>
  {% endfor %}

</table>
""")

v_k = [v for k, v in result.items()]
all_name = []
for el in v_k:
    for k, v in el.items():
        all_name.append(k)

unique_name = list(set(all_name))

html_tab = template.render(
rows_1=[k for k, v in result.items()],
name = unique_name,
)

print(html_tab)

В итоге я получаю такую html таблицу.

<table class="table-2">
  <tr>
    <td>Отчет</td>

    <td>2020-10-27</td>

    <td>2020-10-28</td>

  </tr>

  <tr>
    <td>Костя</td>
  </tr>

  <tr>
    <td>Саша</td>
  </tr>

  <tr>
    <td>Олег</td>
  </tr>

</table>

Не понимаю как теперь по каждой дате вставить в эту таблицу количество вхождений 1 человека.
чтобы получить

Отчет   2020-10-27  2020-10-28
Костя   2
Саша    4
Олег    1           1

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

Мой вариант такой:

import datetime
from collections import Counter
import jinja2

array1 = [
    [datetime.datetime(2020, 10, 27, 12, 37), 'Саша'],
    [datetime.datetime(2020, 10, 28, 16, 2), 'Олег'],
    [datetime.datetime(2020, 10, 27, 16, 40), 'Саша'],
    [datetime.datetime(2020, 10, 27, 16, 41), 'Саша'],
    [datetime.datetime(2020, 10, 27, 12, 54), 'Костя'],
    [datetime.datetime(2020, 10, 27, 12, 27), 'Костя'],
    [datetime.datetime(2020, 10, 27, 12, 27), 'Олег'],
    [datetime.datetime(2020, 10, 27, 12, 54), 'Саша']
]

names = [i[1] for i in array1 ]
all_data = {}
dates = list(set([ i[0].strftime("%d.%m.%Y") for i in array1 ]))

for i in array1:
    date:datetime.datetime = i[0]
    name:str = i[1]
    if name not in all_data.keys():
        all_data[name] = []
    all_data[name].append(date.date().strftime("%d.%m.%Y"))

res = {nm: Counter(dts) for nm, dts in all_data.items()}

template = jinja2.Template("""

            Имена
            {% for dt in dates %}
                {{dt}}
            {% endfor %}

        {% for name in res.keys() %}

                {{name}}
                {% for dt in dates %}
                    {{res[name][dt]}}
                {% endfor %}

        {% endfor %}

""")

print(template.render(
    res = res,
    dates = dates,
))


Посчитать самый популярный ответ для каждого вопроса
Всем привет. Подскажите, пожалуйста.
Есть список, состоящий из списков, в кот 2 элемента, вопрос и ответ.
Мне нужно посчитать самый популярный ответ для каждого вопроса.
Попробовал воспользоваться Counter из collections, пока не получилось.
Пример списка.
<code>
lst = [['Курьер поздоровался с вами?', 'да'], ['Как и во что был одет курьер?', 'нет'], ['Курьер соблюдает субординацию?', 'да'], ['Курьер проявляет индивидуальный подход?', 'нет']]

cnt = collections.Counter()
for i in lst:
    for j in i:
        cnt[j] += 1
</code>
Так он выведет просто самое популярное, независимо от элементов.
метод most.common() дает список из пар самых часто встречающихся элементов.
А я не понимаю как эту логику объединить или получить структуру какую-то.
Мне нужно, чтобы код выдавал самый популярный ответ(в виде ответа, а не числа) для кажд вопроса

from collections import defaultdict, Counter

lst = [
    ['Курьер поздоровался с вами?', 'да'],
    ['Курьер поздоровался с вами?', 'нет'],
    ['Курьер поздоровался с вами?', 'не помню'],
    ['Как и во что был одет курьер?', 'нет'],
    ['Курьер соблюдает субординацию?', 'да'],
    ['Курьер поздоровался с вами?', 'нет'],
    ['Курьер поздоровался с вами?', 'не помню'],
    ['Курьер проявляет индивидуальный подход?', 'нет'],
    ['Курьер поздоровался с вами?', 'не помню'],
]

question_by_answers = defaultdict(list)
for q, a in lst:
    question_by_answers[q].append(a)

for question, answers in question_by_answers.items():
    top_answer = Counter(answers).most_common(1)[0][0]
    print(f'{question!r} - {top_answer!r}')

Результат:

'Курьер поздоровался с вами?' - 'не помню'
'Как и во что был одет курьер?' - 'нет'
'Курьер соблюдает субординацию?' - 'да'
'Курьер проявляет индивидуальный подход?' - 'нет'


Как вернуть список при использовании lambda
Получается, если применяю list() при печати. Как сделать так, чтобы функция возвращала list?
<code>
STR = 'Happy Birthday to you'
song = lambda x: map(lambda i: STR if i[0] != 2 else STR[:-6] + 'dear ' + i[1], enumerate([x, x, x, x]))
print(list(song('Iris')))
</code>

как вариант:

STR = 'Happy Birthday to you'
song = lambda x: [*map(lambda i: STR if i[0] != 2 else STR[:-6] + 'dear ' + i[1], enumerate([x, x, x, x]))]

print(song('Iris'))

вот так чуть покороче будет:

STR = 'Happy Birthday to you'
song = lambda x: [*map(lambda i: STR if i != 2 else f"{STR[:-7]} dear {x}", range(4))]

print(song('Iris'))

немного более хитрый вариант, чтобы ничего в строке не отрезать:

STR = 'Happy Birthday %'
song = lambda x: [*map(lambda i: STR.replace("%", "to you" if i != 2 else f"dear {x}"), range(4))]

print(song('Iris'))

и покороче вариант

STR = 'Happy Birthday '
song = lambda x: [*map(lambda i: STR + ("to you" if i != 2 else f"dear {x}"), range(4))]

print(song('Iris'))

Еще немного компактности - экономим на
if:

song = lambda x: [*map(lambda i: STR if i else f"{STR[:-7]} dear {x}", range(-2, 2))]

song = lambda x: [*map(lambda i: STR.replace("%", "to you" if i else f"dear {x}"), range(-2, 2))]

song = lambda x: [*map(lambda i: STR + ("to you" if i else f"dear {x}"), range(-2, 2))]

Чуть другой подход без
if вообще и пока самый компактный вариант :) :

STR = 'Happy Birthday '
song = lambda x: [STR + [f'dear {x}', 'to you'][bool(i)] for i in range(-2,2)]

И новый рекордсмен по длине кода:

STR = 'Happy Birthday '
song = lambda x: [STR + [f'dear {x}', 'to you'][int(i)] for i in "1101"]


Подсчет кол-ва ненулевых значение в столбцах DataFrame с сохранением результатов в ту же таблицу посредством однострочного выражения
Как можно посредством однострочного выражения подсчитать кол-во не нулевых значений в столбцах и результы записать в те же столбцы вместо ненулевых значений?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set()

d = {
     7:{"c1":5, "c2":8, "c3":10},
     5:{"c1":1, "c2":7, "c3":10},
     4:{"c1":1, "c2":6, "c3":8},
     3:{"c1":4, "c2":7, "c3":9},
     2:{"c1":3, "c2":5, "c3":6},
     1:{"c1":2, "c2":7, "c3":9}
    }

df = pd.DataFrame(d).T
r = (df
     .stack()
     .reset_index(name="col")
     .assign(x=1)
     .pivot_table(index="level_0", columns="col", values="x")
     .reindex(range(1,11), axis=1)
     .fillna(0)
     .astype("int8")
     .rename_axis(None)
     .rename_axis(None, axis=1))

print(r)

Текущий результат

   1  2  3  4  5  6  7  8  9  10
1  0  1  0  0  0  0  1  0  1   0
2  0  0  1  0  1  1  0  0  0   0
3  0  0  0  1  0  0  1  0  1   0
4  1  0  0  0  0  1  0  1  0   0
5  1  0  0  0  0  0  1  0  0   1
7  0  0  0  0  1  0  0  1  0   1

Ожидаемый результат

   1  2  3  4  5  6  7  8  9  10
1  0  1  0  0  0  0  3  0  2   0
2  0  0  1  0  2  2  0  0  0   0
3  0  0  0  1  0  0  3  0  2   0
4  2  0  0  0  0  2  0  2  0   0
5  2  0  0  0  0  0  3  0  0   2
7  0  0  0  0  2  0  0  2  0   2

import pandas as pd

d = {
     7:{"c1":5, "c2":8, "c3":10},
     5:{"c1":1, "c2":7, "c3":10},
     4:{"c1":1, "c2":6, "c3":8},
     3:{"c1":4, "c2":7, "c3":9},
     2:{"c1":3, "c2":5, "c3":6},
     1:{"c1":2, "c2":7, "c3":9}
    }
df = pd.DataFrame(d).T
print(df)
r = (df
     .stack()
     .reset_index(name="col")
     .assign(x=1)
     .pivot_table(index="level_0", columns="col", values="x")
     .reindex(range(1,11), axis=1)
     .fillna(0)
     .astype("int8")
     .rename_axis(None)
     .rename_axis(None, axis=1)).apply(lambda x: x*sum(x))
print(r)

   1  2  3  4  5  6  7  8  9  10
1  0  1  0  0  0  0  3  0  2   0
2  0  0  1  0  2  2  0  0  0   0
3  0  0  0  1  0  0  3  0  2   0
4  2  0  0  0  0  2  0  2  0   0
5  2  0  0  0  0  0  3  0  0   2
7  0  0  0  0  2  0  0  2  0   2

Если нужен более универсальный вариант (когда ненулевые значения в датафрейме не обязательно равны 1, то последний
apply лучше записать так:

.apply(lambda x: x.astype("bool")*sum(x.astype("bool")))


Декоратор для рекурсии
У меня есть декоратор, подсчитывающий количество вызовов рекурсивной функции (
ncalls) и глубину рекурсии (
rdepth)
Для не рекурсивной функции значения будут (1,1)
На примерах, которые придумала я, и на примерах из контекста работает правильно, но при сдаче в контексте не проходит один тест, но я никак не могу придумать ситуацию, которая бы сломала мой код.

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

def counter(func):
    counter.flag = True
    counter.w = 0
    counter.d = 0

    @functools.wraps(func)
    def count_f(*args, **kwargs):
        if counter.flag:
            count_f.ncalls = 0
            count_f.rdepth = 0
            counter.flag = False
            counter.w = 0
            counter.d = 0
        count_f.ncalls += 1
        counter.d += 1
        counter.w = 0
        if count_f.rdepth < counter.d:
            count_f.rdepth = counter.d
        result = func(*args, **kwargs)
        counter.d -= 1
        counter.w += 1
        if counter.w == count_f.rdepth:
            counter.flag = True
        return result

    return count_f

Подскажите, пожалуйста, что здесь можно сделать?
Пример

@counter
def fib(n):
    if n == 0 or n == 1:
        return n
    else:
        return fib(n - 2) + fib(n - 1)

fib(3)
print(fib.ncalls, fib.rdepth)
# 5 3

Пример из контеста:

@counter
def func2(n, steps):
    if steps == 0:
        return

    func2(n + 1, steps - 1)
    func2(n - 1, steps - 1)

if __name__ == "__main__":
    func2(0, 5)
    print(func2.ncalls, func2.rdepth)

    func2(0, 3)
    print(func2.ncalls, func2.rdepth)
# 63 6
# 15 4

Не привязывайтесь к декоратору, храните все в декорированной функции.

def counter(f):
    def reset():
        wrapped.rdepth = 0
        wrapped.ncalls = 0

    def wrapped(*args, **kwargs):
        if wrapped.depth == 0:
            reset()

        wrapped.depth += 1
        wrapped.ncalls += 1
        wrapped.rdepth = max(wrapped.rdepth, wrapped.depth)

        try:
            return f(*args, **kwargs)
        finally:
            wrapped.depth -= 1

    wrapped.depth = 0
    reset()
    return wrapped

или так, если не хотите хранить лишние поля на виду

def counter(f):
    def reset():
        wrapped.rdepth = 0
        wrapped.ncalls = 0

    def wrapped(*args, **kwargs):
        nonlocal depth

        if depth == 0:
            reset()

        depth += 1
        wrapped.ncalls += 1
        wrapped.rdepth = max(wrapped.rdepth, depth)

        try:
            return f(*args, **kwargs)
        finally:
            depth -= 1

    depth = 0
    reset()
    return wrapped

try /
finally обновит глубину, даже если при вызове декорируемой функции произойдет ошибка.

@counter
def f():
    raise ValueError

try:
    f()
except ValueError:
    print(f.rdepth, f.ncalls) # 1 1

try:
    f()
except ValueError:
    print(f.rdepth, f.ncalls) # 1 1 с try / finally и 2 2 без


Selenium и Python3 не нажимают на ссылку
Необходимо нажать с использованием selenium и Python3 на ссылку:

<span data-t="link:default" tabindex="0" class="Link Link_pseudo Link_view_default">У&nbsp;меня нет телефона</span>

Селектор, скопированный со страницы, следующий: #root > div > div.grid > div > main > div > div > div > form > div.human-confirmation-wrapper.can-switch > div > div:nth-child(2) > div > div.toggle-link.link_has-no-phone > span

Пробовал все варианты find_element...по отдельности и в цикле:

for element in driver.find_element_by_css_selector('span'):
    element.click()

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

---> 17 for element in driver.find_element_by_css_selector('span'):
     18     element.click()
     19 #driver.execute_script("arguments[0].click();",cl)
TypeError: 'WebElement' object is not iterable

Именно эту ссылку не ищет, находит другие span на странице. Возможно эта ссылка с оберткой и нужно применить js. Пробовал driver.execute_script("arguments[0].click();",cl), но на странице стоит защита от применения js наверно, так как выбрасывает на новую страницу с требованием включить js в хроме, хотя js включен.

Удалось решить проблему:
<code>
from selenium.webdriver.common.action_chains import ActionChains

cl = driver.find_element_by_xpath("//div[@class='toggle-link link_has-no-phone']")
el = cl.find_element_by_xpath("//*[@id=\"root\"]/div/div[2]/div/main/div/div/div/form/div[3]/div/div[2]/div/div[1]/span")
ActionChains(driver).move_to_element(el).click(el).perform()
</code>


Узнать текст InlineKeyboardButton в telebot
Есть клавиатура(
db.view_all_coins(call.message.chat.id) возвращает список).

markup = types.InlineKeyboardMarkup(row_width=3)
for coin in db.view_all_coins(call.message.chat.id):
    markup.add(types.InlineKeyboardButton(text=coin, callback_data='view_info'))

Текст для каждой кнопки генерируется из этого списка.
Как мне потом получить этот текст по нажатии на эту клавиатуру?
Пробовал
call.message.json['reply_markup']['inline_keyboard'][0][0]['text'] но мне нужно возвращать именно текст из нажатой кнопки, а не просто 1 элемент списка.

Чтобы обрабатывать текст, ты можешь воспользоваться ReplyKeyboardMarkup.
Если хочешь использовать именно InlineKeyboardButton, то можешь захватывать возвращаемую callback_data и находить по ней текст либо из объекта клавиатуры, который имеет структуру, либо задать именнованный кортёж или словарь и записать туда callback_data и buttonText, после чего обращаться по callback_data и получать текст
<code>
{"inline_keyboard":
[
    [{"text": "string", "callback_data": "string"}],
    [{"text": "string", "callback_data": "string"}],
]}
</code>


Как сказать боту что бы он отправил сообщение в другой канал discord.py
учусь писать дискорд ботов на питоне. Не могу разобраться как сказать боту, что бы он отсылал сообщение (что-то типа: человек захотел вывести n-нную сумму) в канал #какой-то, при написании человеком команды !withdraw в другом канале
<code>
@client.command(aliases = ['withdraw'])
async def __withdraw(ctx, amount: int = None):
    balance = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
    if amount is None:
        await ctx.send(f"**{ctx.author.mention}**, укажите сумму, которую желаете вывести")
    elif balance < amount:
            await ctx.send(embed = discord.Embed(description = f"**{ctx.author.mention}** На вашем счету нету минимальной суммы вывода!"))
    else:
        if balance < 10000:
            await ctx.send(embed = discord.Embed(description = f"**{ctx.author.mention}** Минимальная сумма вывода - 10.000 :dollar:"))

        else:
            await ctx.send(embed = discord.Embed(description = f"**{ctx.author.mention}** Заявка принята. Ожидайте! :slight_smile:", color = 0x52f04f))
            cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(amount, ctx.author.id))
            connection.commit()
</code>

Если вам нужен конкретный канал, то получаем его id и объявляем через бота:

my_channel = client.get_channel(id)
Для отправки сообщения строка
await my_channel.send('Текст сообщения')
Примерно такой код:

my_channel = None

@client.event
async def on_ready():
     global my_channel
     my_channel = client.get_channel(id)

@client.command()
async def your_command(ctx):
     global my_channel
     await my_channel.send('Текст сообщения')

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

for channel in client.get_guild(ID сервера).channels:
    print(channel.id)


Мне нужно срезать цифры после запятой Python
Мне надо именно не сократить число, а срезать его
Подскажите пожалуйста как это сделать
Например было 0.12, а должно стать 0

вариантов несколько:

a = int(x)

если число больше нуля, то

import math
a = math.floor(x)

если число меньше нуля, то

import math
a = math.ceil(x)

ну и ряд извратов:

a = float(f"{x:.0f}")

или

import math
a = math.modf(x)[1]

P.S.
если же вам именно получить строку (например, чтобы вывести на экран), тогда

text = f"{x:.0f}"

или

text = format(x, ".0f")


Сравнение дат в datetime
Скажите, почему при сравнении дат в библиотеке datetime выводит неверный результат?
<code>
import datetime as dt

d = dt.datetime.now().strftime('%d.%m.%Y')

ddate = dt.date(3000, 7, 5)
dd = ddate.strftime('%d.%m.%Y')

print(d)
print(dd)
print(dd > d)
</code>
Разве 3000 год не больше, чем 2020 год?

Вы переводите формат
datetime.datetime и
datetime.date в строки (именно это делает метод
strftime), и потом их сравниваете. Разумеется, строка
09.11.2020 больше строки
05.07.3000.
Сравнивать нужно непосредственно данные в форматах datetime:

dt.datetime.now() < dt.datetime(3000, 7, 5)
# True

UPDATE
Если вам изначально дана строка, то переведите ее в формат dateimte и сравнивайте:

import datetime as dt
my_string = "07.02.3000"
my_dt = dt.datetime.strptime(my_string, '%d.%m.%Y')

print(my_dt > dt.datetime.now())
# True


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

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

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

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

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

Всем доброго времени суток, мне нужно писать бота для ВК, опыт работы с ботами для телеги имею (писал их с помощью pytelegrambotapi), но вот какую либу юзать для вк понятия не имею, так как в сети нет точного едино-принятого решения (может я не нашел). Бот мой должен иметь нехилый функционал, в основном постоянная работа с БД. Хочу, чтобы все работало максимально быстро, но возникает вопрос - это дело самого кода и навыков программиста, либо же и либа важную роль играет?
Буду рад за любую помощь!

Действительно полезных и нужных библиотек для работы с vk api нет. Преимущество от их использования сомнительно, они особо ничего не дают. Если у вас большое приложение, то имеет смысл написать свои методы и функции, это не сильно увеличит размер вашего кода, но вам будет удобнее работать. А вообще библиотека это лишь ваш выбор. Кого-то раздражают готовые функции, которые невозможно переписать под себя, кому-то нравится, кто-то хочет использовать это, кто-другое тут ваш выбор. Никакого преимущества в скорости и ещё в чём-либо это не даст.
Для высокой скорости пишите асинхронный код, всё остальное никак не ускорит ваш сервер. Общепринятая бд для python - PostgreSQL. Библиотека для асинхронной работы с этой БД в python - asyncpg. Если вам не нужна высокая производительно и количество запросов вряд ли перевалит за 100 в секунду, то можно писать обычный синхронный код и использовать psycopg2 для работы с БД.


Не могу понять в чем проблема перезапуска бота через systemd?
В интернете определенно много статей о решении этой проблемы, но ни одна из них мне не помогает. Столкнулся с такой  проблемой, что получаю ошибку
«status = 203 / EXEC» при запуске бота на сервере. Для примера мне пока что нужно запустить от
root.
Файл
bot.service:

[Unit]
Description=Mybot - Telegram bot
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/home/myname/bot/
ExecStart=/usr/lib/python3 /home/myname/bot/bot_example.py
RestartSec=60
Restart=always

[Install]
WantedBy=multi-user.target

Не уверен, что правильно указал путь к
ExecStart к интерпретатору, но, как указывают в примерах - стоит писать:
/usr/bin/python3, но у меня не существует такого пути, по крайней мере
../python3 зато существует путь
/usr/lib/python3, который я указал уже в исполняемом скрипте (
chmod +x script.py) первой линией Шебанга -
#!/usr/lib/python3, но я все равно получаю эту ошибку.
Укажите, пожалуйста, почему я не могу запустить свой скрипт на сервере?
OS - Linux Ubuntu 18.04.4

Отдельное спасибо @andreymal, который помог разобраться в этом.
Крайне НЕ рекомендуется запускать бота от имени
root.
Чтобы быстро решить вашу проблему:
1.Отредактировать ранее созданный файл
bot.service (или любое другое имя), в директории
/etc/systemd/system, в котором нужно обязательно правильно указать пользователя, от которого будет запускаться служба.

[Unit]
Description=Mybot - Telegram bot
After=syslog.target
After=network.target

[Service]
Type=simple
User=yourname #ваш пользователь
WorkingDirectory=/home/yourname/bot/
ExecStart=/usr/bin/python3 /home/yourname/bot/bot_example.py #1 путь к интерпретатору, 2 путь к вашему скрипту
RestartSec=60
Restart=always

[Install]
WantedBy=multi-user.target

Указать линию Шебанга в своем скрипте 1 строкой. Это путь к вашему интерпретатору.

#!/usr/bin/python3
Чтобы в этом удостовериться - введите в консоль следующую команду:

which python3

При каждом внесении в
bot.service не забывать вводить команду -
systemctl daemon-reload.

Если что-то идет не так, или бот не запустился, смотрим логи (где будет указана ваша ошибка) такой командой:

journalctl -u bot --since=-1h.
В этом журнале я смог обнаружить свою ошибку - что неправильно указан путь к интерпретатору и что не установлен пакет
telebot - пакет не был установлен из-за того, что служба
systemdи
pip3 запускались не от одного и того же пользователя.


Не работает модуль PyAutoGUI
Когда устанавливаю (
pip install puautogui) то пишет что успешно установлена. А когда запускаю код выходит такая ошибка:

  File "D:\python\pyautogui2.py", line 1, in <module>
    import pyautogui
  File "D:\python\pyautogui.py", line 4, in <module>
    print(pyautogui.position())
AttributeError: partially initialized module 'pyautogui'
 has no attribute 'position' (most likely due to a circu
lar import)

Говорит что
pyautogui не имеет атрибут
position, но он имеет. И вообще говорит что ошибка в 1 строке тоже.
Вот код:

import pyautogui

print(pyautogui.position())

pyautogui.move(50, 50, duration=0.5)
pyautogui.moveTo(150, 200, 0.5)

Говорит что pyautogui не имеет атрибут position, но он имеет.

Да, действительно такой атрибут имеется.
Попробуйте сделать вот что:
Первым делом, проверьте, не называется ли ваш python-файл "pyautogui.py". Проверьте, нет ли рядом с вашим python-файлом другого файла "pyautogui.py".
Скорее всего, проблема именно в этом. Python воспринимает pyautogui как ваш файл, а не библиотеку
Если это исключено, то:

Обновить pip:
pip install --upgrade pip
После этого обновить pyautogui:
pip install --upgrade pyautogui

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


Не получается разбить стихотворение по 1 слову в каждой строке в текстовом документе. Python

inputfile = "word.txt"
outputfile = "word1.txt"
outputfile = "word2.txt"
file = open(inputfile, mode='r', encoding='UTF-8')
file2 = open(outputfile, mode='w', encoding='UTF-8')
file3 = open(outputfile, mode='w', encoding='UTF-8')
for line in file:
         if ' ' in line:
             file3.write(line.split('\n'))

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

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

Надо:

Буря
Мглою
Небо
Кроет

и тд..

например так:

сначала из файла считать все строки в список

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

из списка слов сформировать новый список с уже преобразованными словами

записать список в файл

код:

words = []

# считать данные
fin = open(inputfile, 'r', encoding='utf-8')

lines = fin.readlines()

for line in lines:
    words += line.split()

fin.close()

# сформировать новый массив с первыми буквами
output = list(map(lambda word: word[:1].upper() + word[1:], words))

# записать output в файл

или так:

output = [word[:1].upper() + word[1:] for word in words]


Нужно найти среднее арифметическое чисел
Напишите программу, которая считывает с клавиатуры два числа
a и
b, считает и выводит на консоль среднее арифметическое всех чисел из отрезка
[a; b], которые кратны числу
3.
В приведенном ниже примере среднее арифметическое считается для чисел на отрезке
[-5; 12]. Всего чисел, делящихся на
3, на этом отрезке 6 чисел:
-3, 0, 3, 6, 9, 12−3,0,3,6,9,12. Их среднее арифметическое равно
4.5.
На вход программе подаются интервалы, внутри которых всегда есть хотя бы одно число, которое делится на
3.

first_value = int (input("Введите первое число: "))
second_value = int (input("Введите второе число:"))
for i in range (first_value + 1,  second_value):
    if i % 3 == 0:
        print (i)

Я написал это, нужно еще чтобы программа находила сред. арифм.

начнем с того, что написали вы её неправильно

у вас в данном случае диапазон
(a, b), т.е.
a,
b не входят в диапазон, а по условиям задачи должны входить
for i in range (first_value + 1,  second_value):

т.е.

for i in range(first_value,  second_value + 1):

Теперь по среднему арифметическому - задачу можно решить несколькими способами:
способ 1:
ввести переменную
sum = 0 и переменную
count = 0, для чисел кратных 3 увеличивать сумму и счётчик и по завершению цикла подсчитать среднее арифметическое
способ 2:
сформировать новый список из элементов, кратных 3, вычислить сумму элементов нового списка (функция
sum) и подсчитать среднее арифметическое, используя размер нового списка
способ 3:
чисто математический - вычислить наименьшее число больше
a, кратное 3 и наибольшее число, меньшее
b, кратное 3, а дальше воспользуйтесь формулой для среднего арифметического

Я написал это, нужно еще чтобы программа находила сред. арифм.

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


Почему не возвращаются значения text() и styleSheet()?
Пишу код на Python и SQLite и тут возникает проблема: значения text() и styleSheet() возвращаются как "None", хотя и текст и таблица стилей есть. Из-за чего возникает проблема и как ее можно решить? Заранее спасибо.
<code>

    def load(self):
        cur = self.con.cursor()
        sql = '''INSERT INTO Задачи(Название, label, Текст, Статус, Дата, LCD, Время, kol, kol_1, kol_2)
        VALUES(?, ?, ?,
        ?, ?, ?, ?, ?, ?, ?) '''
        rezult = cur.execute(sql, ("self.widget_{}".format(self.i),
                                   'self.label_{}'.format(self.i),
                                   str(exec('self.label_{}.text()'.format(self.i))),
                                   str(exec("self.widget_{}.styleSheet()".format(self.i))),
                                   str(self.date),
                                   'self.lcdNumber_{}'.format(self.i),
                                   "{}:{}".format(self.t.hour(), self.t.minute()),
                                   str(self.kol),
                                   str(self.kol_1),
                                   str(self.kol_2)))
        self.con.commit()

</code>

Вместо
exec используйте
eval:

eval('self.label_{}.text()'.format(self.i))

и

eval("self.widget_{}.styleSheet()".format(self.i))

Но лучше не использовать
eval/
exec, а честно поместить виджеты в списки (или другие коллекции) и работать с ними через цикл


Как реализовать повторение строки в kotlin? [закрыт]

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

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

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

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

У меня есть строка и я хочу, чтоб строка повторилась n раз. Как это реализовать в kotlin?
В питоне можно умножить строку на число. Какие аналоги есть в котлине?

Воспользуйтесь методом repeat:

println("abc".repeat(3))

Результат:

abcabcabc


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

import numpy as np

def hilbert(n):
    if n < 1:
        raise ValueError("Matrix size must be one or greater")
    elif n == 1:
        return np.array([[1]])

    v = np.arange(1, n + 1) + np.arange(0, n)[:, np.newaxis]
    return 1. / v

n = 3
alpha = 1e-10
H = hilbert(n)
E = np.identity(n)

print(H)
print(alpha*E)

Получается:

[[1.         0.5        0.33333333]
 [0.5        0.33333333 0.25      ]
 [0.33333333 0.25       0.2       ]]
[[1.e-10 0.e+00 0.e+00]
 [0.e+00 1.e-10 0.e+00]
 [0.e+00 0.e+00 1.e-10]]

Хотелось бы (вместо точек нужное кол-во знаков, в данном примере должно быть 10 знаков после запятой):

[[1.0...0         0.50...0         0.33333333...3]
 [0.50...0         0.33333333...3  0.250...0     ]
 [0.33333333...3   0.250...0       0.20...0     ]]
[[1.e-10 0.e+00 0.e+00]
 [0.e+00 1.e-10 0.e+00]
 [0.e+00 0.e+00 1.e-10]]


Задача с функциями, Python
Проходим функции по основам, ментор объяснил на простейших примерах. Не знаю как сделать так чтобы пользователь ввел число 5 раз, буду благодарна если кто-нибудь объяснит или направит.
Сама задача:
Создайте функцию, которая принимает 2 целых числа. По системе координат x и y, где x - 1 вводимое число, y - второе вводимое число. Ваша задача написать функцию, где пользователь вводит два числа 5 раз и надо определить, где находится ваша текущая позиция. Старт дан с координатами (0, 0).
Формат ввода 2 числа. Формат вывода список из 2 аргументов.
Пример ввода:
1
1
2
3
4
3
5
10
7
15
Результат:
[19, 32]

Не знаю как сделать так чтобы пользователь ввел число 5 раз, буду благодарна если кто-нибудь объяснит или направит.
Ну например так. В цикле
while вводить значения, и выполнять ввод пока число итераций меньше 5.

n = 0
x = 0
y = 0
while n <5:
    x_y = input().split()
    x += int(x_y[0])
    y += int(x_y[1])
    n+=1

print([x,y])


Конкатенация чисел с плавающей запятой в строку с фиксированной длиной после запятой
Есть список чисел с плавающей запятой, как соединить их в строку по пробелам, но с фиксированной длиной после запятой?
Пробую так:

x = (1.42, 1.5, 241.2, 52.2, 15.1, 52.1)

print(' '.join(map(str, x)))

Но здесь длина не фиксирована. Как её зафиксировать?
Например, для длины
3 хочу получить строку:

1.420 1.500 241.200 52.200 15.100 52.100

x = (1.422, 1.5, 241.2, 52.2, 15.1, 52.1)

print(' '.join(map(lambda x: format(x, '.3f'), x))) # 1.422 1.500 и тд

Либо так, чтобы не указывать вручную:

prec = 4 # кол-во цифр после запятой
print(' '.join(map(lambda x: format(x, f'.{prec}f'), x)))


Кортеж кортежей в один кортеж или список
Как сделать из кортежа кортежей один кортеж или список?
Пробую так, но выдаёт ошибку:
<code>
x = (1.42, (1.5, 241.2), (52.2, 15.1), 52.1)

import itertools

print(tuple(itertools.chain.from_iterable(x)))
</code>

'float' object is not iterable

Потому что есть не только кортежи, но и простые числа с плавающей точкой. Как сделать в таком случае?

способ 1:

import numpy

x = (1.42, (1.5, 241.2), (52.2, 15.1), 52.1)

res = numpy.hstack(x).tolist()

print(res)

способ 2:

x = (1.42, (1.5, 241.2), (52.2, 15.1), 52.1)

res = []

for item in x:
    res += item if isinstance(item, tuple) else [item]

print(res)


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

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

Формат лога: <имя функции> <параметры вызова> <тип ошибки> <текст ошибки>
Лог файл открывать каждый раз при ошибке в режиме 'a'

<code>
def log_errors(func):
    pass

- Проверить работу на следующих функциях
@log_errors
def perky(param):
    return param / 0

@log_errors
def check_line(line):
    name, email, age = line.split(' ')
    if not name.isalpha():
        raise ValueError("it's not a name")
    if '@' not in email or '.' not in email:
        raise ValueError("it's not a email")
    if not 10 <= int(age) <= 99:
        raise ValueError('Age not in 10..99 range')

lines = [
    'Имя почта@mail.ru 20',
     'имя почта@mail.ru 18'
     .....
     .....
     .....
]
for line in lines:
    try:
        check_line(line)
    except Exception as exc:
        print(f'Invalid format: {exc}')
perky(param=42)
</code>

def log_errors(func):
    def surrogate(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except ZeroDivisionError as z_error:
            file_content1 = ('<{}>  <{}>  <{}>  <{}>\n'.format(func.__name__, kwargs, Exception, z_error))
            with open('function_errors.log', 'a', encoding='utf8') as file:
                file.write(file_content1)
            raise ZeroDivisionError

        except ValueError as v_error:
            file_content2 = ('<{}>  <{}>  <{}>  <{}>\n'.format(func.__name__, args, Exception, v_error))
            with open('function_errors.log', 'a', encoding='utf8') as file:
                file.write(file_content2)
            raise ValueError

    return surrogate

# Проверить работу на следующих функциях
@log_errors
def perky(param):
    return param / 0

@log_errors
def check_line(line):
    name, email, age = line.split(' ')
    if not name.isalpha():
        raise ValueError("it's not a name")
    if '@' not in email or '.' not in email:
        raise ValueError("it's not a email")
    if not 10 <= int(age) <= 99:
        raise ValueError('Age not in 10..99 range')

lines = [
    'Имя почта@mail.ru 20',
     'имя почта@mail.ru 18'
     .....
     .....
     .....
]
for line in lines:
    try:
        check_line(line)
    except Exception as exc:
        print(f'Invalid format: {exc}')
perky(param=42)


Почему при вставке изображения кисть рисуется в другом месте?
При вставке изображения кисть рисуется в другом месте от курсора. Как сделать так, чтобы этого не происходило?
<code>
import sys

from PyQt5.QtGui import QPainter, QPen, QImage
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QAction
from PyQt5.QtCore import Qt

class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(Qt.white)

        self.brushColor = Qt.black
        self.brushSize = 8

        self.setGeometry(200, 300, 650, 500)

        mainMenu = self.menuBar()
        colormenu = mainMenu.addMenu("Сюда")

        saveAction = QAction("Вставить фото", self)
        colormenu.addAction(saveAction)
        saveAction.triggered.connect(self.save)

    def save(self):
        filename = QFileDialog.getOpenFileName(self, "", "",
                                               "PNG(*.png);;JPEG(*.jpg *.jpeg);;All Files(*.*)")[0]
        if filename == '':
            return
        self.image.load(filename)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.rect(), self.image, self.image.rect())
        painter.setPen(QPen(self.brushColor, self.brushSize, Qt.SolidLine))

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.coords = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() and Qt.LeftButton:
            painter = QPainter(self.image)
            painter.setPen(QPen(self.brushColor, self.brushSize, Qt.SolidLine))
            painter.drawLine(self.coords, event.pos())
            self.coords = event.pos()
            self.update()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec())
</code>

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

import sys

from PyQt5.QtGui import QPainter, QPen, QImage
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QAction
from PyQt5.QtCore import Qt

class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.image_foreground = QImage(self.size(), QImage.Format_ARGB32)
        self.image_foreground.fill(Qt.transparent)

        self.image_background = QImage(self.size(), QImage.Format_RGB32)
        self.image_background.fill(Qt.white)

        self.brushColor = Qt.black
        self.brushSize = 8

        self.setGeometry(200, 300, 650, 500)

        mainMenu = self.menuBar()
        colormenu = mainMenu.addMenu("Сюда")

        saveAction = QAction("Вставить фото", self)
        colormenu.addAction(saveAction)
        saveAction.triggered.connect(self.save)

    def save(self):
        filename = QFileDialog.getOpenFileName(self, "", "", "PNG(*.png);;JPEG(*.jpg *.jpeg);;All Files(*.*)")[0]
        if not filename:
            return
        self.image_background.load(filename)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.rect(), self.image_background, self.image_background.rect())
        painter.drawImage(self.rect(), self.image_foreground, self.image_foreground.rect())
        painter.setPen(QPen(self.brushColor, self.brushSize, Qt.SolidLine))

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.coords = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            painter = QPainter(self.image_foreground)
            painter.setPen(QPen(self.brushColor, self.brushSize, Qt.SolidLine))
            painter.drawLine(self.coords, event.pos())
            self.coords = event.pos()
            self.update()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec())

PS.
Если не нужно, чтобы картинка растягивалась под размер окна, то в
drawImage первым параметром передавать размер картинки, а не окна:

painter.drawImage(self.image_foreground.rect(), self.image_foreground)


Ошибка при установке virtualenv на сервере Ubuntu
При вводе команды $ pip install virtualenv
на сервере Operating System: Ubuntu 16.04.7 LTS возникает ошибка установки микроокружения.

Collecting virtualenv
  Using cached virtualenv-20.1.0-py2.py3-none-any.whl (4.9 MB)
Collecting six<2,>=1.9.0
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting importlib-resources>=1.0; python_version < "3.7"
  Using cached importlib_resources-3.3.0-py2.py3-none-any.whl (26 kB)
Collecting filelock<4,>=3.0.0
  Using cached filelock-3.0.12.tar.gz (8.5 kB)
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-C0vJNU/filelock/setup.py'"'"'; __file__='"'"'/tmp/pip-install-C0vJNU/filelock/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-vEf58R
         cwd: /tmp/pip-install-C0vJNU/filelock/
    Complete output (3 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    ImportError: No module named setuptools
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

При выводе версии python выходит следующая информация
$ python -V

 Python 2.7.12
$ python3 -V

 Python 3.5.2
Подскажите что сделать для того чтобы убрать эту ошибку

sudo apt-get install -y python-setuptools


При вызове функции go(), выдаёт ошибку: TypeError: go() missing 1 required positional argument: 'root' [закрыт]

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

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

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

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

<code>
From tkinter import *
from tkinter import ttk
from tkinter.ttk import Combobox
import sqlite3

class GOODZONE():

     def __init__(self,root):
     #denote root
     self.root = root

     #create window
     root.title("file")
     root.geometry('100x100')

     self.btn = Button(root,text = "submit", command = self.go)
     self.btn.grid(column = 0, row = 0)

     #cool func
     def go(self, root):
     print("Hello World")

root = Tk()
good = GOODZONE(root)
root.mainloop()
</code>

Параметр
root лишний и его можно его просто убрать

def go(self):
    print("Hello World")

Если в функции
go вам понадобится
root то надо будет писать
self.root


Как записать изображение в текст?
Возможно глупый вопрос, но как записать изображение в текстовый файл? Для некоторого проекта понадобилось хранить изображение в тексте, но чтобы питон мог с ним работать и переводить обратно в .png. Возможно ли это?

Закодируйте изображение в
base64 и сохраните в файл.
Для этого используйте модуль
base64:

base64.b64encode -- для кодирования байтов в
base64 (результат в байтах)

base64.b64decode -- для раскодирования байтов из
base64 (результат в байтах)

Пример:

import base64

file_name_img = 'img.jpg'
file_name_txt = 'img.txt'

with open(file_name_img, 'rb') as f:
    data = f.read()

with open(file_name_txt, 'wb') as f:
    f.write(base64.b64encode(data))

# Раскодирование из base64
with open(file_name_txt, 'rb') as f:
    img_data = base64.b64decode(f.read())
    print(img_data[:100])  # Первые 100 байт


Вывод колонок из csv файла
Есть csv файл - dataset.csv, он содержит две колонки с числа.
Подскажите как вывести обе колонки в виде вещественных чисел и чтобы первая колонка присваивалась переменной x, вторая колонка переменной y.
У меня получается выводить только одну колонку.
Файл: dataset.csv
Код:
<code>
import csv

Sample=[]
with open("dataset.csv", encoding="ANSI") as V:
    SR=csv.reader(V, delimiter=';')
    for col in SR:
        Sample.append(float(col[0]))
print(sorted(Sample))
</code>


Мне необходимо получить названия столбцов в базе данных SQLite
Мне нужно представить данные из базы данных в форме {'col_name1': 'значение', 'col_name2': 'значение'} с помощью библиотеки sqlite3 на Python. Как получить значение из таблицы я знаю, однако как получить название столбца я не понимаю. Используя
PRAGMA table_info('TEST'), где 'TEST' - название моей таблицы, выводятся все данные, однако мне нужно получить лишь названия столбцов. Прошу у Вас помощи!

Из представленного Вами запроса
PRAGMA table_info("TEST") можно просто убрать лишнюю информацию. Например

cur.execute('PRAGMA table_info("TEST")')
column_names = [i[1] for i in cur.fetchall()]
print(column_names)

Информация содержится в виде кортёжа (
номер столбца (с нуля),
название столбца,
тип данных,
может ли быть null,
значение по умолчанию,
является ли primary key)


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

def enumerate(data, counter):
    n = counter
    for element in data:
        yield n, element
        n += 1
data1 = [6, 8, 3, 1, 0, 2, 3]
for num, val in enumerate(data1, 1):
    print(num, val)

Почему, если вместо
yield написать
return, выдаст ошибку:

"TypeError: cannot unpack non-iterable int object"

Ведь если различие только в том, что
return выдает все сразу, а
yield работает как генератор, то и ошибки не должно быть.

после
return функция сразу завершается
в вашем примере если место
yield поставить
return то функция вернёт
(6, 1) и цикл
for попытается сделать так:

num, val = 6

Что конечно же привидет к ошибке:

TypeError: cannot unpack non-iterable int object

Если хотите чтобы ваш код работал с
return то он должен выглядеть так:

def enumerate(data, counter):
    n = counter
    list_ = []
    for element in data:
        list_.append((n, element))
        n += 1
    return list_


Проблема в понимании рекурсии
Попрошу немного подсказок или алгоритм в идеале шаги как решить эту задачу, спасибо
Даны целые числа
n,
k. (
n>=k>=0).
Вычислить

Основа рекурсии - пошаговое уменьшение размера задачи.
Рекурсивный алгоритм состоит из двух частей:

Тривиальный случай
Рекурсивный спуск

Рассмотрим тривиальные случаи нашей задачи:

k == 0, тогда выражение обращается в
n!/n! = 1
Основной выход из рекурсии, в принципе его одного достаточно

k == n, выражение =>
n!/k!, при равных k и n,
result = 1
необязательно, но хорошо оптимизирует этот случай

n < 2,
n! = 1, k по условию не больше n,
result = 1
лишний, k обращается в 0, раньше чем n

k == 1,
result = n / 1 = n
лишний пункт, естественным образом разрешится в k == 0 на следующей итерации

Далее рассмотрим спуск:
На каждом шаге будем уменьшать задачу по обоим аргументам.
Для этого результат меньшей задачи
F(n-1, k-1) мы будем:

умножать на n, согласно факториалу в числителе.
делить на k, согласно факториалу в знаменателе.

def foo(n, k):
    if k == 0 or k == n:
        return 1

    return n * foo(n - 1, k - 1) // k

# Нарисуем треугольник Паскаля :)
N = 30
pad = 8
for k in range(N):
    for n in range(k, N):
        print(f'{foo(n, k):{pad}}', end=' ')
    print()


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

#author = ctx.message.author
id = {author.mention}

В интернете тоже ничего не нашёл

import discord
from discord.ext import commands
bot = commands.Bot(command_prefix='.')
bot.remove_command( 'help' )
token = 'Токен бота'

@bot.command()
async def приват(ctx):
    guild = ctx.guild
    overwrites = {
    guild.default_role: discord.PermissionOverwrite(read_messages=False),
    guild.ЗДЕСЬ ДОЛЖЕН БЫТЬ ОТПРАВИТЕЛЬ: discord.PermissionOverwrite(read_messages=True)
}
    await guild.create_text_channel("Приватный-канал", overwrites=overwrites)

@bot.event
async def on_ready():
    print("Bot started...")
bot.run(token)

Спасибо

Все контекстные объекты можно достать из
ctx, который контекстом и является.
Ключом в словаре "перезаписей" может быть как пользователь, так и роль, и они не обязательно должны быть аттрибутами сервера (
Guild).

@bot.command()
async def приват(ctx):
    overwrites = {
        ctx.guild.default_role: discord.PermissionOverwrite(read_messages=False),
        ctx.author: discord.PermissionOverwrite(read_messages=True)
    }
    await ctx.guild.create_text_channel("Приватный-канал", overwrites=overwrites)


Почему не работает алгоритм Брона-Кербоша?
Разрабатываю алгоритм нахождения внутреннего устойчевого подмножества. Использую алгоритм Брона-Кербоша из Википедии
Почему-то для графа, который представлен в коде
[[1,2],[1,4],[1,3],[2,4],[3,4],[4,5]], алгоритм возвращает такие множества
[5], [1,4], [1,4], что естественно не правильно. Но вроде все по инструкции делаю

def check(item):
  temp = []
  for i in range(6):
    if item in graf[i]:
      if graf[i][0] not in temp:
        temp.append(graf[i][0])
      if graf[i][1] not in temp:
        temp.append(graf[i][1])

  return temp

def alg(s,add,exists):
    for item in add:
        s.append(item) # добавляем вершину item из множества add
        new_add = [v for v in add if v not in check(item)] # формируем новое множество вершин удаляя из него всех соседей вершины item (функция check вовзращает всех соседей вершины item)
        new_exists = [v for v in exists if v not in check(item)] # тут тоже самое как для new_add
        if len(new_add) == 0 and len(new_exists) == 0:
            print(s)
            return s
        else:
            alg(s,new_add,new_exists)
        s.remove(item)
        add.remove(item)
        exists.append(item)

if __name__ == '__main__':
    graf = [[1,2],[1,4],[1,3],[2,4],[3,4],[4,5]]

    count_vershin = 5
    count_reber = 6

    # создание вложенного списка - двумерный массив
    matrix = [[0] * count_vershin for i in range(count_vershin)]

    # создание матрицы смежности
    for i in range(count_reber):
        k = graf[i-1][0]
        j = graf[i-1][1]
        # print(k,j)
        matrix[k-1][j-1] = 1
        matrix[j-1][k-1] = 1

    # вывод матрицы смежности
    for i in range(count_vershin):
        for j in range(count_vershin):
            print(matrix[i][j], end=' ')
        print()

    s = [] # множество, содержащее на каждом шаге рекурсии независимое множество для данного шага. Строится рекурсивно.
    add = [] # множество вершин, которые могут увеличить
    exists = [] #  множество вершин, которые уже использовались для расширения  на предыдущих шагах алгоритма.

    for item in graf:
        if item[0] not in add:
            add.append(item[0])

        if item[1] not in add:
            add.append(item[1])

    print(add) # по сути тут у нас список исходных вершин
    print(alg(s, add, exists))

Я исправил функцию
check. Она возвращала не понятно что. Теперь она возвращает смежные вершины с вершиной
item.
Но результат самого алгоритма все равно неверный

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

def check(item):
  temp = []
  for i in range(len(graf)):
    if item in graf[i]:
      if graf[i][0] not in temp:
        temp.append(graf[i][0])
      if graf[i][1] not in temp:
        temp.append(graf[i][1])

  return temp

def alg(s,add,exists):
    for item in add:
        s.append(item)
        new_add = [v for v in add if v not in check(item)]
        new_exists = [v for v in exists if v not in check(item)]

        if len(new_add) == 0 and len(new_exists) == 0:
            print(s)
        else:
            alg(s,new_add,new_exists)

        s.remove(item)
        add.remove(item)
        exists.append(item)

if __name__ == '__main__':
    # graf = [[1,2],[1,4],[1,3],[2,4],[3,4],[4,5]]
    # graf = [[1,2],[1,5],[2,5],[2,3],[3,4],[4,5],[4,6]]
    graf = [[1,2],[1,4],[2,3],[3,5],[5,6],[5,4]]

    s = []
    add = []
    exists = []

    for item in graf:
        if item[0] not in add:
            add.append(item[0])

        if item[1] not in add:
            add.append(item[1])

    alg(s, add, exists)


Работа с генераторами python
Мне нужно написать некий аналог chain, который может вытаскивать из генераторов поочередно по одному значению (генераторы лежат в списке  arg_list) и выводить в один список
Я попробовала так:
<code>
list(map(lambda *i: i, *arg_list))
</code>
Однако это работает только для генераторов одинакового размера, а мне нужно если один заканчивается, продолжать выводить значения из других
Что здесь можно придумать?

from itertools import zip_longest

arg_list = [[1,2], [3,4,5], [6]]

print([
    x
    for tup in zip_longest(*arg_list)
    for x in tup
    if x is not None
])

[1, 3, 6, 2, 4, 5]

Или вот более универсальный вариант, если среди элементов может встречаться
None

arg_list = [[1,2], [3,4,5], [6, None]]
fill = object()

print([
    x
    for tup in zip_longest(*arg_list, fillvalue=fill)
    for x in tup
    if x is not fill
])

[1, 3, 6, 2, 4, None, 5]


Python. Метод не видит переменных в классе
Всем привет. Я только начал изучать классы и решил переделать под них текстовый квест. Только вот теперь функция kamera больше не хочет видеть переменные и выдает ошибку. Подскажите, насколько сильно я дурак)
<code>
class Game():
    def __init__(self, pc, s, u):
        self.pc = pc
        self.s = s
        self.u = u
        pc = 0
        s = 0
        u = 0
    def kamera(self): #ПЕРВАЯ ГЛАВА
        print ("\nОсвободившись " +
        "от оков, вы осмотрелись: в небольшой камере находились" + "\n|стол|, |дверь камеры|, |угол камеры|")
        choise = input(">")
        if choise == "стол":
            print("")
            if s == 0:
                pc += 1
                print("Подойдя к практически сгнившему деревянному столу" +
            "вы обнаружили, что на нем лежит пыльная кожанная записная книжка.")
                s += 1
                kamera(self)
            else:
                print ("На столе больше нет ничего интересного")
                kamera(self)
        elif choise == "угол камеры":
            if u == 0:
                pc += 1
                print ("вы подошли к углу камеры и нашли там ключ")
                u += 1
                kamera(self)
            else:
                print ("вы подошли к углу камеры, но не нашли там ничего интересного")
                kamera(self)
        elif choise == "дверь камеры":
            if pc == 2:
                print ("вы вставили ключ в замок и вышли из камеры")
                print("выбравшись из камеры, вы очутились в коридоре.")
                koridor()
            else:
                print("вы подошли к двери камеры, но поняли, что что-то упустили")
                kamera(self)
Game.kamera()
</code>

место
s,
ps,
u пишите
self.s,
self.pc,
self.u.
Место
Game.camera пишите
Game(0, 0, 0).camera()
Место
camera(self),
koridor() пишите
self.camera(),
self.koridor()


Python решение задачи
Дано дерево задач с одним корнем. Узлами дерева являются группы задач, листьми - сами задачи. Внутри
группы могут содержаться либо другие группы, либо задачи, но не то и другое одновременно. Каждый элемент
дерева имеет уникальный идентификатор id (неотрицательное целое число) и название name (строка).
Дополнительно задачи имеют приоритет priority (неотрицательное целое число), а группы задач приоритета
не имеют. Необходимо реализовать функцию findTaskHavingMaxPriorityInGroup, в которую передается дерево
задач и идентификатор группы. Она должна найти задачу с наибольшим приоритетом среди всех из этой
группы (включая те из них, которые находятся во вложенных группах). Если не удалось найти группу с
указанным идентификатором, функция должна генерировать исключение. Если в группе нет ни одной задачи,
должно возвращаться неопределенное значение (undefined в JavaScript, None в Python, nullptr в C++ и null в
Kotlin).
Пример:
Допустим, имеется дерево задач

id = 0, name = "Все задачи"

id = 1, name = "Разработка"

id = 2, name = "Планирование разработок", priority = 1
id = 3, name = "Подготовка релиза", priority = 4

id = 4, name = "Аналитика"

Отступами обозначается вложенность групп задач. Это дерево содержит три группы ("Все задачи", "Разработка"
и "Аналитика"), а также две задачи ("Планирование разработок" и "Подготовка релиза"). Для этого дерева
вызов функции findTaskHavingMaxPriorityInGroup c номером группы

0 - должен вернуть задачу "Подготовка релиза" (имеет максимальный приоритет 4)
3 - сгенерировать исключение (не является группой)
5 - сгенерировать исключение (группа не существует)

4 - вернуть неопределенное значение (в группе нет ни одной задачи)

Дерево
<code>
tasks = {
    'id': 0,
    'name': 'Все задачи',
    'children': [
        {
            'id': 1,
            'name': 'Разработка',
            'children': [
                {'id': 2, 'name': 'Планирование разработок', 'priority': 1},
                {'id': 3, 'name': 'Подготовка релиза', 'priority': 4},
                {'id': 4, 'name': 'Оптимизация', 'priority': 2},
            ],
        },
        {
            'id': 5,
            'name': 'Тестирование',
            'children': [
                {
                    'id': 6,
                    'name': 'Ручное тестирование',
                    'children': [
                        {'id': 7, 'name': 'Составление тест-планов', 'priority': 3},
                        {'id': 8, 'name': 'Выполнение тестов', 'priority': 6},
                    ],
                },
                {
                    'id': 9,
                    'name': 'Автоматическое тестирование',
                    'children': [
                        {'id': 10, 'name': 'Составление тест-планов', 'priority': 3},
                        {'id': 11, 'name': 'Написание тестов', 'priority': 3},
                    ],
                },
            ],
        },
        {'id': 12, 'name': 'Аналитика', 'children': []},
    ],
}
</code>
Подскажите решение, а лучше в какую сторону копать и где искать информацию по этому поводу. Я понимаю что нужно обойти дерево и найти соответствующий элемент. Но вот как сделать этот обход не знаю

Мне стало интересно и я написал не большой код с использованием рекурсии.
Можешь его переделать. обрабатывать результаты можешь отдельно от функции.
100% гарантию того что код выполняет то что нужно дать не могу.
Просто показываю пример того как это можно реализовать.
Я сам не особо хороший кодер, так что не суди строго.
<code>
tree_list = []
name_list = []
def getting_data_from_tree(arr, id):
    if isinstance(arr, dict):
        if 'children' in list(arr.items())[2]:
            if id == arr.get('id'):
                name_list.append(arr.get('name'))
                return name_list
            tree_list.append([arr.get('id'), arr.get('name'), None])
            getting_data_from_tree(arr.get('children'), id)
    elif isinstance(arr, list):
        for i in arr:
            if isinstance(i, dict):
                if 'children' in list(i.items())[2]:
                    if id == i.get('id'):
                        try:
                            newlist = sorted(i.get('children'), key=lambda k: k['priority'])
                            name_list.append(newlist[-1].get('name'))
                        except:
                            if len(i.get('children')) == 0:
                                name_list.append('в группе нет ни одной задачи')
                                return name_list
                            else:
                                name_list.append(i.get('name'))
                                return name_list
                getting_data_from_tree(i.get('children'), id)
    return name_list

if __name__ == '__main__':
    print(getting_data_from_tree(tasks, 6))
</code>


Не понимаю почему не работает логическое ИЛИ
В
firstfold остается один елемент -
6 и в
12 строке
elif len(secondfold) >= 1 or len(firstfold) >= 1: surject = False должно выполнится условие
surject = False, но оно не выполняется, почему?

firstfold = [1, 2, 3, 4, 5, 6]
secondfold = [1, 2, 3, 4, 5]
for i in firstfold.copy():#удаляет общее елементы
    if i in secondfold:
        try:
            firstfold.remove(i)
            secondfold.remove(i)
        except ValueError: continue

print(firstfold, secondfold)
if len(secondfold) == 0 or len(firstfold) == 0: surject = True
elif len(secondfold) >= 1 or len(firstfold) >= 1: surject = False
print(surject)

if len(secondfold) == 0 or len(firstfold) == 0:
    surject = True
elif len(secondfold) >= 1 or len(firstfold) >= 1:
    surject = False

давайте разбираться
во первых что надо знать - как только выполняется условие, остальные условия не рассматриваются
итак в начале
len(firstfold) = 1,
len(secondfold) = 0
начинает проверяться в
if

if len(secondfold) == 0 or len(firstfold) == 0:

первая часть условия

len(secondfold) == 0

оно истинное (
True)
по идее на этом проверка заканчивается, потому что значение второй части условия

len(firstfold) == 0

не важна
и выполняется код:

surject = True

поскольку первое условие выполнено (истинно), то второе условие (в
ifelse) уже не рассматривается и код под условием не выполняется
P.S.
кстати ваш код можно было бы реализовать так:

firstfold = [1, 2, 3, 4, 5, 6]
secondfold = [1, 2, 3, 4, 5, 7]

arr1 = [i for i in firstfold if i not in secondfold]
arr2 = [i for i in secondfold if i not in firstfold]

firstfold, secondfold = arr1, arr2

дешево и сердито :)
или даже так:

firstfold = [1, 2, 3, 4, 5, 6]
secondfold = [1, 2, 3, 4, 5, 7]

firstfold, secondfold = set(firstfold).difference(secondfold), set(secondfold).difference(firstfold)


Почему при вставке в таблицу передаваемые значения воспринимаются как названия столбцов? [дубликат]

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

Как правильно подставлять значения из переменных / списков / словарей в SQL запрос?

                                (1 ответ)

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

Хочу полученные от пользователя данные сохранять в БД. Но код ниже не работает.
Не находит колонки, что верно, такой колонки нету, потому что
Uus - это введенные данные пользователем, а не название колонки в таблице в БД.
Ошибка:

sqlite3.OperationalError: no such column: Uus

Код сохранения переданных данных пользователем (name_, surname_, age_) в таблицу
Profiles(id, First_name, Last_name, Age):

def save_to_sqllite(name_,surname_,age_):
conn = sqlite3.connect(os.path.join(PATH,'Chinook_Sqlite.sqlite')) #подключаемся к БД
cursor = conn.cursor() #создаем курсов для обработки запросов к БД
cursor.execute("SELECT COUNT(ID) FROM Profiles")
next_ID = cursor.fetchall()[0][0] + 1
cursor.execute(f"INSERT INTO Profiles (id, First_name, Last_name, Age) VALUES ({next_ID},{name_},{surname_},{age_});")
conn.commit() #сохраняем изменения в БД
conn.close() #закрываем подключение к БД
return print(f'saved')

Подскажите, почему в строке:

cursor.execute(f"INSERT INTO Profiles (id, First_name, Last_name, Age) VALUES ({next_ID},{name_},{surname_},{age_});")

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

В SQLite приходит следующая команда (я подставил случайные значения переменных):

INSERT INTO Profiles (id, First_name, Last_name, Age)
VALUES (123, Vasiliy, Pupkin, 25)

Строковые литералы в SQL должны быть обрамлены одиночными кавычками - иначе они воспринимаются как имена столбцов/таблиц или других БД объектов (например индексов или
constraints):

INSERT INTO Profiles (id, First_name, Last_name, Age)
VALUES (123, 'Vasiliy', 'Pupkin', 25)

Но вместо подстановки значений при помощи форматирования, гораздо лучше использовать параметры - драйвер БД сам займется квотированием строковых литералов:

sql = """INSERT INTO Profiles (id, First_name, Last_name, Age) VALUES(?,?,?,?)"""
params = (next_ID, name_, surname_, age_)
cursor.execute(sql, params)

где
id, First_name, Last_name, Age - реальные наименования столбцов таблицы БД, а
next_ID, name_, surname_, age_ - имена существующих переменных в Python скрипте.
Всегда старайтесь использовать параметры в SQL запросе вместо подстановки значений переменных в тело SQL запроса - это поможет избежать SQL Injections.
Кроме того для большинства БД это также будет работать быстрее, т.к. при повторном использовании этого запроса - его уже не надо будет парсить, проверять на синтаксис, проверять права доступа и т.д.


различия copy и deepcopy
В чем заключаются различия между
copy и
deepcopy в питоне. Везде говорят, что из-за того, что
copy, в отличие от
deepcopy, копирует ссылки на объекты, а не их копии, какое то изменение во втором объекте влечет за собой изменения в первом. То есть, например, если у нас есть список
a = [1, 2, 3], и мы сделаем его
copy, получится такой же список
b = [1, 2, 3]. Но если изменить что-то в
b, то оно изменится и в
а, т. е., если, к примеру,
b[0] = 2. То получится
b = [2, 2, 3], и
a = [2, 2, 3], т. к.
b содержит именно ссылки на объекты. А
deepcopy как-бы развязывает эти 2 списка. То есть, если
b[0] = 2, то
b = [2, 2, 3], но
a = [1, 2, 3], т. к.
b содержит именно копии, а не ссылки. Так вот я сейчас проверил эти гипотезы, и вышло, что и в случае
copy, и в случае
deepcopy изменения в
b, не влекут за собой изменения в
a, хотя везде говорят, что и
a должен измениться, ведь он содержит ссылки объекта
a. Так в чем-же все таки различия между
copy и
deepcopy в питоне. Заранее спасибо!


Не работает метод распознавания лиц OpenCV Python
Проблема такова. Делал по примеру распознавание лиц. И тут - бац! и выбивает ошибку. А конкретно в методе:

faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor= 1.1,
    minNeighbors= 5,
    minSize=(10, 10)
)

Ошибка:

Traceback (most recent call last):
File "C:\Users\monte\Desktop\Проекты\Python\MACHINE\try2.py", line 6, in
faces = face_cascade.detectMultiScale(
cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-h4wtvo23\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

Полный код:

import cv2
image_path = "me.png"
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor= 1.1,
    minNeighbors= 5,
    minSize=(10, 10)
)
faces_detected = "Лиц обнаружено: " + format(len(faces))
print(faces_detected)
# Рисуем квадраты вокруг лиц
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)

Я так подозреваю, судя по ошибке, что проблема где-то внутри библиотеки.
Как ее решить? Делал все по примеру, который везде. Что не так?

Нужно добавить
haarcascade_frontalface_default.xml в папку со скриптом.
Для проверки наличия файлов

import os

print(os.path.isfile('haarcascade_frontalface_default.xml'))


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

def updatenumber(n):
     n *= 2
b = 8
updatenumber(b)
print(b)

выводится
8, а не
16. Ведь я задал функцию, которая должна умножить заданное число на
2. Разве не должно быть так:

создана функция, умножающая число на
2.
задается число
b = 8.
Впихиваем в аргумент функции число
b.
Создана новая переменная, значение которой равно
16.

В чем ошибка?

переменная
n существует только внутри функции
updatenumber после завершения функции
n исчезает
можете добавить
return чтобы
b был равен
16

def updatenumber(n):
     n *= 2
     return n
b = 8
b = updatenumber(b)
print(b)


pyqt5 выполнить перед закрытием
Мне нужно вызвать метод
save_changes() перед закрытием программы.
Спасибо.

void QWidget::closeEvent(QCloseEvent *event)
Этот обработчик событий вызывается с заданным событием, когда Qt получает запрос на закрытие окна для виджета верхнего уровня от оконной системы.
По умолчанию событие принимается, а виджет закрывается. Вы можете повторно реализовать эту функцию, чтобы изменить способ ответа виджета на запросы закрытия окна. Например, вы можете предотвратить закрытие окна, вызвав ignore () для всех событий.
Приложения главного окна обычно используют повторные реализации этой функции, чтобы проверить, сохранена ли работа пользователя, и запросить разрешение перед закрытием. Например, в примере приложения используется вспомогательная функция, чтобы определить, закрывать ли окно или нет:

<code>
def save_changes():
    ...

...

    def closeEvent(self, event):
        save_changes()

...
</code>


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

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW and event.obj['message']['text'].lower().startswith('лео'):
        print(str(event.obj['message']['from_id']) + '[' + str(event.obj['message']['peer_id']) + ']:' +
              event.obj['message']['text'])

        def message_send(message='', id=event.obj['message']['peer_id'], att='', vk=vk, event=event):
            vk.messages.send(peer_id=id, message=message, random_id=random.randint(0, 2 ** 64), attachment=att)
        def msg():
            msg = event.obj['message']['text'].split()
            del msg[0]
            text = ' '.join(msg)
            return text
        def name(vk=vk):
            get_info = vk.users.get(user_ids=event.obj['message']['from_id'])
            name = '[id' + str(event.obj['message']['from_id']) + '|' + get_info[0]['first_name'] + ' ' + get_info[0][
                'last_name'] + ']'
            return name

        if event.obj['message']['text'].lower().startswith("лео команды"): #Основные команды, список
            message_send(f"Тут типы команд\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"")

        elif event.obj['message']['text'].lower().startswith == "лео команды основные":
            message_send(f"Тут основные команды\n"
                         f"\n"
                         f"")

        else:
            vk.messages.send(peer_id=event.obj['message']['peer_id'], message='Команда не найдена!',
                                random_id=random.randint(0, 2 ** 64)) #Если команды нету то будет выдовать ошибку

попробуйте
if и
elif поменять местами:

        if event.obj['message']['text'].lower().startswith("лео команды основные"): #Основные команды, список
            message_send(f"Тут типы команд\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"\n"
                         f"")

        elif event.obj['message']['text'].lower().startswith("лео команды"):
            message_send(f"Тут основные команды\n"
                         f"\n"
                         f"")


Отправка телеграм боту несколько картинок
Хочу настроить прием картинок телеграм ботом. Бот принимает одну картинку, но если картинок больше он видит только первую картинку.

# -*- coding: utf-8 -*-
import config
import telebot
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton,  InputMediaPhoto

bot = telebot.TeleBot(config.token)
main_menu_keyboard = telebot.types.ReplyKeyboardMarkup(True,True)
main_menu_keyboard.add('test1', 'test2')

welcome_message='''Hello,
dude
'''

dict = {}

class nameDict:
    def __init__(self, name):
        self.name = name
        self.media = None

def process_name_step(message):
    try:
        chat_id = message.chat.id
        name = message.text
        upload = nameDict(name)
        dict[chat_id] = upload
        message = bot.send_message(chat_id, 'Upload your photos: ')
        bot.register_next_step_handler(message, process_media_step)
    except Exception as e:
        bot.reply_to(message, 'Error...')

def process_media_step(message):
    try:
        chat_id = message.chat.id
        media = message.photo[-1].file_id
        upload = dict[chat_id]
        upload.media = media
        bot.send_photo(chat_id, str(upload.media))
    except Exception as e:
        bot.reply_to(message, 'Error...')
        bot.register_next_step_handler(message, process_media_step)

bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers()

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, welcome_message, reply_markup=main_menu_keyboard)

@bot.message_handler(content_types=['text'])
def send_text(message):
    if message.text.lower() == 'test1':
        message = bot.send_message(message.chat.id, 'Enter youe name: ')
        bot.register_next_step_handler(message, process_name_step)

    elif message.text.lower() == 'test2':
        bot.send_message(message.chat.id, 'Empty')

bot.polling()

Каким способом получить все
ID картинок которые передали боту?
Благодарю

Можно написать хендлер специально для картинок и обрабатывать их дальше
<code>
@bot.message_handler(content_types=['photo'])
def get_images(message):
    if message.media_group_id:
        photo_id = message.photo[0].file_id

</code>