Ошибка TypeError
Здравствуйте пишу бота в телегу и выскочила ошибка

TypeError: list indices must be integers or slices, not str (base) 192:korona kupuelel$

import telebot
from telebot import types
import COVID19Py

covid19 = COVID19Py.COVID19()
bot = telebot.TeleBot('лишний раз не пишу токен')

# Функция, что сработает при отправке команды Старт
# Здесь мы создаем быстрые кнопки, а также сообщение с привествием
@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
    btn1 = types.KeyboardButton('Во всём мире')
    btn2 = types.KeyboardButton('Украина')
    btn3 = types.KeyboardButton('Россия')
    btn4 = types.KeyboardButton('Беларусь')
    markup.add(btn1, btn2, btn3, btn4)

    send_message = f"<b>Привет {message.from_user.first_name}!</b>\nЧтобы узнать данные про
коронавируса напишите " \
        f"название страны, например: США, Украина, Россия и так далее\n\n"
    bot.send_message(message.chat.id, send_message, parse_mode='html', reply_markup=markup)

# Функция, что сработает при отправке какого-либо текста боту
# Здесь мы создаем отслеживания данных и вывод статистики по определенной стране
@bot.message_handler(content_types=['text'])
def mess(message):
    final_message = ""
    get_message_bot = message.text.strip().lower()
    if get_message_bot == "сша":
        location = covid19.getLocationByCountryCode("US")
    elif get_message_bot == "украина":
        location = covid19.getLocationByCountryCode("UA")
    elif get_message_bot == "россия":
        location = covid19.getLocationByCountryCode("RU")
    elif get_message_bot == "беларусь":
        location = covid19.getLocationByCountryCode("BY")
    elif get_message_bot == "казакхстан":
        location = covid19.getLocationByCountryCode("KZ")
    elif get_message_bot == "италия":
        location = covid19.getLocationByCountryCode("IT")
    elif get_message_bot == "франция":
        location = covid19.getLocationByCountryCode("FR")
    elif get_message_bot == "германия":
        location = covid19.getLocationByCountryCode("DE")
    elif get_message_bot == "япония":
        location = covid19.getLocationByCountryCode("JP")
    else:
        location = covid19.getLatest()
    final_message = f"<u>Данные по всему миру:</u>\n<b>Заболевших: </b>.
{location['confirmed']:,}\n<b>Сметрей: </b>{location['deaths']:,}"

    if final_message == "":
        date = location[0]['last_updated'].split("T")
        time = date[1].split(".")
        final_message = f"<u>Данные по стране:</u>\nНаселение: {location[0]
['country_population']:,}\n" \
                f"Последнее обновление: {date[0]} {time[0]}\nПоследние данные:\n<b>" \
                f"Заболевших: </b>{location[0]['latest']['confirmed']:,}\n<b>Сметрей: </b>" \
                f"{location[0]['latest']['deaths']:,}"

    bot.send_message(message.chat.id, final_message, parse_mode='html')

# Это нужно чтобы бот работал всё время
bot.polling(none_stop=True)

Ошибка выскакивает в 49 строке:

final_message = f"<u>Данные по всему миру:</u>\n<b>Заболевших: </b>{location['confirmed']:,}\n<b>Сметрей: </b>{location['deaths']:,}"

Если я правильно понял, используется эта библиотека.

covid19.getLatest() возвращает
<class 'dict'>:

import COVID19Py

covid19 = COVID19Py.COVID19()

latest = covid19.getLatest()
print(latest, type(latest))

>>> {'confirmed': 4897492, 'deaths': 323285, 'recovered': 0} <class 'dict'>

Метод
dict.get(key[, default]) - возвращает значение ключа, но если его нет, не бросает исключение, а возвращает default (по умолчанию None).
Таким образом получить значение можно:

print('confirmed:', latest.get('confirmed'), 'deaths:', latest.get('deaths'), 'recovered:', latest.get('recovered'))

>>> confirmed: 4897492 deaths: 323285 recovered: 0


Парсинг и фильтрация CSV файлов
Пример содержимого CSV файла:

название;цена;доставка
Аренда топ игрового компьютера на RTX 2060/2070;398;нет доставки
Ноутбук Aorus RTX 2070 240Hz;150000;нет доставки
Игровой пк 2700x, RTX 2070 Super, 32 Gb DDR4;95000;нет доставки
Игровой пк rtx 2070 i5 9400f монитор/мышь/клава;70000;нет доставки
HP omen 15 dh0026ur 4k RTX 2070 новый;140000;есть доставка
Игровой пк - RTX2070 Super 8Gb, i5 9400F, 16Gb;86000;есть доставка
Игровой процессор на RTX2070 и i5-9600;90000;есть доставка
Asus Strix RTX 2070 8Gb;31000;нет доставки
Gigabyte Geforce RTX 2070 Windforce (8гб);32500;нет доставки
RTX 2070 Super Asus Rog Strix OC Обмен;39990;есть доставка
Игровой компьютер AMD Ryzen 5/24GB/RTX2070/1TB SSD;85000;нет доставки

Задача, вывести строки, которые попадают в интервал цены - от и до (второй столбец файла), и записать их в другой файл.
Решение задачи предложенное @MaxU:

import pandas as pd

price_ot = 5000
price_do = 300000
delivery = 'есть доставка'
brand = 'Aorus'

(pd
 .read_csv('data.csv', sep=';')
 .query('@price_ot <= `цена` <= @price_do and @delivery in `доставка` and @brand in `название`')
 .to_csv('new_data.csv', sep=';', index=False))

Есть ли способ, который позволяет сделать фильтр не по полному вхождению, как сейчас для
delivery, а по отдельному слову в ячейке, например нужно оставить строки в которых содержится только вхождение одного слова 'Aorus' в первом столбце?

Воспользуйтесь модулем Pandas:
<code>
import pandas as pd  #  pip install pandas

price_from = 30000
price_to = 35000
delivery = ["есть доставка"]
qry = "@price_from <= `цена` <= @price_to and `доставка` in @delivery"

(pd
 .read_csv(filename, sep=";")
 .query(qry)
 .to_csv(new_filename, sep=";", index=False))
</code>


как работает json?

f = open('json_data.txt','w', encoding='utf-8') # открывает файл для записи
json.dump(str(items), f)
f.close()

в файле json_data.txt, появляется много данных разделенных "\".
Например:
"title":"Холодильник Side by Side" в файле записана как:
"title\":\"\u0425\u043e\u043b\u043e\u0434\u0438\u043b\u044c\u043d\u0438\u043a Side by Side\".
Мне нужно по ключу "title" в словарь записать все значение, одно из них "Холодильник Side by Side ".
Но в странице,которая парсится, в месте где этот текст, нет HTML тегов. Там ДжаваСкрипт генерирует страницу. Поэтому применяю json. Но не понятно как данные по определенному ключу в словарь записать.

Передавайте в json.dump сам объект, а не его строковое представление.
А чтобы русские символы отображались как есть, то указывайте
ensure_ascii=False
Пример:

with open('json_data.txt', 'w', encoding='utf-8') as f:
    json.dump(items, f, ensure_ascii=False)


Как парсить сайт с js на python
Как парсить сайт, контент на котором прогружается javascript? Кроме selenium.

можно использовать
requests-html.


Скрипт Python не кликает в игровом окне
Пишу бота.
Есть некое окно игры, куда не проходят клики из Python.
Пробовал и ctypes, и autopy и pyautogui.
Не хочет и всё, вне окна игры работает замечательно
Мало того, что он в самой игре не может ничего кликнуть, так даже и окно с игрой свернуть таким способом не получается.
Может кто-нибудь сталкивался с таким? И как победить эту заразу?

# Пример с использованием ctypes
import ctypes
ctypes.windll.user32.mouse_event(2, 0, 0, 0,0) # left down
ctypes.windll.user32.mouse_event(4, 0, 0, 0,0) # left up

# Пример с использованием autopy
import autopy
autopy.mouse.click()

# Пример с использованием pyautogui
import pyautogui
pyautogui.click()

UPD:
win32 api Тоже не работает

это может быть связано с directX. попробуй использовать библиотеку pydirectinput
<code>
import pydirectinput
pydirectinput.moveTo(100, 150)
pydirectinput.click()
pydirectinput.click(200, 220)
pydirectinput.move(None, 10)
pydirectinput.doubleClick()
pydirectinput.press('esc')
pydirectinput.keyDown('shift')
pydirectinput.keyUp('shift')
</code>


Сбалансированное число
У меня есть задача.

Написать функцию balanced_num, которая определяет является ли заданное
  сбалансированным, т.е.
  сумма цифр справа и слева от середины равны (abcde ==> a + b == d + e;
  abcdef ==> a + b == e + f)
  Примеры:
  balanced_num(2222) ==> True balanced_num(135622) ==> True

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

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

def sum_of_digits(num):
    return sum(map(int, str(num)))

def is_balanced(num):
    num_str = str(num)
    mid_idx = len(num_str) // 2
    return (sum_of_digits(num_str[:mid_idx])
            ==
            sum_of_digits(num_str[mid_idx + len(num_str) % 2:]))

Численный вариант решения:

from math import log10, ceil

def sum_of_digits(num):
    res, n = 0, int(num)
    while n > 0:
        res += n % 10
        n //= 10
    return res

def is_balanced(num):
    num_len = ceil(log10(num))
    left_num = num // 10 ** (num_len // 2 + num_len % 2)
    right_num = num % ( 10 ** (num_len // 2))
    return (sum_of_digits(left_num)
            ==
            sum_of_digits(right_num))


Ошибка в коде счетчика количества простых чисел
Всем привет! Встала задачка. На входе число, функция возвращает количество простых чисел, меньше или равных этому числу.
Цикл получился бесконечным из-за оператора else, хотя мне казалось, в этом коде бесконечного цикла не может быть:
1) Из-за постоянного прибавления числа к переменной x, то есть должно сработать условие
while x <= num
2) Из-за цикла for, где рано или поздно мы должны перебрать все значения.
Но почему он получается бесконечным? Спасибо.

def func (num):
#проверка на 0 и 1
    if num < 2:
        return 0

#список для хранения простых чисел
    primes = [2]

    x = 3
# х пробегает значения от 3 до num
    while x <= num:
        for y in range(3,x):
            if x%y == 0:
                x += 2
                break
            else:
                primes.append(x)
                x += 2

    print(primes)
    return len(primes)

func(100)

for y in range(3,x): в вашем случае то же, что и
for y in range(3,3):
В свою очередь это значит
for y in []: (крайне грубо выражаясь. range - не list)
Вы в цикл не заходите и просто вечно проверяете условие
x <= num


Почему venv в Linux не видит библиотеки Python?
Писал программу на Windows. Потом перешёл на Linux, запустил виртуальное окружение и все ок, но Python не может найти библиотеки из виртуального окружения. Что делать?

Библиотеки с Виндовс версии не совместимы с Линукс и наоборот. Не все, но ощутимая их часть. Используйте
pip freeze для сохранения списка и
pip install -r requirements.txt для установки их по списку в другой системе.


Python. Ошибка os.path.splitext
Когда я использую данный путь(часть пути файла):

C:\Users
В функции
os.path.splitext()
То вылетает ошибка:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Как исправить?

На языке Python в строках символ
\ является символом экранирования.
Например
\n - перевод строки.
Передавая путь
C:\Users вы, считайте, сказали интерпретатору:

Считай мне такую строку: "C:", дальше идет символ \U, а дальше "sers".

А интерпретатор говорит:

Но я не знаю что это за символ \U

Пишите вот так:

C:/Users или вот так
C:\\Users (т.к. \ также отключает экранирования экранируемых символов)
Второй вариант применяется автоматически при использовании префикса
r перед строкой, делающего следующую за ним строку "сырой" (игнорирующей экранируемые символы).

>>> 'C:\Users'
SyntaxError: (unicode error) 'unicodeescape' codec can not decode bytes in position 2-3: truncated \UXXXXXXXX escape
>>> r'C:\Users'
'C:\\Users'


Как создавать поля для ввода (Entry), при нажатии на кнопку (Add_field)?
Как я могу добавлять поля ввода пользователя (Entry) при нажатии на кнопку "Add link", и удалять поле с конца, при нажатии на кнопку "Remove link"?
Создал пустой список для сохранения введенной информации, для того чтобы использовать ее дальше в коде. Удаление и добавление элементов происходит, проблема с полями ввода.. Спасибо
<code>
def clicked():
    links_info = tkr.Label(window, text="Each given node must have at least one link\nfor example: (a, b, c), c - is optional argument.", font=("Arial", 8))
    links_info.grid(column=0, row=3)
    btn_add = tkr.Button(window, text="Add link", bg='#0269A1', fg="#ffffff", command=add_entry_field)
    btn_add.grid(column=1, row=3)
    btn_remove = tkr.Button(window, text="Remove link", bg='#0269A1', fg="#ffffff", command=remove_entry_field)
    btn_remove.grid(column=1, row=4)

def add_entry_field():
    entryWidgets.append(tkr.Entry())
    entryWidgets[-1].grid(column=0, row=4)
    print(entryWidgets)

def remove_entry_field():
    try:
        entryWidgets.pop()
    except IndexError as err:
        print("List is empty: ", err)
    print(entryWidgets)

btn = tkr.Button(window, text="Continue", bg='#0269A1', fg="#ffffff", command=clicked)
btn.grid(column=0, row=2)

window.mainloop()
</code>

Текстовые поля нужно добавлять в разные ячейки
grid (при добавлении в одну ячейку они просто заменяют друг друга):

def add_entry_field():
    entryWidgets.append(tkr.Entry())
    # Номер колонки определяется по количеству элементов в списке:
    entryWidgets[-1].grid(column=len(entryWidgets), row=4)
    print(entryWidgets)

При удалении нужно вызывать метод удаления элемента управления из
grid (
grid_forget) или уничтожения элемента управления (
destroy):

def remove_entry_field():
    try:
        # pop() возвращает удаленный из списка элемент, к этому элементу применяем нужный метод
        entryWidgets.pop().grid_forget()  # Или entryWidgets.pop().destroy()
    except IndexError as err:
        print("List is empty: ", err)
    print(entryWidgets)


Ничего нет в последних словарях. Они выводятся, а в них ничего не написано
<code>
import time

def make_album(исполнитель='', альбом='', исполнитель1='', альбом1='', исполнитель2='', альбом2=''):
    исполнитель_альбом = {исполнитель: альбом}
    исполнитель_альбом1 = {исполнитель1: альбом1}
    исполнитель_альбом2 = {исполнитель2: альбом2}
    return исполнитель_альбом
    return исполнитель_альбом1
    return исполнитель_альбом2

musician1 = make_album(исполнитель='Pink Floyd', альбом='Dark side of the moon')
print(musician1)

musician2 = make_album(исполнитель1='Егор Летов', альбом1='Зачем снятся сны?')
print(musician2)

musician3 = make_album(исполнитель2='Metallica', альбом2='Kill em all')
print(musician3)

time.sleep(5)
</code>
В консоли выводится это:
{'Pink Floyd': 'Dark side of the moon'}
{'': ''}
{'': ''}

Функции используются для сокращения кода, если одну и туже часть кода нужно вызывать много раз, меняя в ней всего несколько значений. Значит не нужно описывать все возможные аргументы для функции. Также код после return не выполняется и не даёт значения словарям.
<code>
import os

def make_album(исполнитель, альбом):
    исполнитель_альбом = {исполнитель: альбом}
    return исполнитель_альбом

musician1 = make_album(исполнитель='Pink Floyd', альбом='Dark side of the moon')
print(musician1)

musician2 = make_album(исполнитель='Егор Летов', альбом='Зачем снятся сны?')
print(musician2)

musician3 = make_album(исполнитель='Metallica', альбом='Kill em all')
print(musician3)

os.system("pause")
</code>


Как получить только что выведенную строку обратно в переменную?
Я решил воспользоваться
exec() для того, чтобы выполнять строки кода Python, получаемые на вход через
input(). Но проблема
exec() в мгновенном выводе строки, если я передаю в него
print('Hello'), к примеру. Но мне не нужен вывод этой строки в консоль, а нужно записать её в переменную или массив, чтобы позже вывести данные через API или записать их в файл, допустим. Как это реализовать?
Я читал вопрос про stdin/stdout, не стоит его упоминать. Там затрагивается другая тема, а ответчик на вопрос заявлет, что
print() пишет в
sys.stdout, однако это не так. Увы,
sys.stdout.readable() возвращает мне False, а значит в любом случае я не смогу прочитать данные, которые попали туда через
print().
Жду ответа, спасибо.

In [53]: from io import StringIO

In [54]: from contextlib import redirect_stdout

In [55]: with StringIO() as buffer, redirect_stdout(buffer):
    ...:     print("hello world")
    ...:     out = buffer.getvalue()
    ...:

In [56]: out
Out[56]: 'hello world\n'


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

from PyQt5 import QtCore, QtGui, QtWidgets

from test_dialog import Dialog

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(150, 140, 75, 23))
        self.pushButton.setObjectName("pushButton")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))

class MyWin(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.testDialog)

    def testDialog(self):
        self.dialog = Dialog(self)
        self.dialog.show()

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MyWin()
    w.show()
    sys.exit(app.exec_())

Диалоговое окно:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(120, 70, 47, 13))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(240, 60, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(180, 140, 75, 23))
        self.pushButton.setObjectName("pushButton")

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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "TextLabel"))
        self.pushButton.setText(_translate("Dialog", "PushButton"))

class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.pushButton.clicked.connect(self.changeText)

    def changeText(self):
        self.label.setText('hi')

        self.lineEdit.setText('Text was changed!')
        print('I changed text!')

Можно так:
<code>
from PyQt5 import QtCore, QtGui, QtWidgets

from test_dialog import Dialog

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(150, 140, 75, 23))
        self.pushButton.setObjectName("pushButton")

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

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))

class MyWin(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.testDialog)

        self.dialog = Dialog(self)                               # +++

    def testDialog(self):
#        self.dialog = Dialog(self)                              # ---
        self.dialog.show()

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MyWin()
    w.show()
    sys.exit(app.exec_())
</code>


Python. Ищу библиотеку для распознавания речи
Мне нужно любое распознавание речи из аудио файла (для бота в вк), главное что бы был бесплатным есть ли такие? Неважно оффлайн или онлайн.

speech_recognition
<code>
import speech_recognition as sr

r = sr.Recognizer()

path = 'speech.wav'

with sr.AudioFile(path) as source:
    audio = r.record(source)

    print(r.recognize_sphinx(audio))
</code>


Замена данных в существующем DataFrame по условию
В DataFrame есть список комнат от 0 до 19. Необходимо привеси его в соответствие.
Все данные с значениями комнат = 0 убрать из DataFrame, а все данные с комнатами > 4 включить, заменить на 4.
Пробовал несколько методов:

data["rooms"] = data["rooms"].drop(np.where(data['rooms'] == 0)[0])
data["rooms"] = data[data["rooms"] >= 4 ].replace((data["rooms"] >= 4), 4)

Второй:

rooms_data = data.drop(np.where(data['rooms'] == 0)[0])
def rooms_data_norma(row):
    if row['rooms'] >= 4:
        return row['rooms'] == 4
    else:
        return row['rooms']

DataFrame - образец
В итоге, удалось уйти от 0 значений, но не удалось все, что больше значения заменить на необходимое в том же DataFrame.
Необходимо: в DataFrame должно остаться только строки, где изначально не было 0 и все что больше 4 должно замениться на 4.
Может быть есть метод легче и который сработает?


Конструкция If,else в цикле for loop
Даны числа от 1 до 31 включительно

a = input().split()
q=0
x = [ print(i, end=' '), q=q+1 for i in z if int(i)%2==0 ]

Если число
i четно, то выведи его и прибавь к перемемнной
q+1
Но при компиляции выводит ошибку:
in: 4 16 19 31 2
out:

x = [print(i, end=' '), q=q+1 for i in z if int(i)%2==0]
                         ^    SyntaxError: invalid syntax

numbers = [i for i in range(1, 32, 1)]

numbers = [[i for i in numbers if i % 2==0], [i for i in numbers if i % 2!=0]]

print("Чётные числа: {0}".format(numbers[0]))
print("Нечётные числа: {0}".format(numbers[1]))

Или так

numbers = [i for i in range(1, 32, 1)]

numbers = [[print("Чётные числа: {0}".format(i)) for i in numbers if i % 2==0],\
           [print("Нечётные числа: {0}".format(i)) for i in numbers if i % 2!=0]]


Помогите. Задача на хранение и обход графов
Нужно сдать решение до 19 мая на stepik.
Вы наметили num курсов для обучения, которые пронумеровали от 0 до num-1.
Некоторые курсы имеют требования для их прохождения. Например, курс под номером 0 требует прохождения курса под номером 1. Такое отношение обозначается парой: [0,1].
Вам дано общее количество курсов и список пар-требований. Сможете ли вы пройти все курсы?
ПРИМЕРЫ:
Sample Input 1:
2 [[1,0]]
Sample Output 1:
True
Sample Input 2:
2 [[1,0],[0,1]]
Sample Output 2:
False
Я попробовал такое решение. Оно работает с текущими примерами, но на 3-ем тесте ломается. И stepik не показывает какие входные данные... может кто заметит, что не так в коде?
<code>
def canFinish(self, num: int, courses: list):
    co = []
    completed = [False] * num
    yes = 0

    for idx in range(num-1):
        if courses[idx] != None:
            for case in courses:
                nado = case[1]
                foWhat = case[0]
                curId = courses.index(case)
                if curId == nado:
                    completed[curId] = True
                #print(case)
                #print(completed)
    for i in completed:
        if i: yes += 1
    #print(yes, num-1)
    if yes == num-1: return True
    else: return False
</code>

Алгоритм

Используя список
courses создаём словарь с зависимостями первого уровня для каждого курса. Для списка
[[1, 2], [2, 3], [3, 4]] словарь будет выглядеть так:

{
    1 : {2, 3, 4},
    2 : {3, 4},
    3 : {4}
}

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

происходит попытка повторно войти в один и тот же курс, значит в цепочке есть цикл вида
[[0, 1], [1, 0]], следовательно курсы зависят друг от друга.
курс зависит от курса не попадающего в допустимый диапазон, например от курса 10, когда их всего 5.

Решение

class Solution:
    def canFinish(self, num: int, courses: list) -> bool:
        dct_of_dependencies = {k : set() for k in range(num)}

        for target_course, dependency in courses:
            dct_of_dependencies[target_course].add(dependency)

        for target_course, dependencies_to_check in dct_of_dependencies.items():
            visited = {target_course}
            while dependencies_to_check:
                nxt = dependencies_to_check.pop()
                # Проверка 'nxt >= num' нужна, так как в некоторых тестах есть курсы,
                # которые зависят от курсов вне диапазона num.
                # Иначе решение не проходит
                if nxt in visited or nxt >= num:
                    return False

                if dct_of_dependencies[nxt]:
                    dependencies_to_check.update(dct_of_dependencies[nxt])
                    visited.add(nxt)

        return True


Отправка длинных utf8 сообщений по TCP
пишу клиент-сервер на
python и написал небольшой протокол поверх TCP что бы было удобнее отправлять сообщения

from json import dumps

def receive(socket):
    data = socket.recv(1024).decode('utf8')
    length = int(data[:16])
    data = data[16:]
    while length - 1:
        data += socket.recv(1024).decode('utf8')
        length -= 1
    return data

def send(socket, data):
    if type(data) == dict:
        data = chunk_string(dumps(data), 1000 - 16)
    else:
        data = chunk_string(str(data), 1000 - 16)
    length = len(data)
    data[0] = str(length).zfill(16) + data[0]
    for chunk in data:
        socket.send(bytes(chunk, encoding='utf8'))

def chunk_string(string, chunk_size):
    return [string[i:i + chunk_size] for i in range(0, len(string), chunk_size)]

При отправлении данные нарезаются на чанки по 1000 симоволов и в первые 16 символов добаляется количество чанков.
Работает всё, в принипе, нормально, но есть одна проблема:
Мультибайтовые символы юникода. Иногда из-за них в
receive вылетает
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 1022-1023: unexpected end of data (Позиция байтов не именно 1022-1023, раньше размер чанков был не 1000)
Как избежать этой проблемы? Пока обхожусь пересылкой обычный символов, избегая мультибайтовых, но, конечно, хотелось бы иметь возможность и их пересылать

TCP это stream. На уровне
socket понятие пакета в нем не определено. Это значит, что если сокет А выполняет две операции send:

send('abc')
send('123')

то сокет В может принять эти данные одной или несколькими операциями receive, например:
abc123 или
a,
bc123 или
abc,
123 - любые сочетания возможны. Принимающая сторона должна накапливать данные в буфере и делать parsing только тогда, когда он возможен, то есть вся информация получена.
Каким образом это делать - для этого нужно разработать протокол, надстройку над TCP. Самый распространенный (но не единственный) способ - это посылать в начале каждого логического пакета его длину. Накапливайте данные в буфере (возможно, от одного или более receive) и делайте parsing только при получении полного пакета.


tkinter копирование содержимого scrolledtext
Как скопировать в буфер обмена введённый текст в scrolledtext ?
<code>
from tkinter import *
from tkinter import scrolledtext

root = Tk()
root.geometry('400x200+600+300')

def copy():
    txt.clipboard_append(txt)

btn = Button(root, text='скопировать', command=copy)
btn.place(x=15, y=15)

txt = scrolledtext.ScrolledText(root, width=33, height=11)
txt.place(x=100, y=10)

root.mainloop()
</code>
сейчас по клику в буфер копируется >>> !frame

txt - это сам объект
ScrolledText. При копировании в буфер обмена у вас попадает
str(txt), но это не текстовое содержимое виджета, а имя класса tcl. Чтобы получить из виджета текст, нужно вызвать метод
get (аналогично объекту
Text - см. например Tkinter Text):

def copy():
    txt.clipboard_clear()  # Очистить буфер обмена
    txt.clipboard_append(txt.get(1.0, END))  # Скопировать текст в буфер обмена


Как запускать потоки пачками по 100
Как запускать потоки пачками по 100, чтобы после завершения первой пачки, ишла вторая?

Я решил проблему так - сперва запускаю потоки, каждый раз когда запускается поток, я отслеживаю сколько их их уже запущено, если больше 100 я запускаю цикл while, в котором я отслеживаю сколько потоков активно, если активно меньше 5 (сделал так, чтобы если 1-3 потоки затупили, остальные чтобы их не ждали) я убиваю цикл. Работает чудесно!


Запись двумерного массива в одномерный python
Есть двумерный массив:

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

Как его записать в таком виде?:

l = [2, 3, 4, 5]

с любым кол-вом элементов во втором измерении
<code>
[a for b in l for a in b]
</code>


Кулдаун на команды
Хочу сделать кулдаун на команды, но чтобы при этом бот работал дальше
Примерное использование:
Я: !команда
Бот: выполняет команду
Я: !команда
Бот: Вы сможете использовать эту команду вновь через 3 мин. 23 сек.
Как то можно это сделать?

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

In [123]: import time

In [124]: import functools

In [125]: aka_redis = {}

In [126]: def countdown(interval, rollback):
     ...:     def wrapper(func):
     ...:         @functools.wraps(func)
     ...:         def inner(message, *args, **kwargs):
     ...:             user_id = message.from_user.id
     ...:             if user_id not in aka_redis:
     ...:                 aka_redis[user_id] = time.time()
     ...:             else:
     ...:                 ttl = time.time() - aka_redis[user_id]
     ...:                 if ttl < interval:
     ...:                     return rollback(message, interval - ttl)
     ...:                 aka_redis[user_id] = time.time()
     ...:             return func(message, *args, **kwargs)
     ...:         return inner
     ...:     return wrapper
     ...:

Теперь создадим наш роллбэк:

In [127]: def rollback(message, ttl):
     ...:     print(f"User: {message.from_user.id} can retry in {ttl}.")
     ...:

И наконец сам хендлер:

In [128]: @countdown(5, rollback)
     ...: def handler(message):
     ...:     print(f"Hello, {message.from_user.id}!")
     ...:

Проверяем:

In [129]: handler(message)
Hello, 1337!

In [130]: handler(message)
User: 1337 can retry in 3.7606029510498047.

In [131]: handler(message)
User: 1337 can retry in 2.7380571365356445.

In [132]: handler(message)
User: 1337 can retry in 1.0794241428375244.

In [133]: handler(message)
Hello, 1337!

Конвертировать секунды в более читаемый вид:

In [134]: from datetime import timedelta

In [135]: timedelta(seconds=500)
Out[135]: datetime.timedelta(seconds=500)

In [136]: str(_)
Out[136]: '0:08:20'


: TypeError: expected str, bytes or os.PathLike object, not list
пытаюсь сделать диалоговую прграмму
вот код :
<code>
with open([r'C:\Users\максим\Desktop\t800\t800.txt']) as f:
     lines = [x.rstrip() for x in f.readlines()]
     print(lines[lines.index(input())+1])
</code>
выдаёт ошибку- TypeError: expected str, bytes or os.PathLike object, not list
буду безумно благодарен ,кто поможет

with open(r'C:\Users\максим\Desktop\t800\t800.txt') as f:

Если он не хочет list, уберите
[]


Некорректно отображается текст
Текст в файле отображается некорректно.

f = open("Безназвания.txt", "r")
for line in f:
     print(line)

Текст в "Безназвания.txt":

Hello, world!
some text

Но отображается:

Hello, WorldHello, World!

some text

Как это исправить?

В текстовом файле всякая строка окончена символом перехода на новую строку:
"\n"
Функция
print() добавит стандартно тоже символ
"\n" - значит, будут 2 такие знаки подряд и на выводе окажется пустая строка.
При загрузке из файла нужно этот символ убрать, например так - и я для вас напишу более удобный подход для открытия (и неявного закрытия) файла:

with open("Безназвания.txt") as f:        # "r" не нужно
    for line in f:
        print(line[:-1])                  # line[:-1] исключит последний знак, т.е. "\n"

Другое решение — применить метод
.rstrip() для удаления всех пустых символов из конца строки (т.е. пробелов, табуляторов и символов
"\n"):

with open("Безназвания.txt") as f:        # "r" не нужно
    for line in f:
        print(line.rstrip())              # удалит все пустые символы из конца строки


Вывести несколько заголовков CSV через цикл for
Например, у меня есть код, который выводит нужный мне заголовок:

import pandas as pd
a = pd.read_csv('file.csv', sep=',')
for line in a['header1']:
    print(line)

Но как мне вывести сразу два заголовка в цикле?
Пробовал что-то вроде:

import pandas as pd
a = pd.read_csv('file.csv', sep=',')
for line in a['header1','header2']:
    print(line)

Но выдаёт ошибку.

Воспользуйтесь DataFrame.itertuples():
<code>
for row in df.itertuples():
     print(row.col1, row.col2)
</code>


Вывод sysname из os.uname
При написании os.uname выводится sysname, nodename, release и т.д. Нужно вывести только sysname. Пытатся ли это сделать через uname или использовать другой метод?

Этого метода достаточно
<code>
>>> os.uname().sysname
'Linux'
</code>


tkinter передать данные во фрейм
<code>
from tkinter import *
from tkinter import scrolledtext

root = Tk()
root.title('програмка')
root.geometry('600x400+1000+300')
root.resizable(False, False)
root.config(bg='green')

btn = Button(root, text='кнопка', font='Tahoma', command = dms)
btn.configure(width='30', height='5')
btn.pack()

txt = scrolledtext.ScrolledText(root, width=50, height=10)
txt.pack()

def dms():
    def splitfile(file_name, sep):
        file = open(file_name, 'r')
        text = file.read()
        file.close()
        text = text.split(sep)
        return text

    list1 = splitfile('1.txt', '\n')
    list2 = splitfile('2.txt', '\n')
    result = list(set(list1) - set(list2))

    file = open('res.txt', 'w')
    file.write('\n'.join(result))
    file.close()

    f = open('res.txt', 'r')
    t = f.read()
    txt.insert(1.0, t)

root.mainloop()
</code>

Примерно так:
<code>
f = open('res.txt', 'r')
t = f.read()
Label(topframe, text="Date").pack()
e1 = Entry(topframe)
e1.insert(0, t)
e1.pack()
</code>


Как получить значение переменной из while True
Мне надо получать значение hash раз в 600 секунд из while True, чтобы потом запускать функцию encrypt_decrypt сколько угодно (не раз в 600 секунд). Прошу прощения за такой странный код, просто на улицу давно не выходил) Если нужны уточнения - спрашивайте.
<code>
def listen():
    while True:
        yield hash_generate.generator()
        time.sleep(600)

def encrypt_decrypt():
        s = crypter.encrypt(key=hash, plaintext="Text")
        crypter.decrypt(key=hash, ciphertext=s)

for i in listen():
    hash = hash_generate.hashvalue2
    print(hash_generate.hashvalue2)
    encrypt_decrypt()
</code>

In [52]: import time

In [53]: import random

In [54]: def ensure_periodic_value(interval):
    ...:     def wrapper(func):
    ...:         def inner(*args, **kwargs):
    ...:             if time.monotonic() - getattr(func, "ttl", interval) >= interval:
    ...:                 func.periodic_value = random.randint(1, 100)
    ...:                 func.ttl = time.monotonic()
    ...:             return func(func.periodic_value)
    ...:         return inner
    ...:     return wrapper
    ...:

In [55]: @ensure_periodic_value(interval=5)
    ...: def func(random_value):
    ...:     print(f"Random value is: {random_value}")
    ...:

In [56]: while True:
    ...:     func()
    ...:     time.sleep(5)
    ...:

Каждые
interval секунд в функцию
func будет передано рандомное число, вывод:

Random value is: 80
Random value is: 84
Random value is: 34

Вместо 5 секунд передайте 600, вместо рандома - ваш хэш.


Как вызвать функцию, а в качестве параметров передать элементы массива?
Люди, помогите! У меня есть массив с несколькими значениями, и есть функция, которая принимает определенное количество переменных, но сколько - неизвестно. Например,

array = ['val_1', 'val_2']
def function(val_1, val_2):
    pass

А нужно сделать вот что: если количество элементов массива соответствует количеству параметров функции, то надо вызвать эту функцию, а в качестве параметров передать элементы массива. Именно его элементы, а не сам массив. А как это сделать? Меня именно интересует, как разложить массив на отдельные переменные и вызвать эту функцию, ведь размер массива нам неизвестен, как и количество параметров функции. То есть вариант ниже не подойдет.

function(array[0], array[1])

Используйте
*args:

In [9]: list_ = [1, 2, 3, 4 ,5]

In [10]: def foo(*args):
    ...:     return args
    ...:

In [11]: foo(*list_)
Out[11]: (1, 2, 3, 4, 5)

Если нужно точное соответствие по кол-ву параметров:

In [18]: def foo(a, b, c):
    ...:     pass
    ...:

In [19]: if len(list_) == foo.__code__.co_argcount:
    ...:     foo(*list_)


Нужно сделать так, чтобы функция выполнялась только один раз при первом запуске
Делаю скрипт, в котором одна из функций создает папки на компьютере.
Мне нужно сделать так, чтобы это функция выполнялась только один раз при первом запуске программы, а при дальнейших запусках нет. Каким образом это можно сделать?
Функция
<code>
def create_dirs(folder_sort):
    for i in dirs:
        try:
            os.mkdir(folder_sort + i)
        except OSError:
            k = input(f'Directory {i} already exists, do you want to recreate it?\nAnswer y/n: ')
            if k == 'y':
                shutil.rmtree(folder_sort + i)
                os.mkdir(folder_sort + i)
            elif k == 'n':
                pass
            else:
                pass
</code>

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

def func():
    f = open('result.ini', 'w') # и в функции записывать в файл значение
    b = f.write("The function was completed")
    f.close()
    print("123")

f = open('result.ini', 'r') #при каждом запуске читаются данные
a = f.read()
f.close()

if a == "": #если файл пустой - выполнить функцию
    func()

И при следующем запуске файл не будет пустым и функция не вызовется.
Или как сказал Alexandr Kiselev ловить FileExistsError:

try:
    os.mkdir(folder_sort + i)
except FileExistsError:
    break


Как сделать выбор пути к файлам с помощью всплывающего окна tkinter
Имеется функция
<code>
def extract_text():
    try:
        work_dir = Path(r"D: ")
        sep = ";"
        def join_csv_files(files, **read_csv_kwargs):
            res = pd.concat([pd.read_csv(f, **read_csv_kwargs)
                             for f in files],
                            axis=1)
            return res

        res = join_csv_files(work_dir.glob("*.csv"), sep=sep, usecols=[0, 1], index_col=0)

        res.to_csv(r"D:\res.csv", sep=sep)
</code>
Подскажите пожалуйста, как сделать так, чтобы не прописывать путь в переменной  work_dir, а сделать так, чтобы можно было выбрать каталог с помощью всплывающего окна. Пытался сделать с помощью askopenfilename

Все правильно вы делали
<code>
import tkinter as tk
from tkinter import filedialog as fd

def callback():
    name= fd.askopenfilename()
    print(name)

errmsg = 'Error!'
tk.Button(text='Click to Open File',
       command=callback).pack(fill=tk.X)
tk.mainloop()
</code>


Как мне передать локальную переменную в обработчик для inline-клавиатуры callback_query_handler?
Пишу уже не один бот, и сталкиваюсь с такой проблемой - мне нужно передать переменную в обработчик нажатий inline-клавиатуры. Переменная локальная (примите это во внимание!) и должна передаться в обработчик посредством передачи аргумента, либо же каким-то другим способом (за исключением создания глобальной переменной!!!)
Есть у кого предположения; выслушаю любые идеи. Спасибо)
Код с комментариями:

...
@bot.message_handler(content_types=["text"])
def create(message):
    key = types.InlineKeyboardMarkup()
    btn1 = types.InlineKeyboardButton(text="Пример кнопки 1", callback_data = "Пример кнопки 1")
    btn2 = types.InlineKeyboardButton(text="Пример кнопки 2", callback_data = "Пример кнопки 2")
    key.add(btn1,btn2)
    msg = bot.send_message(message.chat.id, "Текст", reply_markup = key)
    argument = 'Какой-то текст для примера' # вот эту переменную нужно передать в обработчик

...
@bot.callback_query_handler(func=lambda c:True)
# вот сюда нужно передать локальную переменную из другой функции, например argument
# что-то похожее на это:
# def inline(c, argument):
def inline(c):
    if c.data == "Пример кнопки 1":
        #print('Вот здесь должно появится значение аргумента = ' + argument)
        pass
    elif c.data == "Пример кнопки 2":
        pass

@bot.message_handler(content_types=["text"])
def create(message, f=None):
    if f == 'inline':
        argument = 'Какой-то текст для примера'  # вот эту переменную нужно передать в обработчик
        return argument
    else:
        key = types.InlineKeyboardMarkup()
        btn1 = types.InlineKeyboardButton(text="Пример кнопки 1", callback_data="Пример кнопки 1")
        btn2 = types.InlineKeyboardButton(text="Пример кнопки 2", callback_data="Пример кнопки 2")
        key.add(btn1, btn2)
        bot.send_message(message.chat.id, "Текст", reply_markup=key)

@bot.callback_query_handler(func=lambda c: True)
def inline(c):
    if c.data == "Пример кнопки 1":
        print('Вот здесь должно появится значение аргумента = ' + create(None, 'inline'))
    elif c.data == "Пример кнопки 2":
        pass


Есть Telegram bot нужно подключить его к linux серверу
Есть Telegram bot нужно подключить его к linux серверу. С такими условиями
Когда срабатывает if. Бот давал команду по ssh на сервер допустим:
useradd {Случайное имя} && passwd {Случайное имя}
{Случайный пароль}
При этом нужно получить это случайное имя и пароль. И отправить тому человеку кто задал такую команду if

useradd:

def random_name():
    alphabet = string.ascii_letters
    while True:
        random_name = ''.join(choice(alphabet) for i in range(8))
        if (any(symbol.islower() for symbol in uis_password)
                and any(symbol.isupper() for symbol in uis_password)):
            return random_name

passwd:

def random_password():
    alphabet = string.ascii_letters + string.digits
    while True:
        random_password = ''.join(choice(alphabet) for i in range(8))
        if (any(symbol.islower() for symbol in uis_password)
                and any(symbol.isupper() for symbol in uis_password)
                and sum(symbol.isdigit() for symbol in uis_password) >= 1):
            return random_password

ssh:

def ssh_connect():
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    name = random_name()
    pass = random_password()

    client.connect(hostname=, username=, password=, port=)
    stdin, stdout, stderr = client.exec_command('useradd ' + name + '&& passwd ' + pass )
    data = stdout.read().decode('utf-8').strip('\n')
    client.close()


Почему возникает такая ошибка и как с ней справится?
Вот мой код:

import pyautogui as pg

pg.move(200, 300, 0.5)

Он вызывает такую ошибку:

partially initialized module 'pyautogui' has no attribute 'move' (most likely due to a circular import)

Помогите, пожалуйста

Эта ошибка переводится

как частично инициализированный модуль 'pyautogui' не имеет атрибута
  'move' (скорее всего, из-за циклического импорта)

Она возникает если ваша программа названа по имени модуля, который вы импортируете. Python пытается вместо настоящего модуля использовать вашу программу, и появляется ошибка. Исправляется очень просто - переименуйте свою программу и ошибка пропадёт.


Здравствуйте. Объясните, пожалуйста, работу цикла for простым языком с практическими примерами [закрыт]

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

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

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

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

Объясните, пожалуйста, работу цикла for простым языком с практическими примерами

Например, у вас есть список
l = [1,3,5,7,9] чтобы его вывести на экран по одному символу придётся писать

print(l[0])
print(l[1])
print(l[2])
print(l[3])
print(l[4])

Это слишком долго. Для этого можно использовать цикл for:

for i in L:
    print(i)

Где i будет поочерёдно принимать значения списка  L у выводить их на экран. Также можно использовать цикл for если вам нужно сделать какие-либо действия со всеми элементами списка. Можно использовать функцию range:

for i in range(1,10):
    sum += i

Вычислит сумму всех элементов от 1 до 9 (без использования списка)
Практические примеры - вычисление факториала:

n = int(input())
n += 1
res = 1 #результат должен быть 1, чтобы не получилось 0 * x
for i in range(1,n): #цикл начинается с 1 (чтобы не умножить на 0 и продолжается до n)
#в начале я добавил n + 1, т.к цикл как последнее значение берёт n - 1 (пока i < n - строгое неравенство)
# и чтобы цикл умножил результат на само число n - его нужно увеличить на 1
    res *= i

print(res)

Вывод таблицы умножения на 6:

a=1
for i in range (10):
    print('6 *',a,'=',6*a)
    a=a+1


Дата в пути сохранения media
День добрый.
Вот конструкция
<code>
def get_upload_md_name(self, filename):
    if self.pub_date:
        year = self.pub_date.year
    else:
        year = datetime.now().year
    upload_to = upload_dir % (year, self.slug + '-' + filename)
    return upload_to
</code>
Как можно добавить в путь не только год но еще и месяц ?

Т.к я явно не вижу, что из себя представляет шаблон upload_dir. То предположу, что этот  шаблон принимает 4 параметра и возвращает строку, тогда его потребуется изменить на 5 параметров, чтобы месяц тоже пролез. После его изменения достаточно поменять код вот так:
<code>
def get_upload_md_name(self, filename):
    if self.pub_date:
        year = self.pub_date.year
        month = self.pub_date.month # Чтобы это не значило
    else:
        year = datetime.now().year
        month = datetime.datetime.now().month #Получаем month
    #Передаем month в параметры
    upload_to = upload_dir % (year, month, self.slug + '-' + filename)
    return upload_to
</code>


Программа не работает на Linux
<code>
# cc.py (change case) меняет раскрадку с ENG на РУС(и наоборот) посредством буфера обмена.
import pyperclip

eng_chars = "~!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>? 1234567890"
rus_chars = "ё!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ, 1234567890"

def change(s1, s2, s_main):
    s_finish = []
    for i in range(len(s_main)):
        index = s1.index(s_main[i])
        s_finish.append(s2[index])
    return ''.join(s_finish)

s = pyperclip.paste()

if s.isascii():
    print('ascii')
    s = change(eng_chars, rus_chars, s)
else:
    print('not ascii')
    s = change(rus_chars, eng_chars, s)

pyperclip.copy(s)
</code>
На винде все работает четко. Под линуксом(манжароГном) не работает. Что-то не так именно с работой с буфером обмена. Не получается у неё вставить полученый результат обратно.
Суть проги в том, что если случайно написал текст не на той раскладке, копируешь этот текст в буфер обмена, запускаешь программу и вставляешь из буфера уже нормальный текст.

В документации пишут:

On Linux, this module makes use of the xclip or xsel commands, which
  should come with the os. Otherwise run “sudo apt-get install xclip” or
  “sudo apt-get install xsel” (Note: xsel does not always seem to work.)
Otherwise on Linux, you will need the gtk or PyQt4 modules installed.

xclip у Вас установленна?


Зажатие клавиши в pygame

...
import pygame
if pygame.key.get_pressed()[K_LEFT]:
    print ("Hello")
...

написал так. А выводит ошибку:

AttributeError: module 'pygame' has no attribute 'key'

Спасибо!

Нужно добавить
from pygame.locals import * и добавить экран. Без экрана не работает (я не разбирался в этом - может можно и без экрана, но зачем использовать pygame и не создавать окно?)

import pygame
from pygame.locals import * #это добавляет обработку клавиш
pygame.init() #инициализация окна
W = 700
H = 300
sc = pygame.display.set_mode((W, H))#установка размера окна
clock = pygame.time.Clock()#время (не обязательно)
while True:
    for i in pygame.event.get(): #обработка нажатия на крестик (выход)
        if i.type == pygame.QUIT:
            exit()

    if pygame.key.get_pressed()[K_LEFT]:
        print ("Hello")

    clock.tick(60) # частота обновления экрана (FPS) - не обязательно
    # но если не добавить ограничение - сильно возрастает нагрузка на процессор
    # чем меньше FPS - тем медленнее печатается Hello
    pygame.event.pump()


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

disciplines = {
    "mathAnalysis_lecture": "...",
    "mathAnalysis_practice": "...",
    "probabilityTheory_practice": "...",
    "introToSE_lecture": "...",
    "introToSE_practice": "..."
}

Можно ли достать элемент с ключом
introToSE_lecture , только не по ключю, а по его индексу
(3)? Или это вообще глупо и стоит использоваться массивы?

Вариант для Python 3.6 и моложе
Начиная с Python 3.6 в канонической реализации Python порядок добавления элементов в словарь сохраняется. То есть итератор
items() возвращает элементы в том порядке, в котором они были добавлены.
Если у вас гарантированно используется Python 3.6+, то вы можете использовать вот такую функцию (неоптимизировано!)

def nth_discipline(pos):
    "Возвращает пару (название, описание) из словаря disciplines для курса на n-ной позиции."
    items = list(disciplines.items())
    return items[pos]

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

from collections import OrderedDict

disciplines = OrderedDict([
    ("mathAnalysis_lecture", "MAL"),
    ("mathAnalysis_practice", "MAP"),
    ("probabilityTheory_practice", "PTP"),
    ("introToSE_lecture", "ISE_L"),
    ("introToSE_practice", "ISE_P")
])

Правда, ни
keys, ни
items, ни
values для
OrderedDict не поддерживают взятие элемента по индексу. Поэтому даже для
OrderedDict нужна функция
nth_discipline. Просто в случае
OrderedDict она на всех реализациях Python будет давать правильный результат.


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

{% if list %}
    {% for i in list %}
        {% if request.user == i.author %}

              {{i.detail}}

        {% else %}
           <button type="button" class="btn" data-toggle="modal" data-target="#form">
                 Кнопка для вызова формы
           </button>
        {% endif %}
    {% endfor %}

{% else %}
    <button type="button" class="btn btn-primary mr-4" data-toggle="modal" data-target="#digital">
      Кнопка для вызова формы
    </button>
{% endif %}

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

Нужно в views.py сделать проверку и там прервать цикл. Так как в шаблоне нельзя использовать break

class MyClassCreateView(LoginRequiredMixin, CustomSuccessMessageMixin, CreateView):
model = MyClass
template_name = 'mypage.html'
form_class = MyClassForm
success_url = reverse_lazy('mypage')
success_msg = 'сохранён'
def get_context_data(self, **kwargs):
    kwargs['list_mylist'] = MyClass.objects.all()
    list_mylist = kwargs['list_mylist']
    for i in list_mylist:
        if i.author == self.request.user:
            print('my_button')
            kwargs['my_button'] = True
            break
    return super().get_context_data(**kwargs)

в шаблоне проверка по my_button

    {% if my_button %}
       {% for i in list_mylist %}
             {% if request.user == i.author %}
                <a class="btn btn-primary" href="#" role="button">
                  кнопка первая
                </a>
             {% endif %}
       {% endfor %}
{% else %}
    <button type="button" class="btn btn-primary mr-4" data-toggle="modal" data-target="#class">
          кнопка вторая
        </button><br>
    {% endif %}


Распаковка значений атрибутов экземпляра класса в значения атрибутов второго экземпляра при его инициализации
У меня есть два класса:
One и
Two. Первый имеет атрибуты
aa,
bb, второй - собственный атрибут
cc и унаследованные от
Two
aa,
bb соответственно.  Вопрос состоит в следующем: хочу иметь максимально экономичный способ при инициализации передавать в значения атрибутов экземпляра класса
Two(
two_inst в примере ниже) значения атрибутов уже существующего экземпляра класса
One(
one_inst в примере ниже). Другими словами, мне нужно при инициализации
two_inst получить зачения
(cc='cc', aa='aa', bb='bb'), но так, чтоб не руками
aa,
bb прописывать(и не в виде
aa = one_inst.aa, bb=one_inst.bb), а как-то разом перекинуть эти значения от
one_inst при инициализации
two_inst.
  О том, что это можно реализовать циклом в конструкторе класса
Two, я догадываюсь. Меня больше интересует, есть ли какая-то возможность корректно разворачивать, например, словари со значениями атрибутов одного экземпляра при инициализации экземпляра дочернего ему класса - что-то типа передачи
one_inst.__dict__ при инициализации
two_inst, как на примере ниже

class One:
    def __init__(self, aa, bb):
        self.aa = aa
        self.bb = bb

class Two(One):
    def __init__(self, cc, *arg, **kw):
        self.cc = cc
        super().__init__(*arg, **kw)

one_inst = One(aa='aa', bb='bb')

two_inst = Two('cc', one_inst.__dict__) # я знаю что так это не работает (и не должно) - просто для демонстрации смысла того, что я хочу получить.

Вы были близки.
<code>
two_inst = Two('cc', **one_inst.__dict__)
</code>

Стоит посмотреть: Что значит * (звёздочка) и ** двойная звёздочка в Питоне?


Код работает, но на stepik.org выдает "Failed test #9 of 37. Cannot check answer. Perhaps output format is wrong."
<code>
a = float(input())
b = float(input())
op = str(input())
if op == '+':
    print(a + b)
elif op == '-':
    print(a - b)
elif op == '/' and b != 0:
    print(a / b)
elif op == '*':
    print(a * b)
elif op == 'mod' and b != 0:
    print(a % b)
elif op == 'pow':
    print(a ** b)
elif op == 'div' and b != 0:
    print(a // b)
if b == 0 and (op == '/' or 'mod' or 'div'):
    print('Деление на 0!')
</code>

Вот такая строка
op == '/' or 'mod' or 'div' будет всегда верна.
Вам надо сравнить
op == '/' or op == 'mod' or op == 'div'
Или же есть вариант:
op in ('/', 'mod', 'div')

bool(False or "mod") #true
my_var = False or "mod" #my_var == "mod"
my_var = True or "mod" #my_var == True


Нахождение полного имени по имени папки [закрыт]

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

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

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

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

У меня, например, есть имя папки - papka3
Могу ли я получить её полный путь? Что-то вроде: 'C:\papka1\papka2\papka3'?

Если ты работаешь с файлом или папкой в текущем каталоге - то да
Для файла

>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

Для папки

>>> import os
>>> os.path.abspath("papka3 ")
'C:\\papka1\\papka2\\papka3'


Python. Не могу понять логику в блоке с операторами if и for
Всем привет! Встала задачка: на входе список чисел, функция возвращает True, если массив содержит в любом месте две тройки подряд, иначе возвращает False.
Сейчас код возвращает True только когда две тройки стоят в начале списка. Я так понимаю, при соблюдении первого условия возвращается True, а то, что в последующих циклах for условие не соблюдается, ему уже не важно?

def func(a):
    for n in range(0,len(a)-1):
        if a[n+1] == 3 and a[n] == 3:
            return True
        else:
            return False

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

def func(a):
    for n in range(0,len(a)-1):
        if a[n] == 3 and a[n+1] == 3:
            return True
    else:
        return False

Не могу понять, почему он работает. Как мне казалось, else должен принадлежать циклам if и while. А сейчас, получается, он находится вне условия if - тогда к какому условию относится это else?

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

def func(a):
    for n in range(0,len(a)-1):
        if a[n+1] == 3 and a[n] == 3:
            return True
    return False

print(func([3, 2, 1, 3, 3])) # True

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


Как присваивать переменным значения, состоящие из нескольких строк?
Функция input() позволяет присвоить значение переменной из одной строки, а как добавлять значения в переменную через input которые состоят из множества строк?
Например мне нужно сравнить между собой 2 массива данных:

купить слона
купить синего слона
цены на слонов
...
и таких строк сотни

и

слоны в рассрочку
слоны дисконт
слоны оптом
...
и таких тоже сотни

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

a = ['купить слона', 'купить синего слона', 'цены на слонов', ... ]
b = ['слоны в рассрочку', 'слоны дисконт', 'слоны оптом', ... ]

Дополнено:
Файл с массивами данных в формате txt, по одному значению на строчке, разделены переводом строки (без запятых).

Возможно я не совсем понял, но как то так:

result = []
count = 0
while count < 100:
    a = input('Введите строку: ')
    result.append(a)
    count +=1
    print(result)

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

def SplitFIle(filelink, razdelitel):
    file = open(filelink, 'r') #откроем файл на чтение
    text = file.read() #возьмем от туда текст
    file.close #закроем файл
    text = text.split(razdelitel) #разобьем по разделителю
    return (text) #вернем массив данных
list1 = SplitFIle('somefile.txt', '\n') #указали ссылку на файл и разделителель (в данном случае - перенос строки)
print(list1)


Ошибка при расконсервации данных
Пишу функцию для викторины. Мне нужно достать из законсервированного файла рекорды (только очки). Если файл пустой, я заполняю его числами 0, 1, 2, 3 и 4. При запуске получаю следующую ошибку:

File "D:/Работа/Python/quiz/main.py", line 91, in record
    first = pickle.load(f)
EOFError: Ran out of input

Вот часть кода функции:

def record(score, record_file):
    f = open(record_file, "wb+")
    try:
        first = pickle.load(f)
    except EOFError:
        pickle.dump(4, f)
        pickle.dump(3, f)
        pickle.dump(2, f)
        pickle.dump(1, f)
        pickle.dump(0, f)
        first = pickle.load(f)
    second = pickle.load(f)
    third = pickle.load(f)
    fourth = pickle.load(f)
    fifth = pickle.load(f)

Подскажите, в чём может быть проблема? Я подозреваю, что неправильно консервирую данные.

Теоретически, в
pickle файл можно дописывать данные если открывать его в режиме
r+b или
ab:

def add_to_pickle(obj, filename):
    with open(filename, "ab") as f:
        pickle.dump(obj, f)

add_to_pickle(1, filename)
add_to_pickle("a string", filename)
add_to_pickle([1, 2, 3], filename)

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

def read_from_pickle(filename):
    with open(filename, "rb") as f:
        while True:
            try:
                yield pickle.load(f)
            except EOFError:
                break

пример:

In [29]: [x for x in read_from_pickle(filename)]
Out[29]: [1, 'a string', [1, 2, 3]]

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


Разделить изображение по горизонтали
Уважаемые, как разделить изображение по горизонтали на две равные части?
Python
<code>
im = cv2.imread('/home/alexander/empty.jpg')
dimensions = im.shape

width_cutoff = dimensions[1] // 2
s1 = im[:, :width_cutoff]
s2 = im[:,width_cutoff :]

cv2.imwrite("p1.png", s1)
cv2.imwrite("p2.png", s2)
</code>
Это код,который делит изображение по вертикали на две равные части по вертикали и сохраняет эти части как два отдельных изображения. Как сделать также,но по вертикали? Спасибо

Попробуйте вместо строк:

width_cutoff = dimensions[1] // 2
s1 = im[:, :width_cutoff]
s2 = im[:,width_cutoff :]

написать:

height_cutoff = dimensions[0] // 2
s1 = im[:heigt_cutoff,:]
s2 = im[height_cutoff:, :]

все остальное оставьте так же.


как сделать из python файла ехе файл [дубликат]

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

Конвертировать python-программу в exe файл

                                (1 ответ)

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

Недавно я начал писать сайт. На этом сайте я сделал кнопку для скачивания файла с программой. Но формат файла .pyw и из за того что не у всех людей установлен python (а также некоторые библиотеки) файл попросту не запуститься. Тогда я начал искать как python файл превратить в exe , но ничего не нашёл.
Можете подсказать как это сделать?                 (у меня питон версии 3.4)

Чтобы сгенерировать
.exe файл вы можете использовать
pyinstaller:

pyinstaller -F -w -i "path to .ico" main.py

-w заблокирует создание консольного окна, если оно вам не надо

-F просто уберет ненужные файлы в директории с приложением

-i позволит указать путь к файлу
.ico для иконки приложения


Проблема с exe форматом через pyinstaller (с pyqt5)
Столкнулся с проблемой, которую мне не удалось пофиксить часами поисков на форуме. При конвертации моей в программы с помощью pyinstaller в exe формат, у меня не работает кнопка запустить игру. Выскакивает ошибка: this application failed to start because no qt platform plugin could be initialized reinstalling
Вот пример кнопка, которая запускает игру.
<code>
import os

...

aReg = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
aKey = OpenKey(aReg, r"SOFTWARE\Bethesda Softworks\Skyrim Special Edition", 0, KEY_READ |
KEY_WOW64_32KEY)
gPath, _ = QueryValueEx(aKey, "Installed Path")

skyrim = gPath + "Mod Organaizer/ModOrganizer.exe"

...

class Widget(QWidget):
def __init__(self):
    super().__init__()

    ...

    button13 = QPushButton("Запустить", self)
    button13.move(450, 100)
    button13.resize(150, 50)
    button13.setFont(QtGui.QFont("Arial Black", 11, QtGui.QFont.Normal))

    ...

    button3.clicked.connect(self.skyrim)

...

def Skyrim(self):
    import os
    os.startfile(skyrim)
</code>

Поломался pyinstaller, просто надо переустановить.


Добавить ноовый столбец в существующую таблицу peewee
Есть таблица с данными, нужно добавить новый столбец, но если это сделать в коде то получаю ошибку
peewee.OperationalError: no such column: x.xx, как это сделать в БД
sqlite3?

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

ALTER TABLE x ADD xx INTEGER;

Если сложнее (и правильнее), то сделайте скрипт миграции.
Например, сделайте папку
migrations, в ней создайте файл, пусть будет
001.py:

from playhouse.migrate import *

DB_NAME = 'db.sqlite'

my_db = SqliteDatabase(DB_NAME)
migrator = SqliteMigrator(my_db)

with my_db.atomic():
    migrate(
        migrator.add_column('x', 'xx', IntegerField(null=True)),
    )

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


Как добавить фотографию в pyqt5 для конвертации в exe формат
Я пользуюсь qt5 графическим редактором для python. Мне нужно добавить фотографию, как
background. Но я столкнулся с проблемой при использование обычного
label с путём файла, при конвертации файла в exe формат с помощью
pyinstaller фото просто нет.
Я помню, что можно это было как-то сделать через
qrc, но я пишу код вручную и не знаю, как это правильно можно реализовать. Вот как выглядит строчки на
label. +++ это в класс виджета. Ресурс файл есть. Всё в корне.

import resources

pixmap = QPixmap("ZeXsPua_AKU.png")

В комментах можно долго писать. Для простоты давайте так. простейший пример.
у меня в одном каталоге лежат:
test.py, image.png, resources.qrc
сама программа test.py

import sys
from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
from PyQt5.QtGui import QPixmap
import resources

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)
        pixmap = QPixmap(":/newPrefix/image.png")
        lbl = QLabel(self)
        lbl.setPixmap(pixmap)
        hbox.addWidget(lbl)
        self.setLayout(hbox)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

файл ресурсов resources.qrc такого вида:

<RCC>
  <qresource prefix="newPrefix">
    <file>image.png</file>
  </qresource>
</RCC>

для начала запускаем
pyrcc5 -o resources.py resources.qrc и получаем в этом же каталоге модуль resources.py
теперь я могу сделать exe и передать на другой комп:
pyinstaller --onefile test.py


Как после каждой 3-й строки вставить символ?
У меня есть большой файл в нём идёт текст формата

Anya
23
female

Как мне после каждых 3-х строк (4-ой строкой) записать свой символ или слово?

Можно прибегнуть к обыкновенному счетчику
<code>
buffer = ""
with open(filename, 'r') as f:
    i = 0
    for line in f:
        buffer += line
        i+=1
        if i == 3:
            i = 0
            buffer += userword
with open(wfilename, 'w') as f:
    f.write(buffer)
</code>


новый столбец с результатом сравнения
Столкнулся с проблемой заполнения нового столбца по итогам сравнения 2х столбцов в df:

      A      B
0   NaN    1.0
1   1.0    NaN
2  10.0  300.0
3   3.0    3.0

Пытался сделать:

df['C'] = 'Да' if df['A'] > 5 and df['B'] < 400 else 'Нет'

но возникает ошибка:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Желаемый результат:

      A      B    С
0   NaN    1.0   NaN
1   1.0    NaN   NaN
2  10.0  300.0   Да
3   3.0    3.0   Нет

Направьте пожалуйста в каком направлении копать....
Вот код моего примера:

import pandas as pd
import numpy as np

df = pd.DataFrame({
                'A':[np.nan, 1, 10, 3],
                'B':[1, np.nan, 300, 3]
                })

df['C'] = 'Да' if df['A'] > 5 and df['B'] < 400 else 'Нет'

print(df)

Попробуйте так:
<code>
In [14]: df["C"] = (df
                    .dropna(subset=["A", "B"])
                    .eval("A > 5 and B < 400")
                    .replace([True, False], ["Да", "Нет"]))

In [15]: df
Out[15]:
      A      B    C
0   NaN    1.0  NaN
1   1.0    NaN  NaN
2  10.0  300.0   Да
3   3.0    3.0  Нет
</code>


Странная работа print() с параметром end

from time import sleep

print('2 + ', end='')
sleep(1)
print('2 = ', end='')
sleep(1)
print('4')

Почему при вручную заданном значении
end печать будет производиться лишь при достижении 7 строки, но если оставить его стандартным или вписать
end='\n', то все будет работать так, как задумывалось?

Как сказал @andreymal, вывод буферизуется по строкам, можно либо добавлять
flush=True в
print, либо установить переменную окружения
export PYTHONUNBUFFERED=1 чтобы достичь того же эффекта но глобально.
Также можно запускать так:
PYTHONUNBUFFERED=1 python main.py


Как заполнить вложенный список определенным значением в python?
У меня есть список со вложенными списками, довольно глубокий. И мне потребовалось создать список с такой же структурой, но заполненный одним значением.
Исходный список:

field = [
    [[1, 2, 3], [2, 3, 4], [[2, 3, 4], [1, 2]], 3],
    [1, 2, 2],
    4
]

Что хочу получить:

field2 = fillDeepList(field2, 0);

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

Я поискал, но ничего дельного не нашел. Нашел только то, что в модуле
copy есть функция
deepcopy для копирования вложенных списков.
По итогу я написал вот такую функцию:

def fillDeepList(field, value):
    if isinstance(field, Iterable):
        return [fillDeepList(i, value) for i in field]
    else:
        return value

Она вроде бы нормально работает. Может что-то подобное уже есть в каком-нибудь модуле в коробке?

Рекурсией обходим структуру, меняя значение:
<code>
def deep_fill(items: list, value):
    for i in range(len(items)):
        if isinstance(items[i], list):
            deep_fill(items[i], value)
        else:
            items[i] = value

field = [
    [[1, 2, 3], [2, 3, 4], [[2, 3, 4], [1, 2]], 3],
    [1, 2, 2],
    4
]

deep_fill(field, 0)
print(field)
# [[[0, 0, 0], [0, 0, 0], [[0, 0, 0], [0, 0]], 0], [0, 0, 0], 0]
</code>


постепенная печать python
Хочу сделать текст, который постепенно будет печатать содержимое. То есть например в слове "Ожидание..." точки должны выводится одна за другой раз в секунду. Пытался сделать так:
<code>
from time import sleep

print("Ожидание" + sleep(1) + "." + sleep(1) + "." + sleep(1) + ".")
</code>
Но к сожалению это не работает. Как сделать что-то наподобие этого?

from time import sleep

print("Ожидание", end="")

for i in range(3):
    sleep(1)
    print(".", end="")


Ошибка AttributeError в Python 3.8
Участок кода:

 elif speech_engine.comparison(message.text, "время") > 0.5:
    functions.time_now(message.chat.id)

сама функция (time_now):

def time_now(id):
    time_now = time.ctime()
    bot.send_message(id, "Сейчас узнаю")
    bot.send_message(id, str(time_now))

ошибка:

Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\site-packages\telebot\util.py", line 60, in run
    task(*args, **kwargs)
  File "c:\Users\Кирилл\Desktop\telegram_bot\main.py", line 20, in get_text_messages
    functions.time_now(message.chat.id)
AttributeError: partially initialized module 'functions' has no attribute 'time_now' (most likely due to a circular import)
"
Traceback (most recent call last):
  File "c:\Users\Кирилл\Desktop\telegram_bot\main.py", line 3, in <module>
    import functions
  File "c:\Users\Кирилл\Desktop\telegram_bot\functions.py", line 5, in <module>
    import main
  File "c:\Users\Кирилл\Desktop\telegram_bot\main.py", line 36, in <module>
    bot.polling(none_stop=True, interval=0)
  File "C:\Program Files\Python38\lib\site-packages\telebot\__init__.py", line 392, in polling
    self.__threaded_polling(none_stop, interval, timeout)
  File "C:\Program Files\Python38\lib\site-packages\telebot\__init__.py", line 416, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Program Files\Python38\lib\site-packages\telebot\util.py", line 109, in raise_exceptions
    six.reraise(self.exc_info[0], self.exc_info[1], self.exc_info[2])
  File "C:\Users\Кирилл\AppData\Roaming\Python\Python38\site-packages\six.py", line 703, in reraise
    raise value
  File "C:\Program Files\Python38\lib\site-packages\telebot\util.py", line 60, in run
    task(*args, **kwargs)
  File "c:\Users\Кирилл\Desktop\telegram_bot\main.py", line 20, in get_text_messages
    functions.time_now(message.chat.id)
AttributeError: partially initialized module 'functions' has no attribute 'time_now' (most likely due to a circular import)

В
main.py вы импортируете
functions.py, а в
functions.py импортируется
main.py, поэтому и ошибка:

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

Возможно, вам нужен третий модуль, который будет иметь общие данные для
main.py и
functions.py


django как storage
У меня предполагается база данных, постгрес. Вспомнил про существование джанго. Возникли вопросы:

как дела с масштабированием (слышал, что плохо) на разные инстансы?
разумно ли использовать джанго как storage к БД?
мне потребуется сначала накатить данные в постгрес и делать это придётся не через джанго. Умеет ли такое джанго?

Что значит "как storage"?
С первым вопросом  - масштабирование можно преодалеть запустив по джанге на каждом инстансе. Может использовать несколько инстансов как ридонли и один для записи. Но масштабирование разное бывает - нужны подробности.
Админка рисуется за день - два. Использую как интерфейс к небольшим проектам.
Модель можно построить средствами джанги по готовым таблицам. При создании ставится параметр
managed=False и джанга структуру не портит.


Помогите с телеграм ботом
Ситуация такая: изучаю питон 3-ий день. Посмотрел видео курс из 5 часов. Посчитал, что можно приступить к простому, написанию телеграм бота. Я хочу, чтобы он не только ссылки писал, но и погоду. А когда прошу его написать погоду, то либо не работает команда старт, то бесконечно просит вводит города, а если введу не правильный город, то просто крашает бота. Переписывал некоторые блоки у "ютуберов",  а они нихуя не объясняют и я ничего не понимаю. Можете закидать меня помидорами, но я рил не шарю, но очень хочу научиться!!! Закомментированный блок - это и есть блок с погодой, гори она в аду.  Вот код:

import telebot
import pyowm
from telebot import types
owm = pyowm.OWM('мой апи', language = 'ru')
bot = telebot.TeleBot ("мой апи")
can_send_messages = True

@bot.message_handler(commands=['insta'])
def open_insta(message):
    markup1 = types.InlineKeyboardMarkup()
    btninst = types.InlineKeyboardButton("Тык сюда и ты моей инсте", url="я удалил ссылку")
    markup1.add(btninst)
    bot.send_message(message.chat.id, "Подпишись", reply_markup=markup1)

@bot.message_handler(commands=['vk'])
def open_vk(message):
    markup1 = types.InlineKeyboardMarkup()
    btnvk = types.InlineKeyboardButton("Тык сюда и ты моем вк", url="я удалил ссылку")
    markup1.add(btnvk)
    bot.send_message(message.chat.id, "Подпишись", reply_markup=markup1)

@bot.message_handler(commands=['stoopid'])
def open_stoopid(message):
    markup1 = types.InlineKeyboardMarkup()
    btnst = types.InlineKeyboardButton("Тык сюда и ты у самого тупого чела", url="я удалил ссылку")
    markup1.add(btnst)
    bot.send_message(message.chat.id, "Отпишись", reply_markup=markup1)

@bot.message_handler(commands=['stop'])
def stop(message):
    bot.send_message(message.chat.id, "Ты вышел из раздела, жду команды!")

@bot.message_handler(commands=['menu'])
def reec(message):
    bot.send_message(message.chat.id,"""Я туповат пока что и не всегда понимаю, что ты хочешь от меня,но скоро я буду имбой
        Тем не менее, я не могу:
        /weather - узнать погоду (не работает, хз почему)
        /start снова поприветсвую тебя и спрошу кто ты
        про /menu ты уже знаешь
        /insta - узнать мою инсту
        /vk - узнать мой вк
        /stoopid - самый тупой чел
        /stop - выход из раздела
        Пока функционал заканчивается!""")

#@bot.message_handler(content_types='text')
#def pogoda(message):
    #get_message_bot = message.text.strip().lower()
    #if get_message_bot == "weather":
        #observation = owm.weather_at_place(message.text)
        #w = observation.get_weather()
        #temp = w.get_temperature('celsius')["temp"]
        #answer1 = "В городе " + message.text + " сейчас " + w.get_detailed_status() +'\n'
        #answer1 += " Температура сейчас в районе " + str(temp) +'\n'
        #if temp < 10:
        #   answer1 +='На улице холодно, шо пиздец, оденься, как зимой!'
        #elif temp < 15:
        #   answer1 +='На улице чет холодновато, оденься теплее!'
        #elif temp < 20:
        #   answer1 += "На улице в принципе тепло, но в шортах не рекомендую выходить"
        #elif temp > 20:
        #   answer1 += "На улцие жара, шо пиздец "
        #else:
        #   answer1 += "Введи норм город или другю команду"
        #bot.send_message(message.chat.id,answer1)

@bot.message_handler(commands=['start'])
def privet(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=3)
    btn1=types.KeyboardButton("/start")
    btn2=types.KeyboardButton("/menu")
    btn3=types.KeyboardButton("/vk")
    btn4=types.KeyboardButton("/insta")
    btn5=types.KeyboardButton("/stoopid")
    btn6=types.KeyboardButton("/stop")
    btn7=types.KeyboardButton("/weather")
    markup.add(btn1,btn2,btn3,btn4,btn5,btn6,btn7)
    stic = open('sticker.webp', 'rb')
    bot.send_sticker(message.chat.id, stic)
    bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nЯ - {1.first_name}, бот созданный чтобы быть подопытным кроликом.".format(message.from_user, bot.get_me()),
    parse_mode='html', reply_markup=markup)

        #bot.send_message(message.chat.id, "Я тебя не понимаю, введи /menu , чтобы все понять!!")
@bot.message_handler(content_types='text')
def deafult(message):
    bot.send_message(message.chat.id, "Я тебя не понимаю, введи '/menu' , чтобы все понять!!")

bot.polling(none_stop=True)

Если пользователь написал боту (нажал на кнопку ReplyKeyboardMarkup, которая отправляет в чат от имени пользователя "заготовку")
weather -
if get_message_bot == "weather":
бот переходит в режим погода. Ок.
Текст сообщения пользователя,
message.text передаётся в
owm.weather_at_place() как место -
observation = owm.weather_at_place(message.text).
Так как же бот не будет падать, если функция получения погоды пытается найти погоду в месте weather?
Почему бы не сделать для погоды отдельную команду
@bot.message_handler(commands=['weather'])?
Тогда:

@bot.message_handler(commands=['weather'])
def cmd_city(message):
    send = bot.send_message(message.chat.id, 'Введи город')
    bot.register_next_step_handler(send, city)  # ожидает следующий шаг

def city(message):
    bot.send_message(message.chat.id, 'Ищу погоду в городе {city}'.format(city=message.text))
    observation = owm.weather_at_place(message.text)
    w = observation.get_weather()
    temp = w.get_temperature('celsius')["temp"]
    answer1 = "В городе " + message.text + " сейчас " + w.get_detailed_status() + '\n'
    answer1 += " Температура сейчас в районе " + str(temp) + '\n'
    if temp < 10:
        answer1 += 'На улице холодно, шо пиздец, оденься, как зимой!'
    elif temp < 15:
        answer1 += 'На улице чет холодновато, оденься теплее!'
    elif temp < 20:
        answer1 += "На улице в принципе тепло, но в шортах не рекомендую выходить"
    elif temp > 20:
        answer1 += "На улцие жара, шо пиздец "
    else:
        answer1 += "Введи норм город или другю команду"
    bot.send_message(message.chat.id, answer1)

Либо, без хэндлера на команду:

@bot.message_handler(content_types='text')
def text(message):
    if message.text == 'weather':
        send = bot.send_message(message.chat.id, 'Введи город')
        bot.register_next_step_handler(send, city)

def city(message):
    bot.send_message(message.chat.id, 'Ищу погоду в городе {city}'.format(city=message.text))
    observation = owm.weather_at_place(message.text)
    w = observation.get_weather()
    temp = w.get_temperature('celsius')["temp"]
    answer1 = "В городе " + message.text + " сейчас " + w.get_detailed_status() + '\n'
    answer1 += " Температура сейчас в районе " + str(temp) + '\n'
    if temp < 10:
        answer1 += 'На улице холодно, шо пиздец, оденься, как зимой!'
    elif temp < 15:
        answer1 += 'На улице чет холодновато, оденься теплее!'
    elif temp < 20:
        answer1 += "На улице в принципе тепло, но в шортах не рекомендую выходить"
    elif temp > 20:
        answer1 += "На улцие жара, шо пиздец "
    else:
        answer1 += "Введи норм город или другю команду"
    bot.send_message(message.chat.id, answer1)

UPD:

Обработчики (Handlers) - это функции с общей подписью:

handler(request, response)
Ожидается, что обработчик будет использовать информацию из запроса (например, путь) либо для заполнения объекта ответа данными для отправки, либо для прямой записи в выходной поток через экземпляр ResponseWriter, связанный с запросом. Если обработчик выполняет запись в выходной поток, то сервер не будет пытаться выполнить дополнительную запись, т.е. выбор записи прямо в обработчик или нет - «все или ничего».
о декораторах

в данном случае
send = bot.send_message(message.chat.id, 'Введи город') это переменная.
расположение команд не имеет значения, просто удобно видеть, например /start первым блоком кода, разве нет?
bot.register_next_step_handler ожидает ввод и переходит к другому шагу передавая ему данный ввод.
кнопка которая бы возвращала пользователя на этап назад - например создать функцию которая описывает главную клавиатуру и при
if message.text == 'назад': вызывать данную функцию
да, можно под одним хэндлером можно расположить несколько функций.
6.1 верно, сначала идёт cmd_city(), после city()


Как воспроизвести ILIKE в Django
В Django как ILIKE работают 2 лукапа - 'iexact' и 'icontains'. Первый создает запросы вида
ILIKE 'my query', а второй
ILIKE '%my query%'.
Вопрос - как с помощью Django ORM сделать запрос
ILIKE '%my%query%'?

Встроенной возможности нет, но можно определить пользовательский lookup:

from django.db.models import Lookup
from django.db.models.fields import Field

@Field.register_lookup
class ILikeLookup(Lookup):
    lookup_name = 'ilike'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return '%s ILIKE %s' % (lhs, rhs), params

После этого его можно использовать так:

MyModel.objects.filter(somefield__ilike='%my%query%')


Помогите оптимизировать алгоритм нахождения делителей
<code>
def divider(number):
    pol = [1, number]
    number1 = number
    dividers = [2, 3, 5, 7]
    for i in range(2, number1 + 1):
        if number1 % i == 0:
            if pol.count(i) < 1:
                pol.append(i)
                number1 /= i
            else:
                pass
            for j in dividers:
                u = i * j
                if number % u == 0 and pol.count(u) < 1:
                    if i * j == number:
                        pass
                    else:
                        pol.append(u)
    print(sorted(pol))
</code>
Задумка в том, чтобы когда делитель был найден, программа делила на него число, тем самым, она работала бы быстрее. Но строчка number1 /= i только все портит, так как некоторая часть делителей просто не находится и также не изменяет значение nimber1 в цикле. Помогите пожалуйста(

from functools import reduce

def sieve_of_eratosthenes(n):
    is_prime = 2 * [False] + (n-1) * [True]
    p = 2
    while (p * p <= n):
        if is_prime[p]:
            for i in range(2 * p, n + 1, p):
                is_prime[i] = False
        p += 1
    return is_prime

def all_prime_factors(n):
    is_prime = sieve_of_eratosthenes(n)
    prime_facts = [i for i in range(n + 1) if is_prime[i] and n % i == 0]
    prime_facts_powers = []
    for p in prime_facts:
        for i in range(1, n + 1):
            if n % p**i:
                break
        prime_facts_powers.append(i - 1)
    return prime_facts, prime_facts_powers, len(prime_facts)

def all_divisors(n):
    if n == 1:
        return [1]
    primes, powers, nfactors = all_prime_factors(n)
    exponents = nfactors * [0]
    divisors = []
    while True:
        factors = [primes[x] ** exponents[x] for x in range(nfactors)]
        divisor = reduce(lambda x, y: x * y, factors, 1)
        divisors.append(divisor)
        i = 0
        while True:
            exponents[i] += 1
            if exponents[i] <= powers[i]:
                break
            exponents[i] = 0
            i += 1
            if i >= nfactors:
                return divisors

Тест:

all_divisors(24)

[1, 2, 4, 8, 3, 6, 12, 24]

Объяснение:
Разложим число на простые множители и создаем все комбинации этих простых множителей.
Пример: Число 24.
Разложение:
24 = 2**3 * 3**1
Возможные степени 2:
2**0,
2**1,
2**2,
2**3
Возможные степени 3:
3**0,
3**1
Делители:

2**0 * 3**0  1

2**1 * 3**0  2

2**2 * 3**0  4

2**3 * 3**0  8

2**0 * 3**1  3

2**1 * 3**1  6

2**2 * 3**1  12

2**3 * 3**1  24


вопрос реализации алгоритма определения точного времени
от некого api получаю текущее время в формате -
1589468357.
экспериментальным путем я понял, что это число секунд если считать с 1970 года..
вопрос:

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

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

Ваше число - это значение, которое возвращает стандартная функция
time() (число секунд, прошедших "с начала эпохи" - после 1 января 1970, 00:00:00).
Для работы с ним можно воспользоваться не менее стандартными функциями модуля
time, прочесть о которых можно, например, здесь.


не могу настроить pushButton
Никак не получается привязать кнопки интерфейса с действиями

ui.`pushButton` - к `def getFile`

ui.`pushButton_2` - к `def find`

ui.`pushButton_3` - к `def save`

Мой пример:

from PySide import QtCore, QtGui
import sys
from ui import Ui_MainWindow
import os

class File(Ui_MainWindow):
    path = "D:\Test"
    def __init__(self):
        pass

    def getFile(self):
        self.path = path
        for file in os.listdir(path):
            if file.endswith(".html"):
                h = os.path.join(path, file)

    def find(self):
        with open (h, 'r',encoding="utf-8") as f:
            old_data = f.read()
            a = re.findall(r'(<.*>)', old_data)

    def save(self):
        with open ('D:\Test\cest.txt', 'w') as f:
            f.write('\n'.join(a))
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

модуль UI

from PySide import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 226)
        MainWindow.setStyleSheet("QMainWindow{\n"
"background-color:gray\n"
"}\n"
"QPushButton {\n"
"    background-color :white;\n"
"    width: 80px;\n"
"    height: 80px;\n"
"    front-size: 15px;\n"
"    border: none;\n"
"    text-aling: center;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
"    background-color: silver;\n"
"}\n"
"\n"
"QPushButton:pressed{\n"
"    background-color: green\n"
"}")
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 20, 271, 16))
        font = QtGui.QFont()
        font.setFamily("Mongolian Baiti")
        font.setPointSize(14)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(290, 80, 181, 81))
        font = QtGui.QFont()
        font.setFamily("System")
        font.setPointSize(9)
        font.setWeight(75)
        font.setBold(True)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(480, 80, 191, 81))
        font = QtGui.QFont()
        font.setFamily("System")
        font.setPointSize(9)
        font.setWeight(75)
        font.setBold(True)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        self.textEdit = QtGui.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(30, 40, 731, 31))
        self.textEdit.setObjectName("textEdit")
        self.pushButton_3 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(100, 80, 181, 81))
        font = QtGui.QFont()
        font.setFamily("System")
        font.setPointSize(9)
        font.setWeight(75)
        font.setBold(True)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setObjectName("pushButton_3")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("MainWindow", "Введите разположение файла", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Начать чистку HTML файла", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_2.setText(QtGui.QApplication.translate("MainWindow", "Сохранить файл", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_3.setText(QtGui.QApplication.translate("MainWindow", "Найти файл HTML", None, QtGui.QApplication.UnicodeUTF8))

Попробуйте так (не проверено) :
<code>
import sys
import os
from PySide import QtCore, QtGui
from ui import Ui_MainWindow

#class File(Ui_MainWindow):
class File(QtGui.QMainWindow, Ui_MainWindow):                 # +++
    path = "D:\Test"
    def __init__(self):
        super().__init__()                      # забыл добавить !!!
#        pass
        self.setupUi(self)                                    # +++
        self.pushButton.clicked.connect(self.getFile)         # - к def getFile
        self.pushButton_2.clicked.connect(self.find)          # - к def find
        self.pushButton_3.clicked.connect(self.save)          # - к def save

        self.h = None                                         # +++
        self.a = None                                         # +++

    def getFile(self):
# ?        self.path = path
        for file in os.listdir(self.path):                    # self.path
            if file.endswith(".html"):
                self.h = os.path.join(self.path, file)        # self.h self.path

    def find(self):
        with open (self.h, 'r', encoding="utf-8") as f:      # self.h
            old_data = f.read()
            self.a = re.findall(r'(<.*>)', old_data)         # self.a

    def save(self):
        with open ('D:\Test\cest.txt', 'w') as f:
            f.write('\n'.join(self.a))                        # self.a

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
#    MainWindow = QtGui.QMainWindow()
#    ui = Ui_MainWindow()
#    ui.setupUi(MainWindow)
#    MainWindow.show()
    w = File()
    w.show()
    sys.exit(app.exec_())
</code>


rarfile python пример
подскажите пожалуйста, как создать архив rar, через rarfile, только не скидывайте документацию, можно пожалуйста на примере

Пример создания архива через patoolib.
В архиве будет только содержимое папки:
<code>
import os

# pip install patool
import patoolib

DIR = "<папку, чье содержимое нужно отправить в архив>"

# Запоминаем текущую активную директорию
prev_cwd = os.getcwd()

# Меняем активную директорию на папку DIR
os.chdir(DIR)

# Получаем содержимое папки DIR
files = os.listdir('.')

# Создаем архив, указывая путь в папку выше с списком файлов DIR
patoolib.create_archive('../' + DIR + '.rar', files)

# Восстанавливаем предыдущую активную директорию
os.chdir(prev_cwd)
</code>


Фильтрация списка в Python
Как отфильтровать список так, чтобы в нем остались только те элементы, которые начинаются с "@". Пример списка:
<code>
list = ["@mari1977", "просто текст", "Follow", "@ickWil59543298"]
</code>

в функциональном стиле:
<code>
items = ["@mari1977", "просто текст", "Follow", "@ickWil59543298"]

res = list(filter(lambda x: x.startswith("@"), items))
</code>


Остаток от деления -12 на 5
Встретился с такой интересной ситуацией при вычислении -12%5 на разных языках.
На python:

-12%5
3

На java:

-12%5
-2

На JavaScript:

-12%5
-2

Почему python так вычисляет?

Марк Лутц, писал следующее:
"Существует один очень тонкий момент: оператор // обычно называют оператором деления с усечением, но более точно было бы называть его оператором деления с округлением результата вниз – он округляет результат до ближайшего меньшего целого значения, то есть до целого числа, расположенного ниже истинного результата."


Парсинг Twitter в python
Есть задача спарсить имена фолловеров определенного аккаунта твиттер. Есть ли какие-то библиотеки для этого? Пробовал парсить с помощью selenium, но это слишком медленно работает.

Используйте Tweepy для парсинга твиттера или tweet-parser. Вот пример гайда: тык. Уверен, что у твиттера есть еще api для доступа к таким данным (по аналогии с вк), а для работы с ним нужен только requests модуль и json


кодировка python
как сделать условие
если файл равен кодировки cp437,  то...
а если файл равен кодировки cp866, то ...

Может быть так:
<code>
# pip install chardet
from chardet.universaldetector import UniversalDetector

detector = UniversalDetector()
with open('users.txt', 'rb') as fh:
    for line in fh:
        detector.feed(line)
        if detector.done:
            break
    detector.close()

if detector.result['encoding'] == 'cp437':
    #блаблабла
if detector.result['encoding'] == 'cp866':
    #блаблабла
</code>
модуль  chardet


Проверить на наличие атрибута у объектов queryset Django
В админке Django мне нужны лишь определенные объекты модели. Для этого я получаю кастомный queryset:

...
def get_queryset(self, request):
    return super(UserAdmin, self).get_queryset(request).filter(type__sys_name = 'staff')

Однако, атрибут
type модели необязательный, у некоторых объектов он незаполнен, и я получаю ошибку
'NoneType' object has no attribute 'sys_name'. Как мне проверить на наличие этого атрибута, и получить нужную выборку?

Нужно отфильтровать те объекты, у которых нет
type:

def get_queryset(self, request):
    return super(UserAdmin, self).get_queryset(request).filter(
        type__isnull=False, type__sys_name = 'staff')


Решаю задачи на языке python, но проверяющая программа не засчитывает ответ. Есть ли у меня ошибка в коде?
Текст задачи:
Бизнесмен Василий после прочтения известной книги решил открыть новый бизнес — отгружать апельсины бочками. Партнёрам важно знать, сколько именно бочек апельсинов отгружается каждый день.
Мобильный телефон Василия поддерживает только транслит, поэтому он передаёт сообщения вида "n bochek". Например, "3 bochki" или "1 bochka".
Напишите программу, которая выбирает правильное слово (из "bochka" , "bochek" , "bochki" ) в зависимости от значения n.
Входные данные
Одно целое число n (0≤n≤1000).
Выходные данные
Соответствующая фраза на транслите
Примеры:
3 bochki
1 bochka
15 bochek
Мой код:
<code>
a = n//1000
b = n//100%10
c = n//10%10
d = n%10
n == ("a" + "b" + "c" + "d")
if (n != 11 and d == 1) or (n == 1 and d == 1):
    print(str(n) + " bochka")
if (d == 2) or (d == 3) or (d == 4):
    print(str(n) + " bochki")
if (d == 5) or (d == 6) or (d == 7) or (d == 8) or (d == 9) or (d == 0):
    print(str(n) + " bochek")
if n == 11:
    print(str(n) + " bochek")

</code>

У вас в коде несколько ошибок:
1.Намеренно или не специально вы не объявили значение переменной n перед объявлением a,b,c:

n = int(input())
a = n//1000
b = n//100%10
c = n//10%10
d = n%10

2.Вы не проверили результаты от 12-ти до 20-ти бочек, там у вас и будут ошибки:
12 bochki, 13 bochki, ...
Работающий код:

n = int(input())
if 10 <= n%100 <= 20: n = str(n) + ' bochek'
else:
    if n%10 == 1: n = str(n) + ' bochka'
    elif 1 <= n%10 <= 4: n = str(n) + ' bochki'
    else : n = str(n) + ' bochek'
print(n)


Заставить chrome сохранить html тот который обработанный по F12
Новичок в python:
Есть задача распарсить один сайт.  Но сайт вероятно защищен от парсинга. Так как код возвращаем не содержит нужной стурктуры.
Зато задача работает если на странице нажать F12 скопировать этот код в файл и его распарсить, то все работает.
Нужно сохранить то что выдает chrome по F12.
как вообще это сделать? Заставить Chrome сохранить страницу которую он отображает в отладчике.
спасибо.

Используйте Selenium или request-html модули для парсинга, сайт, который Вы парсите, скорее всего сгенерирован javascript'ом


База данных для приложения созданного на питоне
Всем привет! Я пишу свое небольшое приложение на питоне по сбору данных, и хочу сделать базу данных
для сохранение настроек, которые ведёт пользователь чтобы при каждом запуске опять не настраивать
настройки. Я совсем новичок в базах данных хочется научится посоветуйте пожалуйста какую учить (думаю
правильно выразился). Буду очень благодарен.

Я обычно пользуюсь словарями

config = {"name": "Tolya", "date": "6687"}

И так далее. Это для примера данные :)
Их можно сохранять в файл с помощью библиотеки json

import json

res = {"key1": 6}

f = open("config.data","w")
json.dump(res, f, indent=4)
f.close()

Чтение с файла:

import json

f = open("config.data","r")
res = json.load(f)
f.close()