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

class Spisok:
    def append(self, x):
        if x > 0:
            Spisok.append(x)
        else:
            print('Число меньше 0')

lst = Spisok
lst.append(5)

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

Надо ли здесь писать
def __init__(self) и зачем он нужен? Я читал что эта штука инициализирует класс, кто-то называет это конструктором класса, и я не понимаю нужен ли он, потому что часто его вообще не используют в лёгких программах.
Как сделать, чтобы можно было вводить сразу кучу чисел, я знаю про *args, но опять же не понимаю как это реализовать. Программа не даёт мне писать if *args > 0  =\

Заранее огромное спасибо! Очень хочу во всё разобраться честно!

Метод
__init__ выполняется при создании каждого нового экземпляра класса.
Грyбо говоря в твоём слyчае каждый раз при создани экземпляра класса Spisok, мы создаем пyстой список self.lst. Первый аргумент, self, он получает от интерпретатора, остальные передаются классу в круглых скобках при создании экземпляра.

class Spisok:
    def __init__(self):
        self.lst = []

    def append(self, x):
        if x > 0:
            self.lst.append(x)
        else:
            print('Число меньше 0')

lst = Spisok()
lst.append(5)
lst.append(-5)

Есть еще вопросы?


Как в Python разбить строку по 4 символа и сохранить эти "четвёрки" в списке?
То есть есть например строка: "У Маши рыжая корова" и надо разбить строку по 4 символа: "У Ма", "ши е", "сть ", "рыжа", "я ко", "рова". И всё это надо сохранить в списке, например
spisok = ["У Ма", "ши е", "сть ", "рыжа", "я ко", "рова"]. И, пожалуйста. с объяснениями, по возможности. Спасибо!

x = "У Маши есть рыжая корова"

print([x[i:i + 4] for i in range(0, len(x), 4)])


Как удалить дубли в массиве со словарями Python?
Необходимо удалить дубликаты по ключу значению
name из массива со словарями.
Пробовал следующее:

def remove_duplicates(list):
    seen = set()
    new_list = []
    for item in list:
        t = tuple(item.items())
        if t not in seen:
            seen.add(t)
            new_list.append(item)
    return new_list

input = [{'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}, \
    {'description': 'First service another description', 'name': 'service_one', 'value': 'invalid.url'}, \
    {'description': 'URL Service', 'name': 'service_one', 'value': 'invalid.url'}, \
    {'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}]

output = remove_duplicates(input)
print(output)

Получаю:

[{'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}, \
{'description': 'First service another description', 'name': 'service_one', 'value': 'invalid.url'}, \
{'description': 'URL Service', 'name': 'service_one', 'value': 'invalid.url'}]

Ожидаю получить уникальные словари по элементу
name(остальные поля не так важны):

{'description': 'second service', 'name': 'service_two', 'value': 'invalid.url:8080'}, \
{'description': 'First service another description', 'name': 'service_one', 'value': 'invalid.url'}

Вы хотите сравнивать только "name", но сравниваете абсолютно все. Проверяйте только на повтор "name" и все будет хорошо:
<code>
def remove_duplicates(lst):
    seen = set()
    new_list = []
    for item in lst:
        item_name = item['name']
        if item_name not in seen:
            seen.add(item_name)
            new_list.append(item)
    return new_list
</code>


Есть телеграм бот на aiogram. Есть django приложение с юзерами. Как подать сигнал в бот с джанги на рассылку сообщений?
Интересует вопрос реализации данной связки. Ткните носом в нужное направление

<code>
from asgiref.sync import async_to_sync
from aiogram import Bot

API_TOKEN = 'BOT TOKEN HERE'

bot = Bot(token=API_TOKEN)

async_to_sync(bot.send_message(chat_id=123, text='Hello world!'))
</code>
Либо вместо iaogram использовать синхронный телеграм фреймворк, например - telepot. Таким образом вам не нужно будет импортировать и использовать async_to_sync.


ERROR: Command errored out with exit status 1: pyinstaller python 3.8
<code>
E:\programing\Python>pip install pyinstaller
Collecting pyinstaller
  Using cached PyInstaller-3.6.tar.gz (3.5 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... error
    ERROR: Command errored out with exit status 1:
     command: 'c:\users\никита\appdata\local\programs\python\python38-32\python.
exe' 'c:\users\никита\appdata\local\programs\python\python38-32\lib\site-package
s\pip\_vendor\pep517\_in_process.py' prepare_metadata_for_build_wheel 'C:\Users\
843E~1\AppData\Local\Temp\tmptitfmjcz'
         cwd: C:\Users\Никита\AppData\Local\Temp\pip-install-vqw4tu5e\pyinstalle
r
    Complete output (36 lines):
    running dist_info
    creating C:\Users\Никита\AppData\Local\Temp\pip-modern-metadata-jlh43b56\PyI
nstaller.egg-info
    writing C:\Users\Никита\AppData\Local\Temp\pip-modern-metadata-jlh43b56\PyIn
staller.egg-info\PKG-INFO
    writing dependency_links to C:\Users\Никита\AppData\Local\Temp\pip-modern-me
tadata-jlh43b56\PyInstaller.egg-info\dependency_links.txt
    writing entry points to C:\Users\Никита\AppData\Local\Temp\pip-modern-metada
ta-jlh43b56\PyInstaller.egg-info\entry_points.txt
    writing requirements to C:\Users\Никита\AppData\Local\Temp\pip-modern-metada
ta-jlh43b56\PyInstaller.egg-info\requires.txt
    writing top-level names to C:\Users\Никита\AppData\Local\Temp\pip-modern-met
adata-jlh43b56\PyInstaller.egg-info\top_level.txt
    writing manifest file 'C:\Users\Никита\AppData\Local\Temp\pip-modern-metadat
a-jlh43b56\PyInstaller.egg-info\SOURCES.txt'
    reading manifest file 'C:\Users\Никита\AppData\Local\Temp\pip-modern-metadat
a-jlh43b56\PyInstaller.egg-info\SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    Error in sitecustomize; set PYTHONVERBOSE for traceback:
    SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xed in positio
n 0: invalid continuation byte (sitecustomize.py, line 7)
    no previously-included directories found matching 'bootloader\build'
    no previously-included directories found matching 'bootloader\.waf-*'
    no previously-included directories found matching 'bootloader\.waf3-*'
    no previously-included directories found matching 'bootloader\waf-*'
    no previously-included directories found matching 'bootloader\waf3-*'
    no previously-included directories found matching 'bootloader\_sdks'
    no previously-included directories found matching 'bootloader\.vagrant'
    warning: no previously-included files found matching 'bootloader\.lock-waf*'

    no previously-included directories found matching 'doc\source'
    no previously-included directories found matching 'doc\_build'
    warning: no previously-included files matching '*.tmp' found under directory
 'doc'
    warning: no files found matching 'news\_template.rst'
    no previously-included directories found matching 'news'
    no previously-included directories found matching 'old'
    no previously-included directories found matching 'scripts'
    no previously-included directories found matching 'tests\scripts'
    no previously-included directories found matching '.github'
    warning: no previously-included files found matching '.*'
    warning: no previously-included files found matching '*.yml'
    warning: no previously-included files found matching '*~'
    warning: no previously-included files found matching '.directory'
    writing manifest file 'C:\Users\Никита\AppData\Local\Temp\pip-modern-metadat
a-jlh43b56\PyInstaller.egg-info\SOURCES.txt'
    creating 'C:\Users\Никита\AppData\Local\Temp\pip-modern-metadata-jlh43b56\Py
Installer.dist-info'
    error: invalid command 'bdist_wheel'
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'c:\users\никита\appdata\local\pr
ograms\python\python38-32\python.exe' 'c:\users\никита\appdata\local\programs\py
thon\python38-32\lib\site-packages\pip\_vendor\pep517\_in_process.py' prepare_me
tadata_for_build_wheel 'C:\Users\843E~1\AppData\Local\Temp\tmptitfmjcz' Check th
e logs for full command output.
</code>

Попробуй обновить pip до последней версии: python -m pip install ––upgrade pip
И если python ниже версии 3.8, то его тоже нужно обновить там эту ошибку пофиксили, и после обновления проблем быть не должно


Работа с Shell с помощью скриптов Python
Я новичок.
Хочу написать несколько скриптов для автоматизации процессов работы с сервером на Python.
Прочитал про модуль subprocess. Пытался его применить:
<code>
import subrocess

IP = '***'
PASS = '***'

connect = subprocess.run(["ssh", "root@"+IP])
</code>
А вот как дальше передать пароль, я не понимаю.
Подскажите, пожалуйста.
Спасибо!

Используя модуль
pubprocess будет очень трудно работать по SSH. Лучше используйте специализированную библиотеку для работы с SSH, например Paramiko:

Пример использования на Хабре
Пример использования на "Python для сетевых инженеров"
Официальная документация (eng)


Изображение и csv
В общем нужно сохранить картинку в ячейку в файл формата csv.
Догадываюсь, что дело в кодировках, но не могу понять синтаксис.
Помещаю картинку в label:

label_3.setPixmap(QPixmap(self.pixmap))

Потом я ее помещаю в буфер:

buffer = QtCore.QBuffer()

pixmap.save(buffer, 'jpg')

stamp_data = buffer.data().Base64Encoding

Eсли с методом Base64Encoding, то записывается 0 в ячейку,
если без него, - то куча символов (я так понимаю картинка в кодировке).
Запись делаю в файл вот так:

with open("file_name.csv", "a", newline='') as f:
    writer = csv.writer(f, delimiter=";")
        for row in spisok_znachenii:
            writer.writerow(row)
            print(row)

Когда открываю записанный файл, то либо 0, либо куча символов, но нужна картинка.
В целом и общем объясните, как вообще можно положить картинку в ячейку csv или xls.

Помещение картинки в буфер:

pixmap = QPixmap('<исходное изображение>')
buffer = QBuffer()
pixmap.save(buffer, 'jpg')

# toBase64()
stamp_data = buffer.data().toBase64()

Запись в csv-файл

file = QFile("<filename>.csv")
if file.open(QFile.WriteOnly)):
    csv = QTextStream(&file)
    csv << stamp_data
file.close()

Чтение из csv:

file = QFile("<filename>.csv")
if file.open(QFile.ReadOnly)):
    stream = QTextStream(file)
    image_data_from_csv = stream.readLine()

    pixData = QByteArray.fromBase64(image_data_from_csv)
    pixmap = QPixmap()
    pixmap.loadFromData(pixData)

    # pixmap.save('<результирующая картинка>')
    # должна быть такой же как исходная картинка
file.close()


Создание наследников класса с отличием в лике единственной переменной
Нужно создать много однотипных классов, в которых де факто отличается единственная переменная класса.
Помню, что делал реализация под такой вот синтаксис создания класса:
class Token001(Token, "вот эта строчка в ту самую переменную"): pass, но, хоть убейте, не могу вспомнить реализацию этого через конструктор экземпляра
__new__ или
__init_subclass__. В основном попытки реализации через онные методы заканчиваются
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases. Туплю где то на ровном месте, но тут какие то горы :/

#class Token(object): ...

class Sign(object): #(Token):

    keyword = None

    def __init_subclass__(cls, keyword):

        cls.keyword = keyword

class Sign001(Sign, "sign 001"): pass
class Sign002(Sign, "sign 002"): pass
#...

Traceback (most recent call last):
  File "C:\Users\Shamus_Rezol\Desktop\dwe.py", line 11, in <module>
    class Sign001(Sign, "sign 001"): pass
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

Через
__new__ примерно тоже самое. Не понимаю, что не так то?

Да, можно вместо
pass прописать
keyword = .., но мне не эта реализация интересна.

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

class Sign001(Sign, keyword="sign 001"): pass


Как добавить столбец в базy данных sqlite3 python, с объяснением каждого слова после cursor.execute
<code>
c.execute("alter table linksauthor add column '%s' 'float'" % author)
</code>
Объяните, что какое слово значит.

alter - изменить

table - таблицу

linksauthor - название таблицы, которую менять

add - добавить

column - колонку

'%s' - сюда будет подставлено название добавляемой колонки

'float' - тип добавляемой колонки - число с плавающей точкой

% author - подставить название колонки из переменной author


Форматирование даты в датасете
Всем привет! Суть вопроса - есть датафрэйм с датой следующего вида - 2017-05-08 21:46:36+00:00. Для удобства работы надо переформатировать в вид - yyyy-mm-dd, т.е. убрать время.

data = pd.read_csv('ap-northeast-1.csv', parse_dates=['2017-05-08 21:46:36+00:00'], dayfirst=False)
data.columns = ['Date', 'Architecture', 'OS', 'Office', 'price']
data['Date']=pd.to_datetime(data['Date'])

Столбцы имеют следующие форматы:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 393567 entries, 0 to 1956998
Data columns (total 5 columns):
Date            393567 non-null datetime64[ns, UTC]
Architecture    393567 non-null object
OS              393567 non-null object
Office          393567 non-null object
price           393567 non-null float64
dtypes: datetime64[ns, UTC](1), float64(1), object(3)

Скорее всего есть решение в 1 строку. Писать функцию, которая резала бы дату, не нужно. Такое отображение необходимо для построения графика. Хочется узнать у опытных дата-сатанистов - какое простое решение имеется?

Воспользуйтесь Series.dt.floor("D"), чтобы убрать компонент времени из столбца типа
datetime64:

df["Date"] = df["Date"].dt.floor("D")


dtype=np.int32 или dtype=int. Есть ли разница, если есть то в чем?
Есть ли разница, если есть то в чем ? Это библиотека NumPy
При создании массива есть ли разница в dtype=np.int32 или dtype=int. Если есть ,то в чем?

Различие в том, что при использовании
dtype=int, вместо
int будет использовано
np.int_, что в свою очередь представляет собой тип данных
C long. В зависимости от платформы
np.int_ равен
np.int32 или
np.int64 (см. пример ниже). Если указать
dtype=np.int32 или
dtype="int32", то будет использоваться тип данных
int32 вне зависимости от платформы.
Пример:

import numpy as np
a = np.array([1,2,3], dtype=int)
b = np.array([1,2,3], dtype=np.int32)
c = np.array([1,2,3], dtype=np.int_)
print("int: {}".format(a.dtype))
print("int32: {}".format(b.dtype))
print("int_: {}".format(c.dtype))

Вывод на Windows 64-bit:

int: int32
int32: int32
int_: int32

Вывод на Linux 64-bit:

int: int64
int32: int32
int_: int64


Помогите исправить ошибку: AttributeError: 'bool' object has no attribute 'lineEdit"
Помогите пожалуйста! Никак не могу исправить.
Ошибка в строке
place = self.lineEdit.text()

from PyQt5 import QtWidgets
import WA31
import pyowm

class ExampleApp(QtWidgets.QMainWindow, WA31.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(get_weather)

def get_weather(self):
    owm = pyowm.OWM('7c6d5748acf9ac9cc2f17c86e2354ee6')
    place = self.lineEdit.text()
    observation = owm.weather_at_place(place)
    w = observation.get_weather()

    temp = w.get_temperature('celsius')["temp"]

    self.textBrowser.setText(f'Тумпература: { temp }')

app = QtWidgets.QApplication([])
window = ExampleApp()
window.show()
app.exec_()

попробуйте так:
<code>
from PyQt5 import QtWidgets
import WA31
import pyowm

class ExampleApp(QtWidgets.QMainWindow, WA31.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.get_weather)  # + self.

    # ---->
    def get_weather(self):
        owm = pyowm.OWM('7c6d5748acf9ac9cc2f17c86e2354ee6')
        place = self.lineEdit.text()
        observation = owm.weather_at_place(place)
        w = observation.get_weather()

        temp = w.get_temperature('celsius')["temp"]

        self.textBrowser.setText(f'Тумпература: { temp }')

app = QtWidgets.QApplication([])
window = ExampleApp()
window.show()
app.exec_()
</code>


Переменное число параметров python
Прохожу тему "Переменное число параметров python".
<code>
def total(a=5, *numbers, **phonebook):
    print('a', a)

    #проход по всем элементам кортежа
    for single_item in numbers:
        print('single_item', single_item)

    #проход по всем элементам словаря
    for first_part, second_part in phonebook.items():
        print(first_part, second_part)

print(total(10, 1, 2, 3, Jack=1123, John=2231, Inge=1560))
</code>
Результат:

a 10
single_item 1
single_item 2
single_item 3
Inge 1560
John 2231
Jack 1123
None

Откуда в выводе берется None? Аргументов 7, а выводится 8. Спасибо.

total возвращает (неявно)
None, а эта строка делает вывод результата вызова
total:

print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))


Ошибка обработки файлов RTF на python
Всем добрый день!
Сломал всю голову с таким вопросом:
Написал код:

import pyperclip
import os
from striprtf.striprtf import rtf_to_text

rtf = open('01-08.2020.rtf').read()
text = rtf_to_text(rtf)
a = text.encode('iso-8859-1').decode('cp1251')
i = a.find('Поступ.')
if i != -1:
    a = a[:i]
pyperclip.copy(a)

и все работает как часы, если вначале rtf файла не стоит скрытый текст в виде "разрыва раздела"
после чего программа пишет ошибку:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 34-35: ordinal not in range(256)

программа явно ругается на строку, так как iso-8859-1 не может декодировать скрытый текст написанный в RTF-ке:

a = text.encode('iso-8859-1').decode('cp1251')

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

import pyperclip
    import os
    from striprtf.striprtf import rtf_to_text
    text = rtf_to_text(rtf)
    a = text.encode('iso-8859-1').decode('cp1251')
    i = a.find('Поступ.')
    if i != -1:
        a = a[:i]
    pyperclip.copy(a)

Но в нем некорректно кодируется часть слов как пример:
ВЫПИСКА ÈÇ ËÈÖÅÂÎÃÎ Ñ×ÅÒÀ а должна быть ВЫПИСКА ИЗ ЛИЦЕВОГО СЧЕТА
В сухом остатке я вижу два пути либо как то проверять файл на скрытый текст перед декодированием, либо работать с "кривым" текстом и заменять некорректные буквы правильными...
Уважаемые профессионалы, если сможете помочь советом буду благодарен спасибо!!!

Покопался в исходниках striprtf, нашел место, где кириллица превращается в кракозябры:

c = int(hex, 16)
if c > 127:
    out.append(chr(c))  # NOQA
else:
    out.append(chr(c))

Я ее заменил на (в
encoding передавал
cp1251):

c = int(hex, 16)
out.append(
    bytes([c]).decode(encoding)
)

И сделал пример с небольшой доработкой (в
my_rtf_to_text находится копия исходника striprtf с той доработкой, файл с текстом есть в примере):

from my_rtf_to_text import rtf_to_text

# NOTE: file header: {\rtf1\adeflang1025\ansi\ansicpg1251\
rtf = open('EULA_RUS.rtf', encoding='ansi').read()

print(
    rtf_to_text(rtf, encoding='cp1251')
)
# MICROSOFT SOFTWARE LICENSE TERMS
# MICROSOFT SQL SERVER COMPACT 4.0 SERVICE PACK 1 (SP1)
# Настоящие условия лицензии являются соглашением между корпорацией Microsoft (или, в зависимости от места вашего проживания, одним из ее аффилированных лиц) и вами. Прочтите их внимательно. Они применяются к вышеуказанному программному обеспечению, включая носители, на которых оно распространяется (если они есть). Эти условия распространяются также на все
# обновления,
# дополнительные компоненты,
# службы Интернета,
# службы технической поддержки
# Microsoft для данного программного обеспечения, если эти элементы не сопровождаются другими условиями. В последнем случае применяются соответствующие условия.

PS.
Пока искал информацию по
rtf to text, узнал как определять кодировку с которой работать.
В начале файла
rtf она указывается, например
{\rtf1\adeflang1025\ansi\ansicpg1251\ говорит что:

сам файл закодирован
ansi (по-моему, это кодировка по умолчанию)

ansicpg1251 -- текст кодируется в
cp1251 (
windows-1251)


Список слов строки без знаков препинания
Допустим, есть строка:

abracadabra! Abac. BaBca, cab

Мне надо получить список из слов без знаков препинания и пробелов.
Как это сделать? Желательно в одну строку.

через регулярки

import re

my_str='abracadabra! Abac. BaBca, cab'

print(re.findall(r'\b\w+\b', my_str))

\w+ - любое количество букв

\b - Начало или конец слова (слева пусто или не-буква, справа буква и наоборот).


Список всех объектов класса
Требуется получить список всех ссылок на один класс (объекты Myclass могут находится в любых файлах; функция
print_all находится в модуле, откуда импортируются классы)
Имеется класс и ссылки на него (
a,
b,
c и 2 ссылки в
arr, их и нужно получить)

class Myclass:
    pass

a = Myclass()
b = Myclass()
c = Myclass()
arr = [Myclass(), Myclas()]

def print_all():
    print(Myclass.__getall__())

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

[<__main__.Myclass object at 0x108a52e50>, <__main__.Myclass object at 0x108a52f10>, <__main__.Myclass object at 0x108a52fd0>, <__main__.Myclass object at 0x108a7e430>, <__main__.Myclass object at 0x108a7e400>]

Существует ли альтернатива вымышленной мною функции
__getall__(как
GetAllActorsOfClass в UE4) (возможно ли вообще впринципе получить список всех ссылок?)?

Как-то так:
<code>
class A:
    instances = []
    def __init__(self):
        self.__class__.instances.append(self)

    @classmethod
    def printInstances(cls):
        for instance in cls.instances:
            print(instance)

a = A()
b = A()
A.printInstances()

<__main__.A object at 0x6fffffd87cf8>
<__main__.A object at 0x6fffffd87d68>
</code>


Как сделать замыкание в классе Pyton?
Как реализовать замыкания в классе, есть класс и есть 2 функции
само замыкание:

def _open(func):
    def actual(self):
        def wrapper():
            func()
        return wrapper
    return actual

и функция на которую я пытаюсь его применить:

@_open
def _create(self):
    # body

Класс

class MyClass:
    ...
    def _open(func):
        def actual(self):
            def wrapper():
                func()
            return wrapper
        return actual
    @_open
    def _create(self):
        # body

что я вызываю

my = MyClass(...)
my._create()

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

from functools import wraps

class MyClass:
    def _open(func):
        @wraps(func)
        def wrapper(*args, **kw):
            print('open')
            return func(*args, **kw)
        return wrapper

    @_open
    def _create(self):
        print('create')

my = MyClass()
my._create()


проблема перевода строки в b.str версию [закрыт]

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

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

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

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

Мне нужно вывести строку вот так:

print(b."hello world")

Но что если у меня переменная вместо строки:

i="hello world"
print(b.i) - так не работает

Как мне правильно вывести?

<code>
i = b'hello world'

print(i)
</code>
Без точки не работает.


Python, не получается сделать условие проверки для __add__ в классе
вот код

class Water:

    def __add__(self, other):
            if other is Air():
                return Storm()

class Air:
    def __add__(self, other):
        if other is Water():
            return Storm()
class Storm:
    def __str__(self):
        return "шторм"
print(Water() + Air())

потихоньку знакомлюсь с python, делаю практическое задание и застрял...
нужно чтобы при сложении двух классов возвращался третий, подозреваю что надо как то более конкретно указать на
Air(),но не нагуглил как, пробовал подставлять для теста
if other is 1 и делать
print(Water() + 1) тогда все работает и возвращается
Storm(). Пожалуйста подскажите как реализовать эту проверку с классом.

Оператор
a is b фактически проверяет, что слева и справа стоит объект с одним
id:

id(a) == id(b)

Поэтому когда вы проверяете
other is Air() это эквивалентно такой проверке:

id(other) == id(Air())

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

type(other) is Air # слева тип и справа тип, а не экземпляр
id(type(other)) == id(Air) # суть этой проверки

Либо, как предложил в комментарии splash58, такую же проверку можно сделать с помощью функции
isinstance. Но фактически я думаю такая проверка делает тоже самое, что мой код выше, это просто "синтаксический сахар":

isinstance(other,Air)


Как преобразовать JPG в массив NumPy?
Как преобразовать JPG изображение в трехмерный массив NumPy, в котором каждый пиксель будет представлен вектором из трёх чисел?
Первое из которых, обозначает красный цвет, второе - зелёный, а третье - синий, т.е. RGB.

import numpy as np
from PIL import Image    #  pip install Pillow

img = np.asarray(Image.open('image.jpg').convert('RGB'))


Напишите программу которая считывает со стандартного ввода целые числа, по одному числу в строке, и после первого введенного нуля заканчивает цикл
Сейчас я изучаю цикл "While" и мне нужно написать программу которая считывает со стандартного ввода целые числа, по одному числу в строке, и после первого введенного нуля заканчивает цикл.Я написал код,который заканчивает цикл если только первая переменная равна нулю,а мне нужно, чтобы цикл заканчивался если последняя переменная равна нулю.
<code>
a=int(input())
while a!=0:
b=int(input())
if b!=0:
int(input())
</code>

a = int(input())
while a != 0:
    a = int(input())


Добавление множества объектов класса
Хочу чтобы этот код
<code>
class GetUser():
    def __init__(self, user_id):
        fields = ['verified', 'blacklisted', 'sex', 'bdate', 'city',
                    'country', 'home_town', 'photo_50', 'photo_100',
                    'photo_200_orig', 'photo_200', 'photo_400_orig',
                    'photo_max', 'photo_max_orig', 'online', 'lists',
                    'domain', 'has_mobile', 'contacts', 'site',
                    'education', 'universities', 'schools', 'status',
                    'last_seen', 'followers_count', 'common_count',
                    'counters', 'occupation', 'nickname', 'relatives',
                    'relation', 'personal', 'connections', 'exports',
                    'wall_comments', 'activities', 'interests', 'music',
                    'movies', 'tv', 'books', 'games', 'about', 'quotes',
                    'can_post', 'can_see_all_posts', 'can_see_audio',
                    'can_write_private_message', 'timezone', 'screen_name']
        user = vkc.users.get(user_ids=user_id, fields=fields)[0]
        self.verified = user['verified']
        self.blacklisted = user['blacklisted']
        self.sex = user['sex']
        self.bdate = user['bdate']
        self.city = user['city']
        self.country = user['country']
        self.home_town = user['home_town']
        self.photo_50 = user['photo_50']
        self.photo_100 = user['photo_100']
        self.photo_200_orig = user['photo_200_orig']
        self.photo_200 = user['photo_200']
        self.photo_400_orig = user['photo_400_orig']
        self.photo_max = user['photo_max']
        self.photo_max_orig = user['photo_max_orig']
        self.online = user['online']
        self.lists = user['lists']
        self.domain = user['domain']
        self.has_mobile = user['has_mobile']
        self.contacts = user['contacts']
        self.site = user['site']
        self.education = user['education']
        self.universities = user['universities']
        self.schools = user['schools']
        self.status = user['status']
        self.last_seen = user['last_seen']
        self.followers_count = user['followers_count']
        ...

</code>
Был не таким большим, т.е. хочу чтобы он укоротился, но не знаю как (сразу извиняюсь если объяснил неясно)

class GetUser():
    def __init__(self, user_id):
        fields = [
            'verified', 'blacklisted', 'sex', 'bdate', 'city', 'country',
            'home_town', 'photo_50', 'photo_100', 'photo_200_orig',
            'photo_200', 'photo_400_orig', 'photo_max', 'photo_max_orig',
            'online', 'lists', 'domain', 'has_mobile', 'contacts', 'site',
            'education', 'universities', 'schools', 'status', 'last_seen',
            'followers_count', 'common_count', 'counters', 'occupation',
            'nickname', 'relatives', 'relation', 'personal', 'connections',
            'exports', 'wall_comments', 'activities', 'interests', 'music',
            'movies', 'tv', 'books', 'games', 'about', 'quotes', 'can_post',
            'can_see_all_posts', 'can_see_audio', 'can_write_private_message',
            'timezone', 'screen_name'
        ]
        user = vkc.users.get(user_ids=user_id, fields=fields)[0]

        for field in fields:
            setattr(self, field, user[field])


Запрет регистрации с определенных email доменов в Djanga
Всем привет!
Помогите реализовать проверку почтовых доменов из черного списка при регистрации юзера: если домен попадает в этот список, то регистрацию запретить и вывести меседж типа "регистрация с этого домена запрещена".

создаете файл validators.py (там же где и views.py и т.д.) и пишите в него что-то такое

from django.core import validators
from django.core.exceptions import ValidationError

def validate_even(value):

    if 'mail.ru' in value :
        raise ValidationError(
            f'{value} регистрация с mail.ru запрещена ',
            params={'value': value},
        )

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

from .validators import validate_even

class NameForm(ModelForm):
    mail=forms.CharField(label = 'email',validators=[validate_even])

ну и собственно все


как сделать движение по окружности?
я не понимаю как сделать движение по окружности в godot'е, если в python + pygame я мог сделать это таким образом:
<code>
def rotate_mouse(s,img,pos,num,num1):
    mouse_x,mouse_y=pygame.mouse.get_pos()
    rel_x, rel_y = (-screen_width//2+mouse_x-num+hero.x) - s.x, (mouse_y+hero.y+num1-screen_width//2) - s.y
    s.angle = (179 / math.pi) * -math.atan2(rel_y, rel_x)
    w, h = img.get_size()
    img2 = pygame.Surface((w*2, h*2), pygame.SRCALPHA)
    img2.blit(img, (w-w/6-pos[0], h-pos[1]))s.angle - это self.angle
s.angle - это self.angle
self.dotx=self.rect.center[0]+self.r*math.sin(math.radians(self.angle))
self.doty=self.rect.center[1]+self.r*math.cos(math.radians(self.angle))
</code>
и потом на точки self.dotx и self.doty поставить другой объект.
мне просто нужен аналог math.radians для godot'а.
и да этот объект будет вращаться от мыши, я это исправлю.

Всё куда проще чем я ожидал.
<code>
var angle = 0
var r = 50
func _physics_process(delta):
    angle += 0.1
    if angle >= 360:
        angle = 0
    inp.y = r*sin(angle)
    inp.x = r*cos(angle)
    move_and_collide(inp)
</code>


Заменить значения в столбце по условию
Есть две колонки
Count и
Сondition. Хочу заменять значения в
Сondition с условием.
В
Сondition есть значения и 0. Если
Count > Сondition - заменяем 0 ниже на значение, которое было до этого, если оно не 0.
Count < Сondition - останавливаемся заменять 0 на значение. Второе условие - если
Count < Сondition не достигнуто, но мы сталкиваемся с другим значением - останавливаем замену по этому значению и следовательно начинаем с другого.
Сделал через
df.loc[(df['Сondition'].shift(1) !=0 ) & (df['Count'] > df['Сondition']), 'Сondition'] = df['Сondition'].shift(1), но это работает только построчно, не за раз.
Более полные данные.
Вот пример, что есть:

    Count   Сondition
1   27.39   0
2   27.32   0
3   27.33   0
4   27.32   0
5   27.35   0
6   27.35   0
7   27.3    27.16
8   27.24   0
9   27.22   0
10  27.21   0
11  27.17   0
12  27.19   27.15
13  27.21   0
14  27.18   0
15  27.16   0
16  27.17   0
17  27.17   0
18  27.17   0
19  27.18   0
20  27.11   0
21  27.11   0
22  27.11   0
23  27.11   0
24  27.09   0
25  27.12   0
26  27.15   0
27  27.11   27.05
28  27.12   0

И как должно получится:

Count   Сondition
27.39   0
27.32   0
27.33   0
27.32   0
27.35   0
27.35   0
27.3    27.16
27.24   27.16
27.22   27.16
27.21   27.16
27.17   27.16
27.19   27.15
27.21   27.15
27.18   27.15
27.16   27.15
27.17   27.15
27.17   27.15
27.17   27.15
27.18   27.15
27.11   0
27.11   0
27.11   0
27.11   0
27.09   0
27.12   0
27.15   0
27.11   27.05
27.12   27.05


Создание таблицы tableWidget
Не получается создать таблицу в pyside2. Есть два файла один со всем интерфейсом , второй который его запускает.
файл 1

from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
    QObject, QPoint, QRect, QSize, QTime, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
    QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
    QPixmap, QRadialGradient)
from PySide2.QtWidgets import *

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1023, 443)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.tableWidget = QTableWidget(self.centralwidget)
        self.tableWidget.setObjectName(u"tableWidget")
        self.tableWidget.setGeometry(QRect(10, 60, 1001, 331))
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(20, 10, 75, 23))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 1023, 21))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.pushButton.setText(QCoreApplication.translate("MainWindow", u"submit", None))
    # retranslateUi

файл 2

from PySide2 import QtCore, QtGui, QtWidgets
from UI_api import Ui_MainWindow
import sys
import os
import PySide2

# crate app
app = QtWidgets.QApplication(sys.argv)

# Create form and init UI
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()

def get_data():
    data = "{\"events\": {\"050719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Sent\": \"3\", \"Date\": \"05.07.2019\"}, \"050919\": {\"Type\": \"Conference\", \"Published\": \"23\", \"Sent\": \"35\", \"Date\": \"05.09.2019\"}, \"120719\": {\"Type\": \"Conference\", \"Published\": \"3\", \"Sent\": \"4\", \"Date\": \"12.07.2019\"}, \"150719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Date\": \"15.07.2019\", \"Sent\": \"2\"}}}"
    d = json.loads(data)
    keys = ["Date", "Type", "Published", "Sent"]
    labels = keys + ["ID"]

    w = ui.tableWidget
    w.setColumnHidden(4, True)
    w.setHorizontalHeaderLabels(labels)

    for i, (key, value) in enumerate(d["events"].items()):
        rows = [value[k] for k in keys] + [key]
        w.insertRow(w.rowCount())
        for j, v in enumerate(rows):
            it = QtWidgets.QTableWidgetItem(v)
            w.setItem(i, j, it)

ui.pushButton.clicked.connect(get_data)

sys.exit(app.exec_())

проблема в том что функция get_data() не возвращает данные , а только вставляет вертикальные номера строк.
Подскажите, как с такой архитектурой (имеется ввиду через 2 файла) создать таблицу.

Надо указать количество столбцов - тогда заработает:

w.setColumnCount(len(labels))
w.setHorizontalHeaderLabels(labels)

Рекомендую немного изменить архитектуру приложения. Так вам будет проще управлять вашими файлами проекта:
Файл main.py:

import sys
import os
from PySide2.QtWidgets import QApplication, QMainWindow

from MainWindow import MainWindow

if __name__ == "__main__":
    app = QApplication([])

    mainWindow = MainWindow()
    mainWindow.show()

    sys.exit(app.exec_())

Файл главного окна приложения MainWindow.py:

from PySide2 import QtCore
from PySide2.QtWidgets import QMainWindow, QTableWidgetItem
from Ui_MainWindow import Ui_MainWindow
import json

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.get_data)

        # Заголовок таблицы задается один раз в конструкторе
        self.keys = ["Date", "Type", "Published", "Sent"]
        labels = self.keys + ["ID"]

        w = self.ui.tableWidget
        w.setColumnHidden(4, True)
        w.setColumnCount(len(labels))
        w.setHorizontalHeaderLabels(labels)

    # Реакция на нажатие кнопки
    def get_data(self):
        data = "{\"events\": {\"050719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Sent\": \"3\", \"Date\": \"05.07.2019\"}, \"050919\": {\"Type\": \"Conference\", \"Published\": \"23\", \"Sent\": \"35\", \"Date\": \"05.09.2019\"}, \"120719\": {\"Type\": \"Conference\", \"Published\": \"3\", \"Sent\": \"4\", \"Date\": \"12.07.2019\"}, \"150719\": {\"Type\": \"Conference\", \"Published\": \"4\", \"Date\": \"15.07.2019\", \"Sent\": \"2\"}}}"
        d = json.loads(data)

        w = self.ui.tableWidget
        # Очищаем таблицу и вставляем в нее данные
        w.setRowCount(0)
        for i, (key, value) in enumerate(d["events"].items()):
            rows = [value[k] for k in self.keys] + [key]
            w.insertRow(w.rowCount())
            for j, v in enumerate(rows):
                it = QTableWidgetItem(v)
                w.setItem(i, j, it)

Файл Ui_MainWindow остается тем же.


как найти элементы массива Numpy, для которых задана сумма
Есть простая задача определить индексы элементов массива Numpy, сумма которых меньше определённого числа.
Причем элементы должны суммироваться от наибольшего до наименьшего, пока не получится число близкое к заданной сумме. Как сделать это без циклов с помощью Numpy? Спасибо!
<code>
import numpy as np
massiv = np.random.sample(10)
print('исходный массив ', massiv)
summa_zadano = 2.0
print('заданная сумма: ', summa_zadano)
massiv_sort = np.sort(massiv)
massiv_obratn_sort = massiv_sort[::-1]
indeksi_massiva_sort = np.argsort(massiv)[::-1]
massiv_obratn_sort = np.take_along_axis(massiv, indeksi_massiva_sort, axis=0)
for i in range(len(massiv)):
    summa = np.sum(massiv_obratn_sort[0:i+1])
    if summa >= summa_zadano:
        print(massiv_obratn_sort[0:i])
        print(np.sum(massiv_obratn_sort[0:i]))
        print(indeksi_massiva_sort[0:i])
        break
</code>

Для сортированного массива посчитать кумулятивные суммы (cumsum) и бинарным поиском найти нужную.


Как получить полный путь к файлам?
Есть папка, вида:

C:\path\
   folder
   folder
   file

Используя метод
os.listdir(path) получаю список всего, что в ней есть.
Как я могу получать полный путь к каждому файлу в папке и во вложенных папках вне зависимости от уровня вложенности?
Как я понимаю тут нужно создать некую рекурсивную функцию, но как это сделать не очень понимаю.

from pathlib import Path

path = Path(r"C:\download\aaa")
files = [str(f.absolute()) for f in path.glob("**/*")]

результат:

In [8]: files
Out[8]:
['C:\\download\\aaa\\ScreenShots',
 'C:\\download\\aaa\\titanic',
 'C:\\download\\aaa\\ScreenShots\\2020-05-13_19h57_41.jpg',
 'C:\\download\\aaa\\ScreenShots\\2020-05-13_20h00_51.jpg',
 'C:\\download\\aaa\\ScreenShots\\2020-05-25_11h11_54.jpg',
 'C:\\download\\aaa\\ScreenShots\\2020-06-09_14h01_53.jpg',
 'C:\\download\\aaa\\ScreenShots\\2020-06-10_15h33_42.jpg',
 'C:\\download\\aaa\\ScreenShots\\2020-06-10_16h19_57.jpg',
 'C:\\download\\aaa\\ScreenShots\\2020-06-10_16h27_42.jpg',
 'C:\\download\\aaa\\ScreenShots\\2020-06-10_16h32_45.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-05-13_19h57_41.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-05-13_20h00_51.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-05-25_11h11_54.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-06-09_14h01_53.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-06-10_15h33_42.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-06-10_16h19_57.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-06-10_16h27_42.jpg',
 'C:\\download\\aaa\\ScreenShots\\Thumbnails\\2020-06-10_16h32_45.jpg',
 'C:\\download\\aaa\\titanic\\.ipynb_checkpoints',
 'C:\\download\\aaa\\titanic\\preprocess.ipynb',
 'C:\\download\\aaa\\titanic\\preprocess.py',
 'C:\\download\\aaa\\titanic\\sol.py',
 'C:\\download\\aaa\\titanic\\test.csv',
 'C:\\download\\aaa\\titanic\\titanic.7z',
 'C:\\download\\aaa\\titanic\\train.csv',
 'C:\\download\\aaa\\titanic\\.ipynb_checkpoints\\preprocess-checkpoint.ipynb']

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

files = [str(f.absolute()) for f in path.glob("**/*") if f.is_file()]


Помогите разобраться с фyнкцией register_next_step_handler. Библиотека: pytelegrambotapi
Я читал вопросы на этy темy, но немного не понял как строить с ней цепи, и для чего аргyмент message. И как сделать с ней рекyрсию. Пример: Введите число, если ввели не число, то обратно пишет Введите число.

@bot.message_handler(commands=['start'])
def start(message):
    msg = bot.send_message(message.chat.id, 'введите число')  # сообщение от бота
    bot.register_next_step_handler(msg, start_2)  # регистрация след.шага, отправка сообщения, переход к след.функции

def start_2(message):
    if message.text.isdigit():  # если сообщение от пользователя число
        bot.send_message(message.chat.id, 'ваше число {}'.format(message.text))  # отправка сообщения пользователю
    else:  # иначе (если не число)
        bot.send_message(message.chat.id, 'это не число')  # отправка сообщения пользователю
        start(message)  # переход к функции


ffmpeg использования ресурсов GPU Python
Можно использовать moviepy или pypi(ffmpeg) за счёт ресурсов видео карты в python?
Сейчас я использую moviepy и "рендер" идёт за счёт процессора что сильно нагружает пк.

А как вы используете ffmpeg? если вызывая внешний исполняемый фойл то надо просто добавить нужные ключи для использования CUDA, т.е. -vsync 0 -hwaccel cuvid -c:v h264_cuvid, но кодирование на GPU даёт менее качественную картинку при равном размере файла.
Подробная инструкция тут, в кртце ffmpeg должен быть собран с флагами
--enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp


Что нужно знать чтобы учить python django? [закрыт]

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

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

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

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

2,5 месяца назад я заинтересовался программированием и начал учить пайтон. Спустя некоторое время я начал понимать что мне больше нравится веб-разработка. Так как я ещё мало знаю, я хотел бы спросить что мне нужно знать чтобы учить python django?
P.S Мне 13 лет, если это важно

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

На самом деле, тем реально много, и они очень глубокие; но и правда, что это всё не обязательно знать досконально – нередко разработчики разбираются в каких-то вопросах лишь поверхностно, а код просто копируют и адаптируют с блогов и StackOverflow. Это в принципе норм для начала, но надо понимать, что норм это только для начала, и по возможности стоит проявлять интерес, разбираться в вопросах глубже и таким образом значительно повышать свою квалификацию. Но это так, на будущее ;)

Стоит использовать какую-нибудь книгу или курс по Django для начинающих, например Django Girls. И важно научиться не ограничиваться одним источником информации, т.к скорее всего там не всё описано достаточно подробно и понятно, а альтернативные материалы (другие книги, просто статьи или даже ответы на StackOverflow) могут это успешно компенсировать.
Также возможно стоит использовать Django 2.2 – третья версия имеет заметные отличия, и материалов по ней пока не так много. А в целом – удачи в построении карьеры, the world is your oyster!


Как взять следующее сообщение пользователя aiogram
В telebot этот метод выглядит так
bot.register_next_step_handler.
Как взять следующее сообщение пользователя в aiogram?

Можно использовать машину состояний.

сlass Form(StatesGroup):
    peremennaya = State() # Задаем состояние

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await bot.send_message(message.chat.id, 'Отправь свое сообщение:')
    await Form.peremennaya.set() # Устанавливаем состояние

@dp.message_handler(state=Form.a) # Принимаем состояние
async def start(message: types.Message, state: FSMContext):
    async with state.proxy() as proxy: # Устанавливаем состояние ожидания
    a['peremennaya'] = message.text
    await state.finish() # Выключаем состояние

Где в кавычках после переменной a должно находиться переменная, которой названо состояние, в данном случае
peremennaya.


Как получить спосок файлов из списка полных путей?
Имеется список из путей вида:
<code>
['C:/f/f/f/fol/1.txt', 'C:/f/F/1.txt']
</code>
Вложенность пути всегда разная.
Как мне лучше всего получить имена файлов?
Сразу пришла идея перевернуть строку, найти вхождение первого слэша, обрезать строку и перевернуть обратно, но это же костыль какой-то.
Можно ли это как-то реализовать посредством регулярных выражений?

Воспользуйтесь стандартным модулем pathlib, чтобы не зависеть от варианта написания пути и иметь платформо-независимое решение:

from pathlib import Path

paths = ['C:/f/f/f/fol/1.txt', r"c:\path\to\2.txt", "c:\\let's/have\\some/fun.txt"]
res = [Path(x).name for x in paths]

результат:

['1.txt', '2.txt', 'fun.txt']


Работа с посторонними файлами в python
Довольно странный вопрос. К примеру, я создал файл с моим собственным расширением - stck. Могу ли я пользоваться этим файлом в python не как со строкой, а как с файлами JSON? То есть, к примеру, там такой код:

{
"text": "qwerty"
}

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

with open('data.stck', "r+") as stckFile:
        strg = stckFile.read()

, то импортируется он как строка.
Мне же необходимо работать с ним как с объектом (к примеру).
Подскажите, есть ли какое-либо решение, кроме как переписать модуль, встроенный в язык - json по свою гребенку?

Используй стандартную библиотеку json.
Чтобы получить json (словарь в Python) используется класс JSONDecoder.
Пример:
<code>
>>> import json
>>> with open('data.stck') as f:
...    string_from_file = f.read().replace('\n', '')
...
>>> string_from_file
'{"text": "qwerty"}'
>>> dec = json.JSONDecoder()
>>> j = dec.raw_decode(string_from_file)[0]
>>> j
{'text': 'qwerty'}
>>> j['text']
'qwerty'
</code>


Пустой файл после очистки данных
Kод:

d = str(all_users_details)
b = str(re.findall('(?:"id": )(\d+)', d))
ar = [', ']

for x in ar:
    b = b.replace(x, "|")

    with open ('{{ids{0}}}.json'.format(urlfile), 'w', encoding='utf8') as outfile:
        json.dump(b, outfile, ensure_ascii=False, indent=0)

Где:

b = str(re.findall('(?:"id": )(\d+)', d))
ar = [', ']
for x in ar:
    b = b.replace(x, "|")

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

[
{
    "id": 982431710,
    "first_name": "Петр",
    "last_name": "Гарин",
    "user": "Engenegar",
    "phone": null,
    "is_bot": false
},
{
    "id": 576352214,
    "first_name": "Товарищ",
    "last_name": "Легасов",
    "user": "moresarcasm",
    "phone": null,
    "is_bot": false
},
{...

Весь "очищенный" файл:

"[]"

<code>
import json
data = json.loads(all_users_details)
ids = []
for item in data:
    ids.append(item.get("id"))
with open(f"{ids[0]}.json", "w", encoding="utf8") as file:
    json.dump("|".join(ids), file, ensure_ascii=False, indent=0)
</code>
Не стоит парсить json с помощью регулярных выражений, т.к в модуле json уже есть необходимые для этого инструменты. json.loads преобразует строку json в объект Python, в данном случае в list с dicts в нем. Мы можем итерироваться по листу и получать значения словарей, как из обычного словаря, после преобразования, собирая все id. Так же, я использовал шаблонные строки, вместо метода format, т.к это выглядит более уместно в данной ситуации.


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

search_request = str('c major blues backing track')

youtube_search_results = [список, который ниже]

titles = []
for i in youtube_search_results[:]:
    a = i.get('title')
    titles.append(a)

a = []
for i in titles:
    if all(x in str(i).lower().split() for x in search_request.lower().split()) is True:
        a.append(i)

[{'title': 'Slow Blues Backing Track in C / Jam Tracks & Blues Guitar BackTracks TCDG', 'link': '/watch?v=axTQ3Tg9io8', 'id': 'axTQ3Tg9io8'}, {'title': 'C - Medium 12 Bar Blues Backing Track', 'link': '/watch?v=V6aZZFnZUVk', 'id': 'V6aZZFnZUVk'}, {'title': 'Slow Blues Jam | Sexy Guitar Backing Track (C)', 'link': '/watch?v=cVf1mkPvFHY', 'id': 'cVf1mkPvFHY'}, {'title': 'Chicago Style Blues Backing Track (C)', 'link': '/watch?v=3nM_MsXdm6E', 'id': '3nM_MsXdm6E'}, {'title': 'Chicago Blues Backing Jam Track (C)', 'link': '/watch?v=0fJ29wqHQyU', 'id': '0fJ29wqHQyU'}, {'title': 'Slow Blues Backing Track  in C', 'link': '/watch?v=P_uI_Eh6NXw', 'id': 'P_uI_Eh6NXw'}, {'title': 'Slow blues backing track in C major', 'link': '/watch?v=6e_9sqtSqpI', 'id': '6e_9sqtSqpI'}, {'title': 'Soulful Bluesy Groove | Guitar Backing Track Jam in C', 'link': '/watch?v=FjlE5dyiPlw', 'id': 'FjlE5dyiPlw'}, {'title': 'Slow Blues Jam Track in C Major', 'link': '/watch?v=q8IPOQa7VLI', 'id': 'q8IPOQa7VLI'}, {'title': 'Blues Backing Track in C [B.B. King style 4]', 'link': '/watch?v=tgMHbDh9dCw', 'id': 'tgMHbDh9dCw'}]

Решил тем же перебором.
<code>
links = []
for i in youtube_search_results:
    for j in a:
        if j in i['title']:
            links.append(i['link'])
</code>


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

items = {1: 'Русский язык', 2: 'Математика', 3: 'Физика', 4: 'Химия', 5: 'Информатика и ИКТ'}

values = [2, 2, 5, 5, 3, 3, 5, 5]

Что нужно получить:

['Математика', 'Математика', 'Информатика и ИКТ', 'Информатика и ИКТ', 'Физика', 'Физика', 'Информатика и ИКТ', 'Информатика и ИКТ']

res = [items.get(x, "не найдено") for x in values]

результат:

In [55]: res
Out[55]:
['Математика',
 'Математика',
 'Информатика и ИКТ',
 'Информатика и ИКТ',
 'Физика',
 'Физика',
 'Информатика и ИКТ',
 'Информатика и ИКТ']


Как извлечь количество товаров из разнообразных строк?
Подскажите, как извлечь количество товаров из данного DataFrame:

df = pd.DataFrame({
'text':
['полуприцеп-тяжеловоз тсп 94165-0000010 новый 5 шт.; полуприцеп-тяжеловоз тсп 94183-0000010 новый 6шт.',
 'транспортное средство uaz patriot 2017 г.в. комплектация оптимум с дополнительным оборудованием - дополнительный отопитель салона ebespeher 1 шт. - защита ркпп и мкпп уаз 1 единица. - комплект ковриков в салон 1 шт. - коврик в багажник 1 шт. - самоблок. задний дифференциал',
 'неводо-выборочная машина в комплекте с дополнительными изделиями в кол-ве 2-х штук',
 'машина для приготовления горячих напитков larhea bl ec e3 r1 (8 шт.)',
 'комплект печатных форм для полиграфической машины drent vision (8единиц)',
 'блок питания cisco asr 9000 series 750w ac power supply for asr-9001 -2 шт',
 'автомобили уаз - 390945(2 штуки)',
 'устройство выворотки step 2 в количестве 2 (два) шт.',
 'specpricep 994274 2018г.(прицеп)-1 шт.'
 ]})

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

pd.DataFrame({'a': [[5,6],[1,1,1,1],[2],[8],[8],[2],[2],[2]],
'b': [[5,6],[1,1,1,1],2,8,8,2,2,2],
'c': ['5,6','1,1,1,1','2','8','8','2','2','2']})

Можно простой вариант, если не получится с двумя значениями, парсить последнее и получить:

pd.DataFrame({'a': [6,1,2,8,8,2,2,2]})

pat = r"(\d+)(?:\D+)?(?:шт|ед)"
res = df["text"].str.extractall(pat).groupby(level=0)[0].apply(list)

результат:

In [51]: res
Out[51]:
0          [5, 6]
1    [1, 1, 1, 1]
2             [2]
3             [8]
4             [8]
5             [2]
6             [2]
7             [2]
8             [1]
Name: 0, dtype: object

Для приведенного примера все варианты количества товаров спарсились корректно.
PS в ожидаемом результате отсутствуют данные для последней строки с
"(прицеп)-1 шт."


Python. Рекурсия. Что это? [закрыт]

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

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

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

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

я до сих пор не понял как работает рекурсия
<code>
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)
</code>
объясните подробнее пожалуйста

Вы вызываете функцию факториала, допустим, с числом
2:

Условие
if n == 0 не выполняется, функция идёт дальше.

(
factorial(n - 1)). Всё повторяется, но с
n, уменьшенным на 1. Теперь условие снова не выполняется и функция вызывается ещё раз, но с числом
0.

Условие наконец выполнится и вернёт
1.

Потом поднимаемся вверх до функции, вызванной с числом 1. Она вернёт 1 * 1 (т.к. функция ниже вернула 1), и ещё выше передаст свой результат, в данном случае - 1. Потом самая верхняя функция умножает результат предыдущей (1) на 2 и возвращает 2  в основной поток.

Вот и получается факториал 2: 1 * 2 = 2


Итерация по словарям в списке для получения нового списка
Как можно произвести итерацию по словарям в списках:

list_1 = [{'name': 'Vacy', 'id': 1}, {'name': 'Koly', 'id': 4}, {'name': 'Vacy', 'id': 2}]
list_2 = [{'count': 5}, {'count': 6}, {'count': 7}]

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

merged_list = [{'count': 5, 'name': 'Vacy', 'id': 1}, {'count': 6, 'name': 'Koly', 'id': 4}, {'count': 7, 'name': 'Vacy', 'id': 2}]

Понятное дело, что я извлекаю каждый словарь через
for, а потом объединенные словари при помощи
append добавляю в новый список
merged_list. Но как сделать чтобы они объединились в итоге?  Не могу придумать логику.

Воспользуйтесь функцией zip():

res = [{**a, **b} for a,b in zip(list_1, list_2)]

результат:

In [9]: res
Out[9]:
[{'name': 'Vacy', 'id': 1, 'count': 5},
 {'name': 'Koly', 'id': 4, 'count': 6},
 {'name': 'Vacy', 'id': 2, 'count': 7}]

или так:

res = [{**b, **a} for a,b in zip(list_1, list_2)]

In [11]: res
Out[11]:
[{'count': 5, 'name': 'Vacy', 'id': 1},
 {'count': 6, 'name': 'Koly', 'id': 4},
 {'count': 7, 'name': 'Vacy', 'id': 2}]


Отправка изображения на сервер, обработка с помощью Python и отправка обратно приложению на Android (Java)
Я хочу сделать программу для Android (Java) устройства, которая с помощью Python обрабатывает изображение. Я не знаю можно ли использовать Python код на Android совместно с Java и как это сделать и первое что пришло в голову как аналог решения, это: Отправка изображения на сервер с помощью Java, Python его получает, обрабатывает и возвращает, устройство его принимает и к примеру выводит на экран. С помощью каких библиотек это можно сделать? Возможно ли получение изображения с помощью Flask?

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


Как на python задать шанс выпадения?
например -
<code>
import random

chance = random.randint(1,100)

if chance == (шанс выпадения от 1 до 50):
    print("1, 50")

if chance == (шанс выпадения от 51 до 95):
    print("51, 95")

if chance == (шанс выпадения 96 до 100):
    print("96, 100")
</code>
В этих промежутках должен быть шанс выпадения. Как его сделать?

random.randint(x, y) возвращает псевдослучайное число, равномерно распределённое на интервале
[x; y]. Значит, для нахождения вероятности выпадения числа в определённом интервале достаточно взять отношение длины этого интервала к длине всего интервала.
То есть шанс выпадения для
[1; 50] есть
50 / 100 = 0.5, для
[51; 95] —
0.45, для
[96; 100] —
0.05.

def chance(x, y):
    return (y - x + 1) / 100


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

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

Пересечение прямоугольников. Python

                                (4 ответа)

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

На собеседовании получил задачку:

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

Задачку я решил с помощью массивов и собеседование давно закончилось, но подозреваю, что решение не достаточно хорошее:
<code>
def gen_rectangle(cords):
  """Генерирует массив координат всех занимаемых прямоугольником точек"""
  rectangle = []
  for i in range(cords[0][0], cords[1][0]):
    for j in range(cords[0][1], cords[1][1]):
      rectangle.append((i, j))
  return rectangle

def intersection(cord1, cord2):
  """Есть ли пересечение"""
  rectangle1 = gen_rectangle(cord1)
  rectangle2 = gen_rectangle(cord2)

  for i in rectangle1:
    for j in rectangle2:
      if i == j:
        return 'We have intersection!'
  return 'All good'

cord1 = ((1, 1), (4, 8))   # первый прямоугольник
cord2 = ((3, 3), (16, 20)) # второй прямоугольник
print(intersection(cord1, cord2))
</code>
Например: если прямоугольники будут ну очень большими, то каждая занимаемая одним прямоугольником точка - это два int, такое решение не оптимально расходует память.
Как мое решение можно улучшить?

<code>
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

def intersection(l_1, r_1, l_2, r_2):
    if (l_1.x >= r_2.x or l_2.x >= r_1.x):
        return False

    if (l_1.y <= r_2.y or l_2.y <= r_1.y):
        return False

    return True

l_1 = Point(2, 2)
r_1 = Point(4, 1)
l_2 = Point(3, 2)
r_2 = Point(4, 0)

print(intersection(l_1, r_1, l_2, r_2))
</code>
Можно заменить нестрогие неравенства на строгие, в зависимости от условий.


Как вывести/вызвать глобальную переменную из функции в другой функции
У меня есть 2 функции. Необходимо напечатать/вызвать переменную в другой функции.
<code>
def first_function(some):
    global x

def second_function(some):
    print (x)
</code>

def first_function(some):
    global x
    x = 42

def second_function(some):
    global x
    print (x)

global не создаёт переменную, а объясняет интерпретатору, в какой области видимости её искать.
P.S. Использовать
global - плохой стиль, старайтесь передавать аргументы в функции явным образом, либо передавать параметры в класс при его инициализации, чтобы потом использовать эти параметры внутри класса без явной их передачи каждый раз.


Перепутал порядок аргументов.
pat.sub("_", s) вернул ожидаемый результат

"""trash data
_
_
_
_
_"""


Преобразовать список списков в один список
Как преобразовать список списков в один список?

[[123], [456], [123, 4, 5, 6]] →
[123, 456, 123, 4, 5, 6]

l1 = [[1, 2, 3], [4, 5, 6]]
print(sum(l1, [])) # [1, 2, 3, 4, 5, 6]

from itertools import chain
print(list(chain.from_iterable(l1))) # [1, 2, 3, 4, 5, 6]

l2 = [['12', '34'], ['56', '78']]
print(list(map(''.join, l2))) # ['1234', '5678']

Варианты со сторонними библиотеками:

from numpy import array
from pandas.core.common import flatten

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

print(list(array(l).flat))
print(list(flatten(l)))


aiohttp: Вложенные пути RouteTableDef
Как сделать префиксы путям в
RouteTableDef, чтобы не дублировать общие части URL? Во Flask для этих целей есть
flask.Blueprint, в Django
django.urls.include, а как быть в aiohttp?
Хотелось бы такой код:

from aiohttp import web
routes = web.RouteTableDef()

@routes.get('/api/info')
async def get_info(request):
    ...

@routes.get('/api/obj')
async def get_obj(request):
    ...

app = web.Application()
app.add_routes(routes)

Превратить во что-то такое:

from aiohttp import web

routes = web.RouteTableDef()
routes_api = web.RouteTableDef()
routes.append(routes_api, prefix='/api')

@routes_api.get('/info')
async def get_info(request):
    ...

@routes_api.get('/obj')
async def get_obj(request):
    ...

app = web.Application()
app.add_routes(routes)

Чтобы можно было вынести описание части путей в отдельный файл.

В aiohttp нет вложенных путей или префиксов для них, но для этих же целей есть вложенные приложения с префиксами. Получается такой код:
<code>
from aiohttp import web

routes_api = web.RouteTableDef()

@routes_api.get('/info')
async def get_info(request):
    ...

@routes_api.get('/obj')
async def get_obj(request):
    ...

app_api = web.Application()
app_api.add_routes(routes_api)

app = web.Application()
app.add_subapp('/api', app_api)
</code>
Это позволяет легко вынести под-приложения в отдельные файлы. Более подробно см. документацию: Web Advanced: Nested Applications


Сортировка дубликатов и копирование данных
Есть Таблица с данными, есть дубликаты и есть поле 'path' у которого есть None или просто пустое поле
Нужно отсортировать по мин.Цене и скопировать 'path' там где его нету

    ID  price     name        path
    0   1   10.0  помидор  jpg1
    1   1   11.0  помидор  jpg1
    2   2   20.0   яблоко        None
    3   2   25.0   яблоко  jpg2
    4   3   25.0    Банан  jpg3
    5   3   30.0    Банан
    6   4   35.0   Персик

результат

    ID  price     name        path
    0   1   10.0  помидор  jpg1
    2   2   20.0   яблоко  jpg2
    4   3   25.0    Банан  jpg3
    6   4   35.0   Персик  noFoto.jpg

при таком датафрейме:

ID,price,name,path
0,1,10.0,помидор,помидор.jpg
1,1,11.0,помидор,помидор.jpg
2,2,20.0,яблоко,None
3,2,25.0,яблоко,яблоко.jpg
4,3,25.0,Банан,банан.jpg
5,3,30.0,Банан,

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

import numpy as np

df['path'].replace(r'^(?!.*jpg)', np.nan, regex=True, inplace=True)
df = df.sort_values(['ID','path'],na_position='last').fillna(method='ffill')
res = df.sort_values("price").drop_duplicates(subset=["ID"])

res, соответственно, получится:

   ID  price     name         path
0   1   10.0  помидор  помидор.jpg
2   2   20.0   яблоко   яблоко.jpg
4   3   25.0    Банан    банан.jpg

UPDATE
на основании новых пожеланий автора вопроса - если в сете есть строки без дубликатов или без путей к картинкам:

   ID  price     name         path
0   1   10.0  помидор  помидор.jpg
1   1   11.0  помидор  помидор.jpg
2   2   20.0   яблоко         None
3   2   25.0   яблоко   яблоко.jpg
4   3   25.0    Банан    банан.jpg
5   3   30.0    Банан          NaN
6   4   35.0   Персик          NaN
7   5   45.0   ананас          NaN
8   5   40.0   ананас          NaN

делаем так:

df['path'].replace(r'^(?!.*jpg)', np.nan, regex=True, inplace=True)
df['path'] = df.sort_values(['ID','path'],na_position='last').groupby('name')['path'].fillna(method='ffill')
res = df.sort_values("price").drop_duplicates(subset=["ID"])
res.fillna("<NO_IMAGE>", inplace=True)

получаем res:

   ID  price     name         path
0   1   10.0  помидор  помидор.jpg
2   2   20.0   яблоко   яблоко.jpg
4   3   25.0    Банан    банан.jpg
6   4   35.0   Персик   <NO_IMAGE>
8   5   40.0   ананас   <NO_IMAGE>


Неправильно работает программа на Python - лишние переводы строки
Программа, которая логирует всё, что ты писал на клавиатуре
<code>
import pynput.keyboard

log = ""

def process_key_press(key):
   global log
   log = log + str(key)
   print(log)

keyboard_listener =
pynput.keyboard.Listener(on_press=process_key_press)

with keyboard_listener:
   keyboard_listener.join()
</code>
лог должен быть слитным, а он получается в виде:
u'k'
u'i'
u'l'
u'l'
u'a'
u'l'
u'l'
Key.space
u'p'
u'y'
u't'
u'h'
u'o'
u'n'
Key.enter
Завершено

import pynput.keyboard

log = ""

def process_key_press(key):
   global log
   log = log + str(key)
   print(log.replace ("u","").replace ('Key.','').replace('spase',' ').replace ("'",''),end = '')

keyboard_listener = pynput.keyboard.Listener(on_press=process_key_press)

with keyboard_listener:
   keyboard_listener.join()


Ошибка RuntimeError: wrapped C/C++ object of type MatchPage has been deleted
<code>
import sys
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets
import qdarkstyle
from match_page import MatchPage
from bernulli_page import BernulliPage
from poisson_page import PoissonPage
from season_page import SeasonPage
from tournament_page import TournamentPage

class UI_MainWindow(object):
    def setupUI(self, MainWindow, WIDTH, HEIGHT):
        self.DEFAULT_WIDTH = 1680
        self.DEFAULT_HEIGHT = 1010 - 25
        self.HEIGHT = HEIGHT  # чтобы за панель задач не уезжало окно
        self.WIDTH = WIDTH
        self.centralwidget = QtWidgets.QWidget(MainWindow)

    self.set_pages()

    app_icon = QtGui.QIcon()
    app_icon.addFile('icons/ball-16.png', QtCore.QSize(16, 16))
    app_icon.addFile('icons/ball-24.png', QtCore.QSize(24, 24))
    app_icon.addFile('icons/ball-32.png', QtCore.QSize(32, 32))
    MainWindow.setWindowIcon(app_icon)
    MainWindow.setWindowTitle("Football Analytics")
    self.scroll_area = QtWidgets.QScrollArea(self.centralwidget)
    # self.scroll_area.setObjectName('scroll_area')
    # self.scroll_area.setStyleSheet('#scroll_area{border:none}')
    self.scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
    self.scroll_area.setGeometry(QtCore.QRect(
        200, 30, self.WIDTH - 220, self.HEIGHT - 70))

    self.scroll_area.setWidget(self.match_page)

    self.set_menu()
    MainWindow.setCentralWidget(self.centralwidget)

def set_pages(self):
    """
    создание страниц приложения и установка их размеров
    """
    self.match_page = MatchPage()
    self.season_page = SeasonPage()
    self.bernulli_page = BernulliPage()
    self.poisson_page = PoissonPage()
    self.tournament_page = TournamentPage()
    pages = (self.match_page, self.season_page, self.bernulli_page,
             self.poisson_page, self.tournament_page)
    for page in pages:
        page.setGeometry(QtCore.QRect(
            0, 0, self.DEFAULT_WIDTH - 250, self.DEFAULT_HEIGHT - 80))

def set_menu(self):
    """
    добавление меню в прилржение
    """
    self.menu = QtWidgets.QGroupBox(self.centralwidget)
    self.menu.setGeometry(QtCore.QRect(10, 10, 150, self.HEIGHT - 50))
    self.match_item = QtWidgets.QPushButton(self.menu)
    self.match_item.setGeometry(QtCore.QRect(10, 30, 130, 20))
    self.match_item.setText("Матч")

    self.season_item = QtWidgets.QPushButton(self.menu)
    self.season_item.setGeometry(QtCore.QRect(10, 60, 130, 20))
    self.season_item.setText("Сезон")

class MyWindow(QtWidgets.QMainWindow):
    """
    класс окна приложения, задает интерфейс и перехватывает события
    """
    def __init__(self, WIDTH, HEIGHT):
        super(MyWindow, self).__init__()
        self.DEFAULT_WIDTH = 1680
        self.DEFAULT_HEIGHT = 1010 - 25
        self.HEIGHT = HEIGHT - 25  # чтобы за панель задач не уезжало окно
        self.WIDTH = WIDTH
        self.ui = UI_MainWindow()
        self.ui.setupUI(self, WIDTH, HEIGHT)
        self.ui.match_item.clicked.connect(
            lambda: self.ui.scroll_area.setWidget(self.ui.match_page))
        self.ui.season_item.clicked.connect(
            lambda: self.ui.scroll_area.setWidget(self.ui.season_page))
        # self.setMinimumSize(WIDTH, HEIGHT)
        # self.setWindowFlags(
        #     QtCore.Qt.CustomizeWindowHint |
        #     QtCore.Qt.WindowMinimizeButtonHint |
        #     QtCore.Qt.WindowCloseButtonHint)  # убрал на время тестов размера

def closeEvent(self, event):
    """
    перехват события закрытия окна, вывод окна с вопросом при
    возникновении события
    :param event: - событие
    """
    msg = QtWidgets.QMessageBox()
    msg.setWindowTitle("Выход")
    msg_icon = QtGui.QIcon()
    msg_icon.addFile('icons/ball-16.png', QtCore.QSize(16, 16))
    msg.setWindowIcon(msg_icon)
    msg.setText("Вы действительно хотите выйти?")
    button_yes = msg.addButton("Да", QtWidgets.QMessageBox.AcceptRole)
    msg.addButton("Нет", QtWidgets.QMessageBox.RejectRole)
    msg.setDefaultButton(button_yes)
    msg.exec_()
    if msg.clickedButton() != button_yes:
        event.ignore()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    screen = QtWidgets.QDesktopWidget().availableGeometry()
    # print(screen.width(), screen.height())
    MainWindow = MyWindow(screen.width(), screen.height())
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyside2())
    MainWindow.setStyleSheet("background: #121e29")
    MainWindow.showMaximized()

    sys.exit(app.exec_())
</code>
Такая ошибка вылетает при переключении кнопок в меню. Что делать? Чего не хватает?
Отступы немного съехали

нужно использовать
QStackedWidget и переключать страницы с помощью него, а не менять виджеты в
scroll_area с помощью
setWidget()


как правильно перевести запрос sqlalchemy core в raw sql
Всем привет
у меня есть запрос

    query = insert(balance)
    query = query.on_conflict_do_nothing(
        index_elements=["query_id", "warehouse", "product"]
    )

я использую sqlalchemy compile

    sql_str = (
        query.compile(
            dialect=postgresql.dialect(),
        )
    )

на выходе получаю вот такую строку

INSERT INTO balance (id, query_id, warehouse, product) VALUES (%(id)s, %(query_id)s, %(warehouse)s, %(product)s) ON CONFLICT (query_id, warehouse, product) DO NOTHING

как мне получить вот такую raw sql

INSERT INTO balance (id, query_id, warehouse, product) VALUES ($1, $2, $3, $4) ON CONFLICT (query_id, warehouse, product) DO NOTHING

full code

import asyncio
import logging
import sys
from contextlib import asynccontextmanager
from typing import AsyncGenerator

import async_timeout
import asyncpgsa
import stackprinter
from faker import Faker
from sqlalchemy.dialects import postgresql

logging.basicConfig(level=logging.DEBUG)

import sqlalchemy
from sqlalchemy import Boolean, Column, Table, MetaData, NUMERIC, func
from sqlalchemy.dialects.postgresql import UUID, TIMESTAMP, insert
from sqlalchemy.types import Integer

metadata = MetaData()

stock_balance: sqlalchemy.table = Table(
    "stock_balance",
    metadata,
    Column("warehouse", UUID, primary_key=True),
    Column("product", UUID, primary_key=True),
    Column("balance", NUMERIC(15, 3), index=True),
    Column("reserve", NUMERIC(15, 3), index=True),
)

balance: sqlalchemy.table = Table(
    "balance",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("query_id", UUID(as_uuid=True), nullable=False, index=True),
    Column("warehouse", UUID, index=True, nullable=False),
    Column("product", UUID, index=True, nullable=False),
    Column("balance", Boolean, index=True, server_default="f"),
    Column("reserve", Boolean, index=True, server_default="f"),
    Column("count", NUMERIC(15, 3), nullable=False),
    Column("date_time", TIMESTAMP, server_default=func.now(tz="UTC"), index=True),
    Column("updated", Boolean, server_default="f", index=True),
)

def data_traffic():
    fake = Faker("ru_RU")
    balance = fake.boolean()
    return {
        "id": fake.uuid4(),
        "warehouse": fake.uuid4(),
        "product": fake.uuid4(),
        "balance": balance,
        "count": fake.pyfloat(left_digits=15, right_digits=3, min_value=0),
        "reserve": not balance,
    }

@asynccontextmanager
async def connect_db() -> AsyncGenerator:
    try:
        with async_timeout.timeout(5):
            conn = await asyncpgsa.create_pool(
                f"postgresql://postgres:some_secret@"
                f"localhost:10001/stockbalance_test",
                # echo=True,
                min_size=1,
                max_size=1,
                dialect=postgresql.dialect()
            )
            async with conn.acquire() as c:
                yield c
        await conn.close()
    except Exception as exc:
        logging.error(
            "Server Errors: {}\n{}\n{}\n{}".format(
                exc, sys.exc_info()[0], sys.exc_info()[1], stackprinter.format()
            )
        )
        yield None
    finally:
        await conn.close()

async def update_balance(conn, data: list):
    query = insert(balance)
    query = query.on_conflict_do_nothing(
        index_elements=["query_id", "warehouse", "product"]
    )
    sql_str = (
        query.compile(
            dialect=postgresql.dialect(),
        )
    )
    await conn.executemany(
        str(sql_str),
        [
            (
                item["id"],
                item["warehouse"],
                item["product"],
                item["balance"],
                item["reserve"],
                item["count"],
            )
            for item in data
        ],
    )

async def main():
    async with connect_db() as conn:
        try:
            await update_balance(conn, [data_traffic()])
        except Exception as exc:
            print(exc)

if __name__ == "__main__":
    asyncio.run(main())

syntax error at or near "%"

нашел решение.
Может кому поможет.
выглядит это так

    query = insert(balance).values(
        [
            {
                "query_id": item["id"],
                "warehouse": item["warehouse"],
                "product": item["product"],
            }
            for item in data
        ]
    )
    query = query.on_conflict_do_nothing(
        index_elements=["query_id", "warehouse", "product"]
    )
    sql_str, args = compile_query(query)
    print("sql_str: ", sql_str)
    print("args: ", args)
    await conn.executemany(sql_str, [tuple(args)])

sql_str:  INSERT INTO balance (query_id, warehouse, product) VALUES ($2, $1, $3) ON CONFLICT (query_id, warehouse, product) DO NOTHING

args:  ['d982e84e-0f09-43dd-a296-aaf51dd6c36d', '4373a8df-0fd8-4f2f-855c-4a7b36a7ad9e', '831ce109-ff0f-4d0b-8c53-d148bb699bdf']


Сравнение многомерного списка на уникальность по заданным значениям
Есть многомерный список примерно в 20К строк.
Значения
КОД, ЦЕНА, НАИМЕНОВАНИЕ, КАРТИНКА:

list_ = [[1, 10.00, 'помидор', 'путь к jpg'], [1, 11.00, 'помидор', 'путь к jpg'], [2, 20.00, 'яблоко', None], [2, 25.00, 'яблоко', 'путь к jpg'], [3, 25.00, 'Банан', 'путь к jpg'], [4, 25.00, 'Персик', None]

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

list_2 = [[1, 10.00, 'помидор', 'путь к jpg'], [2, 20.00, 'яблуко', None], [3, 25.00, 'Банан', 'путь к jpg'], [4, 25.00, 'Персик', None]

unique , и
set результат не дали.
Кто-то уже сталкивался с подобной проблемой?

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

import pandas as pd #  pip install pandas

создаем Pandas DataFrame из списка записей:

df = pd.DataFrame(list_, columns=["ID", "price", "name", "path"])

получилось:

In [93]: df
Out[93]:
   ID  price     name        path
0   1   10.0  помидор  путь к jpg
1   1   11.0  помидор  путь к jpg
2   2   20.0   яблоко        None
3   2   25.0   яблоко  путь к jpg
4   3   25.0    Банан  путь к jpg
5   4   25.0   Персик        None

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

res = df.sort_values("price").drop_duplicates(subset=["ID"])

результат:

In [95]: res
Out[95]:
   ID  price     name        path
0   1   10.0  помидор  путь к jpg
2   2   20.0   яблоко        None
4   3   25.0    Банан  путь к jpg
5   4   25.0   Персик        None

результат в виде списка:

res_list = res.to_numpy().tolist()

In [97]: res_list
Out[97]:
[[1, 10.0, 'помидор', 'путь к jpg'],
 [2, 20.0, 'яблоко', None],
 [3, 25.0, 'Банан', 'путь к jpg'],
 [4, 25.0, 'Персик', None]]

UPD:

В колонке "Прайс" есть цены в виде строки, '25.00'. как на лету их
преобразовать в float.

df = pd.DataFrame(list_, columns=["ID", "price", "name", "path"])

df["price"] = pd.to_numeric(df["price"], errors="coerce")

res = df.sort_values("price").drop_duplicates(subset=["ID"])


Вложенный comprehension необходимо оптимизировать вручную?
Вопрос к "грандам".
Отвечая на вопрос, где есть такие данные:

dict_groups = [{'name': 'Новые Альбомы', 'gid': 4100014},
{'name': 'Synthpop [Futurepop, Retrowave, Electropop]', 'gid': 8564},
{'name': 'E:\\music\\leftfield', 'gid': 101522128},
{'name': 'Бренд одежды | MEDICINE', 'gid': 134709480},
{'name': 'Другая Музыка', 'gid': 35486626},
{'name': 'E:\\music\\trip-hop', 'gid': 27683540},
{'name': 'Depeche Mode', 'gid': 125927592}]

x = [{'gid': 35486626},{'gid': 134709480},{'gid': 27683540}]

Предложил такое решение:

x_val = tuple(d["gid"] for d in x)
rez = [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]

Оценим производительность:

%timeit x_val = tuple(d["gid"] for d in x)
1.55 µs ± 81.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit [dict_el for dict_el in dict_groups if dict_el["gid"] in x_val]
1.99 µs ± 159 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Можно ли записать итоговый вариант в виде "однострочника"? Конечно можно:

%timeit [dict_el for dict_el in dict_groups if dict_el["gid"] in tuple(d["gid"] for d in x)]
11.9 µs ± 756 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Не знаю почему, но однострочник оказывается медленнее. Так что, рекомендации учебников везде использовать "компрехенсив" (comprehension) - надо проверять.
Складывается впечатление, что выражение
(d["gid"] for d in x) вычисляется в компрехенсиве 7 раз, хотя не зависит от переменных внутри.
Ведь 7*1,55 + 1,99 = 12,84, что примерно совпадает с временем однострочника.

По-моему, вы все правильно поняли - кортеж
tuple(d["gid"] for d in x) создается и проверяется на каждой итерации цикла в однострочной версии.

import dis

In [71]: s = '''[dict_el
    ...:         for dict_el in dict_groups
    ...:         if dict_el["gid"] in
    ...:             tuple(d["gid"] for d in x)]'''

In [72]: dis.dis(s)
  1           0 LOAD_CONST               0 (<code object <listcomp> at 0x000002094FE22270, file "<dis>", line 1>)
              2 LOAD_CONST               1 ('<listcomp>')
              4 MAKE_FUNCTION            0

  2           6 LOAD_NAME                0 (dict_groups)
              8 GET_ITER
             10 CALL_FUNCTION            1
             12 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x000002094FE22270, file "<dis>", line 1>:
  1           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                34 (to 40)

  2           6 STORE_FAST               1 (dict_el)

  3           8 LOAD_FAST                1 (dict_el)
             10 LOAD_CONST               0 ('gid')
             12 BINARY_SUBSCR

  4          14 LOAD_GLOBAL              0 (tuple)
             16 LOAD_CONST               1 (<code object <genexpr> at 0x000002094FE22030, file "<dis>", line 4>)
             18 LOAD_CONST               2 ('<listcomp>.<genexpr>')
             20 MAKE_FUNCTION            0
             22 LOAD_GLOBAL              1 (x)
             24 GET_ITER
             26 CALL_FUNCTION            1
             28 CALL_FUNCTION            1
             30 COMPARE_OP               6 (in)
             32 POP_JUMP_IF_FALSE        4
             34 LOAD_FAST                1 (dict_el)
             36 LIST_APPEND              2
             38 JUMP_ABSOLUTE            4
        >>   40 RETURN_VALUE

Disassembly of <code object <genexpr> at 0x000002094FE22030, file "<dis>", line 4>:
  4           0 LOAD_FAST                0 (.0)
        >>    2 FOR_ITER                14 (to 18)
              4 STORE_FAST               1 (d)
              6 LOAD_FAST                1 (d)
              8 LOAD_CONST               0 ('gid')
             10 BINARY_SUBSCR
             12 YIELD_VALUE
             14 POP_TOP
             16 JUMP_ABSOLUTE            2
        >>   18 LOAD_CONST               1 (None)
             20 RETURN_VALUE

PS как вы уже и сами заметили при использовании генератора -
x_val = (d["gid"] for d in x) -
x_val выдохнется после первой же проверки и это ускорит будущие проверки (результат всех последующих проверок будет неправильным). Но даже при использовании кортежа
x_val = tuple(d["gid"] for d in x) - это работает заметно быстрее по сравнению с однострочной версией.
Замеры времени для списка, состоящего из 70.000 словарей:

In [55]: big = dict_groups * 10000

In [56]: len(big)
Out[56]: 70000

In [67]: %%timeit
    ...: x_val = tuple(d["gid"] for d in x)
    ...: rez = [dict_el for dict_el in big if dict_el["gid"] in x_val]
    ...:
    ...:
6 ms ± 566 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [68]: %%timeit
    ...: rez = [dict_el for dict_el in big if dict_el["gid"] in tuple(d["gid"] for d in x)]
    ...:
    ...:
61.5 ms ± 913 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [69]: %%timeit
    ...: rez = [dict_el for dict_el in big if dict_el["gid"] in set(d["gid"] for d in x)]
    ...:
    ...:
55.9 ms ± 4.55 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Самый быстрый вариант - разница в скорости будет более заметна если в
x будет намного больше элементов. Причина тому - скорость проверки
in list(...) -
O(n), когда для множества:
in set(...) всего
O(1):

In [70]: %%timeit
    ...: x_val = set(d["gid"] for d in x)
    ...: rez = [dict_el for dict_el in big if dict_el["gid"] in x_val]
    ...:
    ...:
5.1 ms ± 72.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

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


Нужно создать множество из значений подстрок в значениях признака
Есть признак в DataFrame, значения у которого - строка, содержащая разное число подстрок через запятую:
df.head - ниже:

0              ['European', 'French', 'International']
1                                                  NaN
2    ['Japanese', 'Sushi', 'Asian', 'Grill', 'Veget...
3                                                  NaN
4    ['German', 'Central European', 'Vegetarian Fri...
Name: Cuisine Style, dtype: object

И так далее, до 11 подстрок в каждой.
Как извлечь вручную каждое значение каждого элемента строки в нужном виде?
Нашла, а в цикл или функцию, чтобы все прогнать и загнать в множество, никак не получается.

    df['Cuisine Style']= df['Cuisine Style'].apply(lambda s:
s.replace('[','') if isinstance(s, str) else s)
df['Cuisine Style']= df['Cuisine Style'].apply(lambda s: s.replace(']','')
if isinstance(s, str) else s)
cuisine_set = set()
for string in df['Cuisine Style']:
    cui_list=df['Cuisine Style'][string].split(',')
    for cuisine in cui_list:
        cuisine=cuisine[1:-1]
        if cuisine in cuisine_set:
            continue
        else:
            cuisine_set.add(cuisine)
cuisine_set

Если я правильно понял вопрос:

from yaml import safe_load   #   pip install pyyaml

res = df["Cuisine_Style"].apply(safe_load).to_list()

результат:

In [9]: res
Out[9]: [['European', 'French'], ['Italian']]

Исходный фрейм:

In [10]: df
Out[10]:
            Cuisine_Style
0  ['European', 'French']
1             ['Italian']

UPD:

На выходе должно получится множество всех возможных из столбца
значений {'European', 'French', 'Italian'.... }

In [128]: res = df["Cuisine Style"].dropna().map(safe_load).sum()

In [129]: len(res)
Out[129]: 95613

In [130]: len(set(res))
Out[130]: 125

In [131]: set(res)
Out[131]:
{'Afghani',
 'African',
 'Albanian',
 'American',
 'Arabic',
 'Argentinean',
 'Armenian',
 'Asian',
 'Australian',
 'Austrian',
 'Azerbaijani',
 'Balti',
 'Bangladeshi',
 'Bar',
 'Barbecue',
 'Belgian',
 'Brazilian',
 ...


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

dict_groups = [{'name': 'Новые Альбомы', 'gid': 4100014},
{'name': 'Synthpop [Futurepop, Retrowave, Electropop]', 'gid': 8564},
{'name': 'E:\\music\\leftfield', 'gid': 101522128},
{'name': 'Бренд одежды | MEDICINE', 'gid': 134709480},
{'name': 'Другая Музыка', 'gid': 35486626},
{'name': 'E:\\music\\trip-hop', 'gid': 27683540},
{'name': 'Depeche Mode', 'gid': 125927592}]

x = [{'gid': 35486626},{'gid': 134709480},{'gid': 27683540}]

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

список= [{'name': 'Другая Музыка', 'gid': 35486626},
{'name': 'E:\\music\\trip-hop', 'gid': 27683540},
{'name': 'Бренд одежды | MEDICINE', 'gid': 134709480}]

In [5]: [dict_group for gid in x for dict_group in dict_groups if dict_group["gid"] == gid["gid"]]
Out[5]:
[{'name': 'Другая Музыка', 'gid': 35486626},
 {'name': 'Бренд одежды | MEDICINE', 'gid': 134709480},
 {'name': 'E:\\music\\trip-hop', 'gid': 27683540}]


Паттерны в Python
Мне приходилось слышать разные мнения касательно паттернов. Я говорю не о паттернах в Python, а о паттернах вообще. Что половину из них нужно бросить в топку, что книги о паттернах программирования нужно запрещать как экстремистскую литературу, что Visitor это не какой не паттерн, а "самый обычный костыль", что если тебе не нравится кандидат на должность - спроси его на знание какого-нибудь паттерна Bridge, и если не сможет схему нарисовать, то пускай идет в другое место. О паттернах, конечно, говорят и хорошее, но эту часть я опущу.
Мой вопрос: Необходимо ли знание паттернов, если пишешь на Python? Или это пережиток прошлого и Python достаточно гибок, чтобы не нуждаться в таких ухищрениях? Если же занать их стоит, то какие 5-10 стоит изучить в первую очередь?

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


Знаки вопроса на странице html, сгенерированной с помощью python
Вообщем, единственная проблема в том, что на странице html, которую генерирует код python, знаки вопроса. ( Кодировка  utf-8 поставлена )
Вот коды:

generate_index.py

from datetime import datetime as dt
from horoscope import generate_prophecies

#body = generate_body(header="Гороскоп на 2012-12-12", paragraphs=generated_prophecies)

def generate_head(title):
    head =  "<meta charset='utf-8'>" + "<title>" + title + "</title>"
    return "<head>" + head + "</head>"

def generate_page(head, body):
    page = "<html>" + head + body + "</html>"
    return page

def generate_body(header, paragraphs):
    body = "<h1>" + header + "</h1>"
    for p in paragraphs:
        body = body + "<p>" + p + "</p>"
    return "<body>" + body + "</body>"

def save_page(title, header, paragraphs, output="index.html"):
    fp = open(output, "w")
    today = dt.now().date()
    page = generate_page(
            head= generate_head(title),
            body= generate_body(header=header, paragraphs=paragraphs)
        )
    print(page, file=fp)
    fp.close()

body = generate_body(header="Гороскоп на 2012-12-12", paragraphs=generate_prophecies())

today = dt.now().date()
save_page(
    title="Гороскоп на сегодня",
    header="Что день " + str(today) + " готовит",
    paragraphs=generate_prophecies()
    )

horoscope.py

import random

times = ["утром", "днём", "вечером", "ночью", "после обеда", "перед сном"]
advices = ["ожидайте", "предостерегайтесь", "будьте открыты для"]
promises = ["гостей из забытого прошлого", "встреч со старыми знакомыми",
            "неожиданного праздника", "приятных перемен"]

def generate_prophecies(total_num=5, num_sentences=3):
    prophecies = []

    i = 0
    while i < total_num:
        j = 0
        forecast = ""
        while j < num_sentences:
            t = random.choice(times)
            a = random.choice(advices)
            p = random.choice(promises)

            full_sentence = t.title() + " " + a + " " + p + "."
            if j != num_sentences - 1:
                full_sentence = full_sentence + " "

            forecast = forecast + full_sentence
            j = j + 1

        prophecies.append(forecast)
        i = i + 1

    return prophecies

А в самом файле index.html вот что:

<html><head><meta charset='utf-8'><title>Ãîðîñêîï íà ñåãîäíÿ</title></head><body><h1>×òî äåíü 2020-06-21 ãîòîâèò</h1><p>Âå÷åðîì ïðåäîñòåðåãàéòåñü ïðèÿòíûõ ïåðåìåí. Íî÷üþ áóäüòå îòêðûòû äëÿ ïðèÿòíûõ ïåðåìåí. Íî÷üþ ïðåäîñòåðåãàéòåñü âñòðå÷ ñî ñòàðûìè çíàêîìûìè.</p><p>Äí¸ì îæèäàéòå ïðèÿòíûõ ïåðåìåí. Ïåðåä Ñíîì áóäüòå îòêðûòû äëÿ ãîñòåé èç çàáûòîãî ïðîøëîãî. Ïîñëå Îáåäà áóäüòå îòêðûòû äëÿ íåîæèäàííîãî ïðàçäíèêà.</p><p>Íî÷üþ áóäüòå îòêðûòû äëÿ íåîæèäàííîãî ïðàçäíèêà. Âå÷åðîì áóäüòå îòêðûòû äëÿ ãîñòåé èç çàáûòîãî ïðîøëîãî. Óòðîì ïðåäîñòåðåãàéòåñü âñòðå÷ ñî ñòàðûìè çíàêîìûìè.</p><p>Íî÷üþ îæèäàéòå ïðèÿòíûõ ïåðåìåí. Ïîñëå Îáåäà áóäüòå îòêðûòû äëÿ ïðèÿòíûõ ïåðåìåí. Ïîñëå Îáåäà îæèäàéòå ïðèÿòíûõ ïåðåìåí.</p><p>Íî÷üþ áóäüòå îòêðûòû äëÿ ïðèÿòíûõ ïåðåìåí. Äí¸ì áóäüòå îòêðûòû äëÿ ãîñòåé èç çàáûòîãî ïðîøëîãî. Óòðîì ïðåäîñòåðåãàéòåñü âñòðå÷ ñî ñòàðûìè çíàêîìûìè.</p></body></html>
Честно говоря, у меня даже нет идей, я код просмотрел несколько раз.

При открытии файла на запись нужно указать ту же кодировку, что указана в теге
<meta charset='...'>, в данном случае - utf-8:

def save_page(title, header, paragraphs, output="index.html"):
    fp = open(output, "w", encoding='utf-8')
    today = dt.now().date()
    page = generate_page(
            head= generate_head(title),
            body= generate_body(header=header, paragraphs=paragraphs)
        )
    print(page, file=fp)
    fp.close()


Почему возникает ошибка KeyError: 0
<code>
n = int(input())
x=[]
a={}
def f(x):
   return x+1
for i in range(n):
    x.append(int(input()))
    if x[i] not in a.keys():
        a.update({x[i]:f(x[i])})
        print(a[i])
    else:
        print(a[i])
</code>

Проблема в том, что у вас в
a[i]
i - это не значение введенное юзером, а его индекс в списке
x.
Например на первой итерации я введу число 10, оно попадет на 0 индекс в списке
x.
Потом вы кладете число на индексе 0 в ваш словарь, тем самым имеем
{10: ...}.
Как видите ключ у нас 10 а не 0, а вы пытаетесь вытащить 0.
Решение: замените
a[i] на
a[x[i]].


Как записать % в ConfigParser Python?
Нужно записать '%7' в конфиг файл, но при попытке сделать это выдаётся ошибка, экранирование через '%%7' не подходит
<code>
# -*- coding: utf-8 -*-

from configparser import ConfigParser

config = ConfigParser()

path = 'config.ini'

config.read(path)
config.set('main', 'mystr', '%7')

with open(path, 'w') as f:
    config.write(f)
</code>

Если еще актуально, вот так работает.
<code>
import configparser
from pathlib import Path

config = configparser.ConfigParser()

path = 'config.ini'

config.add_section("main") # Удалить, если секция [main] существует.

config.read(path)
config.set('main', 'mystr', '%%7')

# Открываем, находим, заменяем, сохраняем.
with open(path, 'w') as f:
    config.write(f)

Path('config.ini').write_text(Path('config.ini').read_text().replace('%%7', '%7'))
</code>


Как определить ближайшую точку из массива с координатами (X,Y) к главной точке (X,Y)?

Необходимо написать функцию
generate_random_coordinates(N), которая генерирует кортеж случайных координат (матрицу) длинной N. Координата X в диапазоне от -180 до +180, координата Y от -90 до +90.

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

Ответ к первому:

from random import randint
c = []
def generate_random_coordinates(N):
    for i in range(N):
        c.append([randint(-180, +180),randint(-90, +90)])
    print(c)

z = generate_random_coordinates(7)
print(z)