Как интегрировать модуль multiprocessing в этот код
При увеличении количества точек, или максимальной длинны соединения программа начинает подтормаживать, подскажите как корректно интегрировать в данный код модуль multyprocessing, я хочу использовать параллельные процессы в функции def lines() для оптимизации работы двухуровневого цикла for. А конкретно вычислять верхний уровень for с помощью мульти-процессов.
Заранее спасибо!
<code>
import tkinter as tk                    #Нужен для визуального оформления программы
import ctypes                           #Нужен для получения размеров монитора
import random
import math

inf             = ctypes.windll.user32          #Получаем все сведенья о системе
width           = inf.GetSystemMetrics(0)       #Получаем ширину экрана
height          = inf.GetSystemMetrics(1)       #Получаем высоту экрана
particles       = []                            #Массив для хранения всех чатиц, т.е. объектов класса Particle
mode            = 'b'                           #Это тип цветовой палитры, понажимайте на клавиатуре 'r', 'g', 'b', 'w', 'o', 'd', последнее рекомендуется нажать пару раз
colors          = ''                            #Этот параметр нужен для работы цветовой палитры  mode == 'd'
cnf             = {                             #Список параметров
    'bgcolor'         : 'black',                #Цвет фона
    'particlecolor'   : 'blue',                 #Цвет частицы
    'particleradiuse' : 3,                      #Радиус частицы
    'particalcount'   : 40,                     #Количество частиц
    'particalspeed'   : 5,                      #Максимальная скорость частицы
    'linelenght'      : 200,                    #Радиус, в пределах которого строится соединени данной точки с другой
    'brightness'      : 90                      #Это параметр отвечает за яркость линий соединений, чем выше, тем бледнее линии соединений
}

root = tk.Tk()
root.attributes('-fullscreen', True)            #При запуске програмы сразу             открываем окно на полный экран

c1 = tk.Canvas(root, width = 100, height = 1000, bg = cnf['bgcolor'],highlightthickness = 0, cursor= 'None')    #Создаем Canvas, размеры потом поменяются
c1.focus_set()                          #Делаем наше окно активным
c1.pack(fill = 'both', expand = 1)      #Растягиваем Canvas на весь экран

class Particle():
    '''Класс создания частиц, и редактирования их свойств'''
    def __init__(self):
        '''Задаем произвольную позицию'''
        self.x = random.randint(cnf['particleradiuse'], width -cnf['particleradiuse'])
        self.y = random.randint(cnf['particleradiuse'], height -cnf['particleradiuse'])
        '''Задаем произвольную скорость в +- диапозоне от максимальной'''
        self.xspeed = random.random()*cnf['particalspeed']*2-cnf['particalspeed']
        self.yspeed = random.random()*cnf['particalspeed']*2-cnf['particalspeed']

    def position(self):
        '''Изменяем позицию частицы, учитывая собственную скорость и столкновение с краем экрана'''
        if self.x+self.xspeed+cnf['particleradiuse'] >= width or self.x+self.xspeed-cnf['particleradiuse'] <= 0:
            self.xspeed *= -1       #При привышении границ экрана менять горизонтальную скорость на противоположную
        if self.y+self.yspeed+cnf['particleradiuse'] >= height or self.y+self.yspeed-cnf['particleradiuse'] <= 0:
            self.yspeed *= -1       #При привышении границ экрана менять вертикальную скорость на противоположную
        '''Меняем координаты прибавив скорость'''
        self.x += self.xspeed
        self.y += self.yspeed

    def coords(self, axis):
        '''Метод возвращает координаты точки'''
        if axis == 'x':
            return self.x
        else:
            return self.y

    def redraw(self):
        '''Функция отрисовки частицы'''
        try:
            self.circle = c1.create_oval(self.x-cnf['particleradiuse'], self.y-cnf['particleradiuse'], self.x+cnf['particleradiuse'], self.y+cnf['particleradiuse'], fill = cnf['particlecolor'], width = 1)
        except:
            pass

def redrawParticles():
    '''Основная функция'''
    while True:
        try:
            '''Перехватываем нажатия с клавиатуры для изменения цветовой палитры или завершения программы'''
            c1.bind("<r>", lambda event: changemode('r'))       #красная тема
            c1.bind("<g>", lambda event: changemode('g'))       #зеленая
            c1.bind("<b>", lambda event: changemode('b'))       #синяя
            c1.bind("<w>", lambda event: changemode('w'))       #серая
            c1.bind("<d>", lambda event: changemode('d'))       #все линии одного случайного цета
            c1.bind("<o>", lambda event: changemode('o'))       #каждая линия случайного цвета
            c1.bind("<Escape>", lambda event: root.destroy())   #Завершение программы
        except:
            '''Если root.destroy то программа завершается'''
            break
        try:
            '''Отчицаем Canvas для следующего кадра'''
            c1.delete('all')
        except:
            pass
        for i in range(cnf['particalcount']):
            '''Для каждой частицы рассчитываем новое положение и отрисовываем частицу там'''
            particles[i].position()
            particles[i].redraw()
        lines()         #Рисуем соединения между частиц
        root.update()   #Обновляем root для отображения результата

def changemode(new_mode):
    global mode, colors
    '''Меняем цвет для режима d'''
    colors = '#'+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))
    mode   = new_mode   #Изменяем текущую цветовую тему на новую

def color(length):
    '''Яркость линии зависит от расстояния, чем ближе тем ярче'''
    if mode == 'r' or mode == 'g' or mode == 'b' or mode == 'w':
        '''Если значение цвета зависит только от одного показателя RGB или является монохромным то выполняем рассчет яреости линии соединениея'''
        color = cnf['linelenght']-int(round(length/cnf['linelenght'], 2)*100)-cnf['brightness']
        if color >= 100:
            color = 99
        if color <= 0:
            color = 0
        if color < 10:
            color = '0'+str(color)
        else:
            color = str(color)

        if mode == 'r':
            cnf.update({'particlecolor': 'red'})
            return '#'+color+'0000'
        elif mode == 'g':
            cnf.update({'particlecolor': 'green'})
            return '#'+'00'+color+'00'
        elif mode == 'b':
            cnf.update({'particlecolor': 'blue'})
            return '#'+'0000'+color
        elif mode == 'w':
            cnf.update({'particlecolor': 'grey'})
            return '#'+color+color+color

    elif mode == 'o':
        #Случайный цвет каждой линии по отдельности
        cnf.update({'particlecolor': 'purple'})
        return '#'+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))+str(random.randint(0, 9))
    else:
        #Случайный цвет для всех линий одинаковый
        cnf.update({'particlecolor': 'purple'})
        return colors

def lines():
    '''Проверяем дистанцию до каждой из точек'''
    for i in particles:
        for j in particles:
            x1 = i.coords('x')      #Координаты первой точки
            y1 = i.coords('y')
            x2 = j.coords('x')      #Координаты второй точки
            y2 = j.coords('y')
            length = math.sqrt(math.pow((x2-x1),2) + math.pow((y2-y1), 2))
            #Нахом расстояние между двумя точками
            if length < cnf['linelenght']:
            #Если расстояние меньше максимальной длянны линиии, то строим соединение
                try:
                    '''Рисуем линию соединения, а цвет возьмем из функции для этого'''
                    c1.create_line(x1, y1, x2, y2, width = 2, fill = color(length))
                except:
                    pass

def start():
    for i in range(cnf['particalcount']):
        '''Наполняем массив частицами с произвольными скорость, положением, направлением'''
        particles.append(Particle())
    redrawParticles()       #Вызываем функцию отрисовки

start()         #Вызываем функцию для запуска программы

root.mainloop()
</code>

ну как бы да. наверное будет примерно так. за правильность кода не ручаюсь, на питоне пишут редко. может где ошибся. но распараллелить можно как-то в этом ключе.
<code>
def calc_distance(index, particles, minlen):
    x1 = particles[index].coords('x')  # Координаты первой точки
    y1 = particles[index].coords('y')
    result = []
    for j in range(index+1, len(particles)):
        x2 = particles[j].coords('x')  # Координаты второй точки
        y2 = particles[j].coords('y')
        length = math.sqrt(math.pow((x2 - x1), 2) + math.pow((y2 - y1), 2))  # Нахом расстояние между двумя точками
        result.append((x1, y1, x2, y2, length, length > minlen))
    return result

def calc_distances(particles):
    import multiprocessing
    results = None
    with multiprocessing.Pool(processes=5) as pool:
        results = pool.starmap(lambda particle: calc_distance(particle, particles, cnf['linelenght']), range(len(particles) - 1))
    return results

def lines():
    for level1 in calc_distances(particles):
        for level2 in level1:
            x1, y1, x2, y2, length, ok = level2
            if ok:
                try:
                    '''Рисуем линию соединения, а цвет возьмем из функции для этого'''
                    c1.create_line(x1, y1, x2, y2, width = 2, fill = color(length))
                except:
                    pass
</code>


Как без цикла поменять значения в заданном массиве на другие?
Имеется массив:

a = np.array([1, 6, 4, 5, 15])

Я генерирую рандомно несколько индексов и сохраняю их в список:

ind = np.random.choice(len(a), size = len(a), replace=True)

Пусть, например,
ind = [0, 3, 1, 0, 1].
Теперь, мне нужен другой массив
b, в котором значения будут соответствовать элементам исходного массива, но под индексами из массива
ind.  Т.е., в нашем случае массив
b после преобразований =
1, 5, 6, 1, 6.
Как мою реализацию заменить на код без цикла?

for i, j in enumerate(ind):
b = np.zeros_like(a)
    b[i] = a[j]
print(b)

просто выберите элементы из вектора
a по индексу
ind:

res = a[ind]

результат:

In [16]: res
Out[16]: array([1, 5, 6, 1, 6])


метод __add__ без if'а
решил сделать класс
Vec2:

class Vec2():
    def __init__(self, x = 0, y = 0):
        self.x, self.y = x, y

    def __add__(self, num):
        if type(num) == Vec2:
            return Vec2(self.x + num.x, self.y + num.y)
        return Vec2(self.x + num, self.y + num)

    def __str__(self):
        return f"{self.x}  {self.y}"

И появился вопрос, могу ли я реализовать метод
__add__ без
if'а?
примерно как в этом коде на c++:

vec2 operator+(vec2& v) {
    return vec2(x + v.x, y + v.y);
}
vec2 operator+(double s) {
    return vec2(x + s, y + s);
}

С помощью декоратора
typedispatch из библиотеки fastcore:

from fastcore.dispatch import typedispatch

class _Vec2:
    def __init__(self, x=0, y=0):
        self.x, self.y = x, y

    def __str__(self):
        return f"{self.x}  {self.y}"

class Vec2(_Vec2):
    @typedispatch
    def __add__(self, num: _Vec2):
        return Vec2(self.x + num.x, self.y + num.y)

    @typedispatch
    def __add__(self, num):
        return Vec2(self.x + num, self.y + num)

print(Vec2(1, 1) + 2)
print(Vec2(1, 1) + Vec2(1, 2))

Вывод:

3  3
2  3

Пришлось выделить отдельный класс
_Vec2 из-за того, что если указывать свой же класс в аннотации, то начинает ругаться на необъявленный символ
Vec2 (если использовать строковую аннотацию
"Vec2" или добавить
from __future__ import annotations, то ошибку выкинет внутри
fastcore.dispatch).
Обзор библиотеки fastcore:
fastcore: An Underrated Python Library

Реализация с помощью
singledispatchmethod из стандартной библиотеки Python (на мой вкус менее красивый вариант из-за того, что нужно менять имя метода на подчеркивание, зато без дополнительных модулей):

from functools import singledispatchmethod

class _Vec2:
    def __init__(self, x=0, y=0):
        self.x, self.y = x, y

    def __str__(self):
        return f"{self.x}  {self.y}"

class Vec2(_Vec2):
    @singledispatchmethod
    def __add__(self, num):
        return Vec2(self.x + num, self.y + num)

    @__add__.register
    def _(self, num: _Vec2):
        return Vec2(self.x + num.x, self.y + num.y)

print(Vec2(1, 1) + 2)
print(Vec2(1, 1) + Vec2(1, 2))


При вызове функции выводит <function result.<locals>.func2 at 0x7f4c18cef158>
<code>
def result(a, b, c):

    def func1(a, b):
        return a * b

    def func2(func1, c):
        return func1 * c

    return func2

print(result(2, 3, 4))
</code>
Вроде как должен вернуть число 12, но выводит строку <function result..func2 at 0x7f4c18cef158>.
Пытался менять способы вывода, но увы. Кажется, что задача проста и ответ на нее также прост, но никак не могу сообразить в чем дело.

def result(a, b, c):

    def func1():
        return a * b

    def func2():
        return func1() * c

    return func2()

print(result(2, 3, 4))

либо:

def result(a, b, c):

    def func1():
        return a * b

    def func2():
        return func1() * c

    return func2

n = result(2, 3, 4)
print(n())

вывод в обоих случаях:

24


Как сделать так,чтобы данные выводились в форме дерева. а не столбиком?

class Node:
    def __init__(self,data):
        self.left= None
        self.right=None
        self.data=data

    def degree(self):
        n=0
        if left:
            n=n+1
        if right:
            n=n+1
        return n
    def find(self,data):
        if self.data:
            if data ==self.data:
                return True
            elif data>self.data:
                if self.right:
                    return self.right.find(data)
                else:
                    return False
            elif data<self.data:
                if self.left:
                    return self.left.find(data)
                else:
                    return False
        else:
            return False

    def insert(self,data):
        if self.data:

            if data<self.data:
                if self.left is None:
                    self.left=Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data
    def printTree(self):
        if self.left:
            self.left.printTree()
        print(self.data),
        if self.right:
            self.right.printTree()
    def depth_first(self,root):
        res=[]
        if root:
            res.append(root.data)
            res=res+self.depth_first(root.left)
            res=res+self.depth_first(root.right)

a=Node(1)
a.insert(2)
a.insert(3)
a.insert(0)
a.printTree()

я исправила и добавила  параметр depth( но выводит тоже самое, почему?)

 def depth_first(self,root):
        res=[]
        if root:
            res.append(root.data)
            res=res+self.depth_first(root.left)
            res=res+self.depth_first(root.right)

a=Node(10)
a.insert(2)
a.insert(3)
a.insert(0)
a.insert(1)
a.insert(15)
a.insert(45)
a.insert(60)
a.insert(17)
a.insert(6)
a.printTree(depth=1)```

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

class Node:
    # остальной класс Node остается как есть, добавим несколько новых методов, которые нам понадобятся

    def get_min_x(self, x=0):
        """вычисляет координату Х самой левой точки дерева"""
        return min(
            self.left.get_min_x(x-1) if self.left else x,
            self.right.get_min_x(x + 1) if self.right else x,
        )

    def prepare_position_to_print(self, x_position, y_position, result_tree=[]):
        """подготавливаем текущий лист дерева для печати"""
        while len(result_tree) < y_position:
            result_tree.append([])
        while len(result_tree[y_position-1]) <= x_position:
            result_tree[y_position-1].append(' ')  # по уму бы здесь не добавлять два пробела, а сначала вычислить самое длинное число в дереве, что бы здесь печатать достаточное количество пробелов
        result_tree[y_position-1][x_position] = str(self.data)
        if self.left:
            self.left.prepare_position_to_print(x_position=x_position-1, y_position=y_position+1, result_tree=result_tree)
        if self.right:
            self.right.prepare_position_to_print(x_position=x_position+1, y_position=y_position+1, result_tree=result_tree)

    def print_real_tree(self):
        """печатаем дерево"""
        minimum_x = self.get_min_x()
        result_tree = []
        self.prepare_position_to_print(
            x_position=-minimum_x,
            y_position=1,
            result_tree=result_tree
        )
        for level in result_tree:
            print('  '.join(level))

a=Node(3)
a.insert(5)
a.insert(2)
a.insert(0)
a.insert(4)
a.insert(7)
a.insert(9)
a.print_real_tree()

получаем результат

      3
   2     5
0     4     7
               9

Edit:
Вообще, этот алгоритм надо переработать. Он не будет нормально работать для деревьев когда ветки сначала расходятся, потом начинают сходиться.
Edit 2:
изменил алгоритм, что бы отрисовывались деревья любого типа

class Node:
    def __init__(self, data=None, values=[]):
        self.left = None
        self.right = None
        self.data = data
        self.x = None
        for value in values:
            self.insert(value)

    def insert(self, data):
        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data=data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data=data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

    def get_max_width_of_data(self):
        return max(
            len(str(self.data)),
            self.left.get_max_width_of_data() if self.left else 0,
            self.right.get_max_width_of_data() if self.right else 0,
        )

    def count_all(self):
        return sum([self.left.count_all() if self.left else 0, self.right.count_all() if self.right else 0, 1])

    def count_left(self):
        return self.left.count_all() if self.left else 0

    def count_right(self):
        return self.right.count_all() if self.right else 0

    def prepare_level_to_print(self, max_width_of_data, x_position, y_position, result_tree=[]):
        left_line = 0
        right_line = 0
        if self.left:
            left_line = self.left.count_right() + 1
        if self.right:
            right_line = self.right.count_left() + 1
        while len(result_tree) < y_position:
            result_tree.append([])
        while len(result_tree[y_position-1]) <= x_position + right_line + 1:
            result_tree[y_position-1].append(' ' * max_width_of_data)
        template = '{:0>'+str(max_width_of_data)+'}'
        result_tree[y_position-1][x_position] = template.format(self.data)
        if self.left:
            for x in range(x_position - left_line, x_position):
                result_tree[y_position - 1][x] = '─' * max_width_of_data
            result_tree[y_position - 1][x_position - left_line] = '┌{}'.format('─' * (max_width_of_data-1))
            self.left.prepare_level_to_print(
                max_width_of_data=max_width_of_data,
                x_position=x_position - left_line, y_position=y_position+1, result_tree=result_tree
            )
        if self.right:
            for x in range(x_position + 1, x_position + right_line):
                result_tree[y_position - 1][x] = '─' * max_width_of_data
            result_tree[y_position - 1][x_position + right_line] = '{}┐'.format('─' * (max_width_of_data-1))
            self.right.prepare_level_to_print(
                max_width_of_data=max_width_of_data,
                x_position=x_position + right_line, y_position=y_position+1, result_tree=result_tree
            )

    def print_real_tree(self):
        result_tree = []
        max_width_of_data = self.get_max_width_of_data()
        self.prepare_level_to_print(
            max_width_of_data=max_width_of_data,
            x_position=self.count_left() + 1,
            y_position=1,
            result_tree=result_tree
        )
        for level in result_tree:
            print(' '.join(level))

tree = Node(values=[30, 1, 2, 3, 0, 10, 15, 45, 50, 39, 60, 17, 6, 11, 13, 12, 14, 37, 35, 31])
tree.print_real_tree()

результат работы скрипта

      ┌─ ── ── ── ── ── ── ── ── ── ── 30 ── ── ── ── ─┐
   ┌─ 01 ─┐                                        ┌─ 45 ─┐
   00    02 ─┐                                  ┌─ 39    50 ─┐
            03 ── ─┐                         ┌─ 37          60
               ┌─ 10 ── ── ── ── ─┐       ┌─ 35
               06    ┌─ ── ── ── 15 ─┐    31
                     11 ── ─┐       17
                        ┌─ 13 ─┐
                        12    14


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

@client.command()

async def test(ctx, channel: discord.TextChannel):
    await channel.send('Test')

и

@client.command()

async def test(ctx):
    channel = discord.Message.channel
    await channel.send('Test')

не предлогайте.

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

@bot.command()
async def send(ctx, *, text):
    channel = bot.get_channel(#айди канала)
    await channel.send(text)

С фиксированным сообщением:

@bot.command()
async def send(ctx):
    channel = bot.get_channel(#айди канала)
    await channel.send(#ваше сообщение)


Почему применение функции над map-объектом очищает его?
<code>
iterable = (0,1,2,3,4,)
map_obj = map(str, iterable)
print(list(map_obj))
# Вывод: ['0', '1', '2', '3', '4']
print(list(map_obj))
# Вывод: []
</code>
Такая же история и с объектом filter и с другими функциями
Почему?

map создаёт итератор, а по итератору можно пройтись только один раз. Чтобы пройтись по итератору ещё раз его надо создать заново. Вы проходитесь второй раз по итератору - и он не возвращает ничего.


Рандомное число, которое не должно совпадать с другими числами
Есть функция dorandom, которая вычисляет рандомное число от 0 до 8, которое не является числом в параметрах. Допустим: аргумент 4, результат любое рандомное число от 0 до 8, но не 4. Или аргумент 324, результат рандомное число от 0 до 8, но не 3, 2 или 4. Как это реализовать?

import random

def dorandom(n):
    lst = set(map(int, str(n)))
    if len(lst) > 8 + 1:
        return None

    n = random.randrange(8 + 1)
    while n in lst:
        n = random.randrange(8 + 1)
    return n

без цикла:

import random

def dorandom(n):
    lst0 = set(map(int, str(n)))
    lst1 = set(range(8 + 1))
    try:
        return random.choice(list(lst1 - lst0))
    except IndexError:
        return None

короче:

def dorandom(n):
    try:
        return random.choice(list(set(range(8 + 1)) - set(map(int, str(n)))))
    except IndexError:
        return None


В цикле странно работает срез списка
Решаю задачу из проекта Эйлера(3): Надо найти наибольший простой делитель
<code>
n = int(input())
list1 = list(range(2, n+1))
list2 = []
for i in list1:
    if i * i > n:
        break
    list2.append(list1[i::i])

print(list2)
</code>
Вывод: [[4, 6, 8, 10], [5, 8]] при n = 10
За алгоритм я беру "решето Эратосфена".
В первом списке из списка (Я думаю, что это позже поправлю и объединю списки в один) числа кратные двум, то есть каждое второе число после двойки, а уже следующие два списка это кратные трём и четырём, но отсчет идет не от i(3, 4) а с самого первого i(2). Почему [i::i] работает не так?
list2 должен содержать 4, 6, 8, 9 , 10

Вы используете i как индекс элемента в списке, но список то не с 0 начинается а с 2, поэтому индексы тоже нужно скорректировать на
2

list2.append(list1[i-2::i])

[[2, 4, 6, 8, 10], [3, 6, 9]]

Если не нужны начальные элементы, то добавить еще i:

list2.append(list1[i-2 + i::i])

[[4, 6, 8, 10], [6, 9]]

Можно заменить
list2 на
set и получить множество уникальных элементов:

n = int(input())
list1 = list(range(2,n+1))
print(list1)
set2 = set()
for i in list1:
    if i * i > n:
        break
    set2.update(list1[i-2+i::i])
print(set2)


line 5 root.["bg"] = 'red' ^ SyntaxError: invalid syntax
<code>
from tkinder import *

root = Tk()

root.["bg"] = 'red'
root.title('Ой!')
root.geometry('1000x900')

root.resizable(width=false, height=false)

root.mainloop()
</code>

from tkinter import *

root = Tk()

root['bg'] = 'red'
root.title('Ой!')
root.geometry('1000x900')

root.resizable(width=False, height=False)

root.mainloop()


Как распечатать бинарное дерево? Чтобы выводились числа?
Я написала алгоритм бинарного дерева, но у меня выводятся какие-то зашифрованные коды вместо дерева, подскажите пожалуйста как нужно написать последнюю строчку, чтобы выводилось дерево.
<code>
from turtle import left, right

class Node:
    def __init__(self,data):
        self.left= None
        self.right=None
        self.data=data

    def degree(self):
        n=0
        if left:
            n=n+1
        if right:
            n=n+1
        return n
    def find(self,data):
        if self.data:
            if data ==self.data:
                return True
            elif data>self.data:
                if self.right:
                    return self.right.find(data)
                else:
                    return False
            elif data<self.data:
                if self.left:
                    return self.left.find(data)
                else:
                    return False
        else:
            return False

    def insert(self,data):
        if self.data:

            if data<self.data:
                if self.data is None:
                    self.left=Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data
    def printTree(self):
        if self.left:
            self.left.printTree()
        print(self.data),
        if self.right:
            self.right.printTree()
    def depth_first(self,root):
        res=[]
        if root:
            res.append(root.data)
            res=res+self.depth_first(root.left)
            res=res+self.depth_first(root.right)

a=Node(1)
a.insert(2)
a.insert(3)
a.insert(0)
a.printTree(a.root)

</code>

у тебя ошибка в методе
insert

def insert(self,data):
        if self.data:

            if data<self.data:
                if self.left is None:  # здесь была ошибка ты проверял не self.left a self.data
                    self.left=Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

и вывод печати должен быть без параметров
a.printTree()


Мне выдаёт проблему "IndexError: string index out of range". В чём проблема?
Вот это код:

perviy = input("Введите слово: ")
vtoroy = input("Введите слово: ")
tretiy = input("Введите слово: ")
i = 1
slovo = str(None)
while i <= len(perviy):
    if perviy[i] == vtoroy[i]:
        slovo = slovo + perviy[i]
    else:
        if perviy[i] == tretiy[i]:
            slovo = slovo + perviy[i]
        else:
            if vtoroy[i] == tretiy[i]:
                slovo = slovo + vtoroy[i]
            else:
                print("IMPOSSIBLE")
                exit
    i += 1
print(slovo)

Выдаёт ошибку
"IndexError: string index out of range". В чём проблема?
Смысл программы в том, чтобы понимать, что за слово было изначально. Например:

Ввод:
Printen
Plinter
Primter

Вывод:
Printer

индексация начинается с нуля поэтому надо писать
i = 0 а не
1
место

while i <= len(perviy):

надо

while i < len(perviy):

и лучше использовать цикл
for

for i in range(len(perviy)):

и можно будет убрать строки
i = 0 и
i += 1


Не работает проверка строки на соответствие
Не могу разобраться, почему сравнение не проходит успешно.
При этом оператор
in вместо
== срабатывает, но он не подходит, так как можно ввести просто
@mail.ru' и вхождение будет засчитано.
mails.txt - текстовый документ со списком мейлов, каждый с новой строки.
message.text - переменная ввода пользователя

passwords = open('/root/mails.txt', encoding='utf-8').readlines()
for line in passwords:
    if message.text.lower() == line:
        msg = bot.send_message(message.chat.id, "Спасибо! Напишите что-нибудь в чат для начала работы.")
        bot.register_next_step_handler(msg, answer)
        break
else:

     bot.send_message(message.chat.id, "Извините, данный емейл не найден. Попробуйте снова или обратитесь в поддержку.")

Может проблема в том, что в одной из сравниваемых строк есть лишние пробелы в начале или конце строки?

if message.text.lower() == line: заменить на
if message.text.lower().strip() == line.lower().strip():


по моему исходнику не получается, помогите пожалуйста
На вход программе подается натуральное число nn. Напишите программу, которая для каждого из чисел от 00 до nn (включительно) выводит фразу: «Квадрат числа [число] равен [число]» (без кавычек).
Формат входных данных:
На вход программе подается натуральное число nn.
Формат выходных данных:
Программа должна вывести текст в соответствии с условием задачи.

Sample Input 1:

9
Sample Output 1:

Квадрат числа 0 равен 0
Квадрат числа 1 равен 1
Квадрат числа 2 равен 4
Квадрат числа 3 равен 9
Квадрат числа 4 равен 16
Квадрат числа 5 равен 25
Квадрат числа 6 равен 36
Квадрат числа 7 равен 49
Квадрат числа 8 равен 64
Квадрат числа 9 равен 81

a = int(input())
for i in range(10):
print('Квадрат числа', i , 'равен',a ** 2)

Вам надо возводить в квадрат число
i а не
a
в цикле
for надо проходить от
0 до
a а не до десяти

a = int(input())
for i in range(a + 1):
    print('Квадрат числа', i , 'равен',i ** 2)

В одну строку

[print(f"Квадрат числа {i} равен {i ** 2}") for i in range(int(input()) + 1)]


Ошибка при вставке BLOB через JayDeBeApi: ORA-01400: невозможно вставить NULL
При попытке сделать вставку в таблицу с колонкой
BLOB, вставляется пустое значение.

import jpype
import jpype.imports
import jaydebeapi

pic = open('out-1.png', 'rb')
z = pic.read()
con = jaydebeapi.connect('oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:user/pass@URL',jars = "ojdbc6.jar")
cursor = con.cursor()
cursor.execute(
    "INSERT INTO TAB (ID, PARAM, DATA) VALUES (:id, :param, :data)",
    (3383782, "50002390872", z))

jaydebeapi.DatabaseError: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: невозможно вставить NULL в ("TAB"."DATA")

Подскажите, что делаю не так?

PS: Долго пытался подобрать решение. Экспериментом выгрузил
BLOB значение из другой таблицы и подставил вo вставку. Сработало. Пробовал через JPype создать объект
oracle.sql.BLOB и туда записать. Но что-то совсем не пошло. Пришлось все-таки перейти на cx_Oracle, там такая конструкция работает. В итоге, решил на сервер положить программу и подключить RemoteAPP. Не совсем как хотел, надеялся распространять .exe и обновлять его, но все-таки первоначальная задача выполнена.

Недостаточно передать во вставку переменную типа байты, полученую при считывании из фйла. Она будет "понята" как
NULL, в чём и причина ошибки.
Данные надо конвертировать согласно Python Database API Specification v2.0 в бинарный формат -
<java array 'byte[]'>.
Ниже воспроизводимый пример, как это надо сделать.
Тестовая таблица:

create table tblob (filename varchar2 (64), data blob not null)

Код:

import jaydebeapi as jdb

fnam = '1234.png'
file = open (fnam, 'rb')
pic = file.read ()

conn = jdb.connect (
    'oracle.jdbc.driver.OracleDriver', 'jdbc:oracle:thin:me/[email protected]/dbsvc',
    jars='/path-to/ojdbc8.jar')
cur = conn.cursor ()
cur.execute ("insert into tblob values (:filename, :data)", (fnam, jdb.Binary (pic)))
cur.close ()
conn.close ()

Результат после выполнения:

select * from tblob
/
FILENAME DATA
-------- --------------------------------
1234.png 89504E470D0A1A0A0000000D49484452
         00000048000000D408060000003F4965
         7F000000017352474200AECE1CE90000
         000467414D410000B18F0BFC61050000
         00097048597300000EC300000EC301C7


Failed test. Wrong answer
Извините за большой текст , я новенький , учу питон и пытаюсь решить задачу только теми способами , которые нам дали на обучении.
Задача на Stepik:
Узнав, что ДНК не является случайной строкой, только что поступившие в Институт биоинформатики студенты группы информатиков предложили использовать алгоритм сжатия, который сжимает повторяющиеся символы в строке.
Кодирование осуществляется следующим образом:
s = 'aaaabbсaa' преобразуется в 'a4b2с1a2', то есть группы одинаковых символов исходной строки заменяются на этот символ и количество его повторений в этой позиции строки.
Напишите программу, которая считывает строку, кодирует её предложенным алгоритмом и выводит закодированную последовательность на стандартный вывод. Кодирование должно учитывать регистр символов
1)Не могу пройти один из тестов, все проверки которые мог придумать я реализовал( в том числе и на неверный символ ), но получаю ошибку:
Failed test #6 of 15. Wrong answer
2)Не совсем понимаю условие "Кодирование должно учитывать регистр символов" , что оно должно значить
Мой код:
<code>
s = input()
s = s.lower()

n = 0
j = 0
i = 0
ia = 0
ib = 0
ic = 0
simv_err = 0

# проверка всей строки на неверный символ

while j <= len(s)-1 :
    if s[j] == 'a' or s[j] == 'b' or s[j] == 'c':
        j += 1
    else :
        j += 1
        simv_err += 1
if simv_err > 0 :
    print('Неверный символ')

#если все символы в строке верные , начинаем считать

else :
    while i <= (len(s)-1) :
            if s[i] == 'a' :
                i += 1
                ia += 1
                if i > (len(s)-1) or s[i] != 'a':
                    ic = 0
                    ib = 0
                    print("a",end='')
                    print(ia,end='')
            elif s[i] == 'b' :
                i += 1
                ib += 1
                ia = 0
                if i > (len(s)-1) or s[i] != 'b' :
                    ic = 0
                    ia = 0
                    print("b",end='')
                    print(ib,end='')
            elif s[i] == 'c' :
                i += 1
                ic += 1
                ib = 0
                ia = 0
                if i > (len(s)-1) or s[i] != 'c' :
                    ia = 0
                    ib = 0
                    print("c",end='')
                    print(ic,end='')
</code>

Кодирование должно учитывать регистр символов

Означает что большие и маленькие буквы должны считаться отдельно:

"aaaabbсaa" -> "a4b2с1a2"
"aAaabbсaa" -> "a1A1a2b2с1a2"

Решил эту задачу двумя способами:

#  "Питоновский" подход - использование zip().
#  Для упрощения кода в конец строки добавляется нулевой байт -
#  это позволяет обработать последнюю букву внутри цикла без каких-либо
#  дополнительных проверок.
#  Условие - строка не должна содержать нулевых байтов.
def dna_compress_1(s):
    compressed_s = ''
    cnt = 0

    s += '\x00'

    for cur, nxt in zip(s, s[1:]):
        cnt += 1

        if cur != nxt:
            compressed_s += cur + str(cnt)
            cnt = 0

    return compressed_s

#  Классический подход - использование индексов
def dna_compress_2(s):
    compressed_s = ''
    cnt = 0
    size = len(s)

    i = 0
    while i < size:
        cnt += 1
        #  Если текущая буква не равна следующей или
        #  текущая буква является последней - запиши
        #  эту букву вместе с её счётчиком в сжатую строку.
        if i == size - 1 or s[i] != s[i + 1]:
            compressed_s += s[i] + str(cnt)
            cnt = 0

        i += 1

    return compressed_s

Тестирование

test_lst = [
    "aaaabbсaa",
    "aAaabbсaa",
    "a",
    "ab",
    "abb"
]

for test_str in test_lst:
    print(dna_compress_1(test_str))
    print(dna_compress_2(test_str))
    print()

Вывод

a4b2с1a2
a4b2с1a2

a1A1a2b2с1a2
a1A1a2b2с1a2

a1
a1

a1b1
a1b1

a1b2
a1b2


Как одновременно воспроизвести музыку и печатать текст?
Подскажите пожалуйста как осуществить следующую идею:
Вывожу на экран текст с эффектом печатной машинки(В переменной introduction лежит многострочная строка):

for introduction in introduction:
    time.sleep(0.05)
    print(introduction, end = "", flush=True)

Так же написал код для запуска нужного мне файла .mp3 (использую Pyglet):

import pyglet

WelcomeSong = pyglet.media.load('music/welcome.mp3')
WelcomeSong.play()
pyglet.app.run()

Как два этих кода запустить одновременно?
Т.е. мне нужно чтобы на экране печатался текст из переменной introduction и в это же время было музыкальное сопровождение из файла .mp3
Спасибо!

Разобрался с этим вопросом сам, с помощью библиотеки для работы с потоками threading.
Вот что получилось:
<code>
import time
import threading
from config import introduction
import pyglet
def WelcomePrintMashin():
    for introductions in introduction:
        time.sleep(0.05)
        print(introductions, end="", flush=True)
def WelcomMusic():
    WelcomeSong = pyglet.media.load('music/welcome.mp3')
    WelcomeSong.play()
    pyglet.app.run()

def play1():
    while time.time() <= start_time:
        pass
    threading.Thread(target=WelcomMusic()).start()
def play2():
    while time.time() <= start_time:
        pass
    threading.Thread(target=WelcomePrintMashin()).start()
start_time=time.time()+1
welcommusicrun = threading.Thread(target=play1).start()
welcomprintmashinrun = threading.Thread(target=play2).start()
welcommusicrun
welcomprintmashinrun
</code>
По итогу поставленная задача была решена, код запускается и две нужных функции работают одновременно. Всем спасибо!


Как создать ссылку на профиль пользователя вида account/user/
Создал личный кабинет вида сайт/account/
Не получается создать личный кабинет вида account/user/
user - пользователь, который зашел
Модель

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)

    @receiver(post_save, sender=User)
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.create(user=instance)

    @receiver(post_save, sender=User)
    def save_user_profile(sender, instance, **kwargs):
        instance.profile.save()

    def get_absolute_url(self):
        return reverse('profile', args=[self.user])

Вьюха

def profile_user(request, user):

    profile = Profile.objects.filter(user=request.user)
    return render(request, 'account/profile.html', {'profile': 'profile'})

urls

path('<slug:user>/', views.profile_user, name='profile'),

.filter() возвращает Queryset. А вам нужен сам объект. Используйте
.get() вместо
.filter()


Удалить дубликаты в Dataframe
Есть таблица, в которой имеются 4 колонки, необходимо по "Номеру анкеты" найти дублирующие анкеты и удалить их, оставив только одну анкету. Дело в том, что удаляя функцией drop_duplicates, он оставляет лишь первые вопросы анкет, при этом все остальные вопросы он удаляет. Мне же необходимо, чтобы оставались все вопросы на месте, а все остальные анкеты с таким же "Номером анкеты" были удалены.
Пример входных данных:

Номер анкеты   Вопрос                   Ответ                      Узлы

2fcc8   Ваш пол?                   Жен.                    Нет патологий
2fcc8   Ваш возраст?               с 40 до 55              Нет патологий
2fcc8   Вы курите?                 Да                      Нет патологий
2fcc8   Сколько лет вы курите?     от 15 до 30 лет         Нет патологий
bdab0   Ваш пол?                   Жен.                    Нет патологий
bdab0   Ваш возраст?               с 40 до 55              Нет патологий
bdab0   Вы курите?                 Да                      Нет патологий
bdab0   Сколько лет вы курите?     от 15 до 30 лет         Нет патологий
2fcc8   Ваш пол?                   Жен.                    Нет патологий
2fcc8   Ваш возраст?               с 40 до 55              Нет патологий
2fcc8   Вы курите?                 Да                      Нет патологий
2fcc8   Сколько лет вы курите?     от 15 до 30 лет         Нет патологий

И то каким я вижу выходной файл:

Номер анкеты   Вопрос                   Ответ                      Узлы

2fcc8   Ваш пол?                   Жен.                    Нет патологий
2fcc8   Ваш возраст?               с 40 до 55              Нет патологий
2fcc8   Вы курите?                 Да                      Нет патологий
2fcc8   Сколько лет вы курите?     от 15 до 30 лет         Нет патологий
bdab0   Ваш пол?                   Жен.                    Нет патологий
bdab0   Ваш возраст?               с 40 до 55              Нет патологий
bdab0   Вы курите?                 Да                      Нет патологий
bdab0   Сколько лет вы курите?     от 15 до 30 лет         Нет патологий

Если я правильно понял вопрос, то попробуйте вот так:
<code>
df.drop_duplicates(subset=['Номер анкеты', 'Вопрос'], keep='first')
</code>


Функция build_absolute_uri всегда генерит http
Функция build_absolute_uri у обьекта request генерит url с  протоколом http,хотя явно url с протоколом https.Можно ли как-то заставить генерить защитный протокол?

Из документации

Mixing HTTP and HTTPS on the same site is discouraged, therefore
build_absolute_uri() will always generate an absolute URI with the
same scheme the current request has. If you need to redirect users to
HTTPS, it’s best to let your Web server redirect all HTTP traffic to
HTTPS.

Т.е. функция возвращает тот же протокол, который стоит в request
Edit:
Если же ты для сайта используешь оба протокола и хочешь что бы тебе build_absolute_uri всегда формировалась с https, просто заменяй в результирующей строке
request.build_absolute_uri('url').replace('http:', 'https:')


Python 3. Функция на выводе выдает нужную информацию и в конце добавляет "None"
Пишу функцию по созданию персонажа в простенькой текстовой игре, она выглядит так:

def CreateMainPlayer(mainplayer):
    print('Вы будете играть за: [человек/монстр]')
    vibor = input()
    if vibor == ('человек'):
        print('Введите свое имя: ')
        n = input()
        print('Введите свой возраст: ')
        try:
            a = int(input())
        except ValueError:
            print('ОШИБКА! Возраст - целое число!')
            try:
                a = int(input())
            except UnboundLocalError:
                print('ОШИБКА! Возраст - целое число!')
        mainplayer = Humon(n, a, 70, 100)
    else:
        print('Введите свое имя: ')
        n = input()
        print('Введите свой возраст: ')
        try:
            a = int(input())
        except ValueError:
            print('ОШИБКА! Возраст - целое число!')
            try:
                a = int(input())
            except UnboundLocalError:
                print('ОШИБКА! Возраст - целое число!')
        mainplayer = Monster(n, a, 100, 50)
    return mainplayer

После этого делаю:

print(mainplayer.tell())

А на выходе получаю следующее:

Имя: "ИМЯ123", Возраст: "25", Здоровье: "70", Энергия: "100"
None

Откуда появляется None? Нужный мне объект все же создается, я проверил это выполнив print(mainplayer)
Подскажите пожалуйста, что сделал неправильно или как избавиться от вывода None?
Заранее прошу прощения, совсем еще новичок ;)
UPD: Совсем забыл, спасибо первому комментатору!
Созданы следующие классы:

class Creation():
    # Представялет любое существо
    def __init__(self, name, age, hp, nrg):
        self.name = name
        self.age = age
        self.hp = hp
        self.nrg = nrg
        #print('Создано существо: "{0}"'.format(self.name))
        # Выводит информацию
    def tell(self):
        print('Имя: "{0}", Возраст: "{1}", Здоровье: "{2}", Энергия: "{3}"'.format(self.name, self.age, self.hp, self.nrg), end ="\n")

class Humon():
    # Представляет человека
    def __init__(self, name, age, hp, nrg):
        Creation.__init__(self, name, age, hp, nrg)
        #print('Создан человек: "{0}"'.format(self.name))
    def tell(self):
        Creation.tell(self)

class Monster():
    # Представляет монстра
    def __init__(self, name, age, hp, nrg):
        Creation.__init__(self, name, age, hp, nrg)
        #print('Создан монстр: "{0}"'.format(self.name))
    def tell(self):
        Creation.tell(self)

В общем как и ожидалось :)
вы делаете

print(mainplayer.tell())

причем в методе
tell() уже есть
print, он то и выводит информацию о персонаже
но дальше вы еще выводите результат вызова этого метода, но метод
tell() не возвращает никаких значений (а в питоне это значит, что возвращается
None), вот вам
print и выводит
None
попробуйте сделать

print(print("Привет"))

и получите тот же результат:

Привет
None


как записать SQL запрос чтобы получить кортеж из двух значений одной таблицы и связанного значения другой?
есть две таблицы в бд SQLite3 для работы приложения на Python..\
<code>
CREATE TABLE product_table (
 -------------id INTEGER NOT NULL,
 -------------product_name VARCHAR,
 -------------product_type_id INTEGER
 -------------price INTEGER,
 -------------product_photo_id INTEGER,
 -------------PRIMARY KEY (id),
 -------------FOREIGH KEY(product_type_id) REFERENCES product_types (id),
 -------------FOREIGN KEY(product_photo_id) REFERENSES product_photos (id),
)

CREATE TABLE product_photos (
 -------------id INTEGER NOT NULL,
 -------------product_id INTEGER,
 -------------telegram_photo_id VARCHAR
 -------------PRIMARY KEY (id),
 -------------FOREIGH KEY(product_id) REFERENCES product_table (id),
)

# Третья для полной картины
CREATE TABLE product_types (
 -------------id INTEGER NOT NULL,
 -------------product_type VARCHAR
 -------------PRIMARY KEY (id),
)
# Таблицы заполнял через БД браузер вручную, потому что так на тот момент было удобнее..но мог бы и так
conn.execute('INSERT into product_table (product_name, product_type_id, price, product_photo_id) VALUES ("кот", 20, 1, 1)')

conn.execute('INSERT into product_photos (product_id, telegram_photo_id) VALUES (1, "file_id от телергамм")')
conn.commit()
</code>
Требуемый вывод [('Кот','20','file_id от телергамм')]
Как вывести первые два - тут все просто execute(f'SELECT product_name, price, product_photo_id FROM product_table WHERE product_type_id={cat_code}').fetchall()
Не понятно именно как добавить в выходной кортеж значение из другой таблицы по связанному полю,
Пробую написать через JOIN, но не понимаю как указать WHERE product_type_id==знач, а мне нужно именно по типу "отбирать", который приходит в функцию в качестве cat_code и равен одному из product_types.id поэтому использую fstring.
Нужно решение именно в виде SQL запроса, без alchemy и тд, потому что хочу понять именно сам SQL

SELECT pt.product_name,
       pt.product_type_id,
       pp.telegram_photo_id
FROM product_table pt
-- Из следующих двух строк - одну выбрать, вторую удалить.
-- Какую выбрать - зависит от логики предметной области.
-- Впрочем, допускаю, что правильным может оказаться третий вариант.
JOIN product_photos pp ON pt.product_photo_id = pp.id
JOIN product_photos pp  ON pp.product_id = pt.id


Передача методу экземпляр класса
Как передать методу
test экземпляр
exercise?

from PyQt5 import QtWidgets
import sys

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.check_button = QtWidgets.QPushButton(self)
        # self.check_button.setObjectName("check_button")

        exercise = SecondClass()
        self.check_button.clicked.connect(self.test)

    def test(self):
        print(exercise.attr)

class SecondClass:
    def __init__(self):
        self.attr = 'value'

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

    self.exercise = SecondClass()
    self.check_button.clicked.connect(self.test)

def test(self):
    print(self.exercise.attr)


Преобразование изображений к типу UMat
Столкнулся с проблемой того, что opencv не любит никакой формат, кроме своего собственного. Получаю изображение с его помощью, но после применения wavelet из pywt выдает ошибку:

(-215:Assertion failed) _src.depth() == CV_8U in function 'cv::Canny'

img = cv2.imread('vlcsnap2.png')
Wave_img = pywt.wavedec2(img, 'coif2', level=4)
Rec_img = pywt.waverec2(Wave_img, 'coif2')
edge = cv2.Canny(Rec_img, 50, 50)

Сколько бы не смотрел в интернете, ни один метод не подошел, чтобы пройти эту ошибку.

Вот так попробуйте
<code>
import numpy as np
import cv2
import pywt
img = cv2.imread('vlcsnap2.png')
Wave_img = pywt.wavedec2(img, 'coif2', level=4)
Rec_img = pywt.waverec2(Wave_img, 'coif2')
Rec_img=Rec_img.astype(np.uint8)
edge = cv2.Canny(Rec_img, 50, 50)
</code>


Код не удаляет символ из первого элемента списка

i=int(0)

f=open('locallist.txt','r')
program_list=f.readlines()
for line in range(len(program_list)):
    program_list[i].replace("\n", "")
    i=i+1
    print(line)
    print(program_list)
f.close()

Выводит:
['Visual Studio Code\n', 'Mozila']
UPD: Удаляет только из последнего элемента
Как исправить это недорозумение - не понимаю.

Строки это иммутабельный тип. А все строковые методы возвращают новую строку.
<code>
program_list[i] = program_list[i].replace("\n", "")
</code>


Python - Telebot. Как сделать столбиковые сообщения
<code>
Не нравится окружение?

Дико надоели скучные друзья, жадный работодатель, сварливая жена?

Есть выход! Меняйся!

Когда меняешься ты , меняется твое окружение.
</code>
Типа такого. Как засунуть такой столбик в str переменную?

если эти строки написаны в массив то так:
<code>
"\n".join(arr)
</code>


Перевод кода с Python на C++
есть код на Python необходимо написать его же на с++, знания в python = 0, а задние необходимо выполнить, к сожалению сроки и занятость не позволят изучить python на нужном уровне.
Сложность возникает в переводе самой логики работы кода
<code>
            def calc_hash(proc_name):
                result = 0
                for c in proc_name:
                    if ord(c) < ord('A') or ord(c) > ord('Z'):
                        b = ord(c)
                    else:
                        b = ord(c) + 0x20
                    result = (0x19660D * result + b + 0x3C6EF35F) & 0xFFFFFFFF
                return result

            proc_name = (input('input:'))
            hex_out = ""
            hex_out = calc_hash(proc_name)

            print("IS", hex_out)
</code>

знания в python = 0

данный код:

выводит на экран текст
input:
и ждет ввода строки
после чего по строке вычисляется хэш
хэш выводится на экран как
is <хэш>

Сам хэш считается по следующему алгоритму:

проходим по всем буквам строки

если буква лежит вне диапазона
A..Z, то накапливаем хэш по формуле

 result = (0x19660D * result + (int)c + 0x3C6EF35F) & 0xFFFFFFFF

если буква лежит в диапазоне
A..Z, то накапливаем хэш по формуле

 result = (0x19660D * result + (int)(c + 0x20) + 0x3C6EF35F) & 0xFFFFFFFF

если в c++ знания != 0, то этого должно быть достаточно для перевода кода
P.S.
от себя могу добавить, что если будете работать с
unsigned int то делать
& 0xFFFFFFFF совершенно бессмысленно - ни на что не влияет


Как запустить в консоли скрипт с заданной версией интерпретатора?
У меня на компьютере стоят две версии Python: 3.7 и 3.8.
Как мне запустить скрипт именно с версией 3.7?
И можно ли как-то настроить команды для этого, например: py37 для 3.7 и py38 для 3.8.

Запускайте через
py с указанием версии, например:
py -3.7 script.py.
См. Python Launcher for Windows, PEP 397 -- Python launcher for Windows


PyTelegramBotApi. Изменение сообщений
Нужно чтобы пользователь мог оставлять оценку на фото, при этом бот после оценки должен изменять фото на другое в том же сообщении. Бот один раз изменяет картинку, но затем выдаёт ошибку ссылаясь на попытку изменить идентичное прошлому сообщение.
TeleBot: "A request to the Telegram API was unsuccessful. Error code: 400 Description: Bad Request: message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message"
<code>
@bot.message_handler(commands=["start"])
def any_msg(message):
    keyboard = types.InlineKeyboardMarkup()
    callback_button1 = types.InlineKeyboardButton(text="Одобряю", callback_data="poc")
    callback_button2 = types.InlineKeyboardButton(text="Ме", callback_data="no_poc")
    keyboard.row(callback_button1, callback_button2)
    with open("test/bydlo.jpg", "rb") as image:
        bot.send_photo(message.chat.id, image, reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.message:
        if call.data == "no_poc" or "poc":
            print("off")
            keyboard = types.InlineKeyboardMarkup()
            callback_button1 = types.InlineKeyboardButton(text="Класс", callback_data="anime")
            callback_button2 = types.InlineKeyboardButton(text="Ме...", callback_data="non_anime")
            keyboard.row(callback_button1, callback_button2)
            with open("test/anime.jpg", "rb") as anime:
                bot.edit_message_media(media=types.InputMedia(type='photo', media=anime),chat_id=call.message.chat.id, message_id=call.message.message_id, reply_markup=keyboard)

        elif call.data == "anime":
            keyboard = types.InlineKeyboardMarkup()
            callback_button2 = types.InlineKeyboardButton(text="Ме", callback_data="jeeraf")
            callback_button1 = types.InlineKeyboardButton(text="Няяя", callback_data="very_anime")
            keyboard.row(callback_button2, callback_button1)
            with open("test/very_anime.jpg", "rb") as very_anime:
                bot.edit_message_media(media=types.InputMedia(type='photo', media=very_anime), chat_id=call.message.chat.id, message_id=call.message.message_id, reply_markup=keyboard)
</code>

У вас ошибка во втором callback обработчике, где вы проверяете call.data
if call.data == "no_poc" or "poc":. Дело в том, что Python в данном случае всегда будет выдавать True, так как разбивает это выражение на
call.data == "no_poc" и
"poc". Первое может быть и не всегда правда, зато второе всегда выдает True.
В этом случае я бы проверял это условие так:

if call.data in ["no_poc", "poc"]:


Генерация чисел по заданной маске
Есть функция get_rand_0_255(), которая генерирует случайное число в диапазоне от 0 до 255.
Есть еще одна функция get_ip(), которая должна генерировать ip адресс по заданному шаблону mask.
Подскажите, пожалуйста, как правильно написать функцию get_ip()?
<code>
from random import randint

def get_rand_0_255():
    return randint(0, 255)

def get_ip(mask="xxx.xx.xx.x"):
    mask_list = mask.split('.')
    ip_parts = []
# Неизвестный блок кода

return ".".join(ip_parts)
</code>

можно так:
<code>
from random import randint

def gen_subnet(digit_length=2):
    stop = 256 if digit_length > 2 else 10**digit_length
    start = 10**(digit_length-1)
    return randint(start, stop)

def gen_ip(mask="xxx.xx.xx.x"):
    return ".".join([str(gen_subnet(len(x))) for x in mask.split(".")])

print(gen_ip()) # 217.26.64.1
</code>


алгоритм

проходите по списку l1
проходите внутри 1) по списку l2
ищете подстроку l1 в строке l2
если находите - помещаете элемент l2 в новый список
проверяете выходной список на дубликаты и удаляете их (или сразу множество
set вместо
list используете)


Помогите задать параметр в def myname():
Имею пример:

self.m = Menu(self.c, tearoff=0)
self.m["bg"] = 'white'
self.m["activebackground"] = 'gray'

как мне задать параметры, для функции
def myname():, таким образом чтобы я мог читать вызывая
self.myname["bg"] и изменять вызывая
self.myname["bg"] = 'white'
Псевдокод:

myname = self.myname()
myname['bg'] = 'gray'

def myname(self, bg):
    self.bg = bg
    print(self.bg)

Нашел информацию о Menu в файле
__init__.py tkinter:

class Menu(Widget):
    def __init__(self, master=None, cnf={}, **kw):
        Widget.__init__(self, master, 'menu', cnf, kw)
...
    def add(self, itemType, cnf={}, **kw):
        """Internal function."""
        self.tk.call((self._w, 'add', itemType) +
                 self._options(cnf, kw))

Подскажите как работает словарь
cnf={} ???
Нашел еще кое что:

class BaseWidget(Misc):
...
    def __init__(self, master, widgetName, cnf={}, kw={}, extra=()):
        """Construct a widget with the parent widget MASTER, a name WIDGETNAME
        and appropriate options."""
        if kw:
            cnf = _cnfmerge((cnf, kw))
        self.widgetName = widgetName
        BaseWidget._setup(self, master, cnf)
        if self._tclCommands is None:
            self._tclCommands = []
        classes = [(k, v) for k, v in cnf.items() if isinstance(k, type)]
        for k, v in classes:
            del cnf[k]
        self.tk.call(
            (widgetName, self._w) + extra + self._options(cnf))
        for k, v in classes:
            k.configure(self, v)

Вариант с использованием класса:

class MyClass():
    def __init__(self, **kwargs):
        self.dict_ = kwargs

    def __setitem__(self, key, value):
        self.dict_[key] = value

    def __getitem__(self, key):
        return self.dict_[key]

    def __repr__(self):
        return str(self.dict_)
x = MyClass(bg = "gray")

x["bg"] = "white"
print(x["bg"])
print(x)

вывод:

white

{"bg": "white"}


Python не работает сложение [закрыт]

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

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

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

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

<code>
test_results = [

[85.4, 71.6, 93.2, 65.8, 45.0],

    [89.5, 80.0, 95.5, 76.5, 72.0]

]

average = 0

for result in test_results:

    average += result
</code>

Потому что элемент
result это элемент списка test_results. Т.е.
[85.4, 71.6, 93.2, 65.8, 45.0] и
[89.5, 80.0, 95.5, 76.5, 72.0].
Получается
0 + [85.4, 71.6, 93.2, 65.8, 45.0] = ???  не понятно что.
Нужно добавить цикл, который будет суммировать элементы вложенных списков.

for i in result:

    average += i


Корректный вывод с lambda
Скажите, как можно с помощью lambda указать, по какому именно условию мы должны выводить число.
К примеру есть список чисел и контрольное число:
Нужно вывести сумму попарных элементов, сумма которых меньше контрольного числа по возрастанию, а также сами эти числа также в порядке возрастания
<code>
listt = [10, 7, 2, 12, 76, 100, 324]
control_number = 30

# вывести последовательно сумму двух элементов, если эта сумма меньше контрольного числа
# Для первых двух чисел: 10 + 7 = 17, a 17 < 30, значит число 17 удовлетворяет условию.
# 7 + 2 = 9, a 9 < 30, 9 удовлетворяет
# 2 + 12 = 14, a 14 < 30, 14 удовлетворяет условию
# 12 + 76 = 88, a 88 > 30, 88 не удовлетворяет условию
# Нужно вывести сумму попарных элементов, сумма которых меньше контрольного числа по возрастанию, а также сами эти числа также в порядке возрастания:
# 9 14 17
# 2 7 10 12
</code>
Вывод:
9 14 17
Вопрос: как сделать так, чтобы выводилось не подряд 17 9 14, а по возрастанию?
P.S. Без использования списка и метода списков, чисто с лямбда

Без методов списка, но со списком.
Используем
heapq heappush/heappop:

from heapq import heappush, heappop

listt = [10, 7, 2, 12, 76, 100, 324]
control_number = 30

h = []
for i in range(len(listt)-1):
    a, b = listt[i], listt[i+1]
    ab = a + b
    if ab < control_number:
        heappush(h, ab)

for _ in range(len(h)):
    print(heappop(h), end=' ') # 9 14 17
print()

Почти без списков, и с лямбдами!

from functools import reduce

solution = sorted(filter(
    lambda x: int(x) < control_number,
    reduce(
        lambda data,x: {'sums': data['sums'] + (data['prev']+x,) if data['prev'] is not None else tuple(), 'prev': x},
        listt,
        {'sums': tuple(), 'prev': None}
    )['sums']
))

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


Python, преобразование полезной нагрузки в словарь или json
Http server на питоне получает строку вида param1=one&param2=two через POST. Можно ли преобразовать её в словарь или в json?

from urllib.parse import parse_qs
from urllib.parse import parse_qsl
import json

parse_qs('param1=one&param2=two')
# {'param1': ['one'], 'param2': ['two']}
parse_qsl('param1=one&param2=two')
# [('param1', 'one'), ('param2', 'two')]

json.dumps(parse_qs('param1=one&param2=two'))
# '{"param1": ["one"], "param2": ["two"]}'


Отсортировать список по заданному шаблону
Есть список:

countries = ['Другие страны', 'Казахстан', 'Международные', 'Россия', 'Таджикистан', 'Узбекистан']

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

countries = ['Казахстан', 'Россия', 'Таджикистан', 'Узбекистан', 'Другие страны', 'Международные']

Пример:
Получил такой список:

countries = ['Казахстан', 'Международные', 'Узбекистан', 'Таджикистан']

нужно отсортировать, чтобы получилось так:

countries = ['Казахстан', 'Таджикистан', 'Узбекистан', 'Международные']

Надеюсь, смог объяснить. Думал присвоить
id каждой стране и сортировать по ним, но не знаю как.

def country_sort(country):
    country_ids = {
        'Казахстан': 1,
        'Россия': 2,
        'Таджикистан': 3,
        'Узбекистан': 4,
        'Международные': 6
    }

    return country_ids[country] if country in country_ids.keys() else len(country_ids)

countries = ['Казахстан', 'Международные', 'Узбекистан', 'Таджикистан']

countries.sort(key=country_sort)

print(countries)
# ['Казахстан', 'Таджикистан', 'Узбекистан', 'Международные']


Как заменить значения индексов фрейма данных по условию?
Хочу выполнить следующую последовательность действий:

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

С первым пунктом получилось справиться успешно, но со 2 ерунда какая-то получается.

d   N1  N2  N3
aa  12  12  5
bb  27  29  25
cc  26  27  18
aa  23  31  20
bb  24  25  23
cc  27  17  33
aa  22  18  28
bb  23  24  20
cc  21  19  19

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

df = pd.read_excel('BB.xlsx', sheet_name='Лист10')
df.loc[df['d'] == 'cc', 'd'] = 'data1'
df.loc[df['d'] == 'aa', 'd'] = 'data2'
df.set_index(df['d'],inplace=True)
df_torg = df.loc[df.index.isin(['data1','data2'])]
df_torg.set_index(df_torg['d'],inplace=True)

Вот, что было и вот что хочу

mapping = {"cc": "data1", "aa": "data2"}

idx = list(mapping.keys())

res = df.query("data in @idx").reset_index().replace(mapping).set_index("data")

результат:

In [90]: res
Out[90]:
       N1  N2  N3
data
data2  12  12   5
data1  26  27  18
data2  23  31  20
data1  27  17  33
data2  22  18  28
data1  21  19  19


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

Использование модуля win32api решает данный вопрос
<code>
import win32api
import win32con

countMouseButtons = win32api.GetSystemMetrics(win32con.SM_CMOUSEBUTTONS)
print(countMouseButtons)
</code>


Брать по несколько элементов в списке в цикле Python
Имеется список изображений
<code>
['IMG_0023_475_30.tif', 'IMG_0023_550_20.tif',
'IMG_0023_670_30.tif', 'IMG_0023_715_10.tif',
'IMG_0023_840_20.tif', 'IMG_0024_475_30.tif',
'IMG_0024_550_20.tif', 'IMG_0024_670_30.tif',
'IMG_0024_715_10.tif', 'IMG_0024_840_20.tif',
'IMG_0025_475_30.tif', 'IMG_0025_550_20.tif',
'IMG_0025_670_30.tif', 'IMG_0025_715_10.tif',
'IMG_0025_840_20.tif', 'IMG_0026_475_30.tif',
'IMG_0026_550_20.tif', 'IMG_0026_670_30.tif',
'IMG_0026_715_10.tif', 'IMG_0026_840_20.tif']
</code>
Мне нужно в цикле брать по 5 элементов в списке, делать с ними некие операции и брать следующие.
Тоесть я беру первые 5 изображений, что-то с ними делаю. Потом беру следующие 5 и т.д.
Как брать по 5 элементов в списке?


Как поменять цвет в ячейке с помощью openpyxl
Мне нужно в существующем файле .xlsx поменять только цвет текста определенной ячейки. Использовал такой код:
<code>
import openpyxl as opx
wb = opx.load_workbook('pattern.xlsx')
ws = wb.active
ws["A3"].font = opx.styles.Font(color='0070C0')
wb.save('pattern.xlsx')
</code>
Но это кроме цвета меняет и все остальное - название шрифта, размер и т.д. на значения по умолчанию.
Подскажите, как оставить остальные параметры не тронутыми.

Разобрался! Чтобы поменять цвет шрифта, нужно указывать все параметры иначе они установятся в значения по умолчанию:

<openpyxl.styles.fonts.Font object>
Parameters:
name=None, charset=None, family=None, b=False, i=False, strike=None, outline=None, shadow=None, condense=None, color=None, extend=None, sz=None, u=None, vertAlign=None, scheme=None

В моем случае получилось так:

ws[f'A3'].font = opx.styles.Font(name='Arial Cyr', charset=204, family=2.0, b=True, color='0070C0', sz=8.0)


Как удалить елементы списка b из списка a. Python
<code>
a = [5, 6, 7, 8]
b = [5, 8, 9]
</code>

a = list(filter(lambda x: x not in b, a))


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

def printing(function):
    def inner(how, *args):
        result = function(how=how, *args)
        print('result =', result)
        return result
    return inner

@printing
def function(how=True, *args):
    if how == True:
        return [arg[::-1] for arg in args]
    else:
        return [arg for arg in args]

function(True, 'Тест', 'Тест2', 'Тест3', 'Тест4')
function(how=True, 'Тест', 'Тест2', 'Тест3', 'Тест4')
function(how=False, 'Тест', 'Тест2', 'Тест3', 'Тест4')

Выпадает:

SyntaxError: positional argument follows keyword argument

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

Позиционные аргументы в Python всегда должны идти до именованных (ошибка буквально говорит, что у вас позиционный параметр идет после именованного, что недопустимо). Поэтому, если вы хотите использовать параметр
how как именованный, передавайте его последним параметром (после
*args).
При этом, если вы будете передавать его как неименованный параметр, то он будет восприниматься как часть кортежа (
tuple) параметров
*args, его нужно вытащить из этого кортежа и передать отдельно.

def printing(function):
    def inner(*args, how=None):
        if how is None:
            how = args[-1]
            args = args[:-1]

        result = function(*args, how=how)
        print('result =', result)
        return result
    return inner

@printing
def function(*args, how=True):
    if how == True:
        return [arg[::-1] for arg in args]
    else:
        return [arg for arg in args]

function('Тест', 'Тест2', 'Тест3', 'Тест4', True)
function('Тест', 'Тест2', 'Тест3', 'Тест4', how=True)
function('Тест', 'Тест2', 'Тест3', 'Тест4', how=False)

Вывод:

result = ['тсеТ', '2тсеТ', '3тсеТ', '4тсеТ']
result = ['тсеТ', '2тсеТ', '3тсеТ', '4тсеТ']
result = ['Тест', 'Тест2', 'Тест3', 'Тест4']


Сколько раз одно бинарное дерево встречается во втором?
Дано два бинарных дерева. Надо посчитать, сколько раз первое дерево встречается во втором.
Например

   tree1 = Node ( Node ( None , None ), Node ( None , None ))
   tree2 = Node ( None , Node ( Node ( None , None ), Node ( None , None )))

   print ( count ( tree1 , tree2 )) # ответ 1

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

from collections import namedtuple
def count ( node1, node2 ):
  if not node1 and not node2:
    return 0
  elif not node1 or not node2:
    return 0
  elif (node2.left or node2.right) and (node1 == node2 or node1 in node2):
    return 1
  return count(node1, node2.left) + count(node1,node2.right)

Как посчитать все повторения? Вот к примеру в таком случае ответ должен быть 2.

tree1 = Node(left=Node(left=None, right=Node(left=None, right=None)), right=None)

tree2 = Node(left=Node(left=Node(left=None, right=Node(left=None, right=None)), right=None), right=Node(left=Node(left=None, right=Node(left=None, right=None)), right=None))

print(count(tree1,tree2)) # 2

Кучерявенькая рекурсия получилась :)
<code>
class Node:
    def __init__(self, left, right):
        self.right = right
        self.left = left
    def __str__(self):
        return f'Node({self.left}, {self.right})'

def count_same(sub, tree):
    def is_same(sub, tree):
        if sub is None:
            return tree is None

        return (tree is not None
            and is_same(sub.left, tree.left)
            and is_same(sub.right, tree.right))

    if sub is None:
        return (1 if tree is None
            else count_same(sub, tree.right) + count_same(sub, tree.left))

    if tree is None:
        return 0

    return (count_same(sub, tree.right)
        + count_same(sub, tree.left)
        + int(is_same(sub.left, tree.left) and is_same(sub.right, tree.right))
    )

tree1 = Node ( Node ( None , None ), Node ( None , None ))
tree2 = Node ( None , Node ( Node ( None , None ), Node ( None , None )))

res = count_same(tree1, tree2)
assert res == 1, f'assert {res} == 1'

tree1 = Node ( None , None )
tree2 = Node ( None , Node ( Node ( None , None ), Node ( None , None )))

res = count_same(tree1, tree2)
assert res == 2, f'assert {res} == 2'

tree1 = None
tree2 = Node ( None , Node ( Node ( None , None ), Node ( None , None )))

res = count_same(tree1, tree2)
assert res == 5, f'assert {res} == 5'

tree1 = Node ( Node ( None , None ), Node ( None , None ))
tree2 = Node ( Node ( None , None ), Node ( Node ( None , None ) , None ))

res = count_same(tree1, tree2)
assert res == 0, f'assert {res} == 0'
</code>


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

streak = np.array([3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 1, 2, 3], int)
arr    = np.array([4, 5, 5, 6, 9, 1, 4, 5, 2, 3, 7, 8, 9, 8, 4, 3], float)

Числа в
streak всегда больше нуля.
Задача cложить текущий элемент вектора
arr с одним из предыдущих из этого же вектора. Индекс предыдущего взять из вектора
streak.
В ответах приложил свое решение чтобы было понятнее. Решение рабочее, но не производительное т.к. в реальности векторы большие.
В результате должен получится вектор:

[nan nan nan 11. 14.  6.  9.  9.  6.  5.  9. 10. 11. 17. 13. 12.]

<code>
streak = [3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 1, 2, 3]
arr    = [4, 5, 5, 6, 9, 1, 4, 5, 2, 3, 7, 8, 9, 8, 4, 3]

ans = [None] * len(arr)
for i in range(len(arr)):
    ind = i - streak[i]
    if ind >= 0:
        ans[i] = arr[i] + arr[ind]

print(*ans)
</code>
Для numpy-массивов переписать - дело пары минут. Я в вас верю


Регистрация пользователей django
На сайте работает система контроля пользователей django-allauth. Проблемы со страницой регистрации.
Я не могу использовать форму, получаемую страницей регистрации по умолчанию, так как в неё очень сложно внедрить мои стили. Поэтому я пишу свою, код которой представлен ниже. Мне нужно, чтобы если не удалось зарегестрировать пользователя, он мог видеть проблему. Пока я использую {% if form.errors %}, но он не говорит, какая именно ошибка возникла. Как мне выводить причину отклонения регистрации более конкретно?
signup.html

    {% if form.errors %}

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

    {% endif %}

        <form action="{% url 'account_signup' %}" method="POST">
            {% csrf_token %}

                    <input type="text" class="text" name="username" autocomplete="off" id="login_id" required>
                    Логин

                    <input type="password" class="text" name="password1" id="password1_id" required>
                    Пароль

                    <input type="password" class="text  " name="password2" autocomplete="off" id="password2_id" required>
                    Повторите

                <input type="submit" id="btnsubmit">

                    Уже есть аккаунт?

Войдите.

        </form>

ты в шаблоне проверяешь
{% if form.errors %}, в нем находится словарь, в котором, хранится информация об ошибках формы в формате:

{
    'имя_поля_1': ['ошибка 1', 'ошибка 2', ...],
    'имя_поля_2': ['ошибка 1', 'ошибка 2', ...],
}

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


Читать данные с stderr subprocess.Popen

def record():
    command = 'ffmpeg -loglevel warning -hide_banner -y -f gdigrab -framerate 30 -i desktop output.mkv'
    command = subprocess.Popen(command, stdin=subprocess.PIPE)
    sleep(5)
    command.stdin.write('q'.encode('utf-8'))
    command.stdin.flush()
    command.wait()

У меня есть вот такая простенькая функция.
Она запускает команду, которая записывает экран, спит 5 секунд и останавливает команду.
В конце генерируется файл
output.mkv. В этот файл
ffmpeg кладёт видео с записью экрана.
Если я заменю
output.mkv, на
output.img, то
ffmpeg выдаст ошибку: 'Неверный формат выходного файла'
Как я могу читать
stderr, чтобы поймать эту ошибку, если она, конечно же, есть?

В ваш код достаточно добавить две фичи:

При создании процесса задать параметр
stderr конструктора
Popen равным
subprocess.PIPE,
И в отдельном потоке читать созданный файловый объект. Если ничего не прочитается, значит, ошибки не было.

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

import subprocess
import threading

failed = False

def read_stderr(stderr_pipe):
    "Sets global variable `failed` if stderr is not empty"
    global failed
    while True:
        try:
            smth = stderr_pipe.read(1)
            # Use readline if you want to parse error messages
            # smth = stderr_pipe.readline()
        except err:
            # reading failed - something went wrong with process construction
            return

        if len(smth) != 0:
            # smth is read from stderr
            failed = True
            return
        else:
            # the pipe is empty - the process terminated without writing to stderr
            pass
            return

def record():
    "Returns `True` if the process runs without errors and `False` otherwise."
    # command_line = ["ffmpeg", "-loglevel", "warning", "-hide_banner", "-y", "-f", "gdigrab", "-framerate", "30", "-i", "desktop", "output.mkv"]
    command_line = ["ls", "/no/such/file"]
    # for testing: successfull command
    # command_line = ["ls", "/bin/bash"]

    command = subprocess.Popen(command_line, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
    t = threading.Thread(target=read_stderr, args=(command.stderr,))
    t.start()

    # sleep(5)
    # command.stdin.write('q'.encode('utf-8'))
    command.stdin.flush()
    command.wait()

    t.join()
    global failed
    return not failed

success = record()
print("Success: ", success)

Для тестирования я использовал команды
ls /no/such/file и
ls /bin/bash. В первом случае вывод был

Success:  False

во втором

/bin/bash
Success:  True


Генерация строк из заданных символов и заданной начальной комбинацией
Нужно сгенерировать строки заданной длины из заданного алфавита.
С обычным декартовым произведением проблем нет,
itertools.product() прекрасно работает. Но вот как начать генерацию с заданной комбинации?

import itertools

symbols = 'abcdfghijk'
length = 5
start_string = 'dfgkj'  # Строка, с которой нужно начать

# Последовательная генерация всех вариантов
for line in itertools.product(symbols, repeat=length):
    print(*line, sep='')

UPD: длина алфавита и длина генерируемых строк может быть больше

Зная принцип обхода комбинаций, можно посчитать позицию для генератора. Дальше, применяя
islice, смещаем генератор.

import itertools

def find_pos(symbols, fstr):
    return sum(len(symbols) ** (len(fstr) - p) * symbols.index(s) for p, s in enumerate(fstr, 1))

symbols = 'abcdfghijk'
length = 5
start_string = 'dfgkj'

line_0 = ''
gen = itertools.product(symbols, repeat=length)
for line in itertools.islice(gen, find_pos(symbols, start_string), len(symbols) ** length):
    # print(*line, sep='')
    if not line_0:
        line_0 = ''.join(line)

assert(start_string == line_0)
print(line_0, ''.join(line))  # -> dfgkj kkkkk

P.S. Вывод каждой строки закомментировал, т.к. большой объем. Для проверки запоминаю первую строку, вывожу вместе с последней.


Что значит regexp в библиотеке PyTelegramBotAPI?
Искал в интернете - ничего не нашел. Возможно потому, что мой вопрос слишком глуп, но все-же: я не понимаю. Помогите, пожалуйста.
<code>
@bot.message_handler(regexp="SOME_REGEXP")
def handle_message(message):
    pass
</code>

Обрабатывать сообщение только если оно соответствует регулярке.


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

Золото:_ + диапазон чисел от 1000 до 10000

(фактически мне необходимо при выполнении условия одной строки вместе с ней выписать две выше)
<code>
import os
os.system('cls' if os.name == 'nt' else 'clear')
#select source file
a = open(input("Введите путь до файла обработки: "), "r")
#select destination file
b = open(input("Введите путь до файла записи: "), "w")
#переменная для проверки
copy = input("1:")
copy1 = input("2:")
copy2 = input("3:")
i = [1000, 10000]
x = range(1000, 10000)
p = copy2 + x
for line in a.readlines():
    if copy in line:
        b.write(line)
    if copy1 in line:
        b.write(line)
    if  in line:
        b.write(line)
    else:
        print("no")
    b.close
    a.close
</code>

если я правильно понял задачу
у тебя в первой строке находится условие 1
во второй строке условие 2
в третьей строке условие 3
и нужно выписывать те три строки у которых совпадают все три условия?
<code>
last_3_lines = []

for line in a.readlines():
    if len(last_3_lines ) == 3: # если уже есть 3 строки в найденном списке удаляем первую и начинаем новую проверку
        last_3_lines.pop(0)
    last_3_lines.append(line)
    if all(len(last_3_lines) == 3, last_3_lines[0] == copy, last_3_lines[1] == copy1, last_3_lines[2] == copy2):
        b.write(line)
        last_3_lines = [] # это на случай, если все условия будут равны между собой и одна строка попадала в вывод только однажды

# не забыть вынести закрытие файлов на окончание программы, а не делать это в цикле
b.close
a.close
</code>


сложить элементы списка python [закрыт]

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

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

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

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

Есть список песен группы Depeche Mode со временем звучания с точностью до долей минут
<code>
violator_songs_list = [
    ['World in My Eyes', 4.86],
    ['Sweetest Perfection', 4.43],
    ['Personal Jesus', 4.56],
    ['Halo', 4.9],
    ['Waiting for the Night', 6.07],
    ['Enjoy the Silence', 4.20],
    ['Policy of Truth', 4.76],
    ['Blue Dress', 4.29],
    ['Clean', 5.83],
]

# распечатайте общее время звучания трех песен: 'Halo', 'Enjoy the Silence' и 'Clean' в формате
#   Три песни звучат ХХХ минут
# Обратите внимание, что делать много вычислений внутри print() - плохой стиль.
# Лучше заранее вычислить необходимое, а затем в print(xxx, yyy, zzz)
</code>
TODO здесь ваш код
ума не приложу как это сделать

violator_songs_list = [
['World in My Eyes', 4.86],
['Sweetest Perfection', 4.43],
['Personal Jesus', 4.56],
['Halo', 4.9],
['Waiting for the Night', 6.07],
['Enjoy the Silence', 4.20],
['Policy of Truth', 4.76],
['Blue Dress', 4.29],
['Clean', 5.83],
]

def main():
    variable = 0
    for i in violator_songs_list:
        print(i[0])
        if i[0] == 'Halo':
            variable += i[1]
        elif i[0] == 'Enjoy the Silence':
            variable += i[1]
        elif i[0] == 'Clean':
            variable += i[1]
    print(f"Три песни звучат {variable} минут")

    # Ещё можно так но не уверен что правильно
    names = ['Halo', 'Clean','Enjoy the Silence']
    total = sum([l for  n, l in violator_songs_list if n in  names])
    print(f"Три песни звучат {total} минут")

if __name__ == '__main__':
    main()


Ошибка в opencv-python:AttributeError: partially initialized module 'cv2' has no attribute 'VideoCapture' (most likely due to a circular import)
у меня пишет ошибку:

AttributeError: partially initialized module 'cv2' has no attribute 'VideoCapture' (most likely due to a circular import)

Код:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('Video', frame)
    # cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

проблема в том что ваш файл называется
cv2.py поэтому он импортирует самого себя и возникает ошибка, это можно понять из этой строки.

most likely due to a circular import

что переводится как:

скорее всего из-за кругового импорта

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


Задачка по информатике 11 класс (средний балл) [закрыт]

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

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

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

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

Ученик 10 класса учился по математике без двоек, при этом его средний
годовой балл по предмету составил 4,2. Если бы у него было троек столько,
сколько он получил пятерок, четверок столько, сколько он получил троек, а
пятерок столько, сколько он получил четверок, то его средний годовой балл
составил бы 4,24. Сколько было четверок у ученика, если всего за год он
получил не более 110 оценок.
На выходе: одно число.

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

Пусть ученик получил X троек, Y четверок и Z пятерок, тогда средний балл у него был бы

(3X + 4Y + 5Z) / (X + Y + Z) = 4.2

Из условия задачи известно, что

Если бы у него было троек столько, сколько он получил пятерок,
четверок столько, сколько он получил троек, а пятерок столько, сколько
он получил четверок, то его средний годовой балл составил бы 4,24

т.е.

(3Z + 4X + 5Y) / (X + Y + Z) = 4.24

за год он получил не более 110 оценок.

т.е.

X + Y + Z <= 110

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


Изменить размер изображений Django после загрузки
У меня есть модель

upload_path = 'images'
upload_path_to_resize = 'images/resized'

class Images(models.Model):
    image = models.ImageField(upload_to=upload_path, blank=True, null=True)
    image_url = models.URLField(blank=True, null=True)
    image_resized = models.ImageField(upload_to=upload_path_to_resize,blank=True)
    width = models.PositiveIntegerField(null=True)
    heigth = models.PositiveIntegerField(null=True)

    def clean(self):
        if (self.image == None and self.image_url == None ) or (self.image != None and self.image_url != None ):
            raise ValidationError('Empty or both blanked')

    def get_absolute_url(self):
        return reverse('image_edit', args=[str(self.id)])

    def save(self):
        if self.image_url and not self.image:
            name = str(self.image_url).split('/')[-1]
            img = NamedTemporaryFile(delete=True)
            img.write(urlopen(self.image_url).read())
            img.flush()
            self.image.save(name, File(img))
            self.image_url = None
        super(Images, self).save()

    def resize(self, *args, **kwargs):
        super().save(*args, **kwargs)
        SIZE = self.width, self.heigth)
        if self.width != None or self.heigth !=None:
        pic = Image.open(self.image.path)
        pic.thumbnail(SIZE, Image.LANCZOS)
        pic.save(self.image_resized.path)

Метод изменения размера должен взять существующий файл из поля «ImageField», изменить его размер и загрузить в поле «image_resized», но по какой-то причине форма ResizedForm передает аргументы высоты и ширины модели, но ничего не происходит.

from django.forms import ModelForm
from .models import Images

class ImageForm(ModelForm):
    class Meta:
        model = Images
        fields = ['image', 'image_url']

class ResizedForm(ModelForm):
    class Meta:
        model = Images
        fields = ['width', 'heigth']

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

наверное как-то так
<code>
 def save(self):
    if self.image_url and not self.image:
        name = str(self.image_url).split('/')[-1]
        img = NamedTemporaryFile(delete=True)
        img.write(urlopen(self.image_url).read())
        img.flush()
        self.image.save(name, File(img))
        self.image_url = None
    if self.image and not self.image_resized:
        self.resize()
    return super(Images, self).save()

    def resize(self):
        if self.width and self.heigth:
            import os # лучше вынести этот импорт в начало файла
            original_name, original_ext = os.path.splitext(self.image.name)
            new_file_name = '{}_resized{}'.format(original_name, original_ext)
            new_size = self.width, self.heigth
            pic = Image.open(self.image.path)
            pic.thumbnail(new_size, Image.LANCZOS)
            pic.save(new_file_name)
            self.resized_image.name = os.path.basename(new_file_name)
</code>


Помогите составить цикл для расчёт границ интервалов
Нужно чтобы программа выводила список левых и правых границ заданного количества интервалов.
Я смог это написать, но нужно чтобы расчёт был в виде цикла. Пытался его составить, но у меня не получается.
Помогите.
sample1.csv
Пример кода:
<code>
import csv
import math

Sample=[]
with open("sample1.csv", encoding="ANSI") as V:
    SR=csv.reader(V, delimiter = ";")
    for row in SR:
        Sample.append(float(row[0]))
print(sorted(Sample))

aggregate=Sample

# Объём выборки
N=len(aggregate)
print("Объём выборки (N): ", N)

# Рекомендуемое кол-во интервалов группировки
m=1+(math.log10(N)/math.log10(2))
print("Рекомендуемое кол-во интервалов (m): ", "%.0f" % m)

# Наибольшее и наименьшее значение выборки
min_volue=min(aggregate)
max_volue=max(aggregate)
print("Наименьшее значение выборки (min volue): ", min_volue)
print("Наибольшее значение выборки (max volue): ", max_volue)

# Ввод кол-во интервалов группировки
kol_interval=int(input("Введите кол-во интервалов (kol_interval): "))

# Величина интервала
delta=((max_volue-min_volue)/kol_interval)
print("Величина интервала (delta): ", "%.0f" % delta)

c0=min_volue
c1=min_volue+1*delta
c2=min_volue+2*delta
c3=min_volue+3*delta
c4=min_volue+4*delta
c5=min_volue+5*delta
c6=min_volue+6*delta
c7=min_volue+7*delta
c8=min_volue+8*delta
print("1-й интервал: от ", "%.0f" % c0, "до ", "%.0f" % c1, "\n"
      "2-й интервал: от ", "%.0f" % c1, "до ", "%.0f" % c2, "\n"
      "3-й интервал: от ", "%.0f" % c2, "до ", "%.0f" % c3, "\n"
      "4-й интервал: от ", "%.0f" % c3, "до ", "%.0f" % c4, "\n"
      "5-й интервал: от ", "%.0f" % c4, "до ", "%.0f" % c5, "\n"
      "6-й интервал: от ", "%.0f" % c5, "до ", "%.0f" % c6, "\n"
      "7-й интервал: от ", "%.0f" % c6, "до ", "%.0f" % c7, "\n"
      "8-й интервал: от ", "%.0f" % c7, "до ", "%.0f" % c8)
</code>

import csv
import math

Sample=[]
with open("sample1.csv") as V:
    SR=csv.reader(V, delimiter = ";")
    for row in SR:
        Sample.append(float(row[0]))
print(sorted(Sample))

aggregate=Sample

# Объём выборки
N=len(aggregate)
print("Объём выборки (N): ", N)

# Рекомендуемое кол-во интервалов группировки
m=1+(math.log10(N)/math.log10(2))
print("Рекомендуемое кол-во интервалов (m): ", "%.0f" % m)

# Наибольшее и наименьшее значение выборки
min_volue=min(aggregate)
max_volue=max(aggregate)
print("Наименьшее значение выборки (min volue): ", min_volue)
print("Наибольшее значение выборки (max volue): ", max_volue)

# Ввод кол-во интервалов группировки
kol_interval=int(input("Введите кол-во интервалов (kol_interval): "))

# Величина интервала
delta=((max_volue-min_volue)/kol_interval)
print("Величина интервала (delta): ", "%.0f" % delta)

for i in range(8):
    c0 = min_volue + delta * i
    c1 = min_volue + delta * (i + 1)
    print(f"{i + 1}-й интервал: от {c0} до {c1}")