Утечка памяти в Python `threading`
При реализации многопоточности, используя
threading.Thread наблюдается утечка памяти. У кого-нибудь есть идеи, как с этим бороться?

Python 3.7.3 [GCC 8.3.0] linux Debian Stable
Тестовый код:

# Аккуратно!!! Течет память!!!
import itertools as itr
import threading
from queue import Queue
import gc

class SimpleThread(threading.Thread):
    def __init__(self, name, queue, result):
        super().__init__()
        self.queue = queue
        self.name = name
        self.result = result

    def run(self):
        while True:
            item = self.queue.get()
            self.result.append(set(item))
            self.queue.task_done()

class Calculate:
    def __init__(self, thread_cls, threads=16):
        self.result = []
        self.queue = Queue()
        for i in range(threads):
            t = thread_cls(f'№{i}',
                self.queue, self.result)
            t.setDaemon(True)
            t.start()

    def __call__(self, input_array):
        for i in input_array:
            self.queue.put(i)
        self.queue.join()
        return self

arr = list(itr.combinations(range(1, 30), 6))
while True:
    calc = Calculate(SimpleThread)
    calc(data)
    i = input('Нажмите `q` для выхода, или `Enter` для продолжения:')
    del calc.queue, calc.result, calc
    gc.collect()
    if i == 'q':
        break

Необходимо добавить способ остановки потоков, иначе у вас создаются потоки и остаются жить до завершения всего приложения. При этом каждый поток ссылается на очередь, тем самым не давая gc очистить память.
При этом принудительно gc.collect не надо вызывать.
Сильно не меняя ваш код, можно сделать так:
<code>
import itertools as itr
import threading
from queue import Queue, Empty
import time
import gc

class SimpleThread(threading.Thread):
    count = 0

    def __init__(self, name, queue, result):
        super().__init__()
        SimpleThread.count += 1
        self.queue = queue
        self.name = name
        self.result = result
        self.stop = False

    def run(self):
        while not self.stop:
            try:
                item = self.queue.get_nowait()
                self.result.append(set(item))
                self.queue.task_done()
            except Empty:
                time.sleep(0.1)
        SimpleThread.count -= 1

class Calculate:
    def __init__(self, thread_cls, nthreads=16):
        self.result = []
        self.queue = Queue()
        self.threads = []
        for i in range(nthreads):
            t = thread_cls(f'№{i}',
                self.queue, self.result)
            t.setDaemon(True)
            t.start()
            self.threads.append(t)

    def __call__(self, input_array):
        for i in input_array:
            self.queue.put(i)
        self.queue.join()
        return self

    def stop(self):
        for t in self.threads:
            t.stop = True
            t.join()

arr = list(itr.combinations(range(1, 30), 6))
while True:
    calc = Calculate(SimpleThread)
    calc(arr)
    calc.stop() # Если закоментировать будет утечка памяти.
    i = input('Нажмите `q` для выхода, или `Enter` для продолжения:')
    del calc.queue, calc.result, calc
    print("Threads = ", SimpleThread.count)
    gc.collect()
    if i == 'q':
        break
</code>


Проблема в работе python 3
Вчера захожу в командную строку в windows 7 (с помощью нее обычно запускаю файлы в python 3). Пишу "python" и cmd пишет, мол ""python" не является внутренней или внешней командой, исполняемой программой или пакетным файлом", до этого ставил галочку "add to path". Ладно, решил переустановить его. Сделал это, все работало хорошо. Сегодня та же ситуация. Даже если просто перезагрузить пк получается то же самое. Версия python 3.7.4. Помогите! Что делать?

Сейчас все работает хорошо. У меня был скачан еще один терминал Hyper, я его удалил, прочистил все остаточные файлы с помощью Ccleaner. Переустановил python в кастомный path, вроде все ок.


Как быстрее применить быструю функцию к длинному списку? В один поток, или в несколько?
Есть простая и быстрая функция, например:
set(), и длинный список, например:
list(itr.combinations(range(1, 30), 6)).
Как быстрее применить функцию к каждой строке списка, в один или несколько потоков?
Вопрос является частью ответа на: Переделка стандартного цикла for для поддержки параллельной обработки данных

Тест однопоточной обработки и многопоточного
map.

from multiprocessing.dummy import Pool
from timeit import default_timer as timer
import itertools as itr
import gc

data = list(itr.combinations(range(1, 30), 6))

def classic_map():
    return list(map(set, data))

def multithread_map():
    pool = Pool(16)  # Кол-во потоков == кол-ву потоков CPU.
    return pool.map(set, data)

for ex in (classic_map, multithread_map):
    time_start = timer()
    ex()
    time_delta = timer() - time_start
    print(ex.__name__, time_delta)
    del ex
    gc.collect()

Результат:

classic_map 0.7905314989574254
multithread_map 0.8719341289252043

Тест модуля threading:

from timeit import default_timer as timer
import itertools as itr
import threading
from queue import Queue
import gc

class Thread_ManyBatch(threading.Thread):
    def __init__(self, name, queue, result):
        super().__init__()
        self.queue = queue
        self.name = name
        self.result = result
        self.stop = False

    def run(self):
        while not self.stop:
            item = self.queue.get()
            for i in item:
                self.result.append(set(i))
            self.queue.task_done()

class Calculate:
    def __init__(self, threads):
        self.result = []
        self.queue = Queue()
        self.threads = []
        for i in range(threads):
            t = Thread_ManyBatch(f'№{i}',
                self.queue, self.result)
            t.setDaemon(True)
            t.start()
            self.threads.append(t)

    def __call__(self, input_array):
        for i in input_array:
            self.queue.put(i)
        self.queue.join()
        return self

    def __del__(self):
        for t in self.threads:
            t.stop = True
        for _ in self.threads:
            self.queue.put([])

def run_test(t, b):
    calc = Calculate(t)
    data = [arr[i:i+b] for i in range(0, len(arr), b)]
    time_start = timer()
    result = calc(data).result
    time_delta = timer() - time_start
    print(f'(Thread) Потоков: {t} Блок: {b} Время: {time_delta}')
    del data, result, calc

# Мой CPU имеет 16 потоков.
arr = list(itr.combinations(range(1, 30), 6))
conditions = [
    {'threads': 4, 'batch': 64},
    {'threads': 8, 'batch': 64},
    {'threads': 16, 'batch': 64},
    {'threads': 32, 'batch': 64},
    {'threads': 64, 'batch': 64},

    {'threads': 16, 'batch': 16},
    {'threads': 16, 'batch': 32},
    {'threads': 16, 'batch': 64},
    {'threads': 16, 'batch': 128},

    {'threads': 16, 'batch': len(arr)},

    {'threads': 16, 'batch': len(arr)//4},
    {'threads': 16, 'batch': len(arr)//8},
    {'threads': 16, 'batch': len(arr)//16},
    {'threads': 16, 'batch': len(arr)//32},
    {'threads': 16, 'batch': len(arr)//64},
    {'threads': 16, 'batch': len(arr)//128},
    {'threads': 16, 'batch': len(arr)//256},
    {'threads': 16, 'batch': len(arr)//512},
    {'threads': 32, 'batch': len(arr)//512},
]
for cond in conditions:
    t = cond['threads']
    b = cond['batch']
    gc.collect()
    run_test(t, b)

Результат:

(Thread) Потоков: 4 Блок: 64 Время: 1.3617786209797487
(Thread) Потоков: 8 Блок: 64 Время: 1.3240357339382172
(Thread) Потоков: 16 Блок: 64 Время: 1.2864610340911895
(Thread) Потоков: 32 Блок: 64 Время: 1.2982085599796847
(Thread) Потоков: 64 Блок: 64 Время: 1.3388550870586187
# Обратите внимание ^ Лучшее кол-во потоков = кол-ву потоков моего CPU (16).
(Thread) Потоков: 16 Блок: 16 Время: 2.04451086896006
(Thread) Потоков: 16 Блок: 32 Время: 1.6462758219568059
(Thread) Потоков: 16 Блок: 64 Время: 1.3170949750347063
(Thread) Потоков: 16 Блок: 128 Время: 1.2290826480602846
# Обратите внимание ^ Увеличение размера блока улучшает время.
(Thread) Потоков: 16 Блок: 475020 Время: 0.8684073160402477
# Обратите внимание ^ Размер блока = кол-ву элементов списка.
# По сути мы реализовали работу в один поток.
(Thread) Потоков: 16 Блок: 118755 Время: 1.0302920539397746
(Thread) Потоков: 16 Блок: 59377 Время: 1.0756338470382616
(Thread) Потоков: 16 Блок: 29688 Время: 1.0272350820014253
(Thread) Потоков: 16 Блок: 14844 Время: 0.9970859980676323
(Thread) Потоков: 16 Блок: 7422 Время: 1.0095931380055845
(Thread) Потоков: 16 Блок: 3711 Время: 0.9970878609456122
(Thread) Потоков: 16 Блок: 1855 Время: 1.02392076398246
(Thread) Потоков: 16 Блок: 927 Время: 1.1156460139900446
(Thread) Потоков: 32 Блок: 927 Время: 1.0031342359725386
# Обратите внимание ^ Уменьшение размера блока нам ничего не дает.

Итог:

Самый быстрый способ: классический однопоточный перебор
list.
Кол-во потоков должно равняться кол-ву потоков CPU.
Деление на блоки ухудшает время.

multiprocessing.dummy.Pool практически аналогичен
threading.

Почему так?
Все дело в том, что узким местом тут является доступ к памяти. Процессорного времени, необходимого для выполнения
set(), требуется слишком мало, чтобы полностью загрузить даже один поток моего процессора. В результате, хоть в один поток, хоть в 16 потоков, мой процессор простаивает ожидая очередной элемент списка из памяти.
Зачем тогда многопоточность?

Для вычислений. Данных может быть не много, но "математических" операций над каждым элементом надо сделать много.
Когда узкое место "ждет". Например получение данных из сети. Пока один поток ждет во время установки соединения, другой уже качает. Более того, пока один поток качает, другой уже обрабатывает полученные данные. Или пока один поток ждет пользователя, другой вычисляет в фоне. Но это все уже к асинхронности.

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


Удаление строки sqlite3
У меня есть таблица и две функции - для записи и удаление строки. Последняя не работает. Как её починить?
<code>
import sqlite3

connect = sqlite3.connect('filname.db', check_same_thread=False)
cursor = connect.cursor()
# cursor.execute('''CREATE TABLE users ('date', 'username', 'user_id')''')

def add_user(date, username, user_id):
    cursor.execute('''INSERT INTO users VALUES (?, ?, ?)''', (date, username, user_id))
    connect.commit()
    connect.close()

def delete_user(user_id):  # FIX IT
    cursor.execute('''DELETE FROM users WHERE user_id = ?''', (user_id))
    connect.commit()
    connect.close()
</code>

В качестве параметров ожидается кортеж, поэтому замените:

(user_id)

на:

(user_id,)

PS следующая команда поможет разобраться:

print(type((user_id)))


Как распарсить диалог?
Есть html  файл с диалогом двух пользователей. Как можно распарсить его, что бы на выходе получился json содержащий вопрос абонента А, ответ абонента Б. Примерно так

 {
     "абонент а сказал": ["привет"],
     "абонент б ответил": ["пока"]
    }

Пример html разметки

<!DOCTYPE html>
<html>

 <head>

  <meta charset="utf-8"/>
<title>Exported Data</title>
  <meta content="width=device-width, initial-scale=1.0" name="viewport"/>

  <link href="css/style.css" rel="stylesheet"/>

  <script src="js/script.js" type="text/javascript">

  </script>

 </head>

 <body onload="CheckLocation();">

  <div class="page_wrap">

   <div class="page_header">

    <div class="content">

     <div class="text bold">
Deleted Account
     </div>

    </div>

   </div>

   <div class="page_body chat_page">

    <div class="history">

     <div class="message service" id="message-1">

      <div class="body details">
16 May 2018
      </div>

     </div>

     <div class="message default clearfix" id="message21365">

      <div class="pull_left userpic_wrap">

       <div class="userpic userpic2" style="width: 42px; height: 42px">

        <div class="initials" style="line-height: 42px">
абонент а
        </div>

       </div>

      </div>

      <div class="body">

       <div class="pull_right date details" title="16.05.2018 20:21:39">
20:21
       </div>

       <div class="from_name">
абонент а
       </div>

       <div class="text">
ты?
       </div>

      </div>

     </div>

     <div class="message default clearfix" id="message21366">

      <div class="pull_left userpic_wrap">

       <div class="userpic userpic7" style="width: 42px; height: 42px">

        <div class="initials" style="line-height: 42px">

        </div>

       </div>

      </div>

      <div class="body">

       <div class="pull_right date details" title="16.05.2018 20:21:54">
20:21
       </div>

       <div class="from_name">
Deleted Account
       </div>

       <div class="text">
Я
       </div>

      </div>

     </div>

     <div class="message default clearfix joined" id="message21367">

      <div class="body">

       <div class="pull_right date details" title="16.05.2018 20:22:01">
20:22
       </div>

       <div class="text">
а может ты?
       </div>

      </div>

     </div>

     <div class="message default clearfix joined" id="message21368">

      <div class="body">

       <div class="pull_right date details" title="16.05.2018 20:22:02">
20:22
       </div>

       <div class="text">
а?
       </div>

      </div>

     </div>

     <div class="message default clearfix" id="message21369">

      <div class="pull_left userpic_wrap">

       <div class="userpic userpic2" style="width: 42px; height: 42px">

        <div class="initials" style="line-height: 42px">
абонент а
        </div>

       </div>

      </div>

      <div class="body">

       <div class="pull_right date details" title="16.05.2018 20:22:24">
20:22
       </div>

       <div class="from_name">
абонент а
       </div>

       <div class="text">
не
       </div>

      </div>

     </div>

Проблема заключается в том, что здесь нет такого формата
имя1: сообщение имя2: сообщение. Тут после
имя1 может быть 10  сообщений. Я сначала пробовал получить два масивал, один с именами другой с сообщениями а потом просто объединить их, но исходя из описаной выше проблемы, сообщений получается больше чем имен. Как быть в таком случае?
пример результата на основе html

 {
     "абонент а сказал": ["ты?"],
     "абонент б ответил": ["я а может ты? а?"]
    },{
     "абонент а сказал": ["не"],
     "абонент б ответил": ["тут сл. сообщение"]
    }

"
Json", который Вы привели, как пример ожидаемого результата, не валиден, поэтому я не стал его придерживаться и просто спарсил необходимые Вам данные, оставив задачу их форматирования и отображения на Вас.
К тому же, в
HTML нет никакого намёка на строку
абонент б.
Видимо, Вы имели в виду строки из
<div class="from_name">...</div>, поэтому я и брал их.
Пример:

from bs4 import BeautifulSoup
import re

def parse(html: str) -> list:
    soup = BeautifulSoup(html, 'lxml')

    res = []
    messages = soup.find_all('div', re.compile(r'message default'))
    for message in messages:
        tmp_from_name = message.find('div', {'class': 'from_name'})

        if tmp_from_name is not None:
            from_name = tmp_from_name.getText().strip()

        text = message.find('div', {'class': 'text'}).getText().strip()
        res.append({from_name: text})
    return res

if __name__ == '__main__':
    with open('index.html', encoding='UTF-8') as f:
        html = f.read()

    res = parse(html)
    print(res)

stdout:

[{'абонент а': 'ты?'}, {'Deleted Account': 'Я'}, {'Deleted Account': 'а может ты?'}, {'Deleted Account': 'а?'}, {'абонент а': 'не'}]


Быстрый способ применить простую функцию к длинному списку
Есть простая и быстрая функция, например:
set(), и длинный список, например:
list(itr.combinations(range(1, 30), 6)).
Не принимая в расчет время, потраченное на конвертирование исходных данных в другой тип объекта, в случае необходимости.
Какой самый быстрый способ применить функцию к каждой строке списка?
Вопрос является частью ответа на: Переделка стандартного цикла for для поддержки параллельной обработки данных

Следующий код позволит измерить скорость применения функции к
list,
np.array,
pd.DataFrame,
deque.

import itertools as itr
from collections import deque
from multiprocessing.dummy import Pool
import numpy as np
import pandas as pd
# Без вызова сборщика мусора,
# результат зависит от очередности вызовов.
import gc

lst = list(itr.combinations(range(1, 20), 6))
arr = np.array(lst)
df = pd.DataFrame(lst)
dq = deque(lst)

print('df for:')
gc.collect()
%timeit [set(i) for _, i in df.iterrows()]
gc.collect()
print('df apply:')
%timeit df.apply(set, axis=1)
gc.collect()
print('arr apply:')
%timeit np.apply_along_axis(set, axis=1, arr=arr)
gc.collect()
print('arr for:')
%timeit [set(i) for i in arr]
gc.collect()
print('lst multithread map:')
pool = Pool(16) # Кол-во потоков CPU.
%timeit pool.map(set, lst)
gc.collect()
print('batched lst multithread map:')
b = 10240
blst = [lst[i:i+b] for i in range(0, len(lst), b)]
pool = Pool(16)
%timeit pool.map(lambda x: [set(i) for i in x], blst)
gc.collect()
print('lst map:')
%timeit list(map(set, lst))
gc.collect()
print('deque for:')
%timeit [set(i) for i in dq]
gc.collect()
print('lst for:')
%timeit [set(i) for i in lst]
gc.collect()

Результат теста на моей системе:

df for:
1.55 s ± 20.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
df apply:
358 ms ± 8.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
arr apply:
113 ms ± 1.87 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
arr for:
52.4 ms ± 486 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
lst multithread map:
23.7 ms ± 716 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
batched lst multithread map:
23.5 ms ± 1.15 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
lst map:
16.4 ms ± 215 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
deque for:
16.5 ms ± 324 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
lst for:
16.3 ms ± 464 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Мои победители с средним результатом
16.4:

[set(i) for i in lst]

list(map(set, lst))

[set(i) for i in dq]


"Takes 1 positional argument but 2 were given" Принимает 1 аргумент, когда 2 были даны
Выдаёт неизвестную ошибку, как это исправить? (я новичок)
Ошибка:
BuildPath() takes 1 positional argument but 2 were given
Мой Код:
<code>
class Object:
    posX = 0;
    posY = 0;
    def __init__(self, posX, posY):
        self.posX = posX
        self.posY = posY
    class Bot(Object):
    def __init__(self, posX, posY):
        posY = Object.posY
        posX = Object.posX

    def BuildPath(targetPosition):
        x = targetPosition[0] - posX
        y = targetPosition[1] - posY
        print(targetPosition[1])

</code>

В данном случае не стоит добавлять один класс в другой.(Вы же хотите использовать наследование).И в методе buildPath пропущен ключевое слово self.
<code>
class Object:
    posX = 0;
    posY = 0;
    def __init__(self, posX, posY):
        self.posX = posX
        self.posY = posY
class Bot(Object):
    def __init__(self, posX, posY):
            self.posY = Object.posY
            self.posX = Object.posX

    def BuildPath(self,targetPosition):
            x = targetPosition[0] - self.posX
            y = targetPosition[1] - self.posY
            print(targetPosition[1])
obj=Object(1,2)
Bot=Bot(1,2)
Bot.BuildPath([4,5])
</code>


Вопрос по static method и class method

Хочу утвердиться правильно ли я понимаю static method и class method.
Если мы метод оборачиваем в декоратор
@staticmethod, то объявленный метод не будет относиться ни к классу в котором мы его объявили, и объекту к которого мы создали, вопрос значит ли это что я могу написать этот метод как функцию в области модуля?
Если обернуть метод в декоратор
@classmethod, то при вызове как я понимаю он будет влиять на все объекты созданные на основе этого класса. Ну например скажем есть поле count, который считает общее количество созданных объектов или я не так все понимаю?

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

class A:
    @staticmethod
    def method1():
        print('static method')

    @classmethod
    def method2(cls):
        print('class method', cls)

    def method3(self):
        print('regular method', self)

a = A()
a.method1() # static method
a.method2() # class method <class '__main__.A'>
a.method3() # regular method <__main__.A object at 0x7f5ebe7d6128>

В
method1 не будет передано ничего лишнего, в
method2 будут передан только класс соответствующий экземпляру (
A), а в
method3 - сам экземпляр (
a).
Так как первые два метода не привязаны к конкретному экземпляру, их также можно вызывать от имени класса.

A.method1() # static method
A.method2() # class method <class '__main__.A'>

Если попытаться таким образом вызвать
method3 это приведет к ошибке

A.method3() # TypeError: method3() missing 1 required positional argument: 'self'

В таком случае необходимо будет указать экземпляр явно

A.method3(a) # regular method <__main__.A object at 0x7f0f9cda10b8>

Если метод, декорированный
classmethod, будет унаследован, ему в качестве аргумента будет передан уже класс наследник

class B(A):
    pass

b = B()
b.method2() # class method <class '__main__.B'>
B.method2() # class method <class '__main__.B'>

Что отличает его от метода, декорированного
staticmethod, который ничего не знает о конкретном классе, от имени которого (или от имени экземпляра которого) его вызвали.
Upd
Например, есть класс

class A:
    def __init__(self, arg):
        self.arg = arg

    def __repr__(self):
        return f'{type(self).__name__}({self.arg!r})'

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

class A:
    _instances = []

    def __init__(self, arg):
        self.arg = arg
        self.get_instances().append(self)

    @staticmethod
    def get_instances():
        return A._instances

    def __repr__(self):
        return f'{type(self).__name__}({self.arg!r})'

A(1)
A('test')
A(1 == 0)
print(A.get_instances()) # [A(1), A('test'), A(False)]

Здесь
get_instances вызывается от имени экземпляра, это возможно благодаря декоратору
staticmethod. Можно было бы обойтись без него, и вручную вызвать метод от имени класса
type(self).get_instances(), но с декоратором код становится проще.
Проблемы начинаются, когда появляется класс наследник

class B(A):
    pass

B(None)
print(B.get_instances()) # [A(1), A('test'), A(False), B(None)]

B не имеет собственного списка экземпляров, и просто выводит вышестоящий. Туда же добавляются и экземпляры
B.
Перепишем решение, заменив список на словарь
(Класс, Список).

class A:
    _instances = {}

    def __init__(self, arg):
        self.arg = arg
        self.get_instances().append(self)

    @staticmethod
    def get_instances():
        return A._instances.setdefault(A, [])

    def __repr__(self):
        return f'{type(self).__name__}({self.arg!r})'

class B(A):
    @staticmethod
    def get_instances():
        return B._instances.setdefault(B, [])

A(1)
A('test')
A(1 == 0)
print(A.get_instances()) # [A(1), A('test'), A(False)]

B(None)
print(B.get_instances()) # [B(None)]

Теперь все работает, но в каждом потомке нужно переопределять метод
get_instances, это приводит к повторениям и увеличивает шанс допустить ошибку. Тут на помощь приходит
classmethod

class A:
    _instances = {}

    def __init__(self, arg):
        self.arg = arg
        self.get_instances().append(self)

    @classmethod
    def get_instances(cls):
        return cls._instances.setdefault(cls, [])

    def __repr__(self):
        return f'{type(self).__name__}({self.arg!r})'

class B(A):
    pass

A(1)
A('test')
A(1 == 0)
print(A.get_instances()) # [A(1), A('test'), A(False)]

B(None)
print(B.get_instances()) # [B(None)]

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


Как из байта D0 получился символ DCD0?
У меня есть файл, в имени которого есть болтающийся без пары байт
\xd0:

touch `echo -en 'test\xd0.txt'`

Когда я смотрю список файлов в каталоге через питон, он декодирует мне его в такую юникодную строку:

>>> os.listdir('.')
['test\udcd0.txt']

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

>>> open('test\udcd0.txt', 'r').read()
''  # (логичный результат для пустого файла)

Но вот, например, печатать её уже не даёт:

>>> print('test\udcd0.txt')
UnicodeEncodeError: 'utf-8' codec can't encode character '\udcd0' in position 4: surrogates not allowed

Вопрос: каким образом из
\xd0 получилось
\udcd0? Есть ли где-то чётко описанный алгоритм или это просто деталь реализации CPython? Могу ли я сам кодировать и декодировать такие битые строки подобным образом?

Для сравнения, listdir в Python 2, в котором все строки по умолчанию байтовые, выдаёт мне
'test\xd0.txt', никак не коверкая хранящееся на ФС имя файла.

Проблема в том что в разных местах разные умолчания для кодека. И это сделанно не просто так.
Тут нужно разобраться в природе символов.

code points in the range U+DC00–U+DFFF (1,024 code points) are known as low-surrogate code points.

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

insert a replacement character (�).

Самое интересное как одинокий символ перевелся. Из сишной
fstat притон получает байты. Во внутренней реализации используется замена на сурогаты. Это происходит внутри сишного кода, где поведение кодека установленно так:

>>> b"\xd0".decode('utf-8',errors='surrogateescape')
'\udcd0'

Это сделанно для того чтоб при обращению к файлу по имени не терялись байты в имени изз преобразования кодировки.
Функция
print же доработанна в соответствии со поведением по умолчанию питона:
errors='strict'
Вы должны определить что делать с несимволами.
Вывести текст без ошибок можно если добавить к кодеку опции
errors='replace'
С python2 такое не повторяется потому что строки в питоне смотрите не юникодные. Нет перекодирования - нет проблем.

python 2 : "" === b""
python 3 : "" === u""

PS.

open(b'a\320a','r') # работает
open(b'a\xd0a','r') # работает


Новые записи не появляются в БД после вставки
Сделал функцию, загрузки пользователей ВК из беседы в БД (SQLite). Одновременно работаю с vk_api.
Вот код, ошибок в консоли ни каких нету и в БД ничего не происходит, ни каких изменений.

def loadDB():

    import sqlite3

    Connect = sqlite3.connect("CaptureBotDB.db")
    Cursor = Connect.cursor()

    peer_id = event.obj.get('peer_id')
    chat = vk.messages.getConversationMembers(peer_id=peer_id)

    for members in chat['profiles']:

        first_name = str(members['first_name'])
        last_name = str(members['last_name'])
        user_id = str(members['id'])

        sql = """INSERT INTO ListMembers (first_name, last_name, user_id) VALUES (?,?,?)"""
        Cursor.execute(sql, (str(first_name), str(last_name), str(user_id)))

Проверил для начала вод этот кусок кода, работает ли вовсе:

        first_name = str(members['first_name'])
        last_name = str(members['last_name'])
        user_id = str(members['id'])

        print(str(first_name) + str(last_name) + str(user_id))

Всё выводит: (Это список пользователей беседы)

СтепанЗеленин154845243
UserGames434495547
KarlRendal539995337

Видимо, что-то не так я сделал с частью SQLite. Что не так?

Изменения надо зафиксировать:
<code>
Connect.commit()
</code>


Как найти и изменить значение в БД? SQLite
Работаю с БД SQLite. Дополнительно работаю с ботом в ВКонтакте. Так вот, я не могу понять, как сделать команду, которая будет изменять значение с БД по поиску другого значения. То есть, есть команда для бота - /ник, где есть два значения. /ник
[Пользователь], где пользователь это имя, которое находится в БД. И /ник
[Пользователь]
[Ник], где ник это значение, которое нужно указать для изменения в БД. Вот, как я это всё представил:

first_name   last_name   nickname
Вася         Петров      NULL

Пишу команду для бота: /ник Вася (либо Петров) VasyaPetrov

first_name   last_name   nickname
Вася         Петров      VasyaPetrov

Подскажите пожалуйста, как это сделать.

если вопрос в том как изменить существующую запись в SQLite DB, то это можно сделать при помощи
UPDATE ...:

conn = sqlite3.connect("CaptureBotDB.db")
cur = conn.cursor()

sql = """UPDATE ListMembers SET nickname = %s WHERE id = %s"""
cur.execute(sql, (nicjname, record_id))

PS менять записи для всех
Вась или для всех
Петровых опасно. Представьте что в вашей БД 30 записей с фамилией Петров - для всех этих записей вы перепишете поле
nickname. Поэтому в таких случаях лучше всегда иметь уникальный столбец - первичный ключ (
identifier или сокращенно
id) и обращаться к записям по
id.


Группировка функций внутри классов
Я хочу сгруппировать несколько методов в разные группы. Все это я хочу содержать в одном большом классе
Что я пробовал сделать:

class MyClass:
    def __init__(self, name):
        self.name = name
    class Group1:
        def method1():
            print('I am method 1 from group Group1, my best friend is ' + name)
    class Group2:
        def method1():
            print('I am method 1 from group Group2, my best friend is ' + name)
        def method2():
            print('I am method 2 from group Group2, my best friend is ' + name)

Эта идея сама по себе оказалась неправильной, проблема этого ужасного способа была в том, что name нельзя было передать из класса-родителя в вложенные классы
Хотел я сделать что-то вроде группировки методов как в vk-requests, там вызов методов реализован так:

bot.messages.send()

То есть все методы имеют собственную группу. Поискав решение в исходниках того проекта, я мало что смог понять и пришел за разнеснениями сюда
Пока, все что я пытался придумать для того, чтобы это осуществилось, закончилось провалом. Могу ли я сделать то, что я хочу и каким образом, если это так?

В данном случае используется композиция
<code>
# Класс Messages может находиться вообще в другом модуле,
# не нужно его вставлять в сам класс, где он используется
class Messages:
    def __init__(self, arg):
        self.arg = arg

    def send(self):
        print("Message sent", self.arg)

class MyClass:
    def __init__(self, arg):
        self.arg = arg
        # Ниже создаем экземпляр класса Messages и записываем в поле объекта
        self.messages = Messages(arg)

me = MyClass(123)
me.messages.send()  # Вывод: Message sent 123
</code>
Как видим, класс внутрь другого класса вставлять не нужно.
К прочтению: Наследование, композиция, агрегация
По поводу vk-requests - можно найти проект на гитхабе и посмотреть как все устроено внутри.


Как оценить сложность модели нейронной сети
Есть две модели для классификации изображений кошек и собак.
Могу ли я как-нибудь оценить сложность этих моделей?
<code>
import tensorflow as tf
import numpy as np
import shutil
import os
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Conv2D, MaxPooling2D
from tensorflow.python.keras.layers import Activation, Dropout, Flatten, Dense
from tensorflow.python.keras.preprocessing.image import load_img
from tensorflow.python.keras.preprocessing.image import img_to_array

# Каталог с набором данных
data_dir = 'C:/Users/Mi/Desktop/Machine learning/train_cats_vs_dogs/train/'
# Каталог с данными для обучения
train_dir = 'C:/Users/Mi/Desktop/Machine learning/train_cats_vs_dogs/traini/'
# Каталог с данными для проверки
val_dir = 'C:/Users/Mi/Desktop/Machine learning/train_cats_vs_dogs/val/'
# Каталог с данными для тестирования
test_dir = 'C:/Users/Mi/Desktop/Machine learning/train_cats_vs_dogs/test/'
# Часть набора данных для тестирования
test_data_portion = 0.15
# Часть набора данных для проверки
val_data_portion = 0.15
# Количество элементов данных в одном классе
nb_images = 12500
# Размеры изображения
img_width, img_height = 150, 150
# Размерность тензора на основе изображения для входных данных в нейронную сеть
# backend Tensorflow, channels_last
input_shape = (img_width, img_height, 3)
# Количество эпох
epochs = 10
# Размер мини-выборки
batch_size = 16
# Количество изображений для обучения
nb_train_samples = 17500
# Количество изображений для проверки
nb_validation_samples = 3750
# Количество изображений для тестирования
nb_test_samples = 3750
# Архитектура модели нейронной сети
import time
# Время работы блока алгоритма
class Profiler(object):
    def __enter__(self):
        self._startTime = time.time()

    def __exit__(self, type, value, traceback):
        print("Elapsed time: {:.3f} sec".format(time.time() - self._startTime))

# Сверточная нейронная сеть
with Profiler() as p:
    model = Sequential()
    model.add(Conv2D(32, (3, 3), input_shape=input_shape))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
    datagen = ImageDataGenerator(rescale=1. / 255)
    train_generator = datagen.flow_from_directory(
        train_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')
    val_generator = datagen.flow_from_directory(
        val_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')
    test_generator = datagen.flow_from_directory(
        test_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')
    model.fit_generator(
        train_generator,
        steps_per_epoch=nb_train_samples // batch_size,
        epochs=epochs,
        validation_data=val_generator,
        validation_steps=nb_validation_samples // batch_size)
# Проверка модели на тестовых данных
    scores = model.evaluate_generator(test_generator, nb_test_samples // batch_size)
    print("Точность на тестовых данных: %.2f%%" % (scores[1]*100))

# Полносвязная нейронная сеть
with Profiler() as p:
    model1 = Sequential()
    model1.add(Flatten(input_shape=input_shape))
    model1.add(Dense(32))
    model1.add(Activation('relu'))
    model1.add(Dense(32))
    model1.add(Activation('relu'))
    model1.add(Dense(64))
    model1.add(Activation('relu'))
    model1.add(Dense(64))
    model1.add(Activation('relu'))
    model1.add(Dropout(0.5))
    model1.add(Dense(1))
    model1.add(Activation('sigmoid'))
    model1.compile(loss='binary_crossentropy',
                  optimizer='sgd',
                  metrics=['accuracy'])
    datagen = ImageDataGenerator(rescale=1. / 255)
    train_generator = datagen.flow_from_directory(
        train_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')
    val_generator = datagen.flow_from_directory(
        val_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')
    test_generator = datagen.flow_from_directory(
        test_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='binary')
    model1.fit_generator(
        train_generator,
        steps_per_epoch=nb_train_samples // batch_size,
        epochs=epochs,
        validation_data=val_generator,
        validation_steps=nb_validation_samples // batch_size)
    scores = model1.evaluate_generator(test_generator, nb_test_samples // batch_size)
    print("Точность на тестовых данных: %.2f%%" % (scores[1]*100))
# Тестирование модели на картинке пользователя
classes=['dog','cat']
img = load_img('z.jpg', target_size=(150, 150))
# Преобразование картинки в вектор
x =img_to_array(img)
x = x.reshape(1,150,150,3).astype('float')
x /= 255
# Применение к вектору сверточной нейронной сети
with Profiler() as p:
    pred = model.predict(x)
    pred = np.around(pred)
    print(classes[int(pred[0][0])])
# Применение к вектору полносвязной нейронной сети
with Profiler() as p:
    pred1=model1.predict(x)
    pred1 = np.around(pred1)
    print(classes[int(pred1[0][0])])
</code>


Python Как удалить из файла все строки с 1 символом?
После того как пропарсил сайт с помощью Scrapy у меня получился файл в который как то попали пустые строки и запятые

'url1'
запятая
'url5'

Вопрос - как удалить все строки с 1 символом(запятой в данном случае) что бы вышло

'url1'

'url2'
?

for line in open('file.txt'):
    if len(line) == 1:
        print() # если нужна пустая строка, иначе заменить на pass
    else:
        print(line)


Как достать ID из упоминания? vk_api
Не пойму, как достать ID из упоминания. Взялся за команду
!kick. Работает она таким способом:

!kick ID пользователя, но я хочу сделать так, чтобы данная команда работала вот так:
!kick @user <<< !kick [id0|user].
'@' - Упомянуть пользователя в беседе.
Говорили использовать регулярные выражения, но не понимаю, как. Помогите пожалуйста решить, данный вопрос. Для меня, так сказать, это важно.
Код:

if request[0:5] == "!кик " and user_id in admin:

     vk.messages.removeChatUser(chat_id=chat_id, user_id=request[5:])

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

import re

string = '!kick [id123456|user]'
user_id = re.findall(r'!kick \[id(\d*)\|.*]', string)[0]

print(user_id)

stdout:

123456


Передать в Class импортируемого модуля переменные
Есть модуль, который я импортирую,например:

import module_name

В самом модуле класс:

my_class:
    some_var = my_var
    do_something()

есть переменная, например:

my_var = 777

Как мне из моего кода передать в класс модуля нужную мне переменную
my_var?

class MyClass:
    def __init__(self, my_var):
        self.some_var = my_var
        print(self.some_var)
        #do_something()

my_var = 777

myClass = MyClass(my_var)
777

print(myClass.some_var)
777

модуль импортируется из другого файла

main.py

from module_name import MyClass

my_var = 777

myClass = MyClass(my_var)

print(myClass.some_var)

module_name.py

class MyClass:
    def __init__(self, my_var):
        self.some_var = my_var
        print(self.some_var)
        #do_something()


Занесение данных в sqlite с помощью функции
Пытался создать функцию с 3-мя аргументами, для занесения их в таблицу. Ошибку ловлю такую:

line 9, in add_user
    c.execute('''INSERT INTO users VALUES (date_time, username, user_id)''', (date_time, username, user_id))
sqlite3.OperationalError: no such column: date_time

Что я сделал не так и  как это можно исправить?

# -*- coding: utf-8 -*-
import sqlite3

conn = sqlite3.connect('name.db')
c = conn.cursor()

def add_user(date_time, username, user_id):
    c.execute('''INSERT INTO users VALUES (date_time, username, user_id)''')
    conn.commit()
    conn.close()

date_time = '2006-01-05'
username = 'Admin'
user_id = 'oivb1381y319iu2bvi'
add_user(date_time, username, user_id)

Помоему кавычка лишняя в запросе
было:

c.execute('''INSERT INTO users VALUES (date_time,'username, user_id)''', (date_time, username, user_id))

поменять:

c.execute('''INSERT INTO users(date_time,username, user_id) VALUES (date_time,username, user_id)''', (date_time, username, user_id))

ps: добавил название колонок в запрос


Прогнозирование временных рядов SARIMAX statsmodels в Python
Для прогнозирования временного ряда я использую модель SARIMAX. Строю модель, сохраняю рассчитанные коэффициенты и пытаюсь применить на новом множестве. Я считаю, что предобученная модель SARIMAX с параметрами
order=(1, 1, 1),
seasonal_order=(1, 1, 1, 1) для прогнозирования должна использовать 5 последних значений ряда. Однако пример ниже показывает, что она использует более 50 исторических значений для прогноза. Подскажите, пожалуйста, почему так?
Пример

from statsmodels.tsa.statespace.sarimax import SARIMAX

X = [1.0, 3.0, 5.0, 8.0, 2.0, 3.0, 2.0, 1.0, 4.0, 5.0, 9.0, 2.0, 3.0, 1.0, 2.0, 3.0, 6.0, 8.0, 3.0, 3.0, 1.0, 2.0, 6.0, 10.0, 16.0, 4.0, 6.0, 4.0, 2.0, 6.0, 10.0, 16.0, 4.0, 6.0, 4.0, 3.0, 7.0, 11.0, 17.0, 5.0, 5.0, 3.0, 3.0, 7.0, 16.0, 17.0, 5.0, 5.0, 3.0, 4.0, 9.0, 18.0, 24.0, 7.0, 7.0, 6.0, 2.0, 3.0, 6.0, 8.0, 3.0, 3.0, 1.0, 2.0, 6.0, 10.0, 16.0, 4.0, 6.0, 4.0, 2.0, 6.0, 10.0, 16.0, 4.0, 6.0, 4.0, 3.0, 7.0, 11.0, 17.0, 5.0, 5.0, 3.0, 3.0, 7.0, 16.0, 17.0, 5.0, 5.0, 3.0, 4.0, 9.0, 18.0, 24.0, 7.0, 7.0, 6.0]

train = X[:-1]
model = SARIMAX(train, order=(1, 1, 1), seasonal_order=(1, 1, 1, 1))
model_fit = model.fit(disp=False)
modelB = SARIMAX(train[-50:], order=(1, 1, 1), seasonal_order=(1, 1, 1, 1))
resB = modelB.smooth(model_fit.params)
y = model_fit.forecast()
y2 = resB.forecast()

print(y, y2)

Результат
y = 8.34461063,
y2 = 8.19208365. Я ожидала, что
y == y2, но это не так. Объясните, пожалуйста, почему?
P.S. Я знаю, что проблема в расчете скользящей средней. Т.е. модель с параметрами
order=(1, 1, 0),
seasonal_order=(1, 1, 0, 1) для прогноза будет использовать 4 последних значения ряда. А исходная модель (см. пример) почему-то требует более 50 одинаковых значений на хвосте.

модель зависит не только от коэффициентов модели SARIMA, но и от шума epsilon_t.  Хотя формально каждый член ряда зависит от шума 4-х предыдущих членов ряда, шум четырех предыдущих высчитывается по ещё предыдущим и так до самого начала. Соответственно у модели есть еще один скрытый параметр - длинна окна для расчета шума.


Как создавать архивы при помощи модуля zipfile?
Я начинающий python программист.
Я не могу понять, как создавать архивы при помощи модуля zipfile?
Объясните пожалуйста (если несложно, добавьте пример в виде программы)

from zipfile import ZipFile

with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('as.py')


Как очистить dict не полностью, а только значения в ключах?
Хотел узнать как очистить значения в ключах в dict, не удаляя от туда ключи. Методом clear не получиться, так как он очистит полностью.

Не совсем понятно, что означает «очистить», но вот так можно присвоить ключам пустую строку:
<code>
for key in dictionary:
    dictionary[key] = ""
</code>


Парсинг HTML файла
у меня есть html документ, в котором записаны результаты матчей по теннису.
Из данного html документа мне нужно получить названия лиг и имена игроков, которые играют в данной лиге.
Проблема в том, что названия лиг и информация по матчам находятся в отдельных блоках html кода.
Ожидаемый результат вывода:

------------------------
ATP - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Тиафо Ф. (Сша)
Бублик А. (Каз)
------------------------
ATP - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Эдмунд К. (Вел)
Харрис Дж. (Южн)
------------------------
ITF - ОДИНОЧНЫЙ РАЗРЯД
------------------------

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

from bs4 import BeautifulSoup
import codecs

f = codecs.open("html_score.html", 'r', 'utf-8') # читаем код html из файла
html = f.read() # записываем его в переменную

soup = BeautifulSoup(html, "lxml")

list_matchs = soup.find_all("div", {"title":"Подробности матча!"}) # получаем все матчи
list_ligs = soup.find_all("div", {"class":"event__header"}) # получаем все родительские лиги матчей

# Перебор родительских лиг
for ligs in list_ligs:

    name_lig = ligs.find("span", {"class":"event__title--type"}) # получаем название лиги

    print(name_lig.text)

# Перебор матчей
for match in list_matchs:

    name_player = match.find_all("div", {"class":"event__participant"}) # получаем название матча
    name_player_one = name_player[0].text
    name_player_two = name_player[1].text

    print(name_player_one)
    print(name_player_two)

Данные берутся из общей папки, из документа html. Я не нашел каких-то зависимостей между лигами и матчами, по-этому не знаю, как решить данную проблему.
Прошу помощи с кодом =) Очень хочется разобраться, как можно решить данную задачу.
Вот тот самый
HTML:

<div class="sportName tennis">
  <div class="event__header">
    <div class="event__check"></div>
    <div class="icon--flag event__title fl_3473162">
      <div class="event__titleBox"><span class="event__title--type">ATP - ОДИНОЧНЫЙ РАЗРЯД</span><span class="event__title--name" title="Вашингтон (США), хард">Вашингтон (США), хард</span></div><span class="toggleMyLeague 2_9011_rgTHIK74"></span>
    </div><a href="#" class="event__info active">Сетка</a>
    <div class="event__expander icon--expander collapse" title="Скрыть все игры этого турнира!"></div>
  </div>
  <div id="g_2_4QWoo2eA" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Тиафо Ф. (Сша)</div>
    <div class="event__participant event__participant--away">Бублик А. (Каз)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">0</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">1</div>
    <div class="event__part event__part--home event__part--2">7<sup class="event__part--ex">7</sup></div>
    <div class="event__part event__part--away event__part--2">6<sup class="event__part--ex">5</sup></div>
  </div>
  <div id="g_2_jBAbIc3G" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Эдмунд К. (Вел)</div>
    <div class="event__participant event__participant--away">Харрис Дж. (Южн)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">0</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">1</div>
    <div class="event__part event__part--home event__part--2">6</div>
    <div class="event__part event__part--away event__part--2">4</div>
  </div>
  <div id="g_2_dpTOvnbg" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home">Рублёв А. (Рос)</div>
    <div class="event__participant event__participant--away fontBold">Гоёвчик П. (Гер)</div>
    <div class="event__score event__score--home">1</div>
    <div class="event__score event__score--away">2</div>
    <div class="event__part event__part--home event__part--1">6<sup class="event__part--ex">6</sup></div>
    <div class="event__part event__part--away event__part--1">7<sup class="event__part--ex">8</sup></div>
    <div class="event__part event__part--home event__part--2">6</div>
    <div class="event__part event__part--away event__part--2">4</div>
    <div class="event__part event__part--home event__part--3">6<sup class="event__part--ex">2</sup></div>
    <div class="event__part event__part--away event__part--3">7<sup class="event__part--ex">7</sup></div>
  </div>
  <div id="g_2_0G2PXiLg" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Цонга Ж. (Фра)</div>
    <div class="event__participant event__participant--away">Хачанов К. (Рос)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">1</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">4</div>
    <div class="event__part event__part--home event__part--2">2</div>
    <div class="event__part event__part--away event__part--2">6</div>
    <div class="event__part event__part--home event__part--3">7</div>
    <div class="event__part event__part--away event__part--3">5</div>
  </div>
  <div class="event__header">
    <div class="event__check"></div>
    <div class="icon--flag event__title fl_3473162">
      <div class="event__titleBox"><span class="event__title--type">ITF - ОДИНОЧНЫЙ РАЗРЯД</span><span class="event__title--name" title="Китцбюэль (Австрия), грунт">Китцбюэль (Австрия), грунт</span>
      </div><span class="toggleMyLeague 2_9011_84SxvsCb"></span>
    </div><a href="#" class="event__info active">Сетка</a>
    <div class="event__expander icon--expander collapse" title="Скрыть все игры этого турнира!"></div>
  </div>
  <div id="g_2_CQt8DEGe" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Шарди Ж. (Фра)</div>
    <div class="event__participant event__participant--away">Лайович Д. (Сер)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">1</div>
    <div class="event__part event__part--home event__part--1">3</div>
    <div class="event__part event__part--away event__part--1">6</div>
    <div class="event__part event__part--home event__part--2">6</div>
    <div class="event__part event__part--away event__part--2">4</div>
    <div class="event__part event__part--home event__part--3">6</div>
    <div class="event__part event__part--away event__part--3">3</div>
  </div>
  <div id="g_2_vemj9V4F" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Рууд К. (Нор)</div>
    <div class="event__participant event__participant--away">Бахингер М. (Гер)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">0</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">4</div>
    <div class="event__part event__part--home event__part--2">7<sup class="event__part--ex">7</sup></div>
    <div class="event__part event__part--away event__part--2">6<sup class="event__part--ex">3</sup></div>
  </div>
  <div id="g_2_biQ8fzxI" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Рамос А. (Исп)</div>
    <div class="event__participant event__participant--away">Муньяр Х. (Исп)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">0</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">2</div>
    <div class="event__part event__part--home event__part--2">6</div>
    <div class="event__part event__part--away event__part--2">3</div>
  </div>
  <div id="g_2_C6xo8uB5" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home">Новак Д. (Авт)</div>
    <div class="event__participant event__participant--away fontBold">Куэвас П. (Уру)</div>
    <div class="event__score event__score--home">1</div>
    <div class="event__score event__score--away">2</div>
    <div class="event__part event__part--home event__part--1">7<sup class="event__part--ex">7</sup></div>
    <div class="event__part event__part--away event__part--1">6<sup class="event__part--ex">1</sup></div>
    <div class="event__part event__part--home event__part--2">0</div>
    <div class="event__part event__part--away event__part--2">6</div>
    <div class="event__part event__part--home event__part--3">2</div>
    <div class="event__part event__part--away event__part--3">6</div>
  </div>
  <div class="event__header">
    <div class="event__check"></div>
    <div class="icon--flag event__title fl_3473162">
      <div class="event__titleBox"><span class="event__title--type">ЧЕЛЕНДЖЕР - ОДИНОЧНЫЙ РАЗРЯД</span><span class="event__title--name" title="Лос Кабос (Мексика), хард">Лос Кабос (Мексика), хард</span></div>
      <span class="toggleMyLeague 2_9011_88suDyRE"></span>
    </div><a href="#" class="event__info active">Сетка</a>
    <div class="event__expander icon--expander collapse" title="Скрыть все игры этого турнира!"></div>
  </div>
  <div id="g_2_pKU5M2Ya" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home">Типсаревич Я. (Сер)</div>
    <div class="event__participant event__participant--away fontBold">Албот Р. (Мол)</div>
    <div class="event__score event__score--home">1</div>
    <div class="event__score event__score--away">2</div>
    <div class="event__part event__part--home event__part--1">5</div>
    <div class="event__part event__part--away event__part--1">7</div>
    <div class="event__part event__part--home event__part--2">6</div>
    <div class="event__part event__part--away event__part--2">2</div>
    <div class="event__part event__part--home event__part--3">0</div>
    <div class="event__part event__part--away event__part--3">6</div>
  </div>
  <div id="g_2_bqpBJ0II" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home">Гарин К. (Чил)</div>
    <div class="event__participant event__participant--away fontBold">Лондеро Х. И. (Арг)</div>
    <div class="event__score event__score--home">1</div>
    <div class="event__score event__score--away">2</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">3</div>
    <div class="event__part event__part--home event__part--2">2</div>
    <div class="event__part event__part--away event__part--2">6</div>
    <div class="event__part event__part--home event__part--3">3</div>
    <div class="event__part event__part--away event__part--3">6</div>
  </div>
  <div id="g_2_6TV1NrJg" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Дэниел Т. (Япо)</div>
    <div class="event__participant event__participant--away">Сандгрен Т. (Сша)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">0</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">2</div>
    <div class="event__part event__part--home event__part--2">6</div>
    <div class="event__part event__part--away event__part--2">0</div>
  </div>
  <div class="event__header">
    <div class="event__check"></div>
    <div class="icon--flag event__title fl_3473164">
      <div class="event__titleBox"><span class="event__title--type">WTA - ОДИНОЧНЫЙ РАЗРЯД</span><span class="event__title--name" title="Вашингтон (США), хард">Вашингтон (США), хард</span></div><span class="toggleMyLeague 2_9012_xnxlobHB"></span>
    </div><a href="#" class="event__info active">Сетка</a>
    <div class="event__expander icon--expander collapse" title="Скрыть все игры этого турнира!"></div>
  </div>
  <div id="g_2_KIfatMzg" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home fontBold">Дияс З. (Каз)</div>
    <div class="event__participant event__participant--away">Gauff C. (Сша)</div>
    <div class="event__score event__score--home">2</div>
    <div class="event__score event__score--away">0</div>
    <div class="event__part event__part--home event__part--1">6</div>
    <div class="event__part event__part--away event__part--1">4</div>
    <div class="event__part event__part--home event__part--2">6</div>
    <div class="event__part event__part--away event__part--2">2</div>
  </div>
  <div id="g_2_tSees2Ln" title="Подробности матча!" class="event__match event__match--twoLine">
    <div class="event__check"></div>
    <div class="event__stage">Завершен</div>
    <div class="event__participant event__participant--home">Викери С. (Сша)</div>
    <div class="event__participant event__participant--away fontBold">Джорджи К. (Ита)</div>
    <div class="event__score event__score--home">0</div>
    <div class="event__score event__score--away">2</div>
    <div class="event__part event__part--home event__part--1">2</div>
    <div class="event__part event__part--away event__part--1">6</div>
    <div class="event__part event__part--home event__part--2">5</div>
    <div class="event__part event__part--away event__part--2">7</div>
  </div>
</div>

Нужные Вам элементы, а именно лига и её матчи, находятся на одном уровне в
DOM.
Благодаря этому, их можно легко перебирать, используя метод
find_next_sibling.
Данный метод возвращает следующий указанный элемент, находящийся на том же уровне.
Осталось лишь различить элементы, которые возвращаются методом, на принадлежность к лиге или матчу.
Это довольно легко сделать с помощью проверки атрибута
class.
В итоге у меня получилась функция
parse, которая возвращает список словарей вида:

[
    {
        'league': 'ATP - ОДИНОЧНЫЙ РАЗРЯД',
        'participants': [
            'Тиафо Ф. (Сша)',
            'Бублик А. (Каз)'
        ]
    },
    {
        'league': 'WTA - ОДИНОЧНЫЙ РАЗРЯД',
        'participants': [
            'Викери С. (Сша)',
            'Джорджи К. (Ита)'
        ]
    }
]

Код:

from bs4 import BeautifulSoup

def parse(html: str) -> list:
    soup = BeautifulSoup(html, 'lxml')

    matches = []
    sibling = soup.find('div', {'class': 'event__header'})
    while sibling:
        if sibling['class'] == ['event__header']:
            title = sibling.find('span', {'class': 'event__title--type'}).getText()
        else:
            participant_1 = sibling.find('div', {'class': 'event__participant'})
            participant_2 = participant_1.find_next_sibling('div')
            matches.append({'league': title, 'participants': [participant_1.getText(), participant_2.getText()]})

        sibling = sibling.find_next_sibling('div')

    return matches

if __name__ == '__main__':
    with open('page.html', encoding='utf-8') as f:
        html = f.read()

    matches = parse(html)

    for match in matches:
        print(
            f"------------------------\n"
            f"{match['league']}\n"
            f"------------------------\n"
            f"{match['participants'][0]}\n"
            f"{match['participants'][1]}"
        )

stdout:

------------------------
ATP - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Тиафо Ф. (Сша)
Бублик А. (Каз)
------------------------
ATP - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Эдмунд К. (Вел)
Харрис Дж. (Южн)
------------------------
ATP - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Рублёв А. (Рос)
Гоёвчик П. (Гер)
------------------------
ATP - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Цонга Ж. (Фра)
Хачанов К. (Рос)
------------------------
ITF - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Шарди Ж. (Фра)
Лайович Д. (Сер)
------------------------
ITF - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Рууд К. (Нор)
Бахингер М. (Гер)
------------------------
ITF - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Рамос А. (Исп)
Муньяр Х. (Исп)
------------------------
ITF - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Новак Д. (Авт)
Куэвас П. (Уру)
------------------------
ЧЕЛЕНДЖЕР - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Типсаревич Я. (Сер)
Албот Р. (Мол)
------------------------
ЧЕЛЕНДЖЕР - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Гарин К. (Чил)
Лондеро Х. И. (Арг)
------------------------
ЧЕЛЕНДЖЕР - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Дэниел Т. (Япо)
Сандгрен Т. (Сша)
------------------------
WTA - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Дияс З. (Каз)
Gauff C. (Сша)
------------------------
WTA - ОДИНОЧНЫЙ РАЗРЯД
------------------------
Викери С. (Сша)
Джорджи К. (Ита)


Анализ кортежа по трем величинам
Есть кортеж

data = [['Id-a', '№1', 2.0], ['Id-b', '№1', 4.0], ['Id-b', '№2', 3.0],
['Id-a', '№1', 6.0], ['Id-a', '№2', 2.0], ['Id-c', '№1', 9.0],
['Id-b', '№2', 1.0], ['Id-c', '№2', 7.0], ['Id-b', '№2', 5.0], ['Id-c', '№1', 2.0]]

Id, принадлежность к группе и число. Необходимо сложить числа в одинаковых группах и Id и вывести в следующем виде:

['Id-a', '№1', 8.0]
['Id-a', '№2', 2.0]
['Id-b', '№1', 4.0]
['Id-b', '№2', 9.0]
['Id-c', '№1', 11.0]
['Id-c', '№2', 7.0]]

Получилось суммировать значения только по Id:

# создаю список id
id=[]
for r in data:
    id.append(r[0])
# суммирую числа по id
res =[]
for k in set(id):
    summ = 0
    for s in data:
        if k==s[0]:
            summ = summ + s[2]
            t = [k, summ]
    res.append(t)

print (res)
# [['Id-a', 10.0], ['Id-b', 13.0], ['Id-c', 18.0]]

Как дополнить код, чтобы суммировать числа по Id и группам?

Воспользуйтесь itertools.groupby():
<code>
In [42]: from itertools import groupby

In [43]: res = [[c[0], c[1], sum(z[2] for z in g)]
                for c,g in groupby(sorted(data), key=lambda x: x[:2])]

In [44]: res
Out[44]:
[['Id-a', '№1', 8.0],
 ['Id-a', '№2', 2.0],
 ['Id-b', '№1', 4.0],
 ['Id-b', '№2', 9.0],
 ['Id-c', '№1', 11.0],
 ['Id-c', '№2', 7.0]]
</code>


Как достать данные из скобок?
Работаю с БД SQLite. При запросе даются данные, но они в скобках.
Kак мне достать данные из скобок? Ну или, как их убрать, эти скобки?
<code>
def listMembers():

    import sqlite3

    Connect = sqlite3.connect("CaptureBotDB.db")
    Cursor = Connect.cursor()

    mess = 'Список пользователей беседы:\n\n'

    for row in Cursor.execute("SELECT first_name, last_name FROM ListMembers"):

        mb = row
        mess += str(mb) + '\n'

    vk.messages.send(
        chat_id=chat_id,
        message=mess,
    )
</code>

Пример:

conn = sqlite3.connect("CaptureBotDB.db")
cur = conn.cursor()

cur.execute("SELECT first_name, last_name FROM ListMembers")

for first, last in cur.fetchall():
     print(f"first_name:\t{first}\tlast_name:\t{last}")

first_name:     Max     last_name:      Mustermann
first_name:     John    last_name:      Doe
first_name:     Иван    last_name:      Иванов

cur.fetchall() возвращает список кортежей. Соответственно можно также обрабатывать его так:

for row in cur.fetchall():
     print(f"first_name:\t{row[0]}\tlast_name:\t{row[1]}")


Получение и суммирование Timedelta
Дано: список пар числовых значений, в котором значение
[0] означает индекс в таблице, с которого начинается некий процесс, а индекс
[1]- индекс конца процесса. Этим индексам, конечно, соответствует запись в столбце
['Время']
Задача: 1) получить
timedelta-объект равный времени между
Timestamp индекса
[1] и
[0]
2) Получить сумму таких
timedelta - то есть выяснить суммарное время некоего процесса.
Желаемый результат примерно описан в документации:

import datetime
import pandas as pd
import numpy as np

dti = pd.to_datetime(['1/1/2018',
                     np.datetime64('2018-01-01'),datetime.datetime(2018, 1, 1)])
dti = pd.date_range('2018-01-01', periods=10, freq='4H')
dti = dti.tz_localize('UTC')
t1 = dti[3:5]-dti[1:3]
t2 = t1
print(type(t1))
sum(t1,datetime.timedelta())

>>> <class 'pandas.core.indexes.timedeltas.TimedeltaIndex'>
Timedelta('0 days 16:00:00')

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

def all_pattern_times(data, conditions, eps):
    # total_time - принимает значение, равное разности
    # времени последнего и первого замера

    total_time = data['Время'].iloc[-1]-data['Время'].iloc[0]
    print(total_time, type(total_time))

    # обход идет по количеству интересующих процессов:....
    for condition1, condition2 in list(zip(conditions['conditions1'], conditions['conditions2'])):
        # Список с парами индексов, обозначающих начало и конец проявления конкретного процесса, он приходит из другой функции
        times = np.array(pattern_time(data, condition1, condition2, eps))
        try:
             print(data['Время'].iloc[times[3:5, 1]]-data['Время'].iloc[times[3:5, 0]] , type(data['Время'].iloc[times[3, 0]]))
           # print(sum(data['Время'][times[:, 1]] - data['Время'][times[:, 0]],datetime.timedelta()))
            out.append(round(sum(data['Время'].iloc[times[:, 1]] - data['Время'].iloc[times[:, 0]],datetime.timedelta()) / total_time * 100, 2))
        except IndexError:
            out.append(0)
    return out

И вот какой результат:

202 days 00:00:00 <class 'pandas._libs.tslibs.timedeltas.Timedelta'>
6151   NaT
6172   NaT
6554   NaT
6568   NaT
Name: Время, dtype: timedelta64[ns] <class 'pandas._libs.tslibs.timestamps.Timestamp'>
7500   NaT
7525   NaT
8173   NaT
8178   NaT
Name: Время, dtype: timedelta64[ns] <class 'pandas._libs.tslibs.timestamps.Timestamp'>
1737   NaT
2572   NaT
2874   NaT
2969   NaT
Name: Время, dtype: timedelta64[ns] <class 'pandas._libs.tslibs.timestamps.Timestamp'>
12562   NaT
12574   NaT
12857   NaT
13110   NaT
Name: Время, dtype: timedelta64[ns] <class 'pandas._libs.tslibs.timestamps.Timestamp'>

Я капитально зарылся в типах переменных, С единичными индексами типа
data['Время'].iloc[times[4, 1]] - data['Время'].iloc[times[4, 0]] все работает, а со срезами уже нет.
В результате хочу поделить сумму временных отрезков, когда проявлялся процесс, на общее время работы оборудования. Но не могу сумму этих временных отрезков

Пример данных (data):
            x1            x2                  x3                   Время  \
0          0.0           0.0                 65.51 2018-12-01 00:00:00.000
1          1.0           1.0                 65.49 2018-12-01 00:15:00.000
2          2.0           2.0                   NaN 2018-12-01 00:25:33.000
3          3.0           3.0                 65.44 2018-12-01 00:29:59.997
4          4.0           4.0                 65.37 2018-12-01 00:45:00.000
5          5.0           5.0                   NaN 2018-12-01 00:48:04.997
6          6.0           6.0                 65.35 2018-12-01 01:00:00.000
7          7.0           7.0                   NaN 2018-12-01 01:06:06.000
8          8.0           8.0                 65.29 2018-12-01 01:14:59.997
9          9.0           9.0                 65.20 2018-12-01 01:30:00.000
10        10.0          10.0                   NaN 2018-12-01 01:34:58.000
11        11.0          11.0                 65.14 2018-12-01 01:45:00.000
12        12.0          12.0                   NaN 2018-12-01 01:55:21.997
13        13.0          13.0                 65.09 2018-12-01 01:59:59.997
14        14.0          14.0                 65.05 2018-12-01 02:15:00.000
15        15.0          15.0                   NaN 2018-12-01 02:16:22.000
16        16.0          16.0                 65.01 2018-12-01 02:30:00.000
17        17.0          17.0                   NaN 2018-12-01 02:36:18.000
18        18.0          18.0                 64.97 2018-12-01 02:44:59.997
19        19.0          19.0                   NaN 2018-12-01 02:55:12.000

                          x4                  x5                 x6  \
0                      28.36                 NaN              28.14
1                      28.26                 NaN              28.16
2                        NaN                 NaN                NaN
3                      28.27                 NaN              28.16
4                      28.34                 NaN              28.13
5                        NaN                 NaN                NaN
6                      28.46                 NaN              28.12
7                        NaN                 NaN                NaN
8                      28.81                 NaN              28.51
9                      28.69                 NaN              28.55
10                       NaN                 NaN                NaN
11                     28.55                 NaN              28.51
12                       NaN                 NaN                NaN
13                     28.55                 NaN              28.48
14                     28.76                 NaN              28.55
15                       NaN                 NaN                NaN
16                     28.64                 NaN              28.56
17                       NaN                 NaN                NaN
18                     28.75                 NaN              28.56
19                       NaN                 NaN                NaN

                       x7        x8              x9           x10   x11  \
0               27.052355      ост.             NaN           NaN   NaN
1               26.938015       NaN             NaN           NaN   NaN
2               26.910000       NaN             NaN           NaN   NaN
3               26.945633       NaN             NaN           NaN   NaN
4               26.983747       NaN             NaN           NaN   NaN
5               27.050000       NaN             NaN           NaN   NaN
6               27.117147       NaN             NaN           NaN   NaN
7               27.260000       NaN             NaN           NaN   NaN
8               27.433487       NaN             NaN           NaN   NaN
9               27.292465       NaN             NaN           NaN   NaN
10              27.390000       NaN             NaN           NaN   NaN
11              27.235298       NaN             NaN           NaN   NaN
12              27.080000       NaN             NaN           NaN   NaN
13              27.231483       NaN             NaN           NaN   NaN
14              27.448730       NaN             NaN           NaN   NaN
15              27.470000       NaN             NaN           NaN   NaN
16              27.334389       NaN             NaN           NaN   NaN
17              27.300000       NaN             NaN           NaN   NaN
18              27.406807       NaN             NaN           NaN   NaN
19              27.300000       NaN             NaN           NaN   NaN

           x12    x13      x14
0          NaN    0          0
1          NaN    0          0
2          NaN    0          0
3          NaN    0          0
4          NaN    0          0
5          NaN    0          0
6          NaN    0          0
7          NaN    0          0
8          NaN    0          0
9          NaN    0          0
10         NaN    0          0
11         NaN    0          0
12         NaN    0          0
13         NaN    0          0
14         NaN    0          0
15         NaN    0          0
16         NaN    0          0
17         NaN    0          0
18         NaN    0          0
19         NaN    0          0

Список пар индексов начала и конца (times):

[[ 1  3]
 [ 5  6]
 [9  10]
 [15 17]
 [18 19]]


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

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

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

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

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

Тяготею к самообучению при помощи различных книг и интерактива. Мне 20 лет, образование средне-специальное юридическое; начинаю, как и многие, с языка python, хотел бы стать back end разработчиком. Собственно, вопрос - смогу ли я вообще дойти до стадии собеседования, где смог бы показать свои компетенции , если эйчар не увидит у меня сертификатов с курсов, высшего образования или хотя бы образования c технической направленностью? Стоит ли получать такое формальное подтверждение чтобы войти в it? Всем спасибо

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

Сможете. Для работодателя главное, что Вы умеете делать. Да и не в каждой конторе хватают звёзды с неба.
Другое дело, что с профильным образованием шансы получить хорошую работу намного выше. Да и работать будет проще. Всё-таки образование даёт системные знания, плюс многое из того, что Вам в процессе учёбы будут говорить не доступно для тех, кто полностью полагается на самообучение. Просто в большинстве книг и тем более видеокурсов нет даже отсылок к этим вещам, хотя это фундаментальные вещи без которых делать серьёзные проекты ой как тяжело.
Также не стоит забывать, что в процессе обучения (обычно в ВУЗе или колледже) может быть организована практика, на которой можно получить пусть начальный, но всё же навык участия в реальном проекте.
Кроме того корочка как бы там ни было говорит о том, что Вы в профессии уже не случайный человек. Без неё в глазах HR Вы будете просто очередным человеком с улицы. Со всеми вытекающими отсюда последствиями.
Да Вы и сами рано или поздно почувствуете, что при прочих равных, Вам не будет хватать самых обычных "институтских" знаний.


Почему RF модель показала точность 0%?
Имеется фрейм
Составлен некоторый код обработки данных и обучена модель.
Обучающая выборка дает некоторый результат, тестовая выборка дает 0%.
<code>
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy.stats import norm
from sklearn.preprocessing import StandardScaler
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
get_ipython().run_line_magic('matplotlib', 'inline')

# In[34]:

df_train = pd.read_csv('D:\___/train.csv')

# In[35]:

df_train.info()
df_train.columns

# In[36]:

fig, ax = plt.subplots(figsize=(15,15))

sns.heatmap(df_train.corr(), cmap= sns.color_palette(palette="RdBu"),linewidths=0.5,annot=False, ax=ax)

# In[37]:

df_train.corr

# In[38]:

df_train['SalePrice'].describe()

# In[39]:

sns.distplot(df_train['SalePrice']);

# In[40]:

print("Skewness: %f" % df_train['SalePrice'].skew())
print("Kurtosis: %f" % df_train['SalePrice'].kurt())

# In[41]:

var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));

# In[42]:

var = 'TotalBsmtSF'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));

# In[43]:

var = 'OverallQual'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
f, ax = plt.subplots(figsize=(8, 6))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);

# In[44]:

fig, ax = plt.subplots(figsize=(15,15))

corrmat = df_train.corr()
k = 16 #number of variables for heatmap
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(df_train[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 16}, yticklabels=cols.values, xticklabels=cols.values, ax=ax)
plt.show()

# In[45]:

sns.set()
cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
sns.pairplot(df_train[cols], size = 2.5)
plt.show();

# In[46]:

total = df_train.isnull().sum().sort_values(ascending=False)
percent = (df_train.isnull().sum()/df_train.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
missing_data.head(20)

# In[47]:

df_train = df_train.drop((missing_data[missing_data['Total'] > 1]).index,1)
df_train = df_train.drop(df_train.loc[df_train['Electrical'].isnull()].index)
df_train.isnull().sum().max()

# In[48]:

saleprice_scaled = StandardScaler().fit_transform(df_train['SalePrice'][:,np.newaxis]);
low_range = saleprice_scaled[saleprice_scaled[:,0].argsort()][:10]
high_range= saleprice_scaled[saleprice_scaled[:,0].argsort()][-10:]
print('outer range (low) of the distribution:')
print(low_range)
print('\nouter range (high) of the distribution:')
print(high_range)

# In[49]:

var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));

# In[50]:

df_train.sort_values(by = 'GrLivArea', ascending = False)[:2]

# In[51]:

df_train = df_train.drop(df_train[df_train['Id'] == 1299].index)
df_train = df_train.drop(df_train[df_train['Id'] == 524].index)

# In[52]:

var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));

# In[53]:

var = 'TotalBsmtSF'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));

# In[54]:

sns.distplot(df_train['SalePrice'], fit=norm);
fig = plt.figure()

# In[55]:

res = stats.probplot(df_train['SalePrice'], plot=plt)

# In[56]:

df_train['SalePrice'] = np.log(df_train['SalePrice'])

# In[57]:

sns.distplot(df_train['SalePrice'], fit=norm);
fig = plt.figure()

# In[58]:

res = stats.probplot(df_train['SalePrice'], plot=plt)

# In[59]:

df_train['HasBsmt'] = pd.Series(len(df_train['TotalBsmtSF']), index=df_train.index)
df_train['HasBsmt'] = 0
df_train.loc[df_train['TotalBsmtSF']>0,'HasBsmt'] = 1

# In[60]:

df_train.loc[df_train['HasBsmt']==1,'TotalBsmtSF'] = np.log(df_train['TotalBsmtSF'])

# In[61]:

sns.distplot(df_train[df_train['TotalBsmtSF']>0]['TotalBsmtSF'], fit=norm);
fig = plt.figure()
res = stats.probplot(df_train[df_train['TotalBsmtSF']>0]['TotalBsmtSF'], plot=plt)

# In[62]:

df_train.info()

# In[70]:

    data_features = df_train.drop("Id", axis = 1)
X, y = df_train.drop (["SalePrice"], axis = 1), df_train["SalePrice"]
FF = pd.get_dummies(X)

# In[76]:

# In[80]:

from sklearn.model_selection import train_test_split

# In[92]:

Xnp = np.array(FF)
ynp = np.array(y)
X_train, X_test, y_train, y_test = train_test_split (Xnp, ynp, test_size=0.5)
print(FF.shape, X_train.shape, X_test.shape)
print(y.shape, y_train.shape, y_test.shape)

# In[90]:

from sklearn import preprocessing

lab_enc = preprocessing.LabelEncoder() #выдавало ValueError: Unknown label type: ‘continuous’
tse = lab_enc.fit_transform(y_train)

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit (X_train, tse)

# In[91]:

print ("Train accuracy:", (model.predict(X_train) == tse).mean())
print ("Val accuracy:", (model.predict(X_test) == y_test).mean())
</code>

Похоже проблема в том, что вы пытаетесь использовать алгоритм классификации (которые предсказывают дискретные значения) для предсказания непрерывных данных (таких как цена).
Для таких задач надо использовать один из алгоритмов регрессии.


Почему True != False => False
Написал простой код с функцией исключающего или, которая возвращает значение bool.
<code>
def xor(x, y):
    return x != y

if xor(bool(input()), bool(input())):
    print(1)
else:
    print(0)
</code>
При этом значение функции всегда False
Но например 1 != 0, должно выйти True
Почему так происходит и чего я не понимаю?

Если хотите работать с числами, то конвертируйте значения
input() в числа:

def xor(x, y):
    return x != y

if xor(bool(int(input())), bool(int(input()))):
    print(1)
else:
    print(0)

Преобразование непустой строки к
bool всегда даёт
True. А вот преобразование к
bool числа выдаст
False, если будет передан
0.
Если же Вы хотите подавать на вход для сравнения чистые строки, уберите преобразование к
bool.


Импорт класса из модуля
Написал класс, импортирую его в другой Python файл. Однако после импорта в результате выдается
<class '__example__.ExampleClass'>. Как его правильно обозначить, чтобы вывод был корректным.
Пример класса:

class Alpha(object):

    def __init__(self):
       self.cross()

    def cross(self):
       print('Hello World')

if __name__ == '__main__':
    attribute = Alpha()

Импорт:

 import __example__ as ex

 print(ex.Alpha)

Результат:

<class '__example__.ExampleClass'>

Если я всё правильно понял в вопросе, автор хочет, чтобы сработал метод
__init__ класса. Для этого необходимо создать объект.

import __example__ as ex

obj = ex.Alpha()

Однако хотелось бы заметить, что строка, выводимая при создании объекта (т.е. при срабатывании метода
__init__), отнюдь не является содержимым класса (если закрыть глаза на сомнительность самого термина). Чтобы наделить класс, а точнее его объект, каким-либо "содержимым", стоит, по крайней мере, определить его свойство. Я бы сделал это как-то так:

class Alpha(object):

    content = 'Hello world'

    def get_content(self):
        return content

Тогда второй файл выглядел бы так:

import __example__ as ex

obj = ex.Alpha()

print(obj.get_content())


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

<code>
Product.object.filter(filter_seasons and Q(season__in=filter_seasons) or Q())
# или
res = Product.objects.all()
if form.cleaned_data['filtered_seasons']:
    res = res.filter(season__in=form.cleaned_data['filtered_seasons'])
</code>

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


Присвоение в python
я новичок в
python. Увидел такой код:
a, b = c
Что это значит? Я знаю что поменять местами это a, b = b, a. А что значит то, что я написал?

a, b = b, a

Семантически эквивалентно следующей записи

(a, b) = (b, a)

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

c = (b, a)
a, b = c

что очень приблизительно соответствует следующей последовательности действий

c = (b, a)
a = c[0]
b = c[1]

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

>>> [*a, (b, *c)] = (1, 2, 3, (4, 5, 6))
>>> a
[1, 2, 3]
>>> b
4
>>> c
[5, 6]


Объединить заголовки столбцов в pandas
Есть условная таблица которую экспортирую из pandas в excel. Выглядит она примерно так:
Возможно ли в pandas объединить только названия столбцов по типу. Чтобы при экспорте в excel она выглядела таким образом?


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

Ввод: 1 Для начала огляжусь (99) подойду к двери (117).

Вывод:1 Для начала огляжусь хххх подойдук двери ххххх.

pagetext = re.sub('\([\d]*\)','x', pagetext)

Заменяет весь блок на один символ.

Вместо текста для замены можно указать функцию, это даст большую свободу действий
<code>
pagetext = re.sub(r'\(\d+\)', lambda match: 'x' * len(match.group()), pagetext)
</code>


NLTK stoplist удаляет не все слова
Возникла проблема при тематическом моделирование. Из исходного текста требуется удалить лишние слова. Для этих целей использую nltk и его корпус brown следующим образом:

from nltk.corpus import brown
stop_words= nltk.corpus.stopwords.words('russian')
newStopWords = ['это', 'ты', 'просто']
stop_words.extend(newStopWords)

Все работает и добавленные мною слова удаляются из итогового мешка слов, но некоторые слова он в упор пропускает! Слово "такой" самое частое слово, которое есть в тексте и он не хочет его удалять. Это слово есть в основном корпусе, также я пробовал его добавлять отдельно, но оно все равно остается. Это не единственное проблемное слово. Из примера выше, слова "это" и "просто" отлично удалились из текста, а слово "ты" осталось.
Удаление слов и символов происходит следующим образом:

word=nltk.word_tokenize(text)
word_ws=[w.lower() for w in word if w.isalpha()]
word_w=[w for w in word_ws if w not in stop_words]
lem = mystem . lemmatize ((' ').join(word_w))
lema=[w for w in lem if w.isalpha() and len(w)>1]
freq=nltk.FreqDist(lema)

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

Переменная text:
@igoralexandrovich83 а ты такой? Что твоя советь позволяет тебе гонять без правил?
И что тут такого ? Такой ор
Вытянул передний привод
@romchi_k 100%
@potapovv.a 🤦🏾♂

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

Не могу воспроизвести описанное поведение.
Пример:

text = """@igoralexandrovich83 а ты такой? Что твоя советь позволяет тебе гонять без правил?
И что тут такого ? Такой ор
Вытянул передний привод
@romchi_k 100%
@potapovv.a 🤦🏾♂"""

word=nltk.word_tokenize(text)
word_ws=[w.lower() for w in word if w.isalpha()]
word_w=[w for w in word_ws if w not in stop_words]

результат:

In [75]: word_w
Out[75]:
['твоя',
 'советь',
 'позволяет',
 'тебе',
 'гонять',
 'правил',
 'такого',
 'ор',
 'вытянул',
 'передний',
 'привод']

Как видно из примера, все стоп-слова были удалены.


Как реализовать эту программу в Python-е? [закрыт]

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

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

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

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

Дан набор из N неотрицательных целых чисел, меньших 1000. Для каждого числа вычисляется сумма цифр его десятичной записи. Необходимо определить, какая сумма цифр чаще всего встречается у чисел этого набора. Если таких сумм несколько, нужно вывести наименьшую из них. Напишите эффективную по времени и по памяти программу для решения этой задачи. Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз. Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает одного килобайта и не увеличивается с ростом N.
Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и по памяти, — 4 балла.
Максимальная оценка за правильную программу, эффективную только по времени или только по памяти, — 3 балла.
Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, — 2 балла.
Вы можете сдать одну или две программы решения задачи. Если Вы сдадите две программы, каждая из них будет оцениваться независимо от другой, итоговой станет бо́льшая из двух оценок. Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.

Ну что же вы? Разбивайте задачу на части и пишите код для каждой из них.

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

def digit_sum(number: str) -> int:
    return sum(map(int, number))

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

Находим количества всех сумм:

def get_counts(numbers: List[str]) -> List[int]:
    counts = [0] * 28
    for v in numbers:
        counts[digit_sum(v)] += 1
    return counts

Т.к на входе числа менее тысячи, то наибольшая сумма = 9+9+9, наименьшая 0, итого 28 возможных вариантов, каждому из которых соответствует своя позиция в списке, а в значении хранится количество соответствующих сумм.
Далее выбираем наиболее частую сумму с наименьшим значением:

def min_most_freq(counts: List[int]) -> int:
    best_i = -1
    best_v = -1
    for i, v in enumerate(counts):
        if v > best_v:
            best_i, best_v = i, v
    return best_i

Если таких сумм несколько, нужно вывести наименьшую из них.

Это достигается тем, что алгоритм обрабатывает значения от меньших к большим, а новые суммы с частотой, равной текущей наибольшей, отвергаются.

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

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

Пример:

from typing import List

...
# 3 функции выше
...

counts = get_counts(['314', '101', '242', '271', '200', '123', '345', '999'])
print(counts)
result = min_most_freq(counts)
print(result)


Возврат выбранных значений из диалогового окна Toplevel в поле listbox основного окна Tkinter
Пишу небольшой GUI для обработки данных, появилась задача из списка значений, представленного в поле
result_listbox окна
Toplevel()
вернуть выделенные данные в
listbox главного окна интерфейса.

import tkinter as tk
from tkinter import ttk

search_result = [1, 2, 3, 4, 5, 6, 7, 8, 9]

class Toplevel(object):

     def __init__(self, parent, search_result):
        self.toplevel = tk.Toplevel(parent)
        self.search_result = search_result

        result_frame = ttk.LabelFrame(self.toplevel, width=482, height=285, text="Found Result",
                                      relief=tk.RIDGE)
        result_frame.grid(row=1, column=1, sticky=tk.E + tk.W + tk.N + tk.S)
        result_frame.grid_propagate(False)

        result_label = ttk.Label(result_frame, text="List:")
        result_label.grid(row=1, column=1, sticky=tk.W)

        result_listbox = tk.Listbox(result_frame, selectmode=tk.EXTENDED, width=65, height=10,
                                    font="Courier 9", bg="#ADD8E6", fg="#191970")
        result_listbox.grid(row=2, rowspan=3, column=1, columnspan=3,
                            sticky=tk.E + tk.W + tk.N + tk.S, pady=3)

        add_button = ttk.Button(result_frame, text="Add",
                                command=lambda: add())
        add_button.grid(row=6, column=1, sticky=tk.W)

        close_button = ttk.Button(result_frame, text="Close", command=lambda: self.toplevel.destroy())
        close_button.grid(row=6, column=3, sticky=tk.E)

        for element in search_result:
            result_listbox.insert(0, element)

        def add():

            list_numbers = list(result_listbox.get(0, "end"))

            index = list(result_listbox.curselection())

            selected_numbers = []
            for i in index:
                selected_numbers.append(list_numbers[i])

            print(selected_numbers)

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.button = tk.Button(self, text="Click me!", command=self.on_click)
        self.button.pack()

        listbox = tk.Listbox(self, selectmode=tk.EXTENDED, width=65, height=10,
                             font="Courier 9", bg="#ADD8E6", fg="#191970")
        listbox.pack()

    def on_click(self):

        result = Toplevel(self, search_result)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

Не могу сообразить как вернуть сформированный список
selected_numbers из диалогового окна и для вставки в поле
listbox основного окна

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

class Toplevel(object):
    def __init__(self, parent, search_result):
        ...
        self.selected_numbers = []

        def add():

            list_numbers = list(result_listbox.get(0, "end"))

            index = list(result_listbox.curselection())

            selected_numbers = []
            for i in index:
                selected_numbers.append(list_numbers[i])

            print(selected_numbers)
            self.selected_numbers = selected_numbers

class Example(tk.Frame):
    ...

    def on_click(self):
        dialog = Toplevel(self, search_result)
        dialog.toplevel.wait_window()
        print('Selected:', dialog.selected_numbers)

Можно также добавить метод ожидания результата, который сам и возвращает результат (скрываем детали реализации):

class Toplevel(object):
     def __init__(self, parent, search_result):
        ...

        self.selected_numbers = []

        def add():

            list_numbers = list(result_listbox.get(0, "end"))

            index = list(result_listbox.curselection())

            selected_numbers = []
            for i in index:
                selected_numbers.append(list_numbers[i])

            print(selected_numbers)
            self.selected_numbers = selected_numbers

    def wait_for_result(self):
        self.toplevel.wait_window()
        return self.selected_numbers

class Example(tk.Frame):
    ...

    def on_click(self):
        dialog = Toplevel(self, search_result)
        print('Selected:', dialog.wait_for_result())


Разные результаты у re.search и re.findall при одинаковом паттерне

import re

str = '''
139.255.50.180:8080 ID-N-S +
88.99.83.28:3128 DE-H -
96.118.254.95:8080 US-N +
'''

pattern = re.compile(r'([0-9]{1,3}[\.]){3}[0-9]{1,3}:\d{1,}')

print(pattern.search(str)[0])
print(pattern.findall(str))

результат:

>>> 139.255.50.180:8080
>>> ['50.', '83.', '254.']

К .search претензий ноль, а что не нравится .findall - почему не дает три айпишника?

In [73]: pattern = re.compile(r'(?:[0-9]{1,3}[\.]){3}[0-9]{1,3}:\d{1,}')
# NOTE: ---------------------->  ^^

In [74]: pattern.findall(str)
Out[74]: ['139.255.50.180:8080', '88.99.83.28:3128', '96.118.254.95:8080']

цитата из официальной документации:

...
If one or more groups are present in the pattern, return a list of
  groups; this will be a list of tuples if the pattern has more than one
  group.
...

PS старайтесь не использовать в качестве имен переменных / классов зарезервированные имена, такие как
str, т.к. после этого вы не сможете использовать "затененные" функции / классы:

In [82]: str(1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-82-5c73dd08b6cc> in <module>
----> 1 str(1)

TypeError: 'str' object is not callable


Python. Проблема с двумерным списком
Имеется задачка:
Выведите таблицу размером n×n, заполненную числами от 1 до n^2 по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке
<code>
a = int(input()) # 5

rez = [[0] * a] * a

pointer = 0
ln = a
b_len = a
edge = 1
x = -1
y = 0

for i in range(a ** 2):

  if pointer == 4:
    pointer = 0
  if pointer == 0:
    x += 1
  if pointer == 1:
    y += 1
  if pointer == 2:
    x -= 1
  if pointer == 3:
    y -= 1

  rez[x][y] = i + 1
  print("rez[" + str(x) + "][" + str(y) + "] = " + str(rez[x][y]))
  #прим. rez[0][0] = 1
  ln -= 1
  if ln == 0:
    edge -= 1
    pointer += 1
    ln = b_len
  if edge == 0:
    edge = 2
    b_len -= 1
    ln = b_len

x = 0
y = 0
print("\n\nrez[" + str(x) + "][" + str(y) + "] = " + str(rez[x][y]) + "\n\n")
#rez[0][0] = 5

for i in rez:
  print(*i)
</code>
В алгоритме я как раз хожу по спирали и заполняю двумерный список. но в результате почему-то, весь список заполняется обратной диагональю от нужного, да при встроенной проверке, ясно, что заполнение происходит правильно но потом что-то происходит. Хоть вроде не дурак, но понять проблему никак не могу

В этой строке Вы создали список из
a нулей и потом список из
a его копий (одного и того же списка) положили в
rez:

rez = [[0] * a] * a

Это легко проверить, например:

 rez[0] is rez[1]    # True

Видно, что элементы
rez - ссылки на одно и то же значение. Соответственно, когда Вы менете
res[0][0], меняется и
rez[1][0], и
rez[2][0] и т.д. вплоть до
rez[a-1][0]. Поэтому делайте начальный список иначе, например:

rez = [[0 for idx_y in range(a)] for idx_x in range(a)]

Это не приведёт к получению списка из ссылок на одно значение и элементы списка будут меняться по-отдельности.


ошибка: OSError: [Errno 22] Invalid argument:
Выдает в консоле такую ошибку

Traceback (most recent call last):
File "D:\python\ass.py", line 48, in <module>
file1 = open(file_name_one, 'r')
OSError: [Errno 22] Invalid argument: 'Write here witch file do you want to copy?: '

вот код:

file_name_one = ('Write here witch file do you want to BACKUP?: ')
file_name_two = 'backup_' + file_name_one

file1 = open(file_name_one, 'r')
file2 = open(file_name_two, 'w')

file2.write(file1.read())

file1.close
file2.close

print("BACKUP completed successfully")

Банально пропустили
input():

file_name_one = input('Write here witch file do you want to BACKUP?: ')
file_name_two = 'backup_' + file_name_one

file1 = open(file_name_one, 'r')
file2 = open(file_name_two, 'w')

file2.write(file1.read())

file1.close()
file2.close()

print("BACKUP completed successfully")


Как преобразовать число чтобы оно имело количество значащих цифр после десятичной точки не более чем у другого числа?
Имеется 2 числа
A и
B, где число
В как шаблон:

A = 123.12345678
B = 0.00100000

Как сделать на Python, чтобы число
А имело количество  значащих цифр после десятичной точки, не более чем у числа
В?
T.е. должно получится так:

А = 123.12300000

или так:

А = 123.123

Можно попробовать так:

In [52]: round(A, len(str(B).split('.')[1]))
Out[52]: 123.123

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

In [56]: C = 0.1 + 0.2

In [57]: str(C)
Out[57]: '0.30000000000000004'