Ошибка multiple values for argument при вызове функции
Можете объяснить, почему не работает конструкция вызова функции вида:

def foo(a, b, c=-20, *args):
    print(a, b, c, args)

tup = (1, 2, 3, 4)
foo(1,2,c=100,*tup)

Если
с у меня позиционный аргумент со стандартным значением
-20, то почему я не могу вызвать функцию с указанием
с=100 ?

Позиционный аргумент (*args) следует за именованным аргументом (c = 100) в этом и ошибка.
Именованный аргумент

def foo(a, b, *args, c=-20):
    print(a, b, c, args)

tup = (1, 2, 3, 4)
foo(1,2,tup, c = 100) # Передан именованный аргумент

Позиционный аргумент

def foo(a, b, c=-20, *args):
    print(a, b, c, args)

tup = (1, 2, 3, 4)
foo(1,2,100,*tup) # передается позиционный аргумент


Ошибка IndexError: list index out of range [дубликат]

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

Почему я получаю ошибку "IndexError: list index out of range" и как ее исправить?

                                (1 ответ)

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

Имею код
<code>
import random
import numpy as np

class people:
    __slots__ = "name", "age", "gold", "ids", "location"

    def __init__(self, ids, name, age, gold, location):
        self.ids = ids
        self.name = name
        self.age = age
        self.gold = gold
        self.location = location

    def __str__(self):
        return "ID: {} | Имя: {} | Возраст: {} | Денег: {} | Локация: {}".format(self.ids, self.name, self.age,
                                                                                self.gold, self.location)

    __repr__ = __str__

def getLocation():   # *проблемное место*
    loca = random.randint(0, len(location))
    locaPeople[loca] += 1

    return location[loca]

location = [f"Место_{i}" for i in range(10)] # нужно.
locaPeople = [0 for i in range(len(location))]

pepl = [people(i, f"Человек_{i}", random.randint(18, 90), random.randint(1, 1000), getLocation()) for i in range(500000)]
</code>
из за чего происходить ошибка
IndexError: list index out of range?
И как можно её исправить?

Т.к.
randint генерирует число в границах:
a <= randint() <= b, то есть вероятность, что будет снегерировано число
b. А элемента под таким индексом не существует.  Поэтому нам надо подвинуть правую границу на
-1, так
loca = random.randint(0, len(location) - 1)

import random
import numpy as np

class people:
    __slots__ = "name", "age", "gold", "ids", "location"

    def __init__(self, ids, name, age, gold, location):
        self.ids = ids
        self.name = name
        self.age = age
        self.gold = gold
        self.location = location

    def __str__(self):
        return "ID: {} | Имя: {} | Возраст: {} | Денег: {} | Локация: {}".format(self.ids, self.name, self.age,
                                                                                self.gold, self.location)

    __repr__ = __str__

def getLocation():   # *проблемное место*
    loca = random.randint(0, len(location) - 1) # изменил
    locaPeople[loca] += 1

    return location[loca]

location = [f"Место_{i}" for i in range(10)] # нужно.
locaPeople = [0 for i in range(len(location))]

pepl = [people(i, f"Человек_{i}", random.randint(18, 90), random.randint(1, 1000), getLocation()) for i in range(500000)]


Python создать список списков из обычного списка
Есть, например, список

list = [73, 54, 73, 94, -73, -7, -73, 47]

Он не фиксированный, то есть значений может быть больше, а может и меньше, но количество элементов всегда кратно 4.
И как мне из этого списка создать вот такой список списков:

list = [ [73,54] [73,94] [-73,-7] [-73,47] ]

my_list = [73, 54, 73, 94, -73, -7, -73, 47]

results = [list(couple) for couple in zip(my_list[::2], l[1::2])]

print(results)


Как считать количество реакций в сообщении (discord.py)
Как посчитать количество реакций раздельноm так, чтобы было не количество всех реакций, а одной нужной эмоции. Например:

В сообщении две реакции(возьмём крестик и галочку)
Как отдельно посчитать количество галочек и крестиков раздельно, так чтобы было:
<code>
Галочек - **x**
Крестиков - **y**
</code>

Решение вашей проблемы:

from discord.utils import get

@client.event
async def on_raw_reaction_add(payload):
    if payload.channel_id == 1234567890:
        if payload.emoji.name == "Нужный вам эмодзи, например 🔁":
            channel = client.get_channel(1234567890)
            message = await channel.fetch_message(payload.message_id)
            reaction = get(message.reactions, emoji=payload.emoji.name)
            if reaction:
               reaction_counter = await reaction.count

В качестве
payload отправляйте в функцию все необходимые ID, чтобы затем производить с ними необходимые манипуляции.
reaction_counter присваивается количество упомянутых реакций
reaction в сообщении с нужным ID на нужном канале. Для того, чтобы получить большее количество реакций, просто добавьте еще одну переменную по типу
reaction, проверьте ее наличие и найдите количество упоминаний.


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

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

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

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

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

Есть такая таблица:

                                              Unnamed: 5
2550               +380639231808, Зеркло Мария Орестовна
2551               раролджєжопа, Кролик Вера Герасимовна
2552           063-070-99-48, Марийчук Надежда Иосифовна
2553           063 076 66 68, Марийчук Надежда Иосифовна
2554    (097)5455793 Слуцький Т., Надежны Тарас Олегович

Задача состоит в том, чтобы записать в список только номера в формате 0999999999. Я так понимаю, что это делается через регулярные выражения, но я смог только вывести все цифры.
Мой код такой:

for i in range(0, 5):
    line_number = 2550 + i
    line_content = str(sheet_1.iloc[[line_number], [5]])
    res = re.sub('[^\d]', '', line_content)
    print(res)

В итоге нужно получить список, где все номера в едином формате:

phones = ['0639231808', '0630709948', '0630766668', '0975455793']

<code>
txt = """                                              Unnamed: 5
2550               +380639231808, Зеркло Мария Орестовна
2551               раролджєжопа, Кролик Вера Герасимовна
2552           063-070-99-48, Марийчук Надежда Иосифовна
2553           063 076 66 68, Марийчук Надежда Иосифовна
2554    (097)5455793 Слуцький Т., Надежны Тарас Олегович"""

tel = []
rr = r"(\d{10,})|(\d+\){1}\d+)|(([ -]{1}\d{2,3}[ -]{1}\d{2,3}){2})"
res = re.findall(rr, txt)
for gr in res:
    for st in gr:
        if len(st) >= 10:
            st = re.sub('[^\d]', '', st)
            if len(st) > 10:
                st = st[-10:len(st):]
            tel.append(st)
print(tel)
</code>

['0639231808', '0630709948', '0630766668', '0975455793']

Может слегка громоздко, зато работает.


Ошибка AttributeError: 'NoneType' object has no attribute при вызове метода виджета
<code>
import tkinter as tk
import random
from PIL import ImageTk, Image
def start():
    button3 = tk.Button(text="Регистрация", width = 12, command = registration,   font = ("Arial" , "12")).place(x = 200, y = 130)
    button4 = tk.Button(text = "Войти" , width = 12, command = vxod,   font = ("Arial" , "12")).place(x = 200, y = 100)
def add():
    print(entry1)
def registration():
    global entry1
    label = tk. Label(text = "Придумайте свой ник" ,   font = ("Arial" , "8")).place(x = 400 , y = 100)
    entry1= tk.Entry().place(x = 400, y = 120)
    label = tk. Label(text = "Адрес электронной почты" ,  font = ("Arial" , "8")).place(x = 400 , y = 160)
    entry2 = tk.Entry().place(x = 400, y = 180)
    label = tk. Label(text = "Придумайте пароль" ,  font = ("Arial" , "8")).place(x = 400 , y = 220)
    entry3 = tk.Entry().place(x = 400, y = 240)
    label = tk. Label(text = "Введите ваш возраст" ,  font = ("Arial" , "8")).place(x = 400 , y = 280)
    entry4 = tk.Entry().place(x = 400, y = 300)
    button = tk.Button(text = "Зрегистрироваться" , command = add).place(x = 400 , y = 340)
def vxod():
    label = tk. Label(text = "Ник" ,  font = ("Arial" , "8")).place(x = 600 , y = 100)
    entry1 = tk.Entry().place(x = 600, y = 120)
    label = tk. Label(text = "Пароль" ,  font = ("Arial" , "8")).place(x = 600 , y = 160)
    entry2 = tk.Entry().place(x = 600, y = 180)
    label = tk. Label(text = "Возраст" ,  font = ("Arial" , "8")).place(x = 600 , y = 220)
    entry3 = tk.Entry().place(x = 600, y = 240)
    button = tk.Button(text = "Войти").place(x = 600, y = 280)

def rules():
    window = tk.Tk()
    window.title("Правила игры")
    label = tk.Label(window,text  = "Вы игрок можете выбрать количество").pack()
    label1 = tk.Label(window, text="кирпечей от 1 до 3 ").pack()
    label3 = tk.Label(window, text="Робот выбирает любое значение неизвестное игроку").pack()
    label4 = tk.Label(window, text = "В конце игры выводиться статистика").pack()
    label5 = tk.Label(window, text = "Время не ограничено, всего 10 попыток").pack()
    window.mainloop()

def show_image(path):
    root = tk.Tk()
    img = Image.open(path)
    width = 800
    ratio = (width / float(img.size[0]))
    height = int((float(img.size[1]) * float(ratio)))
    imag = img.resize((width, height), Image.ANTIALIAS)
    image = ImageTk.PhotoImage(imag)
    panel = tk.Label(root, image=image)
    panel.pack(side="top", fill="both", expand="no")
    label = tk.Label(text = "Кирпичики" ,  font=("Arial", "12")).place(x = 200, y = 0)
    button = tk.Button(text = "Правила игры", width = 12, command = rules, font = ("Arial" , "12")).place(x = 200, y = 100 )
    button2 = tk.Button(text = "Начать", command = start,  font = ("Arial" , "12")).place(x = 200 , y = 130 )
    root.mainloop()
show_image("C:/Users/User/Desktop/Кирпичики2.jpg")
</code>
Помогите пожалуйста получить данные из виджета Entry, я использовал глобальные переменные, ввожу текст, а программа выдает пустоту(None).

Потому что в такой конструкции:

entry1 = tk.Entry().place(x = 600, y = 120)

в
entry1 записывается не созданный объект
Entry, а результат вызова метода
place, который всегда возвращает
None (так же как и
grid и
pack). Разделите создание виджета и его размещение:

entry1 = tk.Entry()
entry1.place(x = 600, y = 120)


Автозапуск скрипта при включении windows
Как сделать так, чтобы скрипт запускался при каждом запуске windows?
Пробовал так:
<code>
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0,winreg.KEY_ALL_ACCESS)
winreg.SetValueEx(key, "DDoS", 0, winreg.REG_SZ, r"C:\Users\user\PycharmProjects\untitled6\project.py")
key.Close()
</code>
Когда захожу в автозагрузки, то автозапуск скрипта отключен.

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

import os, sys

Thisfile = sys.argv[0] # Полный путь к файлу, включая название и расширение
Thisfile_name = os.path.basename(Thisfile) # Название файла без пути
user_path = os.path.expanduser('~') # Путь к папке пользователя

if not os.path.exists(f"{user_path}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\{Thisfile_name}"):
        os.system(f'copy "{Thisfile}" "{user_path}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"')
        print(f'{Thisfile_name} добавлен в автозагрузку')

Но это будет работать только в случае, если у вас скрипт скомпилирован в .exe
В противном случае, вам помимо самого скрипта, в папке автозагрузки нужно будет создать .bat или .cmd файл, который уже будет запускать скрипт в интерпретаторе.

@echo off
python PythonCode.py
exit


Как передать данные из виджета Entry
<code>
def registration():
    button = tk.Button(text = "Зарегистрироваться" , command =  get_entry).place(x = 400 , y = 340)
    label = tk. Label(text = "Придумайте свой ник" ,   font = ("Arial" , "8")).place(x = 400 , y = 100)
    entry = tk.Entry().place(x = 400, y = 120)
    label = tk. Label(text = "Адрес электронной почты" ,  font = ("Arial" , "8")).place(x = 400 , y = 160)
    entry3 = tk.Entry().place(x = 400, y = 300)
def get_entry():
    s = entry.get()
    print(s)
</code>
Как получить  из виджета entry значение которого ввел пользователь, при нажатии на кнопку? Возникает ошибка NameError.

entry - локальная переменная функции
registration, она видна только в этой функции. Есть несколько способов решения вашей проблемы:

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

def registration():
    global entry
    # Дальше остальной код функции

переместить функцию
get_entry внутрь
registration, так что
get_entry будет видеть все переменные внешней функции:

def registration():
    def get_entry():
        s = entry.get()
        print(s)

    button = tk.Button(text = "Зарегистрироваться" , command =  get_entry).place(x = 400 , y = 340)
    # Дальше остальной код

передавать entry внутрь обработчика нажатия как параметр через лямбду:
command=lambda: get_entry(entry) + добавить параметр
entry в
get_entry:

def get_entry(entry):
    s = entry.get()
    print(s)

обернуть все в класс, сделать
entry полем объекта, а функции
registration и
get_entry - методами, доступ к полям объекта будет через
self (
self.entry, например).


Подскажите путь к решению задачки на Питоне
Начал учить Python и застрял на этой задачке (уже больше недели). Пожалуйста, подскажите путь к решению, у меня идей нет…
Задача:
Вам необходимо создать программу, которая выводит состояние магазина Open или Closed в зависимости от времени и дня недели.
Магазин открыт ежедневно с 10 до 21, кроме субботы и воскресенья. В четверг магазин открыт с 15 часов.
Вам необходимо добавить час и день недели в качестве ввода.
День недели представлен в виде целого числа (1 для понедельника, 2 для вторника и т. д.)
Пример ввода:
15
4
Пример вывода:
Open
Мой код:
<code>
    hour = int(input())
    day = int(input())
    if day == 6 or day == 7:
        print('Closed')
    if (hour < 15 or hour > 21) and (day == 4):
        print('Closed')
    if (hour < 10 or hour > 21) and (day == 1 or day == 2 or day == 3 or day == 5):
        print('Closed')
    else:
        print('Open')
</code>
Проблема:
Если вводить субботу или воскресенье (6 или 7 день) идет двойной вывод: сначала прога возвращает, как и должно быть, Closed и следом за ним почему-то еще и Open.
Тот же результат, если вводить нерабочие часы четверга.
С остальными днями недели все равботает как должно.

У вас четыре взаимоисключаемые условия:

СБ, ВС - закрыт (однозначно, и дальше нечего проверять)
ЧТ - закрыт, если время меньше 15 или больше 21
остальные дни - закрыт, если время меньше 10 или больше 21
иначе (если ничего из вышеперечисленного не сработало) - открыт

Вот для такого взаимоисключения elif и нужен (из документации):

if_stmt ::=  "if" assignment_expression ":" suite
         ("elif" assignment_expression ":" suite)*
         ["else" ":" suite]

Код:

hour = int(input())
day = int(input())

if day == 6 or day == 7:
    print('Closed')
elif day == 4 and 15 > hour > 21:
    print('Closed')
elif 10 > hour > 21:
    print('Closed')
else:
    print('Open')


Особенность работы lambda с сигналами/слотами
Есть большая программа с двумя окнами и большим количеством сигналов\слотов. Заметил, что при комментировании части кода с сигналам перестаёт запускаться второе окно. В итоге программа сократилась до:

import sys
from PyQt5 import QtWidgets

class Win1(QtWidgets.QMainWindow):
    def __init__(self):
        super(Win1, self).__init__()
        self.enter = QtWidgets.QPushButton(self)
        self.enter.setText('Enter')
        self.enter.setDefault(True)
        self.enter.clicked.connect(self.go_ahead)

    def go_ahead(self):
        self.hide()
        app2 = Win2()
        app2.show()

class Win2(QtWidgets.QMainWindow):
    def __init__(self):
        super(Win2, self).__init__()
        self.pushButton = QtWidgets.QPushButton(self)
        self.pushButton.setText('second')
        self.pushButton.setDefault(True)
        self.pushButton.clicked.connect(lambda: self.send())

    def send(self):
        print('ff')

app1 = QtWidgets.QApplication([])
start_win = Win1()
start_win.show()
sys.exit(app1.exec_())

В таком виде программа нормально запускается. При комментировании
self.pushButton.clicked.connect(lambda: self.send()) перестаёт открываться
Win2. Оказалось, что надо писать
self.app2 = Win2(), а не
app2 = Win2()(что тоже не совсем понятно).
Дальнейший анализ показал, что использование
lambda в сигнале\слоте позволяет использовать запись
app2 = Win2(), т.е. с
.connect(lambda: self.send()) всё работает, а с
.connect(self.send) второе окно не запускается. Подобное поведение не только с сигналом
clicked, но и с
textChanged,
timeout,
cursorPositionChanged да и скорее всего со всеми.
Означает ли подобное поведение, что
lambda делает
app2 атрибутом
Win1? Если нет, то что всё таки происходит?

Оказалось, что надо писать self.app2 = Win2(), а не app2 = Win2()(что
тоже не совсем понятно).

Это логично, т.к. если объект не имеет ссылок, то он уничтожается, а при
app2 = Win2() объект
Win2 имеет ссылку только в переменной
app2, а после выхода функции эта переменная выходит из своей области действия и уничтожается, а на
Win2 уменьшает количество ссылок и оно становится 0, поэтому он уничтожается.
Поэтому, когда вы написали
self.app2, вы в текущем объекте создали атрибут
app2 и теперь он ссылается на
Win2 и теперь пока существует текущий объект
Win2 тоже будет существовать.
НО, можно обойтись только
app2, если указывать родителя у виджета, тогда объект будет иметь ссылку на другой объект и останется в памяти

Дальнейший анализ показал, что использование lambda в сигнале\слоте
позволяет использовать запись app2 = Win2(), т.е. с .connect(lambda:
self.close) всё работает, с .connect(self.close) второе окно не
запускается.

Вообще, разница
.connect(lambda:self.close) и
.connect(self.close) проявится только при выполнении клика. В первом случае
self.close не будет вызван, а во-втором будет (попробуйте в коде вызвать
self.close и
self.close(), и увидите, что метод в первом случае не был вызван).

Означает ли подобное поведение, что lambda делает app2 атрибутом Win1?
Если нет, то что всё таки происходит?

Думаю при
self.pushButton.clicked.connect(lambda: self.close()) происходит замыкание и ссылка на текущий объект сохраняется в функции (лямбде) из-за чего и не происходит удаление объекта

Вы ведь прячете первое окно, а второе окно не имеет ссылок на первое, поэтому не сможет на него воздействовать.
Мне кажется, в вашем случае, самое то будет работать с
QStackedWidget. Сделаете главное окно, добавите на него те два виджета и у
QStackedWidget через методы
setCurrentIndex и/или
setCurrentWidget переключайтесь между окнами.
Немного доработал ваш код:

import sys
from PyQt5 import QtWidgets

class Win1(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.enter = QtWidgets.QPushButton(self)
        self.enter.setText('Enter')
        self.enter.setDefault(True)
        self.enter.clicked.connect(self.go_ahead)

    def go_ahead(self):
        self.hide()

        self.app2 = Win2(self)
        self.app2.show()

class Win2(QtWidgets.QMainWindow):
    def __init__(self, app1):
        super().__init__()

        self.app1 = app1

        self.pushButton = QtWidgets.QPushButton(self)
        self.pushButton.setText('second')
        self.pushButton.setDefault(True)
        self.pushButton.clicked.connect(self.on_click)

    def on_click(self):
        self.hide()
        self.app1.show()
        self.close()

app1 = QtWidgets.QApplication([])
start_win = Win1()
start_win.show()
sys.exit(app1.exec_())


Как с помощью регулярок взять блоки?
Есть вывод консоли

Security Associations (2 up, 0 connecting):
 IPSec-IKEv2[2]: ESTABLISHED 10 seconds ago, 5.79.70.34[a.teletom.ru]...91.77.160.189[192.168.1.64]
 IPSec-IKEv2[2]: Remote EAP identity: mac
 IPSec-IKEv2[2]: IKEv2 SPIs: 8e03bee2f90a7b0f_i 2b840459b2a53517_r*, rekeying disabled
 IPSec-IKEv2[2]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
 IPSec-IKEv2{2}:  INSTALLED, TUNNEL, reqid 2, ESP in UDP SPIs: ca7323ca_i 0dd681eb_o
 IPSec-IKEv2{2}:  AES_CBC_128/HMAC_SHA1_96, 63234 bytes_i (390 pkts, 0s ago), 113714 bytes_o (345 pkts, 0s ago), rekeying disabled
 IPSec-IKEv2{2}:   0.0.0.0/0 === 10.101.0.2/32
 IPSec-IKEv2[1]: ESTABLISHED 8 minutes ago, 5.79.70.34[a.teletom.ru]...91.77.160.189[hon]
 IPSec-IKEv2[1]: IKEv2 SPIs: 0fa1c950bdb21ac0_i 0bcd0f3b2bea4cea_r*, rekeying disabled
 IPSec-IKEv2[1]: IKE proposal: AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256
 IPSec-IKEv2{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cb680131_i 69774a81_o
 IPSec-IKEv2{1}:  AES_GCM_16_128, 86593 bytes_i (454 pkts, 11s ago), 249805 bytes_o (510 pkts, 11s ago), rekeying disabled
 IPSec-IKEv2{1}:   0.0.0.0/0 === 10.101.0.1/32

Я хочу вытащить блоки ESTABLISHED. У меня в логах их две штуки, но моя регулярка парсит одну

(?<=ESTABLISHED)[\W\w]*?ESTABLISHED

Как сделать чтобы выделил оба блока?

Регулярное выражение будет таким:

/^(.+ESTABLISHED[\s\S]+?={3}.+?)$/gim

Рабочий пример на JS:

let sTxt = `Security Associations (2 up, 0 connecting):
 IPSec-IKEv2[2]: ESTABLISHED 10 seconds ago, 5.79.70.34[a.teletom.ru]...91.77.160.189[192.168.1.64]
 IPSec-IKEv2[2]: Remote EAP identity: mac
 IPSec-IKEv2[2]: IKEv2 SPIs: 8e03bee2f90a7b0f_i 2b840459b2a53517_r*, rekeying disabled
 IPSec-IKEv2[2]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
 IPSec-IKEv2{2}:  INSTALLED, TUNNEL, reqid 2, ESP in UDP SPIs: ca7323ca_i 0dd681eb_o
 IPSec-IKEv2{2}:  AES_CBC_128/HMAC_SHA1_96, 63234 bytes_i (390 pkts, 0s ago), 113714 bytes_o (345 pkts, 0s ago), rekeying disabled
 IPSec-IKEv2{2}:   0.0.0.0/0 === 10.101.0.2/32
 IPSec-IKEv2[1]: ESTABLISHED 8 minutes ago, 5.79.70.34[a.teletom.ru]...91.77.160.189[hon]
 IPSec-IKEv2[1]: IKEv2 SPIs: 0fa1c950bdb21ac0_i 0bcd0f3b2bea4cea_r*, rekeying disabled
 IPSec-IKEv2[1]: IKE proposal: AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256
 IPSec-IKEv2{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cb680131_i 69774a81_o
 IPSec-IKEv2{1}:  AES_GCM_16_128, 86593 bytes_i (454 pkts, 11s ago), 249805 bytes_o (510 pkts, 11s ago), rekeying disabled
 IPSec-IKEv2{1}:   0.0.0.0/0 === 10.101.0.1/32`;

let rExp = /^(.+ESTABLISHED[\s\S]+?={3}.+?)$/gim;

console.log(sTxt.match(rExp));

Для С# и Python выражение не меняется (за исключением работы с флагами).


Всем элементам после первого положительного отнять 0.5

x = [-3, -5, 3, 4, -4, 2, -2, -6, 5]

b = list(filter(lambda z: z > 0, x))
y = x.index(b[0])
for i in x[y: -1]:
    x[i] -= 0.5
    x[i] += 1
print(x)

Результат:

[-3, -5, 3.5, 5.0, -3.5, 2.5, -2, -5.5, 5]

Почему числа как-то странно считает?

x = [-3, -5, 3, 4, -4, 2, -2, -6, 5]

enabled = False

for i in range(len(x)):
    x[i] -= 0.5 * enabled
    enabled = enabled or x[i] > 0

print(x)

алгоритм:

проходим по всем элементам массива

у каждого элемента вычитаем
0.5 * enabled, если
enabled = False, то соответственно ничего вычитаться не будет (
0.5 * 0) иначе будет вычтено
0.5 (
0.5 * 1)

если
x[i] > 0, то устанавливаем
enabled в
True, но чтобы сделать это в одну строку требуется выполнить более сложную проверку:

если
enabled == True ничего не меняем при любом значении элемента иначе если
x[i] > 0 устанавливаем в True
такую проверку можно записать как

enabled = enabled or x[i] > 0

т.е. если
enabled
True, то его значение не изменится иначе будет установлено по условию

вычисление
enabled после вычисления
x[i] позволяет менять элементы ПОСЛЕ первого положительного, а не НАЧИНАЯ С первого положительного


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

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

Как пронумеровать каждый вывод print?

                                (3 ответа)

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

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

Пример:
<code>
list = ['apple','1','5']
for x,y in enumerate(list, start=1):
    print(f'{x}:{y}')
</code>


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

# Number of threads = Number of proxies
t_list = generate_threads(proxies, checker=checker, goods=goods)
for t in t_list:
    t.start()

for t in t_list:
    t.join()  # Waiting for process end checking
save_goods(goods, filename=goods_dest)

Но так как прокси много ~300 штук проверка идет порядка 30 - 40 секунд. И неплохо было бы запилить прогрессбар, который показывал бы состояние проверки.
Я решил использовать библиотеку
tqdm. Переписал код так:

# Number of threads = Number of proxies
t_list = generate_threads(proxies, checker=checker, goods=goods)
for t in t_list:
    t.start()

for t in tqdm(t_list):
    t.join()  # Waiting for process end checking
save_goods(goods, filename=goods_dest)

Но у этого похода есть проблема. Т.к. потоки идут по очереди, и главный поток ждёт пока завершится следующий, то получается что если первый поток "долгий", то прогрессбар долго остаётся на 0, так как ждёт пока он выполнится. Так же я пытался вынести прогрессбар в отдельный процесс, но у меня ничего не получилось.

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

from functools import wraps

lock = threading.Lock()

def execute_and_update_progress(f, progress):
    def wrapped(*args, **kwargs):
        try:
          return f(*args, **kwargs)
        finally:
            with lock:
                progress.update(1)
    return wrapped

# В предположении что checker это функция, которую выполняют потоки
with tqdm(total=len(proxies)) as progress:
    t_list = generate_threads(
        proxies, checker=execute_and_update_progress(checker, progress), goods=goods)
    for t in t_list:
        t.start()

    for t in t_list:
        t.join()

save_goods(goods, filename=goods_dest)

Второй вариант, это вместо явного создания потоков воспользоваться
Executor-ами из
concurrent.futures:

with ThreadPoolExecutor(max_workers=len(proxy)) as executor:
  lock = threading.Lock()
  futures = []
  with tqdm(total=len(proxies)) as progress:
    def update_progress():
       with lock:
         progress.update(1)
    for proxy in proxies:
       # тут добавляем задачу на выполнение на proxy
       # нужно передать правильные параметры в функцию потока
       future = executor.submit(checker, param1, param2)
       future.add_done_callback(update_progress)
       futures.add(future)
    concurrent.futures.wait(futures)


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

s1 = morph.parse(word1)[0] #собаку
s2 = morph.parse(word2)[0] #кошка

s3= s2.inflect({s1.tag.POS,s1.tag.case,s1.tag.number})

На выходе у нас
кошку. С существительными работает. А вот если взять
идти и
шагал то тут всё рушится, так как у первого нет
tag.case и
tag.number.
Вопрос. Можно ли сделать что примерно такого

s3= s2.inflect({s1.tag})

Чтобы оно автоматом брало все теги из первого

Свойство
tag имеет класс
OpencorporaTag, при передаче в метод
inflect будет ругаться, что сравнение
<= не поддерживается между объектами
'OpencorporaTag' и
'frozenset' (
TypeError: '<=' not supported between instances of 'OpencorporaTag' and 'frozenset').
Чтобы просклонять какое-то слово методом
inflect, нужно из объекта
OpencorporaTag (который возвращает свойство
tag) вытащить набор граммем в виде множества (
set или
frozenset), для этого нужно обратиться к свойству
grammemes:

import pymorphy2

morph = pymorphy2.MorphAnalyzer()

word1 = "собаку"
word2 = "кошка"

s1 = morph.parse(word1)[0]
s2 = morph.parse(word2)[0]

s3 = s2.inflect(s1.tag.grammemes)

print(s3.word)  # Вывод: кошку

# ----

word1 = "идти"
word2 = "шагал"

s1 = morph.parse(word1)[0]
s2 = morph.parse(word2)[0]

s3 = s2.inflect(s1.tag.grammemes)

print(s3.word)  # Вывод: шагать

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

import pymorphy2

morph = pymorphy2.MorphAnalyzer()

word1 = "стали"
word2 = "кошка"

s2 = morph.parse(word2)[0]

for s1 in morph.parse(word1):
    gramemmes = set(s1.tag.grammemes)

    if 'NOUN' in s2.tag:
        # Для существительных убираем одушевленность и род, т.к. это не категории формы, а характеристика самого слова
        # Например "кошка" всегда одушевленное, а "сталь" всегда неодушевленное,
        # а слово "день" нельзя перевести в женский род при всем желании
        gramemmes -= {'inan', 'anim', 'femn', 'masc', 'neut'}

    s3 = s2.inflect(gramemmes)
    if s3 is not None:  # Если удалось просклонять, результат выводим
        print(gramemmes)
        print(s3.word)

Вывод:

{'sing', 'gent', 'NOUN'}
кошки
{'nomn', 'plur', 'NOUN'}
кошки
{'sing', 'datv', 'NOUN'}
кошке
{'sing', 'loct', 'NOUN'}
кошке
{'accs', 'plur', 'NOUN'}
кошек

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


Найти индекс первого положительного элемента не используя цикл
<code>
x = [-3, -5, 3, 4, -4, 2, -2, -6, 5]
for i in x:
    if i > 0:
        print("Перший додатній елемент: ", i)
        break
print(x.index(i))
</code>
Я написал этот код, но узнал что нельзя использовать цикл. Как найти индекс только первого положительного элемента?

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

print(x.index(i))

Ну а по сути, без цикла можно задачу решить так:

x = [-3, -5, 3, 4, -4, 2, -2, -6, 5]

b = list(filter(lambda z: z > 0, x))
print(b[0])


Ошибка re.sub: "TypeError: expected string or bytes-like object"

import re
mystr = ['234egfdgf']
mystr = re.sub(r"[egfdgf]", "", mystr)

Ошибка:

return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

Должно работать

Просто уберите mystr из квадратных скобок:
<code>
mystr = '234egfdgf'
</code>


Как сделать так что бы после определенной функции исполнялась та функция которую мне надо
Здраствуйте! Возникла проблема, надо что бы после того как в функции
answer посчитала сколько раз нажали кнопку. После этого дать один ответ из трех.
Писал код в
callback_query_handler но если на кнопку нажмут 10 человек то после 5 секунд человеку который отправлял запрос придёт 10 одинаковых ответов.

@bot.callback_query_handler(func = lambda call: True)
def answer(call):

    global s_yes
    global s_no

    if call.data == 'yes':
        s_yes += 1

    if call.data == 'no':
        s_no += 1

    time.sleep(5)

@bot.message_handler(func = lambda message: True)
def replay_answer(message):
    s_n = s_no
    s_y = s_yes

    global user_id

    if s_y > s_n:
        bot.send_message(user_id, 'Ты прошел')
    elif s_y < s_n :
        bot.send_message(user_id, 'Извены')
    elif s_y == s_n:
        bot.send_message(user_id, 'Подожди')

bot = telebot.TeleBot(...)

yes = {}
no = {}

<...>

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.data == 'yes':
        if call.message.chat.id in yes:
            yes.update({call.message.chat.id: {'yes': yes[call.message.chat.id]['yes'] + 1}})
        else:
            yes.update({call.message.chat.id: {'yes': 1}})

    elif call.data == 'no':
        if call.message.chat.id in no:
            no.update({call.message.chat.id: {'no': no[call.message.chat.id]['no'] + 1}})
        else:
            no.update({call.message.chat.id: {'no': 1}})
    print('Y', yes)
    print('N', no)

    # noinspection PyBroadException
    try:
        if yes[call.message.chat.id]['yes'] > no[call.message.chat.id]['no']:
            print('yes > no')
        elif yes[call.message.chat.id]['yes'] < no[call.message.chat.id]['no']:
            print('yes < no')
        elif yes[call.message.chat.id]['yes'] == no[call.message.chat.id]['no']:
            print('yes = no')
    except Exception:
        pass

при первом нажатии, допустим, на
yes:

>>> Y {id: {'yes': 1}}
    N {}

в той же сессии, при нажатии на
no:

>>> Y {id: {'yes': 1}}
    N {id: {'no': 1}}
    yes = no

пример нужно оптимизировать


Получить доступ из декоратора к полям класса
Имеется асинхронный декоратор определенный в классе. Как получить доступ к полям класса из декоратора?
<code>
class Hello(object):
template = 'Hello, {}'

    def hello(fun):
        @wraps(fun)
        async def wrapper(text):
            return await fun(self.template.format(text))
        return wrapper

    @hello
    async def b(self, text):
        print(text)
        return False

n = Hello()
asyncio.get_event_loop().run_until_complete(n.b('Maxim'))
</code>

Функция
wrapper должна принимать ещё один параметр
self. в
fun надо передавать
self

class Hello(object):
    template = 'Hello, {}'

    def hello(fun):
        @wraps(fun)
        async def wrapper(self, text):
            return await fun(self, self.template.format(text))
        return wrapper

    @hello
    async def b(self, text):
        print(text)
        return False

n = Hello()
asyncio.get_event_loop().run_until_complete(n.b('Maxim'))


Перебрать 4-битное число. Python
Допустим, есть переменная bits с числом и answer.

bits = 4
answer = 1111

Нужно перебрать значения
(0000, 0001...1111) а потом сравнивать с
answer, а если переменная равна
answer, вывести ее на экран. Еще одна задача - чтобы если переменная
bits менялась (допустим она становилось цифрой 8), перебираемые значения тоже должны изменяться
(00000000, 00000001...11111111)
Я пытался это сделать так:

bits = 4
answer = "1111"

x = bits*bits
y = []
for n in range(len(answer)):
    y.insert(n, 0)
for i in range(x):
    ans = ""
    for j in range(len(answer)):
        if y[j] == 0:
            ans += "0"
            y[j] = n
        else:
            ans += "1"
    print(ans)

Но при этом, выдавало
0000, а на следующий раз
1111

можно использовать модуль
itertools

import itertools

for i in itertools.product("01", repeat = 4):
    print("".join(i))


Вычетание в python
В общем, мне надо вычесть из
a
a1. Только не через списки, я нашёл функцию
remove, но это для списков.

n = int(input("Кол-во "))
a = ''
h = ''
for i in range(n):
    a = a + (input())
    a1 = min(a)
    h = a1 + h
    # тут надо a[a1]
print (h)

Пример входных данных:

n = 3

2

7

1
Вывод:

127

Как вариант:

n = int(input("Кол-во "))
a = ''
h = ''
for i in range(n):
    a = a + (input())

for i in a:
    a1 = min(a) # получаем наименьший элемент в a
    h += a1 # записываем его в (h=h+a1). Любые последующие просто добавляем в конец строки
    a= a.replace(a1, "") # Удаляем текущий наименьший элемент в `a` и повторяем цикл пока в `a` есть данные.

print (h)

из минусов что не обрабатывает ввод двойных чисел. (10 15 и тд) но при Вашем вводе нет возможности их отделить в
a


Как создавать отдельную таблицу для пользователя?
Пишу некий опросник, и возникла проблема с сохранением вопросов/ответов пользователей. Не могу понять, как создавать отдельно таблицу для пользователя в коде (если конечно для него ещё нет таблицы), чтобы код мог с ней работать. Буду очень благодарен за объяснение
Вот примерные поля для такой таблички:
<code>
class UserTable(peewee.Model):
    """База данных пользователя"""

    id = peewee.IntegerField(unique=True)
    # вопрос 1
    q1 = peewee.CharField(null=True)
    # вопрос 2
    q2 = peewee.CharField(null=True)
    # вопрос 3
    q3 = peewee.CharField(null=True)
    # вопрос 4
    q4 = peewee.CharField(null=True)

    class Meta:
        database = database
</code>

Нет нужды делать много табличек.
В твоей табличке у пользователя есть уникальный идентификатор:
UserTable.id.
Значит в ней можно хранить сколько угодно пользователей - каждый со своим
id.
Возможно нужно добавить в таблицу поле
name - чтобы хранить имя.


Асинхронный декоратор в классе
Как сделать асинхронный декоратор в классе?
Я попробовал реализовать, но возникает проблема, которую я не могу решить.
<code>
import asyncio
from functools import wraps

class sa(object):
    def a(self, fun):
        @wraps(fun)
        async def wrapper(*args):
            print(args)
            return await fun(*args)
        return wrapper

    @a
    async def b(self, text):
        print(text)
        return False

n = sa()
asyncio.get_event_loop().run_until_complete(n.b('hello'))
</code>

Как вариант, можно вынести функцию из класса, тогда не нужно будет передавать
self:

import asyncio
from functools import wraps

def a(fun):
    @wraps(fun)
    async def wrapper(*args):
        print(args)
        return await fun(*args)

    return wrapper

class sa(object):
    @a
    async def b(self, text):
        print(text)
        return False

n = sa()
asyncio.get_event_loop().run_until_complete(n.b('hello'))

Вывело:

(<__main__.sa object at 0x000001BF26808DD8>, 'hello')
hello

PS.
Можно и внутри класса оставить, но это может привести к путанице:

class sa(object):
    def a(fun):
        @wraps(fun)
        async def wrapper(*args):
            print(args)
            return await fun(*args)

        return wrapper

    @a
    async def b(self, text):
        print(text)
        return False

PPS.
Еще можно так оформить декоратор, и вызывать его для других функций:

import asyncio
from functools import wraps

class sa(object):
    def a(self, fun):
        @wraps(fun)
        async def wrapper(*args):
            print(args)
            return await fun(*args)

        return wrapper

n = sa()

@n.a
async def b(text):
    print(text)
    return False

asyncio.get_event_loop().run_until_complete(b('hello'))

Результат:

('hello',)
hello


Многопроцеcсорность в python и telebot [закрыт]

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

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

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

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

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

Я Вам рекомендую записать все команды бота в один файл как функции и запускать эти функции с помощью
threading, к примеру -

import telebot
import time
import threading

bot = telebot.TeleBot("token")

@bot.message_handler(commands=['start'])
def hello(message):
    bot.send_message(message.chat.id, "Привет!")
    time.sleep(86400)
threading.Thread(target = hello, args = (1,), daemon = True).start()

@bot.message_handler(commands=['help'])
def help(message):
    bot.send_message(message.chat.id, "Помощь!")
    time.sleep(3600)
threading.Thread(target = help, args = (1,), daemon = True).start()

@bot.message_handler(commands=['else'])
def else(message):
    bot.send_message(message.chat.id, "Другое!")
    time.sleep(60)
threading.Thread(target = else, args = (1,), daemon = True).start()

bot.polling(none_stop=True)


Django Корзина в Cookie
Всем привет подскажите как лучше поступить , у меня есть корзина , но когда я не зарегистрирован при добавлении товара в корзину выскакивает ошибка, подскажите как мне лучше сделать чтоб если юзер не залогиненый то создать его корзину в куках и заказ сохранить в бд с пометкой для анонима.
models.py

class Cart(models.Model):

    class Meta:
        verbose_name = 'Корзина'
        verbose_name_plural = 'Корзина'
        unique_together = ('user', 'session_key',)
    user = models.OneToOneField(User, blank=True, null=True, related_name='cart',on_delete=models.CASCADE)

    owner = models.ForeignKey('Customer',null=True, verbose_name='Владелец',on_delete=models.CASCADE)
    products = models.ManyToManyField(CartProduct,blank=True,related_name='related_cart')
    total_products = models.PositiveIntegerField(default=0)
    final_price = models.DecimalField(max_digits=10,default=0, decimal_places=2,verbose_name='Общая сумма')
    in_order= models.BooleanField(default=False)
    for_anonymoys_user= models.BooleanField(default=False)
    session_key = models.CharField(max_length=40,null=True,blank=True)

    def __str__(self):
        return str(self.id)

class CartProduct(models.Model):

    class Meta:
        verbose_name = 'Продукт для корзины'
        verbose_name_plural = 'Продукты для корзины'

    user  = models.ForeignKey('Customer',verbose_name='Покупатель', on_delete=models.CASCADE)
    cart = models.ForeignKey('Cart',verbose_name='Корзина',on_delete=models.CASCADE,related_name='related_products')
    # #########################################&&&&&&&&&&?????????????????????????????
    product= models.ForeignKey(Product,verbose_name='Товар',on_delete=models.CASCADE)
    qty = models.PositiveIntegerField(default=1)
    final_price = models.DecimalField(max_digits=10,decimal_places=2,verbose_name='Общая сумма')

    def __str__(self):
        return "Продукт: {} (для корзины)".format(self.product.title)

    def save(self, *args, **kwargs):
        self.final_price = self.qty * self.product.price
        super().save(*args, **kwargs)

class Customer(models.Model):

    class Meta:
        verbose_name = 'Покупатель'
        verbose_name_plural = 'Покупатели'

    user = models.ForeignKey(User, verbose_name='Пользователь', on_delete=models.CASCADE)
    phone = models.CharField(max_length=20, verbose_name='Номер телефона')
    adress = models.CharField(max_length=255, verbose_name='Адрес', null=True, blank=True)
    orders = models.ManyToManyField('Order', verbose_name='Заказы покупателя', related_name='related_order')

    def __str__(self):
        return "Покупатель: {} {}".format(self.user.first_name, self.user.last_name)

class Order(models.Model):

    class Meta:
        verbose_name = 'Заказ'
        verbose_name_plural = 'Заказы'

    STATUS_NEW ='new'
    STATUS_IN_PROGRESS='in_progress'
    STATUS_READY= 'is_ready'
    STATUS_COMPLETED= 'completed'
    STATUS_DEACTIVE='deactive'

    BUYING_TYPE_SELF= 'self'
    BUYING_TYPE_DELIVERY = 'delivery'

    STATUS_CHOICES= (
        (STATUS_NEW,'Новый заказ'),
        (STATUS_IN_PROGRESS,'Заказ в обработке'),
        (STATUS_READY,'Заказ готов'),
        (STATUS_COMPLETED,'Заказ выполнен'),
        (STATUS_DEACTIVE,'Заказ Отменен')
    )

    BUYING_TYPE_CHOICES=(
        (BUYING_TYPE_SELF,'Самовывоз'),
        (BUYING_TYPE_DELIVERY,'Доставка')
        )

    customer = models.ForeignKey(Customer, verbose_name='Покупатель', related_name='related_orders', on_delete=models.CASCADE)
    first_name = models.CharField(max_length=255, verbose_name='Имя')
    last_name = models.CharField(max_length=255, verbose_name='Фамилия')
    phone = models.CharField(max_length=20, verbose_name='Телефон')
    cart = models.ForeignKey(Cart, verbose_name='Корзина', on_delete=models.CASCADE, null=True, blank=True)
    adress = models.CharField(max_length=1024, verbose_name='Адрес', null=True, blank=True)
    otdel = models.CharField(max_length=20,verbose_name='Отделение', null=True, blank=True)
    status = models.CharField(
        max_length=100,
        verbose_name='Статус заказ',
        choices=STATUS_CHOICES,
        default=STATUS_NEW
    )
    buying_type = models.CharField(
        max_length=100,
        verbose_name='Тип заказа',
        choices=BUYING_TYPE_CHOICES,
        default=BUYING_TYPE_SELF
    )
    comment = models.TextField(verbose_name='Комментарий к заказу', null=True, blank=True)
    created_at = models.DateTimeField(auto_now=True, verbose_name='Дата создания заказа')
    order_date = models.DateField(verbose_name='Дата получения заказа', default=timezone.now)

    def __str__(self):
        return str(self.id)

class Rewiews(models.Model):

    name= models.CharField(max_length=255, verbose_name='Имя')
    text= models.TextField('Сообщение',max_length=500)
    parent= models.ForeignKey(
        'self',verbose_name='Родитель',on_delete=models.SET_NULL,blank=True,null=True
    )
    product=models.ForeignKey(Product,verbose_name='Продукт',on_delete=models.CASCADE)
    data = models.DateTimeField(auto_now=True,db_index=True,verbose_name='Добавлено')

    def __str__(self):
        return f"{self.name}-{self.product}"

    class Meta:
        verbose_name='Отзыв'
        verbose_name_plural='Отзывы'

cartmixins.py

class CartMixin(View):
    def dispatch(self,request,*args,**kwargs):
        if request.user.is_authenticated:
            customer = Customer.objects.filter(user=request.user).first()
            if not customer:
                customer= Customer.objects.create(
                    user=request.user
                )
            cart = Cart.objects.filter(owner=customer,in_order=False).first()
            if not cart:
                cart= Cart.objects.create(owner=customer)
        else:
            cart= Cart.objects.filter(for_anonymoys_user=True).first()
            if not cart:
                cart= Cart.objects.create(for_anonymoys_user=True)
        self.cart=cart
        self.cart.save()
        return super().dispatch(request,*args,**kwargs)

views.py

class AddToCartView(CartMixin,View):
    def get(self,request,*args,**kwargs):
        product_slug= kwargs.get('slug')
        product= Product.objects.get(slug=product_slug)

        if request.user.is_authenticated:
            cart_product,created=CartProduct.objects.get_or_create(
                user=self.cart.owner,cart=self.cart,product=product
            )
            if created:
                self.cart.products.add(cart_product)
            recalc_cart(self.cart)
            messages.add_message(request,messages.INFO,'Товар добавлен в корзину')
            return redirect(product.get_absolute_url())
        else:
            # print(request.session['cartanon'])
            cart, created = Cart.objects.get_or_create(
            session_key = request.session.session_key,
            defaults = {'user': None}
             )
            return redirect(product.get_absolute_url())
            # except:
            #     new_cart = Cart()
                # new_cart.save()
                # request.session["cart_id"] = new_cart.id
                # new_cart.products.add(product)
                # new_cart.save()
                # return HttpResponse("<h1>okkk!</h1>")

class DeleteFomCartView(CartMixin,View):

    def get(self,request,*args,**kwargs):

        product_slug=kwargs.get('slug')
        product= Product.objects.get(slug=product_slug)
        cart_product=CartProduct.objects.get(
            user=self.cart.owner,cart=self.cart,product=product
        )
        self.cart.products.remove(cart_product)
        cart_product.delete()
        recalc_cart(self.cart)
        messages.add_message(request,messages.INFO,'Товар Удален')
        return HttpResponseRedirect('/cart/')

class ChangeQTYView(CartMixin,View):
    def post(self,request,*args,**kwargs):

        product_slug= kwargs.get('slug')
        product= Product.objects.get(slug=product_slug)
        cart_product=CartProduct.objects.get(
            user=self.cart.owner,cart=self.cart,product=product
        )
        if request.POST.get('qty')=='1':
            cart_product.qty+=1
            cart_product.save()
            recalc_cart(self.cart)
        if request.POST.get('qty')=='0':
            cart_product.qty-=1
            cart_product.save()
            recalc_cart(self.cart)

        messages.add_message(request,messages.INFO,'Кол-во изменено')
        return HttpResponseRedirect('/cart/')

class CartView(CartMixin, View):

    def get(self, request, *args, **kwargs):
        category = Category.objects.all()
        context = {
            'cart': self.cart,
            'category': category
        }
        return render(request, 'cart.html', context)

class CheckoutView(CartMixin, View):

    def get(self, request, *args, **kwargs):
        category = Category.objects.all()
        form=OrderForm(request.POST or None)
        context = {
            'cart': self.cart,
            'category': category,
            'form': form
        }
        return render(request, 'checkout.html', context)

class MakeOrderView(CartMixin,View):

    def post(self, request, *args, **kwargs):
        form = OrderForm(request.POST or None)
        customer = Customer.objects.get(user=request.user)
        if form.is_valid():
            new_order = form.save(commit=False)
            new_order.customer = customer
            new_order.phone = form.cleaned_data['phone']

            phone=form.cleaned_data['phone']

            new_order.first_name = form.cleaned_data['first_name']

            name=form.cleaned_data['first_name']

            new_order.last_name = form.cleaned_data['last_name']
            new_order.adress = form.cleaned_data['adress']

            email=form.cleaned_data['adress']

            new_order.otdel = form.cleaned_data['otdel']
            new_order.buying_type = form.cleaned_data['buying_type']
            new_order.order_date = form.cleaned_data['order_date']
            new_order.comment = form.cleaned_data['comment']

            comment=form.cleaned_data['comment']

            new_order.save()
            self.cart.in_order = True
            self.cart.save()
            new_order.cart = self.cart
            new_order.save()
            customer.orders.add(new_order)

            # email=form.cleaned_data['adress']
            # print(email)
            # name= form.cleaned_data['first_name']
            # body= form.cleaned_data['phone']
            send_email(email,name,phone,comment)

            messages.add_message(request, messages.INFO, 'Спасибо за заказ! Менеджер с Вами свяжется')
            return HttpResponseRedirect('/')
        return HttpResponseRedirect('/checkout/')

<code>
from django.contrib.sessions.models import Session
class Order(models.Model):
    session = models.ForeignKey(Session, on_delete=models.SET_NULL, blank=True, null=True)
</code>
Лучше корзину сохранять в сессии.
Для аннонимных пользователей при оформлении заказа создавать юзера с username=session_id.
А если пользователь залогинится, то по session_id вы найдете заказ и привяжите его к уже существующем юзеру, а пользователя с username=session_id удалите.


Перевести столбец в строку python
У меня есть проблема. Моя задача состоит в том, чтобы вытащить столбец из некой таблицы и записать его длину
len(). Но мой код выдает его в столбец, из-за чего
len() считает каждый элемент столбца отдельно, а не их общее количество

for col in water:
    el = list(col.split()[2])

water.txt:

     HETATM    1  H   HOH A   1      27.265  36.739  58.126
     HETATM    2  H   HOH A   1      27.109  35.124  57.944
     HETATM    3  O   HOH A   1      27.486  35.958  57.542
...
     HETATM 9999  O   HOH A3333      30.490  83.899  10.929

а так не устраивает?

water = [
    "HETATM    1  H   HOH A   1      27.265  36.739  58.126",
    "HETATM    2  H   HOH A   1      27.109  35.124  57.944",
    "HETATM    3  O   HOH A   1      27.486  35.958  57.542",
]

column = [line.split()[6] for line in water]

print(column)

на выходе список из значений в 6 столбце (для примера)
или вам что-то иное нужно?
вот код из файла:

with open('d:\\watercube.txt') as f:
    lines = f.readlines()
    column = [line.split()[6] for line in lines if len(line.split()) > 6]
    print(column)


Python. Найти число, удовлетворяющее условию
На вход подается список h, элементы в нем расположены по возрастанию. Необходимо найти такое число k, при котором функция f() будет возвращать минимальное значение. Код функции f():

def f(l):
    s = 0
    for i in range(len(h)):
        if (h[i] - l > 0):
            s += (1 + h[i] - l)/2*(h[i] - l)
        else:
            s += (1 + l - h[i])/2*(l - h[i])

    return s

Пример:
Если h = [2, 3, 5, 29], то k = 9
Подскажите пожалуйста, как найти такое k? Я пытался сделать бинарный поиск, но не получилось

min_s = 10**1000

h = [2, 3, 5, 29]

l = h[0]
r = h[len(h)-1]
while l != r - 1:
    m = (l + r) // 2
    e = f(m)
    if e >= min_s:
        l = m
    else:
        r = m
        min_s = e
print(l, min_s)

Я бы сделал вообще ход конем:
функция
f может быть представлена в виде

def f(l, h):
    s = 0
    for i in range(len(h)):
        r = h[i] - l
        if (h[i] - l > 0):
            s += (r + r * r)
        else:
            s += (-r + r * r)

    return s / 2

или так (на математическом языке):

s = sum[(k - h_i)**2 +- (k - h_i)] / 2

плюс-минус в зависимости от выполнения условия
(k - h_i) > 0
Найдем минимальное значение с помощью математического анализа - т.е. надо найти производную, приравнять нулю и найти
k

s' = 2 * k - 2 * h_i -+ 1 = 0

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

s' = sum[2 * k_min - 2 * h_i + 1] = 0
s' = sum[2 * k_max - 2 * h_i - 1] = 0

откуда

k_min = sum[h_i] / len(h) - 0.5
k_max = sum[h_i] / len(h) + 0.5

в итоге надо перебрать всего 3 значения для
k и не важно был отсортирован список
h или нет
а поскольку
k у нас должны быть целыми, то имеем ответ

k = round(sum[h_i] / len(h))

но я все таки проверил бы боковые
k тоже


Как обратиться к каждому элементу исходной матрицы в Python?
У меня есть код который работает с матрицей находящейся в файле и работает с кодами module_1 module_2 и module_3

import csv
from matplotlib.pyplot import matshow, show
from module_1 import task_1
from module_2 import task_2
from module_3 import task_3
def read(csvfile):
    with open(csvfile, 'r') as file:
        r = list(csv.reader(file))
    for x in range(len(r)):
        for y in range(len(r[x])):
            r[x][y] = int(r[x][y])
    return r
def write(matrix, name = "result.csv"):
    with open(name, 'w') as file:
        for x in range(len(matrix)):
            for y in range(len(matrix[x])):
                if y == len(matrix[x]) - 1:
                    file.write(str(matrix[x][y]) + "\n")
                else:
                    file.write(str(matrix[x][y]) + " ")
t1 = task_1(read("tekst.csv"))
for x in range(len(t1)):
    print(t1, end='\n')
print('\n')
t2 = task_2(read("tekst.csv"))
for x in range(len(t2)):
    for y in range(len(t2[x])):
        print(t2[x][y], end=' ')
    print()
t3 = task_3(read("tekst.csv"))
for x in range(len(t3)):
    print(t3[x], end='\n')
print('\n')
write(t2)
matshow(t2)
show()

module_1 меняет матрицу на нули

def task_1(m):
    d = [0]*len(m)
    return d

И происходит вывод:

[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]

Но мне нужно чтобы был вывод:

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Так же и в module_3 он удаляет последние 4 строки матрицы:

def task_3(m):
    return m[:-4]

Вывод:

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

А нужно:

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

Входные данные в файле tekst.csv

1,2,3,4,5,6,7,8
8,7,6,5,4,3,2,1
2,3,4,5,6,7,8,9
9,8,7,6,5,4,3,2
1,3,5,7,9,7,5,3
3,1,5,3,2,6,5,7
1,7,5,9,7,3,1,5
2,6,3,5,1,7,3,2

1)
Сразу же в глаза бросается тот факт, что Вы обращаетесь к таблице несколько раз. Это крайне неэффективно по времени и по памяти (вы постоянно преобразовываете таблицу в список). Обратитесь к ней в самом начале и передайте ей, например, переменную
TABLE. Для повторяющихся переменных также советую использовать константы, описать их вначале вашей программы. Например, присвоить переменной
TABLE_NAME имя таблицы с расширением
.csv, т.е.
TABLE_NAME = 'tekst.csv'
2)
Измените функции
task_1,
task_2 и
task_3, чтобы в них происходило окончательное создание матриц. Таким образом, функция будет возвращать полноценный список с столбцами и строками.
3)
Замените громоздкий цикл для функций
def write() и
def read().
В данном случае я имею в виду заменить цикл внутри
write() на:

ROWS = [(0,0,0),(0,0,0),(0,0,0)]
# () - ЭТО ОБЪЕКТ SET (можете прочитать по нему документацию в интернете). КАЖДЫЙ SET - ЭТО ОДНА СТРОКА В ВАШЕЙ МАТРИЦЕ. В СОВОКУПНОСТИ ОНИ СОСТАВЛЯЮТ ПОЛНОЦЕННУЮ МАТРИЦУ

csvfile=open(TABLE_NAME, 'w', newline='')
obj=csv.writer(csvfile)
for row in ROWS:
   obj.writerow(row)
csvfile.close()

Цикл внутри
read() заменить на:

with open(TABLE_NAME) as fp:
    reader = csv.reader(fp, delimiter=",", quotechar='"')
    data_read = [row for row in reader]

4)
Замените эту часть вашей программы:

t1 = task_1(read("tekst.csv"))
for x in range(len(t1)):
    print(t1, end='\n')
print('\n')
t2 = task_2(read("tekst.csv"))
for x in range(len(t2)):
    for y in range(len(t2[x])):
        print(t2[x][y], end=' ')
    print()
t3 = task_3(read("tekst.csv"))
for x in range(len(t3)):
    print(t3[x], end='\n')

На это:

TABLE = read(TABLE_NAME)

matrix_t1 = task_1(TABLE)
matrix_t2 = task_2(TABLE)
matrix_t3 = task_3(TABLE)

print(*matrix_t1, sep = "  ")
print(*matrix_t2, sep = "  ")
print(*matrix_t3, sep = "  ")


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

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

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

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

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

Нужно сделать так, чтобы результат цикла for записывался в .txt. Например,

aab aac aba, только каждый раз с новой строки.

import itertools
noc = input('число >>> ')
ltr = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

for i in itertools.product(ltr, repeat=int(noc)):
    print(''.join(i))

Открытие и запись в файл c циклом производятся следующим образом:
<code>
STR_DATA = ['Str1', 'Str2', 'Str3']

with open('f.txt', 'w+', encoding='utf-8') as file:
  for i in range(len(STR_DATA)):
     file.write(STR_DATA[i] + '\n')
</code>
Можете использовать этот код по вашему усмотрению, в зависимости от задачи.


Как удалить виджет в tkinter
<code>
w = Tk()
w.title('@')
w.geometry('650x500')
b = Button(w)
b.grid()
w.mainloop()
</code>
Как удалить виджет b?

Для полного удаления виджета можно использовать метод
destroy, пример:

def on_press():
    b.destroy()

b = Button(w, command=on_press)

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

Методы
.grid_forget,
.pack_forget (он же  просто
.forget),
.place_forget удаляют виджет из окна, но виджет продолжает сущестовать, его можно снова разместить в окне.

Метод
.grid_remove позволяет скрыть виджет, и потом вернуть его обратно с теми же параметрами и в то же место (в ту же строку и колонку сетки) просто вызовом
.grid() без параметров.


No value for argument 'choice' in function call pylint(no-value-for-parameter)
Пытался написать код, который генерирует все возможные комбинации на Python 3.9, начал выдавать ошибку:

No value for argument 'choice' in function call pylint(no-value-for-parameter)

Помогите, пожалуйста.
Вот сам код:
<code>
import itertools

def select():
    print("""
            a. a-z
            b. A-Z
            c. 0-9
                    """)
    choice = c = input('>>> ')
    if choice == 'a':
        a = ltr
        print(a)
    elif choice == 'b':
        b = ltr_upper
        print(b)
    elif choice == 'c':
        c = num
        print(c)
    else:
        print('Enter a valid number of operation.')
        select()

def number_of_characters():
    print("text")
    noc = input('>>> ')
    print(noc)

def generating(choice, noc):
    for i in itertools.product(choice, repeat=noc):
        print(''.join(i))

# lists
ltr = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
ltr_upper = ['A','B','C','D','E','F','G','H','I','G','K','K','L','M','N','O','P','Q','R','S','U','V','W','X','Y','Z']
num = ['1','2','3','4','5','6','7','8','9','0']

select()
number_of_characters()
generating()
</code>

No value for argument 'choice' in function call pylint(no-value-for-parameter)

def generating(choice, noc):
    for i in itertools.product(choice, repeat=noc):
        print(''.join(i))

generating()  # <------- проблема здесь

Решение репорта
no-value-for-parameter от
pylint: передайте два параметра в функцию
generating, и ошибка
pylint уйдёт.
Пример:

generating(choice=3, noc=5)


Как заблокировать Entry в tkinter
Как сделать чтобы в entry нельзя было вводить символы*


Цветной текст в python
Как вывести разноцветный текст в python 3.8

Зависит от того где этот текст будет выводится. Для консоли пробуй модуль
colorama


Чем отличаются методы в pathlib: Path.rename от Path.replace
Оба метода одинаково переименовывают файл.
По документации разница не ясна.
Методом тыка разница тоже не обнаружена.

Две версии практически одинаковых методов существуют по исторической причине, причем

Path.rename() и
Path.replace() повторяют методы
os.rename() и
os.replace().

.rename(): в случае существования такой папки или файла результат зависит от операционной системы:

Windows: ошибка
OSError.
POSIX системы: переименование, и за счет потери (замены в случае существования).

Возвращает

None для версий Питона перед 3.8
новый объект
Path для версий 3.8+.

.replace(): всегда переименование, и за счет потери (замены в случае существования).
Возвращает

None для версий Питона перед 3.8
новый объект
Path для версий 3.8+.

Значит, лучше использовать
.replace(), потому что он не зависит от операционной системы (и перед применением проверить, если папка или файл с таким именем уже не существует).


Создание zip файла без заданных файлов
Пишу на Python.
Требуется создать
zip архив без некоторых каталогов и чтоб в архиве были только файлы данной директории.
Пробовал использовать
make_archive из
shutil, но не нашел исключение.

Создайте сами список исключений
<code>
import zipfile
import os

# Находим все в текущей директории
currentDirectory = os.listdir(".")

# Создаем список файлов
list_files = []
for currentFile in currentDirectory:
    list_files.append(currentFile)

# Удаляем ненужное
del_list = ["folder1", "folder2"]
for i in del_list:
    if i in currentDirectory:
        list_files.remove(i)

# Пишем в архив
with zipfile.ZipFile('arh.zip', 'w') as myzip:
    for i in list_files:
        for root, dirs, files in os.walk(i):
            for file in files:
                path = os.path.join(root, file)
                myzip.write(path)

</code>


Как пронумеровать каждый вывод print?
У меня есть функция, которая во время работы выводит в терминал:

print("...")

Мне нужно, чтобы каждый новый
print нумеровался:

print ("[1]...")

Встроенная функция enumerate() - именно то, что вам нужно!
Она возвращает кортежи с порядковым номером и очередным элементом:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']

>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

нумерация может начитаться с заданного числа (0 по-умолчанию):

>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

Для вашего случая:

months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
for i, m in enumerate(months, 1):  # начитать нумерацию с 1
   print(f'{i}: {m}')

На печать выведет:

1: January
2: February
3: March
4: April
5: May
6: June
7: July
8: August
9: September
10: October
11: November
12: December

или так:

print(f'[{i}] {m}')

выведет по вашему шаблону:

[1] January
[2] February
[3] March
[4] April
[5] May
[6] June
[7] July
[8] August
[9] September
[10] October
[11] November
[12] December


Python. Поиск и замена подстрок в строке
Смысл заключается в том что к примеру имеется строка:

aaabbcdecvvv
Имеются подстроки:

aa = 1

aaa = 2

bb = 3

b = 4

c = 5

cde = 6

vvv = 7
Необходимо заменять содержимое строки на подстроки с начала и по максимальному совпадению.
Следовательно как результат будет
2bbcdecvvv ->
23cdecvvv ->
236cvvv ->
2365vvv ->
23657
Метод который знаю, а именно
replace не подходит, т.к. он вырывает не всегда из начала

Попробуйте так:
<code>
repl_dict = {"aa":1, "aaa":2, "bb":3, "b":4, "c":5, "cde":6, "vvv":7}

a = "aaabbcdecvvv"

for i in sorted(repl_dict.keys(), key=len, reverse=True):
    a = a.replace(i, str(repl_dict[i]))

print(a)  # 23657
</code>


"Программа завершила работу с ненулевым кодом возврата" почему так происходит и что это значит
На сайте где я компилирую код пишет: "Программа завершила работу с ненулевым кодом возврата" как это исправить и что это такое?
Вот код:
<code>
a = int(input())
b = int(input())
d = a + b
print(d)
</code>

в задача сказано что надо вводить данные в одну строку, а у вас в две

a, b = map(int, input().split())

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


Почему цикл while(print()) в питоне не бесконечен?
В C++ например можно написать
while(std::cout<<"");, и он будет бесконечным
В питоне же
while(print(" ")): pass выполняется только 1 раз

Просто потому, что питоновская функция
print(), вызванная с любыми аргументами, всегда возвращает
None, а значение
None расценивается
while как
False.
Но, что забавно, вы можете обернуть
print в кортеж и вот он то уже не будет восприниматься как
False, поскольку он не совсем пустой - в нём есть
None (т.е. получится кортеж
(None,), спасибо gil9red за уточнение):

while (print(" "),): pass

Я всего лишь добавил к вашему коду запятую в нужном месте, благо скобки (вообще-то не нужные для условия
while в питоне) вы уже написали вокруг
print сами.


Что делает ключевое слова «yield»? [дубликат]

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

Принцип работы yield в Python

                                (2 ответа)

Генератор yield

                                (3 ответа)

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

Для чего нужен и как использовать ключевое слово
yield?
Например, я пытаюсь понять этот код1:

def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild

это вызывается здесь:

result, candidates = [], [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result

Что происходит при вызове метода
_get_child_candidates? Возвращается список? Один элемент? Это Вызывается снова? Когда прекратятся последующие Вызовы?

1. Этот фрагмент кода написал Jochen Schulz (jrschulz), который создал отличную библиотеку для метрических пространств. ссылка на полный источник: Модуль mspace
 Перевод вопроса What does the "yield" keyword do? от участника Alex. S.

Чтобы понять, что делает
yield, вы должны понять, что такое генераторы. И прежде чем вы сможете понять генераторы, вы должны понять что такое итераторы
Итераторы
Когда вы создаете список, вы можете читать его элементы один за другим. Чтение его элементов по одному называется итерацией:

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i)
1
2
3

mylist - итерируем. Когда вы используете list comprehension вы создаете список и, итерируете по нему:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

Все, что вы можете использовать
for ... in ..., является итерируемым: списки, строки, файлы...
Итерируемые объекты удобны, потому что вы можете читать их сколько угодно, но вы храните все значения в памяти, но это не удобно когда у вас много значений.
Генераторы
Генераторы - это итератор, который можно проитерировать только один раз.
Генераторы не хранят все значения в памяти, они генерируют значения на лету:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

Это то же самое, за исключением того, что вы использовали
() вместо
[]. НО, вы не можете выполнить
for i in mygenerator второй раз, поскольку генератор можно использовать только один раз: он вычисляют
0, затем забывают об этом и вычисляют
1 и забывает 2 об этом, и т.д.
yield
Ключевое слово
yield используется как
return, за исключением того, что функция вернет генератор.

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # создаётся генератор
>>> print(mygenerator) # mygenerator - это объект!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

Здесь это бесполезный пример, но это удобно, когда вы знаете, что ваша функция вернет огромный набор значений, которые вам нужно будет прочитать только один раз.
Чтобы освоить
yield, вы должны понимать, что при вызове функции код, написанный в теле функции, не выполняется. Функция возвращает только объект генератора, это немного сложно :-)
Затем ваш код будет продолжаться с того места, где он остановился, каждый раз, когда
for использует генератор.
Теперь самое сложное:
В первый раз, когда
for вызывает объект-генератор, созданный из вашей функции, он запускает код в вашей функции с самого начала до тех пор, пока не достигнет
yield, после чего он вернет первое значение цикла. Затем каждый последующий вызов будет запускать другую итерацию цикла, который вы написали в функции, и возвращать следующее значение. Это будет продолжаться до тех пор, пока генератор не будет считаться пустым, что происходит, когда функция выполняется без достижения
yield. Это может быть из-за того, что цикл подошел к концу, или из-за того, что условие
if/else больше не выполнилось.

Объяснение вашего кода
генератор:

# Здесь вы создаете метод объекта `node`
# который вернет генератор

def _get_child_candidates(self, distance, min_dist, max_dist):

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

     # Если слева от узла еще есть дочерний объект
     # И если расстояние в порядке, вернуть следующий объект
     if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild

     # Если справа все еще есть дочерний объект узла
     # И если расстояние в порядке, вернуть следующий объект
     if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild

     # Если функция попадает сюда, генератор будет считаться пустым

вызов:

# Создать пустой список и список с ссылкой на сам объект
result, candidates = list(), [self]

# Цикл по candidate(он содержат только один элемент в начале)
while candidates:

     # Получить последнего элемент candidate и удалить его из списка
     node = candidates.pop()

     # Получить расстояние между obj и candidate
     distance = node._get_dist(obj)

     # Если расстояние в порядке, вы можете заполнить результат
     if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)

     candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))

return result

Этот код содержит несколько логических частей:

Цикл выполняет итерацию по списку, но список расширяется, пока цикл повторяется :-) Это краткий способ просмотреть все  данные, даже если это немного опасно, поскольку вы можете получить бесконечный цикл. В этом случае
candidates.extend (node._get_child_candidates (distance, min_dist, max_dist)) исчерпывают все значения генератора, но при этом продолжают создавать новые объекты генератора, которые будут давать значения, отличные от предыдущих, поскольку он не применяется к одному и тому же узлу.

Метод
extend() - это метод списка, который ожидает итерируемый объект и добавляет все значения в список.

Обычно мы передаем ему список:

>>> a = [1, 2]
>>> b = [3, 4]
>>> a.extend(b)
>>> print(а)
[1, 2, 3, 4]

Но в вашем коде он получает генератор, это хорошо, потому что:

Вам не нужно читать значения дважды.
У вас может быть много объектов, и они не будут хранится в памяти.

И это работает, потому что Python не волнует, передаётся ли ему списком или нет. Python ожидает итерируемый объект, поэтому он будет работать со строками, списками, кортежами и генераторами! Это называется утиной типизацией и является одной из причин, по которой Python такой крутой. Но это уже совсем другая история...
Перевод ответа от участника e-satis


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

class FooClass:
    def __init__(self, list_attr=[]):
        # Список, который должен быть уникальным для каждого нового экземпляра класса FooClass
        self.list_attr = list_attr

    def add_to_list_attr(self, new_item):
        """метод, для добавления объектов в список self.list_attr,
           который предполагался как уникальный для каждого экземпляра
           класса FooClass"""
        self.list_attr.append(new_item)

Если я правильно понимаю смысл ключевого слова
self в Питоне, то оно должно сделать список
self.list_attr уникальным для каждого нового создаваемого объекта
FooClass. Поэтому в методе
add_to_list_attr(self, new_item) первым аргументом также указано
self.
Однако на выходе я получаю это:

>>> foo1 = FooClass()

>>> foo1.list_attr
[]

>>> foo1.add_to_list_attr(1)

>>> foo1.list_attr
[1]

>>> foo2 = FooClass()

>>> foo2.list_attr
[1]

>>> foo2.add_to_list_attr(2)

>>> foo2.list_attr
[1, 2]

>>> foo1.list_attr
[1, 2]

То есть
self.list_attr ведет себя, словно это статичный атрибут для класса в целом, а не атрибут экземпляра класса. Объясните, пожалуйста, в чем причина и как добиться желаемого поведения.

Это известная фича, если вкратце, то нужно делать так:

def __init__(self, list_attr=None):
    # Список, который должен быть уникальным для каждого нового экземпляра класса FooClass
    if list_attr is None:
        list_attr = []
    self.list_attr = list_attr

Смысл примерно в том, что если вы задаёте дефолтный параметр функции, то он инициализируется только один раз. При создании новых экземпляров класса новой инициализации уже не происходит. Поэтому в дефолтных параметрах нужно использовать не пустой список, а
None, а уже внутри функции проверять на
None и создавать новый список. Это просто нужно знать.
И проявляется это не только в методах класса, а в любых функциях:

def myfunc(mylist = []):
    mylist.append(1)
    return mylist

myfunc()
print(myfunc())

Вывод:

[1, 1]


pyTelegramBotAPI: Как передать message.chat.id в другую функцию
Как можно передать message.chat.id в другую функцию?
<code>
import telebot
import config
import os

bot = telebot.TeleBot(config.TOKEN)

def create_folders():
    try:
        os.makedirs(user_folder + "/" + str(message.chat.id) + "/" + "result")
    except:
        pass

@bot.message_handler(commands=["dirs"])
def update_email_field(message):
    bot.send_message(message.chat.id, "Создание папок")
    create_folders()

bot.polling()
</code>

import telebot
import config
import os

bot = telebot.TeleBot(config.TOKEN)

def create_folders(chat_id):
    try:
        os.makedirs(user_folder + "/" + str(chat_id) + "/" + "result")
    except:
        pass

@bot.message_handler(commands=["dirs"])
def update_email_field(message):
    bot.send_message(message.chat.id, "Создание папок")
    create_folders(message.chat.id)

bot.polling()


Ресайз видео в PyQt5 (OpenCV)
Мне нужно, чтобы видео изменяло размеры от размеров самого окна. Видео проигрывается в лэйбле, которому стоит правило на заполнение. Но при уменьшении окна видео просто обрезается. Можно ли этого избежать уменьшая само разрешение видео динамически (не запрещая на абсолютный минимайз)
Ниже код функции воспроизведения и правил размеров (без них тоже работает)
<code>
def video_stream(self):
    ret, frame = self.video_capture.read()
    if not ret:
        return False

    video_width = int(self.video_capture.get(cv2.CAP_PROP_FRAME_WIDTH))
    video_height = int(self.video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT))

    screen_rect = app.desktop().screenGeometry()
    video_width = (screen_rect.width() if video_width > screen_rect.width() else video_width)
    video_height = (screen_rect.height() if video_height > screen_rect.height() else video_height)

    self.video_size = QtCore.QSize(video_width, video_height)
    frame = cv2.resize(frame, (self.video_size.width(), self.video_size.height()), interpolation = cv2.INTER_AREA)

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    image = qimage2ndarray.array2qimage(frame)
    self.frame_lable.setPixmap(QtGui.QPixmap.fromImage(image))
</code>

Всё решилось очень просто

frame = cv2.resize(frame, (self.frame_lable.size().width(), self.frame_lable.size().height()), interpolation = cv2.INTER_AREA)

Теперь для ресайза берутся значения размеров виджета
Также для виджета стоит правило

self.frame_lable.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)


Задача на строки питон [закрыт]

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

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

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

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

Как известно, Винни-Пуха очень расстраивают длинные слова. У него есть одно такое слово и он очень хочет его сократить. Винни-Пух решил, что если он выбросит из слова все вхождения некоторой одной буквы, то смысл слова не очень изменится, но слово станет короче
Ваша задача — найти какое самое короткое слово сможет получить Винни-Пух. Если вариантов ответа несколько, то можно вывести любой.

Input

oboronosposobnost
brnspsbnst

Output

abbba
aa

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

Посчитать вхождения для каждой буквы и удалить ту, которая больше всего места занимает.
<code>
s = 'oboronosposobnost'
s.replace(max([s.count(x), x] for x in s)[1], '')
</code>


Время работы программы очень длинное, возможна ли реализация з помощью хэш-таблиц?
Для программы используется список на 1млн чисел, нужно при складывании чисел x и y, то-есть A[i] и A[j] получить число s, которое лежит в диапазоне от -1000 до 1000, и найти количество уникальных чисел. Программа работает правильно, но проблема в длительности выполнения програми, которое достигает нескольки часов, возможно ли реализовать с помощью хэш-таблиц, чтобы сократить время работы?
Вот код
<code>
A = []
with open("input.txt") as f:
    for line in f:
        A.append(int(line))
n=len(A)
checker = []
s = A[0]+A[1]
checker.append(s)
print('Start')
for i in range(0, n-1):
    for j in range(1, n):
        if A[i]+A[j]>=-1000 and A[i]+A[j]<=1000:
            s = A[i]+A[j]
            if s not in checker:
                checker.append(s)
                print(checker)
del checker[0]
print('res:', len(checker))
print(checker)
print('End')
</code>

вот такой код:
100.000 записей где-то за 7 секунд перемалывает, 1000.000 за 2,5 минуты, но оптимизировать еще можно и наверное еще на порядок можно ускорить легко
его конечно надо допилить, но основные принципы более-менее тут раскрыты

исходный список сортируем по возрастанию

для каждого элемента списка определяем диапазон
left..right сумма с числом из которого будет меньше 1000

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

дальше (в идеале) нам надо просто занести в множество все числа по индексам
i_left..i_right

я код писал на коленке, так что бинарный поиск немного недоработан :)
но есть куда расти - главное - ПРИНЦИП
код:

import random

count = 1000000

arr = [random.randint(-1000000, 1000000) for i in range(count)]

print("start")

arr.sort()

res = set()

for i in range(len(arr)):

    # определить границы диапазона
    left = -1000 - arr[i]
    right = 1000 - arr[i]

    # бинарным поиском найти граничные элементы
    border_l = 0
    border_r = len(arr) - 1

    pos_l = (border_r + border_l) // 2
    old = -1

    while True:
        value = arr[pos_l]

        if value < left:
            border_l = pos_l
        elif value > left:
            border_r = pos_l

        old = pos_l
        pos_l = (border_r + border_l) // 2

        if pos_l == old:
            break

    border_l = 0
    border_r = len(arr) - 1

    pos_r = (border_r + border_l) // 2
    old = -1

    while True:
        value = arr[pos_r]

        if value < left:
            border_r = pos_r
        elif value > left:
            border_l = pos_r

        old = pos_r
        pos_r = (border_r + border_l) // 2

        if pos_r == old:
            break

    for j in range(pos_l, pos_r + 1):

        value = arr[j]

        if value < left:
            continue

        if value > right:
            break

        res.add(arr[i] + arr[j])

print(len(res))


Не выполняется цикл python
<code>
l=     [1]
x=      1

while (len(l) != 10001):
    index = 0
    for i in l:
        if (x % i != 0):
            index += 1
    if (index == len(l)):
        l.append(x)
    else:
        x += 1

print(l)
</code>
Прикол программы в поиске простых чисел и занос их в единый список, но она выдает пустоту. Ошибок никаких не выдает и в логической части вроде бы не накосячил.

надо начинать с
2 а не
1, потому что все целые числа делятся на 1 без остатка

l=     [2]
x=      2


Python, как отследить изменение файла?
Мне нужно отследить изменение конкретного файла по конкретному пути(именно факт того что файл изменили, а не сами изменения), я написал код:
<code>
import os
import shutil
import time

class someclass:
    def __init__(self):
        if not os.path.isdir("temp"):
            os.mkdir("temp")
            os.chdir("temp")
        else:
            os.chdir("temp")

    def watch_file_update(self, filepath):
        if os.path.exists(filepath):
            # Копирую файл в temp
            shutil.copy(filepath, os.getcwd())
            while True:
                time.sleep(1)
                if not os.path.exists(filepath):
                    # Если в процессе файл удалят, переименуют или ещё что, то я возвращаю -2
                    return -2
                else:
                    # Сравниваю файл в temp с оригиналом
                    with open(filepath, 'r') as f1:
                        with open(f'{os.getcwd()}/{os.path.basename(filepath)}', 'r') as f2:
                            if not f1.read() == f2.read():
                                return 1
        else:
            return -1

if __name__ == "__main__":
    api = someclass()
    if api.watch_file_update("D:/somefile.txt") == 1:
        # Сделать что-либо
    elif api.watch_file_update("D:/somefile.txt") == -1:
        print("Ошибка, файл не найден")
    elif api.watch_file_update("D:/somefile.txt") == -2:
        print("Ошибка, возможно файл был перемещён или удалён")
</code>
Код абсолютно рабочий, только есть одна загвоздка, он подходит разве что для файлов меньше 1мб, иначе же он жрёт невероятно много ресурсов компа и работает невероятно медленно, может есть какой-то другой способ   отследить изменение файла, или может существует волшебная библиотека для отслеживания изменения файла?

Можно сравнивать не содержимое файлов, а дату последнего редактирования файла. Её можно получить с помощью модуля
os:

import os

def watch_file_update(path):
  timestamp = os.stat(path).st_mtime
  while 1:
    if timestamp != os.stat(path).st_mtime:
      timestamp = os.stat(path).st_mtime
      print('Файл изменён!')
      return

watch_file_update("D:/somefile.txt")


Тип базового класса в миксинах
У меня есть большой класс разбитый на миксины:

class MyObject(MyObjectFilesMixin, MyObjectProcessingMixin, ...):
    def __init__(self, value):
        self.value = self.preprocess(value)

Миксины такие:

class MyObjectFilesMixin:
    def load_from_file(cls, filename):
        return ...

Сейчас хочу добавить везде типизацию:

class MyObjectFilesMixin:
    def load_from_file(cls, filename: str) -> MyObject:
        return ...

class MyObjectProcessingMixin:
    def preprocess(self: MyObject, value: bytes):
        return value  # логика опущена

    def append(self: MyObject, other: MyObject):
        self.value += other.value

Но это приводит к циклическим зависимостям. Конечно, можно создать какой-нибудь класс вида
MyObjectBase (следуя принципу инверсии зависимостей), чтобы главный класс
MyObject мог наследовать этот базовый, а миксины использовали его как тип аргумента/результата в методах, но это всё же корявый тип будет. Как это можно исправить??
Немного скучаю по заголовочным/исходным файлам C++

у cls и self type hints не используют, так как и так понятно, что self  это экземпляр объекта того класса, который вызывается, а cls это объект класса в котором определен метод данного класса(только не забудьте декоратор @classmethod)


Преобразование русскоязычной даты в pandas datetime
Есть столбец с датами на русском языке типа
str. Необходимо конвертировать их в тип данных
pandas datetime. Использовал
pd.to_datetime(errors="coerce"), но он не сработал. Кварталы трогать необязательно и можно удалить.

index
Дата

4
IV кв. 2019 г.

5
I кв. 2020 г.

6
Декабрь 2009

7
Декабрь 2010

8
Декабрь 2011

...
...

4555
Февраль 2014

4556
Март 2014

Сначала замените русские названия месяцев на их порядковый номер, используя Series.replace или Series.str.replace
Например:
<code>
Декабрь —> 01.12
Март -> 01.03
</code>
После этого воспользуйтесь pd.to_datetime()


Сортировка матрицы
Дана матрица n * m , нужно отсортировать и вывести колонками от самого маленького к самому большому, у меня не выходит сделать, смотреть ниже.
Мой код:

n , m = map(int,input().split())
matrix = [list(map(int,input().split())) for i in range(n)]
matrix_copy = copy.deepcopy(matrix)
li = []
for i in range(n):
    for j in range(m):
        li.append(matrix[i][j])
li.sort()
k = -1
for i in range(n):
    for j in range(m):
        k +=1
        matrix_copy[i][j] = li[k]

x = (list(zip(*matrix_copy)))

for i in x:
    print(*i)

Вход: n - количество строк, m- количество колонок, потом вводим матрицу нужного размера.
Как работает у меня:

input:

3 3
4 1 3
2 5 7
9 8 6

output:

1 4 7
2 5 8
3 6 9

input:
1 3
4 2 1
output:
1
2
4

input:
3 1
9
7
8

output:

7 8 9

Как должно быть:

input0:

3 3
4 1 3
2 5 7
9 8 6

output0:

1 4 7
2 5 8
3 6 9

input1:
1 3
4 2 1

output1:
1 2 4

input2:
3 1
9
7
8
output2:
7
8
9

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

n, m = map(int,input().split())
matrix = [list(map(int,input().split())) for i in range(n)]
li = []
for i in range(n):
    for j in range(m):
        li.append(matrix[i][j])
li.sort()

# ------- дотуда (почти) ваш код, теперь мой --------

for i in range(n):
    for j in range(m):
        print(li[n * j + i], end=" ")
    print()

n * j + i просто индекс
i-той строки и
j-того столбца в вашем списке
li.


Python. Создать словарь нужно вида [закрыт]

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

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

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

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

есть переменные ticket, Eng_name, STATUS, summa которые парсятся и присваиваются в цикле.
на выходе имеем такой вид:
<code>
ticket:  59406 Eng_name: Иванов STATUS:  Рассчитан summa :  600
ticket:  59269 Eng_name: Петров STATUS:  Рассчитан summa :  5600
ticket:  54730 Eng_name: Петров STATUS:  Рассчитан summa :  27750
ticket:  59241 Eng_name: Карпов STATUS:  Рассчитан summa :  1050
</code>
требуется создать словарь с ключами по всем фамилиям. (если фамилия встречается 2 и более раз, то добавить в словарь все значения переменных ticket, Eng_name, STATUS, summa и вычислить сумму значений summa )

Что-то на подобии:
<code>
data = [
    "ticket:  59406 Eng_name: Иванов STATUS:  Рассчитан summa :  600",
    "ticket:  59269 Eng_name: Петров STATUS:  Рассчитан summa :  5600",
    "ticket:  54730 Eng_name: Петров STATUS:  Рассчитан summa :  27750",
    "ticket:  59241 Eng_name: Карпов STATUS:  Рассчитан summa :  1050",
]

res = dict()

for line in data:
    parts = line.split()

    ticket_id, name, status, summ = parts[1], parts[3], parts[5], int(parts[8])

    if name in res:
        res[name]["data"].append((ticket_id, status, summ))
        res[name]["sum"] += summ
    else:
        res[name] = {
            "data": [(ticket_id, status, summ)],
            "sum": summ
        }

print(res)
</code>


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

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

Проверка массива на непрерывное возрастание цифр

                                (4 ответа)

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

Создавал предыдущий вопрос но не совсем уточнил точные действия. И так у нас есть список из чисел:

num = [1,2,3,4,5,100,214,411,41]
OUT: True, MAX: 5

Нам требуется проверить, если в этом списке есть 5 чисел которые нарастают непрерывно, то есть - 1, 2, 3, 4, 5, а так же вывести то число до какого идет непрерывное возрастание, в нашем случае 5
Так же списки могут быть разными, к примеру у нас будет такой список:

num = [22,1,2,3,4,5,6,7,8,41,44,200]
OUT: True, MAX: 8

Тут мы видим что нарастание идет уже из 8 цифр, нам требовалось проверить наростают ли 5 цифр, в этом случае мы должны получить что непрерывно наростают у нас 3,4,5,6,7 (то есть получаем максимальное число)

def f(arr):
    for i in range(len(arr) - 5):
        el = arr[i:i + 5]
        if el == list(range(min(el), max(el) + 1)):
            return True, el[-1]
    return False

print(f([22,1,2,3,4,5,6,7,8,41,44,200]))

Вывод:

(True, 5)

def f(arr):
    arr2 = []
    for i in range(len(arr) - 5):
        el = arr[i:i + 5]
        if el == list(range(min(el), max(el) + 1)):
            arr2.append(el[-1])

    if arr2:
        return True, max(arr2)
    return False

print(f([22,1,2,3,4,5,6,7,8,41,44,200]))

Вывод:

(True, 8)

Вариант где длина передаётся как параметр

def f(arr, n):
    for i in range(len(arr) - n):
        el = arr[i:i + n]
        if el == list(range(min(el), max(el) + 1)):
            return True, el[-1]
    return False


Выборочный парсинг данных из Excel файлa
Есть Excel файл с данными, 5 столбцов. Нужно спарсить выборчные колонки.
Вот столбцы
['Name', 'Age', 'position', 'level', 'city'].

import pandas as pd

df_ = pd.read_excel('file.xlsx', sheet_name=['sheet1', 'sheet2'])
df = pd.DataFrame().append([df_[i] for i in df_]).reset_index(drop=True)
column_name = ['Name', 'city']

data = []
for i in range(len(column_name)):
    data.append(df[column_name[i]])

print(data)

Нужно получить данные с
Name и с
City.

Воспользуйтесь параметрами pd.read_excel(..., sheet_name=['sheet1', 'sheet2'], usecols=["Name","city"]):
<code>
df = pd.concat(pd.read_excel(filename,
                             sheet_name=['sheet1', 'sheet2'],
                             usecols=['Name', 'city']))
</code>


Проверка массива на непрерывное возрастание цифр
К примеру у нас есть массив:
<code>
nums = [7, 10, 9, 8, 6]
#Отсортировываем, большее к меньшему
nums.sort()
</code>
Так вот, как проверить что в этом массиве, есть 5 чисел которые возрастают непрерывно, к примеру в нашем случае это 6,7,8,9,10 - все 5 чисел возрастают непрерывно, возвращает истину, если нет ложь, отмечу что числа могут быть совершенно разные.

Ну это просто:
<code>
all(a - b == 1 for a,b in zip(nums[1:],nums))
</code>


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

Ответ на этот вопрос зависит от настроек консольного окна (
cmd в Windows,
terminal в Linux/MacOS). Обычно параметр, отвечающий за хранения буфера вывода называется
scroll buffer.
Даже если установить значение этого буфера в 10.000 строк и учесть среднюю длину строки в 100 символов, то это займет:
10000 * 100 / 1024 = 977 KiB - т.е. меньше одного мегабайта.
Поэтому я считаю, что такими мелочами заниматься не стоит.


Проверка на целое число
На ввод дается два чилса в одной строчке через пробел, Нужно проверить целые они или нет, если нет, то вывести:"Неправильный формат ввода". Вот мой код:
<code>
a, b = map(int, input().split())

if int(a)/float(a)==1.0:
    print('является целым числом')
else:
    print('не целое число.')

if int(b)/float(b)==1.0:
    print('является целым числом')
else:
    print('не целое число.')
</code>

Не такая простая задача если решать её полностью. Есть три с половиной варианта:

целое число (0, -33, 16, 1_000_000)

вещественное число (0.1, -123.4, 12e-1, 12.345e2).

вещественное число c целым значением (1.0, -16.0, 12.34e2)

непонятно что (123s, abracadabra, 1O0).

Целое число распознает
int(s). Если
s строка с целым числом внутри, то вернётся его значение, иначе будет выброшено исключение
ValueError.
Вещественное число распознает
float(s). И тоже выбросит исключение в случае неправильного формата.
Для проверки целочисленного значения вещественного числа пригодится метод
is_integer.
В третий пункт попадает всё что вообще не выглядит как число.
Проверка на целое число должна идти до проверки на вещественное, иначе все целые числа будут записаны в вещественные.

def as_int(s):
    try:
        return int(s)
    except ValueError:
        return None

def as_float(s):
    try:
        return float(s)
    except ValueError:
        return None

def main():
    s = input()
    i = as_int(s)
    if i is not None:
        print('int', repr(s), i)
        return

    f = as_float(s)
    if f is not None:
        print('float', repr(s), f)
        if f.is_integer():
            print('... of integer value')
        return

    print('???', repr(s))

main()

Тест:

$ python is_integer.py
1_000_000
int '1_000_000' 1000000

$ python is_integer.py
0
int '0' 0

$ python is_integer.py
-33
int '-33' -33

$ python is_integer.py
16
int '16' 16

$ python is_integer.py
0.1
float '0.1' 0.1

$ python is_integer.py
-123.4
float '-123.4' -123.4

$ python is_integer.py
12e-1
float '12e-1' 1.2

$ python is_integer.py
12.345e2
float '12.345e2' 1234.5

$ python is_integer.py
1.0
float '1.0' 1.0
... of integer value

$ python is_integer.py
-16.0
float '-16.0' -16.0
... of integer value

$ python is_integer.py
12.34e2
float '12.34e2' 1234.0
... of integer value

$ python is_integer.py
123s
??? '123s'

$ python is_integer.py
abracadabra
??? 'abracadabra'

$ python is_integer.py
1O0
??? '1O0'


Удалить и заменить значения матрицы в модуле Python
Мне нужно в
module_1 сделать функцию, которая удаляет в матрице, находящейся в файле, 4 последних строки, при этом заменив значение всех элементов на ноль.
Я могу сделать это всё по отдельности, но в одном
module_1 не получается. Код:

import csv
from matplotlib.pyplot import matshow, show
from module_1 import task_1
from module_2 import task_2
from module_3 import task_3
def read(csvfile):
    with open(csvfile, 'r') as file:
        r = list(csv.reader(file))
    for x in range(len(r)):
        for y in range(len(r[x])):
            r[x][y] = int(r[x][y])
    return r
def write(matrix, name = "result.csv"):
    with open(name, 'w') as file:
        for x in range(len(matrix)):
            for y in range(len(matrix[x])):
                if y == len(matrix[x]) - 1:
                    file.write(str(matrix[x][y]) + "\n")
                else:
                    file.write(str(matrix[x][y]) + " ")
t1 = task_1(read("tekst.csv"))
for x in range(len(t1)):
    print(t1, end='\n')
print('\n')
t2 = task_2(read("tekst.csv"))
for x in range(len(t2)):
    for y in range(len(t2[x])):
        print(t2[x][y], end=' ')
    print()
t3 = task_3(read("tekst.csv"))
for x in range(len(t3)):
    print(t3)
write(t2)
matshow(t2)
show()

Вот module_1,

def task_1(m):
    d = []
    for i in range(len(m)):
        d.append([0]*len(m[i]))
    return d[:-4]

Если я использую этот код, получается такой вывод :

[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]

А нужно:

[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]

Входные данные в файле tekst.csv

1,2,3,4,5,6,7,8
8,7,6,5,4,3,2,1
2,3,4,5,6,7,8,9
9,8,7,6,5,4,3,2
1,3,5,7,9,7,5,3
3,1,5,3,2,6,5,7
1,7,5,9,7,3,1,5
2,6,3,5,1,7,3,2

Попробуйте так:

def task_1(m):
    d = []
    for i in range(len(m[:-4])):
        d.append([0]*len(m[i]))
    return d

вы так печатаете, попробуйте так:

...

t1 = task_1(read("tekst.csv"))

for x in range(len(t1)):
    print(t1[x], end='\n')     #  t1[x] !!!
print('\n')

...