Змейка закрывается раньше времени
Всем привет, написал простую змейку и теперь не могу понять, почему она при отпущении клавиатуры закрывается раньше времени, то есть если змейке дать продолжить ползти, то через некоторое время программа закрывается, и при этом она не касается стенки (что странно). Как это можно решить?
<code>
import pygame
import sys

SIZE_BLOCK = 14
WHITE = (180, 180, 180)
BLACK = (0, 0, 0)
HEADER_COLOR = (255, 255, 255)
SNAKE_COLOR = (255, 0, 0)
COUNT_BLOCK = 25
HEADER_MARGIN = 70
MARGIN = 1
size = [SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * COUNT_BLOCK,
        SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * SIZE_BLOCK + HEADER_MARGIN + 10]
screen = pygame.display.set_mode(size)
print(size)
pygame.display.set_caption('snake')
timer = pygame.time.Clock()

def draw_block(color, row, column):
    pygame.draw.rect(screen, color,
                     [SIZE_BLOCK + column * SIZE_BLOCK + MARGIN * (column + 1),
                      HEADER_MARGIN + SIZE_BLOCK + row * SIZE_BLOCK + MARGIN * (row + 1),
                      SIZE_BLOCK,
                      SIZE_BLOCK])

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

    def is_inside(self):
        return 0 <= self.x < SIZE_BLOCK and 0 <= self.y < SIZE_BLOCK

snake_block = [SnakeBlock(9, 7), SnakeBlock(9, 8), SnakeBlock(9, 9), SnakeBlock(9, 10)]
d_row = 0
d_col = 1

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and d_col != 0:
                d_row = -1
                d_col = 0
            elif event.key == pygame.K_DOWN and d_col != 0:
                d_row = 1
                d_col = 0
            elif event.key == pygame.K_LEFT and d_row != 0:
                d_row = 0
                d_col = -1
            elif event.key == pygame.K_RIGHT and d_row != 0:
                d_row = 0
                d_col = 1

    screen.fill(WHITE)
    pygame.draw.rect(screen, HEADER_COLOR, [0, 0, size[0], HEADER_MARGIN])
    for row in range(COUNT_BLOCK):
        for column in range(COUNT_BLOCK):
            if (row + column) % 2 == 0:
                color = BLACK
            else:
                color = BLACK
            draw_block(color, row, column)

    head = snake_block[-1]
    if not head.is_inside():
        print('crash')
        pygame.quit()
        sys.exit()
    for block in snake_block:
        draw_block(SNAKE_COLOR, block.x, block.y)

    head = snake_block[-1]
    new_head = SnakeBlock(head.x + d_row, head.y + d_col)
    snake_block.append(new_head)
    snake_block.pop(0)

    pygame.display.flip()
    timer.tick(2)
</code>

проблема здесь

return 0 <= self.x < SIZE_BLOCK and 0 <= self.y < SIZE_BLOCK

вы сравниваете значения с
SIZE_BLOCK который равен
14. Думаю вам надо сравнивать с
COUNT_BLOCK

return 0 <= self.x < COUNT_BLOCK and 0 <= self.y < COUNT_BLOCK


Вставить датафрейм со столбцом с датами библиотекой clickhouse-driver
Создал таблицу:

create table t
(
    order_date     Date
)
engine = ReplacingMergeTree()
PARTITION BY toYYYYMM(order_date)
ORDER BY order_date
SAMPLE BY order_date
SETTINGS index_granularity = 8192;

Хочу вставить в нее датафрейм:

pd.DataFrame([[datetime.date(2020, 12, 21)]])

Вставку пытаюсь осуществить методом insert_dataframe
Клиент:

from clickhouse_driver import Client

client = Client('localhost', settings={'use_numpy': True})

Вставка:

client.insert_dataframe(f'INSERT INTO t VALUES', df)

Если пытаюсь вставить
df = pd.DataFrame([[datetime.date(2020, 12, 21)]]), то получаю ошибку:

int() argument must be a string, a bytes-like object or a number, not 'datetime.date'

Если пытаюсь вставить
df = pd.DataFrame([['2020-12-21']]), то получаю ошибку:

invalid literal for int() with base 10: '2020-12-21'

Если
df = pd.DataFrame([[1608560160]]) (текущий unixtimestamp), то вставка происходит, но дата - 2092-01-17.
Как вставить столбец с датой?

Нужно передать дату, как число дней от 1970-01-01:
<code>
from datetime import date
import pandas
from clickhouse_driver import Client

EPOCH_START = date(1970, 1, 1)

def get_count_days(dt: date) -> int:
    return (dt - EPOCH_START).days

client = Client('localhost', settings={'use_numpy': True})

df = pandas.DataFrame([{'order_date': get_count_days(date(2020, 12, 26))}])
client.insert_dataframe(f'INSERT INTO t VALUES', df)
</code>


Передача списка в функцию: по ссылке или по значению?
Из следующего примера выходит, что по ссылке:

my_list = ['a', 'b', 'c']

def my_function(values):
    values.append('d')
    print(values)

при вызове
my_function с
my_list в качестве аргумента,
ожидаемо видим вывод на печать списка из четырех элементов:

>>> my_function(my_list)
['a', 'b', 'c', 'd']

и измененный
my_list:

>>> print(my_list)
['a', 'b', 'c', 'd']

Но если сделать так:

my_list = ['a', 'b', 'c']

def my_function(values):
    values = ['d', 'e']
    print(values)

то выходит, что по значению:

>>> my_function(my_list)
['d', 'e']
>>> print(my_list)
['a', 'b', 'c']

Как, все таки, изменяемые типы передаются в функцию в качестве аргументов?

В первом примере вы изменяет полученный список, а во втором создаётся новый который никак не связан с
my_list
пример:

my_list = ['a', 'b', 'c']

def my_function(values):
    values.append('d')
    return values

print(my_list is my_function(my_list))

my_list = ['a', 'b', 'c']

def my_function(values):
    values = ['d', 'e']
    return values

print(my_list is my_function(my_list))

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


Как запустить background task в discord.py?
Как запустить background task в discord.py?
При например таком коде минимально воспроизводимом примере:
<code>
import asyncio
import discord
from discord.ext import commands

bot = commands.Bot(command_prefix = '!!')

@bot.command()
async def hi(ctx):
    await ctx.send('Hi!')

bot.run('***********************************')
</code>

Вот так:
<code>
import asyncio
import discord
from discord.ext import commands
from discord.ext.tasks import loop

bot = commands.Bot(command_prefix = '!!')

@loop(seconds=1)
async def bg_task():
    pass # doing smth

@bot.command()
async def hi(ctx):
    await ctx.send('Hi!')

bg_task.start()
bot.run('***********************************')
</code>


Как считать время проведенное в голосовом канале? | discord.py
У меня есть код, который реагирует на вход в голосовой, и выход из него. При входе пишется "1", при выходе "0". Как мне его изменить, чтобы он еще и считал время проведенное в голосовом канале.
<code>
@bot.event
async def on_voice_state_update(member, before, after):
    if before.channel is None and after.channel is not None:
        print('1')
    elif before.channel is not None and after.channel is None:
        print('0')
</code>

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

А в чём пробела-то ? Засепкаем время при входе, аналогично - при выходе. И берём их разницу:
<code>
import  time

if before.channel is None and after.channel is not None:
    print('1')
    t1 = time.time()
elif before.channel is not None and after.channel is None:
    t2 = time.time()
    print('0')
    print(t2-t1)
</code>


Как найти все наиболее часто дублирующиеся элементы с одинаковым количеством в списке python?
Допуcтим, что есть список
names = [1, 2, 1, 4, 5, 1, 2, 3, 2]
здесь есть одинаковые элементы 1 и 2,  выбор падает только на них ибо их количество наиболее встречаемое, ну и их количество одинаково, как это можно сделать?..

можно сделать так:
<code>
names = [1, 2, 1, 4, 5, 1, 2, 3, 2]

# подсчитать максимальное кол-во элементов
max_count = names.count(max(names, key=lambda i: names.count(i)))

# найти все элементы
res = {i for i in names if names.count(i) == max_count}

print(res)
</code>


Как можно провести сравнение в цикле?
Есть такой код. Нужно провести сравнение, чтобы все строки были равны соответствующим. Можно сделать это как-то красивее, в цикле или что-то типа того? Заранее спасибо за помощь.
<code>
qs_cart = ECart.objects.filter(user_id=obj.user_id)
                qs_delivery = EOrderDelivery.objects.filter(order_id__in=qs_cart.values('order_id'))
                for idx, obj in enumerate(qs_delivery):
                    if idx == 0:
                        fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']
                        obj_ok = obj
                        id_ok = qs_cart[0].order_id
                    else:
                        if (getattr(obj, fields[0]) == getattr(obj_ok, fields[0])) and (
                                getattr(obj, fields[1]) == getattr(obj_ok, fields[1])) and (
                                getattr(obj, fields[2]) == getattr(obj_ok, fields[2])) and (
                                getattr(obj, fields[3]) == getattr(obj_ok, fields[3])) and (
                                getattr(obj, fields[4]) == getattr(obj_ok, fields[4])) and (
                                getattr(obj, fields[5]) == getattr(obj_ok, fields[5])) and (
                                getattr(obj, fields[6]) == getattr(obj_ok, fields[6])):
                            qs_cart.update(order_id=id_ok)
</code>

например так:

fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']

# формируем список значений по полям
obj_data = [getattr(obj, name) for name in fields]
obj_ok_data = [getattr(obj_ok, name) for name in fields]

# сравниваем
if all([i[0] == i[1] for i in zip(obj_data, obj_ok_data)]):
    print()

или даже так:

fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']

# формируем список значений по полям
obj_data = [getattr(obj, name) for name in fields]
obj_ok_data = [getattr(obj_ok, name) for name in fields]

# сравниваем
if obj_data == obj_ok_data:
    print()

а если мучать первый вариант, то:

fields = ['city', 'country', 'flat', 'house', 'region', 'street', 'postal_code']

# формируем список значений по полям и сравниваем
if all(getattr(obj, name) == getattr(obj_ok, name) for name in fields):
    print()

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


pyTelegramBotAPI python-telegram-bot-calendar v1.0.2 Помогите пересобрать календарь
Помогите пересобрать
python-telegram-bot-calendar - хочу добавить часы и минуты, вроде все сделал, но где-то ошибка, не могу понять.
Выдаёт:

File
"C:\Anaconda3\lib\site-packages\telegram_bot_calendar\detailed.py",
line 50, in _process  minute = int(params['minute']) KeyError:
'minute'

base.py. Добавил часы + минуты:

import json
import random
from datetime import date

from dateutil.relativedelta import relativedelta

from telegram_bot_calendar.static import MONTHS, DAYS_OF_WEEK, HOURS, MINUTES_OF_HOUR

calendar.setfirstweekday(calendar.MONDAY)

CB_CALENDAR = "cbcal"

YEAR = 'y'
MONTH = 'm'
DAY = 'd'
HOUR = "h"
MINUTE = "mi"
SELECT = "s"
GOTO = "g"
NOTHING = "n"
LSTEP = {'y': 'year', 'm': 'month', 'd': 'day', 'h': 'hour', 'mi': 'minute'}

class TelegramCalendar:
    months = MONTHS
    days_of_week = DAYS_OF_WEEK
    hours = HOURS
    minutes_of_hour = MINUTES_OF_HOUR
    prev_button = "<<"
    next_button = ">>"
    middle_button_minute = "{hour} {day} {month} {year}"
    middle_button_hour = "{day} {month} {year}"
    middle_button_day = "{month} {year}"
    middle_button_month = "{year}"
    middle_button_year = " "
    back_to_button = "<<< {name}"
    empty_nav_button = "×"
    empty_day_button = " "
    empty_month_button = " "
    empty_year_button = " "
    size_year = 2
    size_year_column = 2
    size_month = 3
    size_day = 7
    size_hour = 4
    size_minute = 60
    size_additional_buttons = 2
    _keyboard = None
    step = None

    def __init__(self, calendar_id=0, current_date=None, additional_buttons=None, locale='ru', min_date=None,
                 max_date=None, **kwargs):

        if current_date is None: current_date = date.today()
        if min_date is None: min_date = date(1, 1, 1)
        if max_date is None: max_date = date(2999, 12, 31)

        self.calendar_id = calendar_id
        self.current_date = current_date
        self.locale = locale

        self.min_date = min_date
        self.max_date = max_date

        if not additional_buttons: additional_buttons = []
        self.additional_buttons = rows(additional_buttons, self.size_additional_buttons)

        self.prev_button_year = self.prev_button
        self.next_button_year = self.next_button
        self.prev_button_month = self.prev_button
        self.next_button_month = self.next_button
        self.prev_button_day = self.prev_button
        self.next_button_day = self.next_button
        self.prev_button_hour = self.prev_button
        self.next_button_hour = self.next_button
        self.prev_button_minute = self.prev_button
        self.next_button_minute = self.next_button

        self.nav_buttons = {
            YEAR: [self.prev_button_year, self.middle_button_year, self.next_button_year],
            MONTH: [self.prev_button_month, self.middle_button_month, self.next_button_month],
            DAY: [self.prev_button_day, self.middle_button_day, self.next_button_day],
            HOUR: [self.prev_button_hour, self.middle_button_hour, self.next_button_hour],
            MINUTE: [self.prev_button_minute, self.middle_button_minute, self.next_button_minute],
        }

    @staticmethod
    def func(calendar_id=0):
        def inn(callback):
            start = CB_CALENDAR + "_" + str(calendar_id)
            return callback.data.startswith(start)

        return inn

    def build(self):
        if not self._keyboard:
            self._build()
        return self._keyboard, self.step

    def process(self, call_data):
        return self._process(call_data)

    def _build(self, *args, **kwargs):

    def _process(self, call_data, *args, **kwargs):

    def _build_callback(self, action, step, data, *args, is_random=False, **kwargs):
        if action == NOTHING:
            params = [CB_CALENDAR, str(self.calendar_id), action]
        else:
            data = list(map(str, data.timetuple()[:3]))
            params = [CB_CALENDAR, str(self.calendar_id), action, step] + data

        salt = "_" + str(random.randint(1, 1e18)) if is_random else ""

        return "_".join(params) + salt

    def _build_button(self, text, action, step=None, data=None, is_random=False, **kwargs):
        return {
            'text': text,
            'callback_data': self._build_callback(action, step, data, is_random=is_random)
        }

    def _build_keyboard(self, buttons):
        return json.dumps({"inline_keyboard": buttons + self.additional_buttons})

    def _valid_date(self, d):
        return self.min_date <= d <= self.max_date

    def _get_period(self, step, start, diff, *args, **kwargs):
        lstep = LSTEP[step] + "s"
        dates = []

        empty_before = 0
        empty_after = 0

        for i in range(diff):
            n_date = start + relativedelta(**{lstep: i})
            if self.min_date > max_date(n_date, step):
                empty_before += 1
            elif self.max_date < min_date(n_date, step):
                empty_after += 1
            else:
                dates.append(n_date)
        return [None] * empty_before + dates + [None] * empty_after

def rows(buttons, row_size):
    return [buttons[i:i + row_size] for i in range(0, max(len(buttons) - row_size, 0) + 1, row_size)]

def max_date(d, step):
    if step == YEAR:
        return d.replace(month=12, day=31)
    elif step == MONTH:
        return d.replace(day=calendar.monthrange(d.year, d.month)[1])
    else:
        return d

def min_date(d, step):
    if step == YEAR:
        return d.replace(month=1, day=1)
    elif step == MONTH:
        return d.replace(day=1)
    else:
        return d

detailed.py. Добавил часы + минуты:

from telegram_bot_calendar.base import *

STEPS = {YEAR: MONTH, MONTH: DAY, DAY: HOUR, HOUR: MINUTE}

PREV_STEPS = {MINUTE: HOUR, HOUR: DAY, DAY: MONTH, MONTH: YEAR, YEAR: YEAR}
PREV_ACTIONS = {MINUTE: GOTO, HOUR:GOTO, DAY: GOTO, MONTH: GOTO, YEAR: NOTHING}

class DetailedTelegramCalendar(TelegramCalendar):
   first_step = MONTH

   def __init__(self, calendar_id=0, current_date=None, additional_buttons=None, locale='ru',
                min_date=None,
                max_date=None, **kwargs):
       super(DetailedTelegramCalendar, self).__init__(calendar_id, current_date=current_date,
                                                      additional_buttons=additional_buttons, locale=locale,
                                                      min_date=min_date, max_date=max_date)

   def _build(self, step=None, **kwargs):
       if not step:
           step = self.first_step

       self.step = step
       if step == YEAR:
           self._build_years()
       elif step == MONTH:
           self._build_months()
       elif step == DAY:
           self._build_days()
       elif step == HOUR:
           self._build_hours()
       elif step == MINUTE:
           self._build_minutes()

   def _process(self, call_data, *args, **kwargs):
       params = call_data.split("_")
       params = dict(
           zip(["start", "calendar_id", "action", "step", "year", "month", "day", "hour", "minute"][:len(params)], params))

       if params['action'] == NOTHING:
           return None, None, None
       step = params['step']

       year = int(params['year'])
       month = int(params['month'])
       day = int(params['day'])
       hour = int(params['hour'])
       minute = int(params['minute'])
       self.current_date = date(year, month, day, hour, minute)

       if params['action'] == GOTO:
           self._build(step=step)
           return None, self._keyboard, step

       if params['action'] == SELECT:
           if step in STEPS:
               self._build(step=STEPS[step])
               return None, self._keyboard, STEPS[step]
           else:
               return self.current_date, None, step

   def _build_years(self, *args, **kwargs):
       years_num = self.size_year * self.size_year_column

       start = self.current_date - relativedelta(years=(years_num - 1) // 2)
       years = self._get_period(YEAR, start, years_num)
       years_buttons = rows(
           [
               self._build_button(d.year if d else self.empty_year_button, SELECT if d else NOTHING, YEAR, d,
                                  is_random=True)
               for d in years
           ],
           self.size_year
       )

       nav_buttons = self._build_nav_buttons(YEAR, diff=relativedelta(years=years_num),
                                             mind=max_date(start, YEAR),
                                             maxd=min_date(start + relativedelta(years=years_num - 1), YEAR))

       self._keyboard = self._build_keyboard(years_buttons + nav_buttons)

   def _build_months(self, *args, **kwargs):
       start = self.current_date.replace(month=1)
       months = self._get_period(MONTH, self.current_date.replace(month=1), 12)
       months_buttons = rows(
           [
               self._build_button(
                   self.months[self.locale][d.month - 1] if d else self.empty_month_button,
                   SELECT if d else NOTHING,
                   MONTH, d, is_random=True
               )
               for d in months
           ],
           self.size_month)

       nav_buttons = self._build_nav_buttons(MONTH, diff=relativedelta(months=12),
                                             mind=max_date(start, MONTH),
                                             maxd=min_date(start.replace(month=12), MONTH))

       self._keyboard = self._build_keyboard(months_buttons + nav_buttons)

   def _build_days(self, *args, **kwargs):
       days_num = monthrange(self.current_date.year, self.current_date.month)[1]

       start = self.current_date.replace(day=1)
       days = self._get_period(DAY, start, days_num)

       days_buttons = rows(
           [
               self._build_button(d.day if d else self.empty_day_button, SELECT if d else NOTHING, DAY, d,
                                  is_random=True)
               for d in days
           ],
           self.size_day
       )

       days_of_week_buttons = [[
           self._build_button(self.days_of_week[self.locale][i], NOTHING) for i in range(7)
       ]]

       nav_buttons = self._build_nav_buttons(DAY, diff=relativedelta(day=1),
                                             maxd=max_date(start, Day),
                                             mind=min_date(start + relativedelta(days=days_num - 1), Day))

       self._keyboard = self._build_keyboard(days_of_week_buttons + days_buttons + nav_buttons)

   def _build_hours(self, *args, **kwargs):
       start = self.current_date.replace(hour=1)
       hours = self._get_period(HOUR, self.current_date.replace(hour=1), 24)
       months_buttons = rows(
           [
               self._build_button(
                   self.hours[self.locale][d.hour - 1] if d else self.empty_hour_button,
                   SELECT if d else NOTHING,
                   HOUR, d, is_random=True
               )
               for d in hours
           ],
           self.size_hour)

       nav_buttons = self._build_nav_buttons(HOUR, diff=relativedelta(hours=24),
                                             mind=max_date(start, HOUR),
                                             maxd=min_date(start.replace(hour=24), HOUR))

       self._keyboard = self._build_keyboard(hours_buttons + nav_buttons)

   def _build_minutes(self, *args, **kwargs):
       start = self.current_date.replace(minute=1)
       minutes = self._get_period(MINUTE, self.current_date.replace(minute=1), 60)
       minutes_buttons = rows(
           [
               self._build_button(
                   self.minutes[self.locale][d.minute - 1] if d else self.empty_minute_button,
                   SELECT if d else NOTHING,
                   MINUTE, d, is_random=True
               )
               for d in minutes
           ],
           self.size_minute)

       nav_buttons = self._build_nav_buttons(MINUTE, diff=relativedelta(minutes=60),
                                             mind=max_date(start, MINUTE),
                                             maxd=min_date(start.replace(minute=12), MINUTE))

       self._keyboard = self._build_keyboard(minutes_buttons + nav_buttons)

   def _build_nav_buttons(self, step, diff, mind, maxd, *args, **kwargs):

       text = self.nav_buttons[step]

       sld = list(map(str, self.current_date.timetuple()[:3]))
       data = [sld[0], self.months[self.locale][int(sld[1]) - 1], sld[2]]
       data = dict(zip(["year", "month", "day", "hour", "minute"], data))
       prev_page = self.current_date - diff
       next_page = self.current_date + diff

       prev_exists = mind - relativedelta(**{LSTEP[step] + "s": 1}) >= self.min_date
       next_exists = maxd + relativedelta(**{LSTEP[step] + "s": 1}) <= self.max_date

       return [[
           self._build_button(text[0].format(**data) if prev_exists else self.empty_nav_button,
                              GOTO if prev_exists else NOTHING, step, prev_page, is_random=True),
           self._build_button(text[1].format(**data),
                              PREV_ACTIONS[step], PREV_STEPS[step], self.current_date, is_random=True),
           self._build_button(text[2].format(**data) if next_exists else self.empty_nav_button,
                              GOTO if next_exists else NOTHING, step, next_page, is_random=True),
       ]]

   def _get_period(self, step, start, diff, *args, **kwargs):
       if step != DAY:
           return super(DetailedTelegramCalendar, self)._get_period(step, start, diff, *args, **kwargs)

       dates = []
       cl = calendar.monthcalendar(start.year, start.month)
       for week in cl:
           for day in week:
               if day != 0 and self._valid_date(date(start.year, start.month, day)):
                   dates.append(date(start.year, start.month, day))
               else:
                   dates.append(None)

       return dates

_init_.py. Добавил часы + минуты:

from telegram_bot_calendar.whour import WHourTelegramCalendar
from telegram_bot_calendar.wday import WDayTelegramCalendar
from telegram_bot_calendar.wmonth import WMonthTelegramCalendar
from telegram_bot_calendar.wyear import WYearTelegramCalendar

static.py. Добавил часы + минуты:

    'en': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
    'eo': ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aŭg", "sep", "okt", "nov", "dec"],
    'ru': ["янв", "фев", "мар", "апр", "май", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"],
}

DAYS_OF_WEEK = {
    'en': ["M", "T", "W", "T", "F", "S", "S"],
    'eo': ["L", "M", "M", "Ĵ", "V", "S", "D"],
    'ru': ["П", "В", "С", "Ч", "П", "С", "В"],
}

HOURS = {
    'en': ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
         "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"],
    'eo': ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
         "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"],
    'ru': ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
         "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"],
}

MINUTES_OF_HOUR = {
    'en': ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11",
            "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
            "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
             "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47",
              "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"],
    'eo': ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11",
            "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
            "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
             "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47",
              "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"],
    'ru': ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11",
            "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",
            "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35",
             "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47",
              "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59"],
} ```

`wyear.py`. Оставил как есть:

``` from telegram_bot_calendar.base import MONTH
from telegram_bot_calendar.detailed import DetailedTelegramCalendar

class WYearTelegramCalendar(DetailedTelegramCalendar):
    first_step = MONTH

wmonth.py. Оставил как есть:

from telegram_bot_calendar.detailed import DetailedTelegramCalendar

class WMonthTelegramCalendar(DetailedTelegramCalendar):
    first_step = DAY

whour.py. Добавил новым:

from telegram_bot_calendar.detailed import DetailedTelegramCalendar

class WHourTelegramCalendar(DetailedTelegramCalendar):
    first_step = MINUTE

wday.py. Добавил новым:

from telegram_bot_calendar.detailed import DetailedTelegramCalendar

class WDayTelegramCalendar(DetailedTelegramCalendar):
    first_step = HOUR

Проблема в том, что у функции
date из модуля
datetime нет аргументов
hour,
minute.  Если вам необходима дата:
2021-10-01 04:17:00, используйте
datetime вместо
date. Если нужна дата
Tuesday, 21. November 2006 04:30PM, то используйте
strftime.
Изучите подробно документацию на модуль
datetime и выберите необходимый вариант.


Простой вопрос про циклы в Python [закрыт]

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

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

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

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

Не совсем понимаю как работает математика внутри цикла
while в python. Вот у меня есть программный код:

def arrayset():
    i = column - 1
    while i != 0:
        NewItemX = CordX + CordStepX
        xarray.append(NewItemX)
        i -= 1
    i = column - 1
    while i != 0:
        NewItemY = CordY + CordStepY
        yarray.append(NewItemY)
        i -= 1

И в массив забиваются значения условно 480, 480, 480, 480, 480 в первом случае. И 200, 200, 200, 200, 200 во втором случае, т.е. над
NewItemX и
NewItemY производится одна операция со сложением, хотя она внутри цикла
while...

Как обычно - при отсутствии точного ТЗ ответ - ХЗ...
Вангую, что вам нужно
<code>
def arrayset():
    i = column - 1
    NewItemX = CordX
    NewItemY = CordY
    while i != 0:
        NewItemX += CordStepX
        xarray.append(NewItemX)
        NewItemY += CordStepY
        yarray.append(NewItemY)
        i -= 1
</code>


Работа с файлом. Python
Не могу понять, почему не находит номер рейса в файле, все время выводит "Не найден".
<code>
import csv

print("1.Добавить информацию\n2.Поиск информации")
x = int(input())
if x == 1:
    #Ввод пункта назначения рейса
    print("Введите место назначения")
    place = input().upper()

    #Ввод номера рейса
    print("Введите номер рейса")
    num = input().upper()

    #Ввод тип самолета
    print("Введите тип самолета")
    air = input().upper()

    #Запись вводимых данных в файл
    with open("fly.txt", mode = "a", encoding = "utf-8", newline = "") as f:
        file_writer = csv.writer(f, delimiter = ";", lineterminator = "\r")
        file_writer.writerow([place, num, air])
        f.close()

if x == 2:
    d =[]
    with open("fly.txt", encoding = "utf-8") as f:
        reader = csv.DictReader(f, delimiter = ";")
        for row in reader:
            d.append(row)

    print("Введите номер")
    num = input().upper()
    d1 = []
    for i in d:
        if i.get('номер рейса') == num:
            d1.append(i)
    if len(d1) == 0:
        print("Не найден")
    else:
        for i in d1:
            print(f"{i.get('название пункта назначения рейса')} {i.get('номер рейса')} {i.get('тип самолета')}")
</code>

При содании экземпляра
csv.DictReader, необходимо указать параметр:

fieldnames=['название пункта назначения рейса', 'номер рейса', 'тип самолета'])

В документации на DictReader все написано:

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

А у вас первой строкой имена полей не указываются. Из-за чего:

i.get('номер рейса') - не имеет смысла

i.get('название пункта назначения рейса') - не имеет смысла

i.get('тип самолета') - не имеет смысла

А после указания
fieldnames все заработает как надо. Вас спасла бы отладка, её необходимо было проделать. Как?

    with open("fly.txt", encoding = "utf-8") as f:
        reader = csv.DictReader(f, delimiter = ";")
        for row in reader:
            print(row)  # НАПРИМЕР, РАСПЕЧАТАТЬ, ЧТО ЗА ЭЛЕМЕНТЫ ПОПАДАЮТ В d!!!
            d.append(row)

И все стало бы очевидно. Ответ либо нашли бы сами в документации - кладезь ответов на многие вопросы. Либо смогли задать более точный вопрос.
PPS:
f.close() при использовании
with open... противопоказан, все уже делается автоматически, а ваша "самодеятельность" может привести к странным/страшным ошибкам.


Воспользуйтесь модулем dpath:
<code>
import dpath.util as dpu  # pip install dpath

for i in range(len(data)):
    dpu.set(data[i], "/**/label", predictions[i])
</code>


Как рассчитать сумму модулей элементов массива, расположенных после первого отрицательного числа?
Имеем:

import random
a = float(input("Введите число, которое будет началом диапазона случайных чисел: "))
b = float(input("Введите число, которое будет концом диапазона случайных чисел: "))
rndlist = [random.randint(a, b) for i in range(8)] # Создаем и заполняем список, состоящий из случайных чисел

Далее, нужно найти через цикл for(я так предполагаю) первое отрицательно число в списке и убрать из списка это отрицательное число и все те числа, которые были до него и записать оставшиеся значения в новый список. В новом списке могут быть отрицательные числа, в лабораторной сделан акцент именно НА ВЫБРОСЕ ПЕРВОГО ОТРИЦАТЕЛЬНОГО И ЧИСЕЛ ДО НЕГО(<<<PLEASE HELP)
Далее, я имею новый список, и там уже понятно:
Привожу через for все числа внутри нового списка к модулю:

newlist = [abs(elem) for elem in newlist]

И нахожу сумму всех значений.

from itertools import dropwhile

rndlist = [random.randint(-10, 10) for i in range(8)]  # Входные данные

it = iter(rndlist)  # Создаём итератор по списку

dropwhile_it = dropwhile(lambda x: x >= 0, it)  # Создаём итератор, который будет выкидывать все элементы до тех пор, пока не встретит первый отрицательный

next(dropwhile_it)  # Выбрасыааем первый отрицательный

result = sum(map(abs, dropwhile_it))  # Суммируем модули оставшихся элементов

Кстати, приводить
input() к
float, а затем скармливать это
randint - не самая хорошая затея.
И учтите, что рандом может сгенерировать последовательность и без отрицательных элементов (или с одним отрицательным в конце списка).


Заменить буквы в строке вариативными значениями python
Есть строка из 4 букв ABCX
Необходимо создать массив в котором будут строки, в которых X заменен сначала на A, потом B, C и D
Пробовал через replace, но он требует строку для замены

 print([i for i in st i.replace("X","ABCD")])
Ввод: ABCX
Вывод: ABCA, ABCB, ABCC, ABCD

from itertools import product

text = 'TEST XXX BEST'  # Входные данные

placeholder = 'X'  # Что будем заменять
alph = 'ABC'  # алфавит букв, которыми будем заменять

template_str = text.replace(placeholder , '{}')  # Меняем места для замены на {}, чтобы затем к этой строке можно было применить format

result = [
    template_str.format(*seq)  # Подставляем комбинацию в строку
    for seq in product(alph, repeat=template_str.count('{}'))  # Для всех возможных комбинаций
]

В результате будет

['TEST AAA BEST',
 'TEST AAB BEST',
 'TEST AAC BEST',
 'TEST ABA BEST',
 'TEST ABB BEST',
 'TEST ABC BEST',
 'TEST ACA BEST',
 'TEST ACB BEST',
 'TEST ACC BEST',
 'TEST BAA BEST',
 'TEST BAB BEST',
 'TEST BAC BEST',
 'TEST BBA BEST',
 'TEST BBB BEST',
 'TEST BBC BEST',
 'TEST BCA BEST',
 'TEST BCB BEST',
 'TEST BCC BEST',
 'TEST CAA BEST',
 'TEST CAB BEST',
 'TEST CAC BEST',
 'TEST CBA BEST',
 'TEST CBB BEST',
 'TEST CBC BEST',
 'TEST CCA BEST',
 'TEST CCB BEST',
 'TEST CCC BEST']


Если
Timestamp - это объект из Pandas, то это можно сделать так:

import pandas as pd

res = [(pd.Timestamp(x), y) for x,y in a]

результат:

In [145]: res
Out[145]:
[(Timestamp('2020-12-13 00:00:00'), 'ADAM'),
 (Timestamp('2020-12-13 01:00:00'), 'MADAM'),
 (Timestamp('2020-12-13 02:00:00'), 'TADAM')]

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

In [149]: res = pd.DataFrame(a, columns=["Date", "Name"]).assign(Date=lambda df: pd.to_datetime(df["Date"]))

In [150]: res
Out[150]:
                 Date   Name
0 2020-12-13 00:00:00   ADAM
1 2020-12-13 01:00:00  MADAM
2 2020-12-13 02:00:00  TADAM

In [151]: res.dtypes
Out[151]:
Date    datetime64[ns]
Name            object
dtype: object


Python не хочет принимать словарь в функцию
Вот мой код -

stats = {
        "PLm" : PLm,
         }
def MTGWU(**stats):
    time.sleep(0.4)
    while True:
        print(stats)
        PLm = stats["PLm"]

Ошибка которую выдаёт:

TypeError: MTGWU() takes 0 positional arguments but 1 was given

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

Надо писать так:

def MTGWU(**stats):
...
MTGWU(**stats)

либо так:

def MTGWU(stats):
...
MTGWU(stats)

В вашем случае лучше использовать второй вариант и вызывать функцию так:

threading.Thread(target=MTGWU, args=(stats, ))


Можно ли убрать контур кнопок в tkinter?
Хотелось бы иметь виджет Button без этих краев.Это может понадобится, когда хочется передать параметр command к простому тексту(но Label к сожалению, этого не позволяет).

Не знаю немного о чём вы но... А почему не с Label?
<code>
label.bind("<Button-1>", on_click_function)
</code>


получить локальный ip компьютера

import socket

hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)

получаю
socket.gaierror: [Errno 11004] getaddrinfofailed
как получить ip?
в C# делаю так и все работает

ipEntry = Dns.GetHostByName(Dns.GetHostName());
addr = ipEntry.AddressList;
addr[0]; //192.168.0.158

hostname не записан ни в
etc/hosts, ни в
winbind, ни в какомто ещё ресолвере - поэтому возникает такая ошибка. В настроенных компьютерах там обычно 127.0.0.1
Запусти любой UDP сокет на любой внешний адрес и ядро построит маршрут. На сокете будет адрес который смаршрутизирован в данном направлении.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])
s.close()

Запросы никуда не отправляются


Как исправить змейку?
Всем привет, написал простую змейку и возникла ошибка в том, что красные клетки расположены далеко друг от друга, как это можно исправить?
<code>
import pygame

SIZE_BLOCK = 14
WHITE = (180, 180, 200)
BLUE_BLACK = (225, 225, 225)
BLACK = (0, 0, 0)
HEADER_COLOR = (255, 255, 255)
SNAKE_COLOR = (255, 0, 0)
COUNT_BLOCK = 25
HEADER_MARGIN = 70
MARGIN = 1
size = [SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * COUNT_BLOCK,
        SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * SIZE_BLOCK + HEADER_MARGIN + 10]
screen = pygame.display.set_mode(size)
print(size)
pygame.display.set_caption('snake')
timer = pygame.time.Clock()

def draw_block(color, row, column):
    pygame.draw.rect(screen, color,
                     [SIZE_BLOCK + column * SIZE_BLOCK + MARGIN * (column + 1),
                      HEADER_MARGIN + SIZE_BLOCK + row * SIZE_BLOCK + MARGIN * (row + 1),
                      SIZE_BLOCK,
                      SIZE_BLOCK])

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

snake_block = [SnakeBlock(9, 8), SnakeBlock(9, 9), SnakeBlock(9, 10)]
d_row = 0
d_col = 1

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and d_col != 0:
                d_row = -1
                d_col = 0
            elif event.key == pygame.K_DOWN and d_col != 0:
                d_row = 1
                d_col = 0
            elif event.key == pygame.K_LEFT and d_row != 0:
                d_row = 0
                d_col = -1
            elif event.key == pygame.K_RIGHT and d_row != 0:
                d_row = 0
                d_col = 1

    screen.fill(WHITE)
    pygame.draw.rect(screen, HEADER_COLOR, [0, 0, size[0], HEADER_MARGIN])
    for row in range(COUNT_BLOCK):
        for column in range(COUNT_BLOCK):
            if (row + column) % 2 == 0:
                color = BLACK
            else:
                color = BLACK
            draw_block(color, row, column)

    for block in snake_block:
        draw_block(SNAKE_COLOR, block.x, block.y)
        block.x += d_row
        block.y += d_col

        head = snake_block[-1]
        new_head = SnakeBlock(head.x + d_row, head.y + d_col)
        snake_block.append(new_head)
        snake_block.pop(0)

    pygame.display.flip()
    timer.tick(2)
</code>

создания новой части надо вынести из цикла
for

import pygame

SIZE_BLOCK = 14
WHITE = (180, 180, 200)
BLUE_BLACK = (225, 225, 225)
BLACK = (0, 0, 0)
HEADER_COLOR = (255, 255, 255)
SNAKE_COLOR = (255, 0, 0)
COUNT_BLOCK = 25
HEADER_MARGIN = 70
MARGIN = 1
size = [SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * COUNT_BLOCK,
        SIZE_BLOCK * COUNT_BLOCK + 2 * SIZE_BLOCK + MARGIN * SIZE_BLOCK + HEADER_MARGIN + 10]
screen = pygame.display.set_mode(size)
print(size)
pygame.display.set_caption('snake')
timer = pygame.time.Clock()

def draw_block(color, row, column):
    pygame.draw.rect(screen, color,
                     [SIZE_BLOCK + column * SIZE_BLOCK + MARGIN * (column + 1),
                      HEADER_MARGIN + SIZE_BLOCK + row * SIZE_BLOCK + MARGIN * (row + 1),
                      SIZE_BLOCK,
                      SIZE_BLOCK])

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

snake_block = [SnakeBlock(9, 8), SnakeBlock(9, 9), SnakeBlock(9, 10)]
d_row = 0
d_col = 1

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and d_col != 0:
                d_row = -1
                d_col = 0
            elif event.key == pygame.K_DOWN and d_col != 0:
                d_row = 1
                d_col = 0
            elif event.key == pygame.K_LEFT and d_row != 0:
                d_row = 0
                d_col = -1
            elif event.key == pygame.K_RIGHT and d_row != 0:
                d_row = 0
                d_col = 1

    screen.fill(WHITE)
    pygame.draw.rect(screen, HEADER_COLOR, [0, 0, size[0], HEADER_MARGIN])
    for row in range(COUNT_BLOCK):
        for column in range(COUNT_BLOCK):
            if (row + column) % 2 == 0:
                color = BLACK
            else:
                color = BLACK
            draw_block(color, row, column)

    for block in snake_block:
        draw_block(SNAKE_COLOR, block.x, block.y)
        block.x += d_row
        block.y += d_col

    head = snake_block[-1]
    new_head = SnakeBlock(head.x + d_row, head.y + d_col)
    snake_block.append(new_head)
    snake_block.pop(0)

    pygame.display.flip()
    timer.tick(2)


Графический интерфейс открывается не в том окне
Всем привет! Возникла проблема при нажатии на кнопку в основном окне
tkinter, должно открываться вторничное окно в котором будут флажки и текст, но при нажатии на кнопку создаеться пустое вторичное окно а весь графический интерфейс в основном окне, у меня
Python 3.8 работаю в
Python IDLE
Вот мой код:

from tkinter import *
import tkinter as tk
import datetime as dt
import os

def move():
    one = 0
    two = 0
    three = 0
    four = 0
    five = 0

    root = Tk()
    root.geometry("400x400")

    def show():
        s = f'{var1.get()}, ' \
            f'{var2.get()}, ' \
            f'{var3.get()}, ' \
            f'{var4.get()}, ' \
            f'{var5.get()}, ' \

    def buildsettings():
        if var1.get() == True:
            one = 1
        else:
            one = 0
        if var2.get() == True:
            two = 1
        else:
            two = 0
        if var3.get() == True:
            three = 1
        else:
            three = 0
        if var4.get() == True:
            four = 1
        else:
            four = 0
        if var5.get() == True:
            five = 1
        else:
            five = 0

        print(one, two, three, four, five)
        root.destroy()

    frame = Frame()
    frame.pack(side=LEFT)

    var1 = BooleanVar()
    var1.set(0)
    c1 = Checkbutton(frame, text="one",
                 variable=var1,
                 onvalue=1, offvalue=0,
                 command=show)
    c1.pack(anchor=W, padx=10)

    var2 = IntVar()
    var2.set(-1)
    c2 = Checkbutton(frame, text="two",
                     variable=var2,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    var3 = IntVar()
    var3.set(-1)
    c2 = Checkbutton(frame, text="three",
                     variable=var3,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    var4 = IntVar()
    var4.set(-1)
    c2 = Checkbutton(frame, text="four",
                     variable=var4,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    var5 = IntVar()
    var5.set(-1)
    c2 = Checkbutton(frame, text="five",
                     variable=var5,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    l1 = Label(text="hello",
           font="Arial 8")
    l1.config(bd=20, bg='#ffaaaa')
    l1.pack()
    b = tk.Button(root, text='start', command=buildsettings,)
    b.place(x=0, y=375)

def fmok():
    root = tk.Tk()
    root.geometry("800x400")
    root.title("fmok")
    root["bg"] = "black"
    b = tk.Button(root, text='open', command=move)
    b.place(x=0, y=375)

    root.mainloop()

fmok()

Я уже все перепробовал, ничего не выходит( Помогите

Вот, вроде как делает всё что ты хотел ;)

from tkinter import *
import tkinter as tk
import datetime as dt
import os

def move():
    one = 0
    two = 0
    three = 0
    four = 0
    five = 0

    self = Toplevel()
    self.geometry("400x400")

    def show():
        s = f'{var1.get()}, ' \
            f'{var2.get()}, ' \
            f'{var3.get()}, ' \
            f'{var4.get()}, ' \
            f'{var5.get()}, ' \

    def buildsettings(root):
        if var1.get() == True:
            one = 1
        else:
            one = 0
        if var2.get() == True:
            two = 1
        else:
            two = 0
        if var3.get() == True:
            three = 1
        else:
            three = 0
        if var4.get() == True:
            four = 1
        else:
            four = 0
        if var5.get() == True:
            five = 1
        else:
            five = 0

        print(one, two, three, four, five)
        root.destroy()

    frame = Frame(self)
    frame.pack(side=LEFT)

    var1 = BooleanVar()
    var1.set(0)
    c1 = Checkbutton(frame, text="one",
                 variable=var1,
                 onvalue=1, offvalue=0,
                 command=show)
    c1.pack(anchor=W, padx=10)

    var2 = IntVar()
    var2.set(-1)
    c2 = Checkbutton(frame, text="two",
                     variable=var2,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    var3 = IntVar()
    var3.set(-1)
    c2 = Checkbutton(frame, text="three",
                     variable=var3,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    var4 = IntVar()
    var4.set(-1)
    c2 = Checkbutton(frame, text="four",
                     variable=var4,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    var5 = IntVar()
    var5.set(-1)
    c2 = Checkbutton(frame, text="five",
                     variable=var5,
                     onvalue=1, offvalue=0,
                     command=show)
    c2.pack(anchor=W, padx=10)

    l1 = Label(self, text="hello",
           font="Arial 8")
    l1.config(bd=20, bg='#ffaaaa')
    l1.pack()
    b = tk.Button(self, text='start', command=lambda: buildsettings(self))
    b.place(x=0, y=375)

def fmok():
    root = tk.Tk()
    root.geometry("800x400")
    root.title("fmok")
    root["bg"] = "black"
    b = tk.Button(root, text='open', command= lambda: move())
    b.place(x=0, y=375)

    root.mainloop()

fmok()

Основные ошибки:

Создавай другие окна через
Toplevel
При создании виджетов в другом окне указывай ту переменную, в которую запихнул
Toplevel
Если делаешь окна через функцию, то для каждого отдельного окна выбирай новую переменную, иначе будет считать основной
root
Желательно для окон использовать Классы, и потом делать вызов класса и прописывай функции там


TypeError: 'str' object is not callable
Python 3.86
Windows 7
Pycharm

pip freeze:
certifi=2020.12.5
chardet=4.0.0
geojson=2.5.0
idna=2.10
pyowm=3.1.1
PySocks=1.7.1
pyTelegramBotAPI=3.7.4
requests=2.25.1
urllib3=1.26.2

Сижу через tutorial-env
Мой код:

from pyowm import OWM
from pyowm.utils.config import get_default_config

import telebot

owm = OWM('ключ owm')
bot = telebot.TeleBot("мой api от botfather")

@bot.message_handler(content_types=['text'])

def send_echo(message):

    mgr = owm.weather_manager()
    observation = mgr.weather_at_place(message.text)
    w = observation.weather

    temp = w.temperature('celsius')['temp']
    wind = w.wind()['speed']

    answer = 'Влад п***р, в городе ' + message.text + ' сейчас ' + w.detailed_status() + '\n'
    answer += 'Влад ша**ва, температура сейчас в районе ' + str(temp) + ' градусов, а скорость ветра где-то ' + str(wind) + ' м/с' + '\n\n'

    if temp < -10:
        answer += 'Влад петух, на улице сейчас жуткий холод. Лучше вообще никуда не выходить!'
    elif temp < 0:
        answer += 'Влад г****н, на улице сейчас холод. Лучше одеться потеплее!'
    elif temp < 10:
        answer += 'Влад пи***ас, на улице сейчас холодновато. Накинь куртку!'
    elif temp < 20:
        answer += 'Влад про******ка, на улице сейчас прохладно. Накинь кофту!'
    elif temp > 20:
        answer += 'Влад гомосексуалист, на улице тепло или даже жарко. Можно выходить в шортах.'

    bot.send_message(message.chat.id, answer)

bot.polling(none_stop=True)

В консоли выдаёт это сразу после отправки боту первого сообщения

(tutorial-env) C:\Users\6417\PycharmProjects\projects>python main.py
Traceback (most recent call last):
  File "main.py", line 37, in <module>
    bot.polling(none_stop=True)
  File "C:\Users\6417\PycharmProjects\projects\tutorial-env\lib\site-packages\telebot\__init__.py", line 455, in polling
    self.__threaded_polling(none_stop, interval, timeout, long_polling_timeout)
  File "C:\Users\6417\PycharmProjects\projects\tutorial-env\lib\site-packages\telebot\__init__.py", line 513, in __threaded_polling
    raise e
  File "C:\Users\6417\PycharmProjects\projects\tutorial-env\lib\site-packages\telebot\__init__.py", line 479, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\6417\PycharmProjects\projects\tutorial-env\lib\site-packages\telebot\util.py", line 118, in raise_exceptions
    raise self.exception_info
  File "C:\Users\6417\PycharmProjects\projects\tutorial-env\lib\site-packages\telebot\util.py", line 69, in run
    task(*args, **kwargs)
  File "main.py", line 20, in send_echo
    answer = 'Влад п***р, в городе ' + message.text + ' сейчас ' + w.detailed_status() + '\n'
TypeError: 'str' object is not callable

(tutorial-env) C:\Users\6417\PycharmProjects\helloworld>

w.detailed_status это строка, а не метод поэтому вызывать её не надо. Просто уберите скобки


Вечная загрузка программы
При попытке запустить программу она уходит в вечную загрузку, зависает и более не реагирует ни на что. В чём может быть проблема? Подскажите пожалуйста.
<code>
#import tkinter as tk
import pygame
import random

RUNNING = True
#root = tk.Tk()
WIDTH = 960 #root.winfo_screenwidth()
HEIGHT = 960 #root.winfo_screenheight()
FPS = 30

#BLACK = (0, 0, 0)
#WHITE = (255, 255, 255)
#RED = (255, 0, 0)
#GREEN = (0, 255, 0)
#BLUE = (0, 0, 255)
TEST_COLOR = (232, 232, 232)

#i = 0

#SIZE_CIRCLE = random.randint(32,64)
Count_Circle = 30

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Test Untitled Game")
clock = pygame.time.Clock()

def Drawning_Circle(Count_Circle, WIDTH, HEIGHT):
    Now_Count_Circle = 0
    while Now_Count_Circle != Count_Circle:
        FIRST_RANDOM_COORDINATE = random.randint(0, (WIDTH + HEIGHT) / 2)
        SECOND_RANDOM_COORDINATE = random.randint(0, (WIDTH + HEIGHT) / 2)
        pygame.draw.circle(screen, (32, 32, 32),
            (FIRST_RANDOM_COORDINATE, SECOND_RANDOM_COORDINATE), 32)

try:
    while RUNNING:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                RUNNING = False
                pygame.quit()

        screen.fill(TEST_COLOR)
        Drawning_Circle(Count_Circle, WIDTH, HEIGHT)
        pygame.display.flip()
except Exception as e:
    print(e)
    pygame.quit()
</code>

Проблема возникает из-за использования цикла while. В вашем случае лучше использовать цикл for, если заранее известно количество итераций.
Вместо:

while Now_Count_Circle != Count_Circle:

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

for i in range(Count_Circle):


Прервать процесс по таймауту в Python
Господа, подскажите пожалуйста есть ли в Python готовое решение (уверен что есть не могу найти) для такой задачи.
Нужно по таймауту кильнуть процесс. Тоесть должно работать как вот такой костыль:
<code>
import os
import signal
import time
from datetime import datetime
from multiprocessing import Process

def o(time_limit: int = 0):
    start = datetime.now()
    while (datetime.now() - start).seconds <= time_limit:
        time.sleep(.1)
    else:
        os.kill(os.getppid(), signal.SIGTERM)
    print(f'\n{datetime.now() - start}')

def main():
    start = datetime.now()
    while (datetime.now() - start).seconds < 30:
        print(f'\r{(datetime.now() - start).seconds}', end='')
        time.sleep(1)
    return True

if __name__ == '__main__':
    main_start = datetime.now()
    print(os.getpid())
    p = Process(target=o, args=(20,))
    p.start()
    if main():
        p.kill()
    else:
        p.join()
        print()
</code>

Каноничное решение это прерывание на SIGALARM. Но оно не работает с асинхронным кодом.
Можно так, чтоб не засорять блокировками маин
<code>
def timeout(p, t):
    p.join(t)
    p.kill()
    p.join()

p = Process(target=o, args=(20,))
Thread(target=timeout, args=(p, 30)).start()
</code>


Ошибка в коде Python (Массивы и циклы) [закрыт]

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

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

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

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

В написания кода на
Python я новичок, помогите понять, в чем подвох.

X = int(0)
Y = int(0)
CellX = int(0)
CellY = int(1)
CellStep = int(1)
Cells = int(input('Ввести количество ячеек ='))
Windows = int(input('Фактическое количество окон ='))
CordX = int(input('Первое окно X ='))
CordY = int(input('Первое окно Y ='))
CordyInitial = CordY
SecondWindowX = int(input('Второе окно (снизу) X ='))
CordStepX = SecondWindowX - CordX
SecondWindowY = int(input('Второе окно (снизу) Y ='))
CordStepY = SecondWindowY - CordY
ThirdWindowX = int(input('Третье окно (справа) X ='))
ThirdWindowY = int(input('Третье окно (справа) Y ='))
сolumn = int(input('Количество колонн ='))
xyarray = ([], [])

xarray = [CordX]
yarray = [CordY]
While column != 0:
    yarray.append(cordy + CordStepY)
    xyarray.append([], [yarray])
    column -= 1
column == 5
While сolumn != 0:
    xarray.append(cordx + CordStepX)
    xyarray.append([xarray], [])
    column -= 1
print (xyarray)

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

while надо писать с маленькой буквы

сolumn = int(input('Количество колонн =')

буква
с русская а должна быть английской
c
регистр имеет значение. Вы создали переменные
CordX и
CordY а используете
cordx и
cordy
писать
int(0) не обязательно можно просто
0

column == 5

вы просто сравнили два значения, чтобы присвоить значение используйте
=

column = 5


программа пропускает if и сразу переходит к else
В консоль должно по нажатию кнопки start выводиться что one on или one off и two on или two off взависимости от проставленных флажков в окне tkinter но вместо этого всегда выводиться one off и two off как бы небыли бы выставлены флажки, как я понял программа всегда выводит else: но почему она всегда выводит только else я не понял, работаю на python 3.8 в Idle
вот код:
<code>
from tkinter import *
import tkinter as tk
import datetime as dt

root = Tk()
root.geometry("400x400")
root["bg"] = "grey"

def show():
    s = f'{var1.get()}, ' \
        f'{var2.get()}'

def buildsettings():
    if var1 == "True":
        print ("two on")

    else:
        print ("one off")

    if var2 == "True":
        print ("two on")

    else:
        print ("two off")

frame = Frame()
frame.pack(side=LEFT)

var1 = BooleanVar()
var1.set(0)
c1 = Checkbutton(frame, text="one",
                 variable=var1,
                 onvalue=1, offvalue=0,
                 command=show)
c1.pack(anchor=W, padx=10)

var2 = IntVar()
var2.set(-1)
c2 = Checkbutton(frame, text="two",
                 variable=var2,
                 onvalue=1, offvalue=0,
                 command=show)
c2.pack(anchor=W, padx=10)
b = tk.Button(root, text='start', command=buildsettings)
b.place(x=0, y=375)

root.mainloop()
</code>

True - это переменная bool типа, а не строка. При этом сравнение с True можно опустить
if var1.get()
Значение переменных tkinter надо брать через
get

def buildsettings():
    if var1.get() == True:
        print ("two on")

    else:
        print ("one off")

    if var2.get() == True:
        print ("two on")

    else:
        print ("two off")


Количество совпадений в столбце Series
подскажите, как посчитать количество совпадений в столбце?
например, есть таблица
<code>
df = pd.Series(['a|b', 'a', 'a|d', 'a|c|d', 'c|b|c', 'd|c', 'b|a'])
</code>
как в нём посчитать какие самые повторяющиеся пары значений? чтобы получилось, например
ac повторяется x раз
ab повторяется y раз
abc повторяется z раз и т.д

Для столбца датафрейма:

df['x'].value_counts(sort=False).to_dict()

для сериас:

df = pd.Series(['a|b', 'a', 'a', 'a|d', 'a|c|d', 'c|b|c', 'd|c', 'b|a'])
df.value_counts(sort=False).to_dict()

выдаст

 {'a': 2, 'a|d': 1, 'b|a': 1, 'a|c|d': 1, 'd|c': 1, 'a|b': 1, 'c|b|c': 1}

Второй вариант через groupby:

df.groupby(by=df).size()

выдаст

Out[20]:
a        2
a|b      1
a|c|d    1
a|d      1
b|a      1
c|b|c    1
d|c      1
dtype: int64

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

df.groupby(by=df).size().to_dict()


Как исправить такую ошибку с кодировкой?
<code>
  File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 455, in polling
    self.__threaded_polling(none_stop, interval, timeout, long_polling_timeout)
  File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 513, in __threaded_polling
    raise e
  File "/usr/local/lib/python3.8/dist-packages/telebot/__init__.py", line 479, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "/usr/local/lib/python3.8/dist-packages/telebot/util.py", line 118, in raise_exceptions
    raise self.exception_info
  File "/usr/local/lib/python3.8/dist-packages/telebot/util.py", line 69, in run
    task(*args, **kwargs)
  File "main.py", line 30, in send_text
    print("\u0412\u044b\u0432\u043e\u0434 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 ", result)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)

</code>

Добавьте
#coding=utf8 в начало файла скрипта.


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

df = pd.DataFrame({'words': ['a|b|c|d','a|b','b|d|a','d|b'], 'numbs': [3, 4, 5,6]})

Как посчитать сумму
numbs для каждой буквы, например, 'a' есть в первой, второй и третьей ячейке соответственно, a = 3 + 4 + 5?

res =  (df
        .assign(word=df["words"].str.split("|"))
        .explode("word")
        .groupby("word")
        ["numbs"]
        .sum())

результат:

In [79]: res
Out[79]:
word
a    12
b    18
c     3
d    14
Name: numbs, dtype: int64


Нужна помощь с использованием QCheckBox и QComboBox в циклах
Есть программа на Python с использованием PyQt5.
Имеются 3
QComboBox:

ComboFizAkt - уровень физической активности, в котором 4 варианта выбора.

ComboCel - цель (хочу похудеть, хочу улучшить фигуру и т.д.), в котором 3 варианта выбора.

ComboTrenirovki - кол-во тренировок в неделю, в котором 7 вариантов выбора.

Также имеются 2
QCheckBox, которые отвечают за пол пользователя:

PolMuzh - мужской пол

PolZhen - женский пол

Хочу кое-что реализовать, нужна помощь.
Грубый пример: Если нажата
PolMuzh и в
ComboFizAkt выбран  пункт "Преобладает физ. труд", вывести print(123)

# текст combobox'ов
self.LvlFizAkt.setText("Уровень физической активности:")   # qlabel
self.ComboFizAkt.setItemText("Сидячий")
self.ComboFizAkt.setItemText("Слабый физ. труд")
self.ComboFizAkt.setItemText("Преобладает физ. труд")
self.ComboFizAkt.setItemText("Тяжёлый физ. труд")
self.ComboFizAkt.setItemText("Очень тяжёлый физ. труд")
self.ViborCeli.setText("Ваша цель:")                       # qlabel
self.ComboCel.setItemText("Ничего не хочу")
self.ComboCel.setItemText("Хочу похудеть")
self.ComboCel.setItemText("Хочу улучшить фигуру")
self.ComboCel.setItemText("Хочу набрать мыш. массу")
self.KolvoTrenirovok.setText("Кол-во тренировок в неделю:") # qlabel
self.ComboTrenirovki.setItemText("0")
self.ComboTrenirovki.setItemText("1")
self.ComboTrenirovki.setItemText("2")
self.ComboTrenirovki.setItemText("3")
self.ComboTrenirovki.setItemText("4")
self.ComboTrenirovki.setItemText("5")
self.ComboTrenirovki.setItemText("6")
self.ComboTrenirovki.setItemText("7+")

# функция, при которой, если PolMuzh включён, PolZhen выключается

self.PolMuzh.stateChanged.connect(self.selectCombo1)
self.PolZhen.stateChanged.connect(self.selectCombo2)

def selectCombo1(self, toggle):
    if toggle == QtCore.Qt.Checked:
        self.PolZhen.setEnabled(False)
    else:
        self.PolZhen.setEnabled(True)

# функция, при которой, если PolZhen включён, PolMuzh выключается
def selectCombo2(self, toggle):
    if toggle == QtCore.Qt.Checked:
        self.PolMuzh.setEnabled(False)
    else:
        self.PolMuzh.setEnabled(True)

Если нажата PolMuzh и в ComboFizAkt выбран пункт "Преобладает физ.
труд", вывести print(123)

При клике
PolMuzh проверяйте текущее значение в комбобоксе (это можно сделать через методы:
currentText,
currentIndex,
currentData)
Пример:

def selectCombo1(self, toggle):
    if toggle == QtCore.Qt.Checked:
        self.PolZhen.setEnabled(False)

        if self.ComboFizAkt.currentText() == 'Преобладает физ. труд':
            print(123)

    else:
        self.PolZhen.setEnabled(True)


Объеденить индексы в массиве python
Есть массив:

data = [('ADAM', 50)],[('WAS', 55)],[('STUDENT', 60)]

нужно сделать в таком ввиде:

data = [('ADAM', 50), ('WAS', 55), ('STUDENT', 60)]

Можно сделать вручную в таком ввиде, но это не правильно, мне нужно динамично:

data = data[0] + data[1] + data[2]


Ошибка при работе pygame
Пожалуй сразу к теме. При создании и первой отрисовки окна должно появляться несколько кругов(все одного размера и цвета). При попытке так сделать, возникает ошибка, которая автоматически закрывает программу. Проблема в том, что даже при отключении "стоп-крана" она не выводит ошибку, из-за чего не могу понять, что не так. Подскажите пожалуйста, как сделать отрисовку определённого числа фигур?
<code>
import pygame
import random

RUNNING = True
#root = tk.Tk()
WIDTH = 960 #root.winfo_screenwidth()
HEIGHT = 960 #root.winfo_screenheight()
FPS = 30

#BLACK = (0, 0, 0)
#WHITE = (255, 255, 255)
#RED = (255, 0, 0)
#GREEN = (0, 255, 0)
#BLUE = (0, 0, 255)
TEST_COLOR = (232, 232, 232)

#SIZE_CIRCLE = random.randint(32,64)
FIRST_RANDOM_COORDINATE = random.randint(0, (WIDTH + HEIGHT) / 2)
SECOND_RANDOM_COORDINATE = random.randint(0, (WIDTH + HEIGHT) / 2)
Count_Circle = 30

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Test Untitled Game")
clock = pygame.time.Clock()

def Drawning_Circle(Count_Circle):
    Now_Count_Circle = 0
    while Now_Count_Circle != Count_Circle:
        pygame.draw.circle(screen, (32, 32, 32),
            (FIRST_RANDOM_COORDINATE, SECOND_RANDOM_COORDINATE), SIZE_CIRCLE)
        Now_Count_Circle += 1

try:
    while RUNNING:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                RUNNING = False
                pygame.quit()

        screen.fill(TEST_COLOR)
        Drawning_Circle(Count_Circle)
        pygame.display.flip()
except:
    pygame.quit()
</code>

try/except лучше переделать в такой вид:

try:
    ...

except Exception as e:
    print(e)
    ...

так при ошибке в её увидите в консоле. В вашем случаем это выведите то что переменная
SIZE_CIRCLE не существует


Как каждый раз создавать новый список с другим названием при каждом срабатывании цикла for?
На вход программе подается число n, а затем n строк, содержащих целые числа в порядке возрастания. Из данных строк формируются списки чисел. Напишите программу, которая объединяет указанные списки в один отсортированный список с помощью функции quick_merge(), а затем выводит его.
Sample Input 1:
3
1 2 3 4
5 6 7
10 11 17
Sample Output 1:
1 2 3 4 5 6 7 10 11 17
я написал программу и не знаю как генерировать каждый раз новый список с другим названием, чтобы их записывать в созданную функцию при выводе ответа
<code>
def merge(*iters):
    for it in iters:
        yield from it

n = int(input())
for i in range(n):
  a = [int(j) for j in input().split()]

print(list(merge(a, b, c)))
</code>

лучше их всех положить в ещё один список

arr = []
for i in range(n):
  arr.append([int(j) for j in input().split()])

print(list(merge(*arr)))

чтобы убрать скобки по краям и запятые то пишите так

print(*list(merge(*arr)))

Если постараться то весь код можно уместить в одну строку

print(*sorted(sum([list(map(int, input().split())) for _ in range(int(input()))], [])))


Как запустить два скрипта одновременно? Python
Делаю бота ВК на питоне. Я хочу сделать так что бы моя база данных автосохранялась каждые несколько секунд. Можно ли как то сделать так, что бы скрипт и работал как просто бот, и что бы бд сохранял.

Каркас программы под поток на сохранение
<code>
from threading import Thread

def save_db():
    # Ваша функция сохранения
    print("Save!")

def my_bot():
    pass

thread1 = Thread(target=save_db, args=(), daemon=True) # Создаем поток
thread1.start() # Запускаем.
my_bot() # Запускаем бота

# А тут весь остальной код..
print("Ваша программа...\n")
</code>


Как получить все возможные части списка?
У меня есть список, включающий в себя несколько вещественных чисел:

a = ['2.4', '5.2', '-10.6', '4.0', '7.8']

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

b = [['2.4', '5.2'],
     ['5.2', '-10.6'],
     ['-10.6', '4.0'],
     ['4.0', '7.8'],
     ['2.4', '5.2', '-10.6'],
     ['5.2', '-10.6', '4.0'],
     ['-10.6', '4.0', '7.8'],
     ['2.4', '5.2', '-10.6', '4.0'],
     ['5.2', '-10.6', '4.0', '7.8'],
     ['2.4', '5.2', '-10.6', '4.0', '7.8']]

Порядок, в котором части списка a будут располагаться в списке b, не имеет значения. Количество элементов в списке a небольшое, обычно 10-20, но иногда может быть немного больше. Пожалуйста, скажите, как это можно сделать?

len_ = len(a) + 1
for i in range(2, len_):
    for j in range(len_ - i):
        print(a[j:j + i])

len_ = len(a) + 1
b = [a[j:j + i] for i in range(2, len_) for j in range(len_ - i)]


как поменять тему windows 10 через python?
Пример темы windows которую нужно сменить через python

Не знаю то ли это, но...
<code>
import os, time
os.system("""C:\WINDOWS\system32\rundll32.exe C:\WINDOWS\system32\themecpl.dll,OpenThemeAction C:\Users\xxx\Misc_computer_stuff\themes\my_fav_gr.theme""")
time.sleep(1)
os.system("TASKKILL /F /IM systemsettings.exe & close window")
</code>
related


Проблема с командой "предложение к разработчику" в боте
Я решил создать команду "!change_add" в своём боте, чтобы пользователи могли писать !change_add abc и чтобы некое предложение ABC записывалось в .txt файл. Короче если кто-то хочет чтобы я добавил что-либо в бота, это предложение записывалось ко мне. С записью в .txt файл я разобрался, вот только я не могу понять как сформулировать команду чтобы текст после !change_add записывался в переменную. Сначала я узнал что это легко можно сделать через метод removeprefix(). Но вот незадача - он добавляется только в Python 3.9. А Python 3.9 требует установленной OS Windows 8 и выше. Но у меня Windows 7. Короче если кто знает как это можно сделать без использования removeprefix(), отпишитесь.

Вот код функции
removeprefix():

def removeprefix(self, prefix):
    if self.startswith(prefix):
        return self[len(prefix):]
    else:
        return self[:]

Можете назвать любым именем и использовать в любой версии питона.


удаление элементов с массива больше заданого значения [дубликат]

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

Проблема с удалением элемента списка методом remove(), в цикле python [дубликат]

                                (4 ответа)

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

<code>
nums=[1,2,55,2,6,969,44,65,21,45,44,42,10,72,12,35,2,0,512,3,410,30]
for i in nums:
    if i>30:
        nums.remove(i)
print(nums)
</code>
Задача кода удалить все элементы,которые больше 30 и вывести готовый список на экран.
Но вместо того, чтобы вернуть [1,2,2,6,21,10,12,2,0,3] она возвращает [1,2,2,6,44,21,44,10,12,2,0,3,30]
Помогите понять в чём ошибка

не удаляйте из списка элементы когда двигаетесь направо по этому списку!!!
а решение вашей задачи:
<code>
nums = [i for i in nums if i <= 30]
</code>


Как изменить директорию файла в Python
Решил сделать небольшую программу. И в этой программе создается файл через with open(). Но он создаётся в директории запуска кода.
Каким образом мне сохранить файл, например на рабочий стол? (пытался через os.chdir() и не получилось)

Попробуйте:

import os.path

path_desktop = os.path.expanduser(r'~\Desktop')
file_name = os.path.join(path_desktop, '123.txt')
with open(file_name, 'w') as f:
    f.write('test')

Должно сработать и через
os.chdir() (но мне кажется менять активную директорию, только чтобы файл сохранить/открыть не лучшая идея):

os.chdir(path_desktop)
with open('123.txt', 'w') as f:
    ...


Не работает Telethon на Heroku
Создаю клиент:

client = TelegramClient('session_name2', api_id, api_hash)
client.start()

все работает. Но как только я пытаюсь отправить сообщение:

client.send_message('me', 'Бот запустился')

появляется ошибка:

 - 2020-12-19T12:26:10.417481+00:00 app[worker.1]: Traceback (most
   recent call last):
 - 2020-12-19T12:26:10.417500+00:00 app[worker.1]:   File "poster.py",
   line 2967, in <module>
 - 2020-12-19T12:26:10.419396+00:00 app[worker.1]:     main_funk()
 - 2020-12-19T12:26:10.419396+00:00 app[worker.1]:   File "poster.py",
   line 2950, in main_funk
 - 2020-12-19T12:26:10.421085+00:00 app[worker.1]:     CreateClient()
 - 2020-12-19T12:26:10.421085+00:00 app[worker.1]:   File "poster.py",
   line 2941, in CreateClient
 - 2020-12-19T12:26:10.422793+00:00 app[worker.1]:
   client.send_message('me', 'Бот запустился1')
 - 2020-12-19T12:26:10.422794+00:00 app[worker.1]:   File
   "/app/.heroku/python/lib/python3.6/site-packages/telethon/sync.py",
   line 39, in syncified
 - 2020-12-19T12:26:10.422914+00:00 app[worker.1]:     return
   loop.run_until_complete(coro)
 - 2020-12-19T12:26:10.422915+00:00 app[worker.1]:   File
   "/app/.heroku/python/lib/python3.6/asyncio/base_events.py", line 488,
   in run_until_complete
 - 2020-12-19T12:26:10.423143+00:00 app[worker.1]:     return
   future.result()
 - 2020-12-19T12:26:10.423144+00:00 app[worker.1]:   File
   "/app/.heroku/python/lib/python3.6/site-packages/telethon/client/messages.py",
   line 743, in send_message
 - 2020-12-19T12:26:10.423443+00:00 app[worker.1]:     result = await
   self(request)
 - 2020-12-19T12:26:10.423443+00:00 app[worker.1]:   File
   "/app/.heroku/python/lib/python3.6/site-packages/telethon/client/users.py",
   line 75, in __call__
 - 2020-12-19T12:26:10.423565+00:00 app[worker.1]:
   self.session.process_entities(result)
 - 2020-12-19T12:26:10.423567+00:00 app[worker.1]:   File
   "/app/.heroku/python/lib/python3.6/site-packages/telethon/sessions/sqlite.py",
   line 282, in process_entities
 - 2020-12-19T12:26:10.423744+00:00 app[worker.1]:     'insert or
   replace into entities values (?,?,?,?,?)', rows)
 - **2020-12-19T12:26:10.423750+00:00 app[worker.1]:
   sqlite3.OperationalError: table entities has 6 columns but 5 values
   were supplied**

При это при запуске напрямую с пк все работает отлично!

Скорее всего, версия Telethon на Heroku отличалась от версии установленной локально. Файл сессии был создан на ПК локально и не подходил под версию Telethon на Heroku. Я решил проблему используя StringSession


Не могу вывести номер первого столбца матрицы, состоящего из отрицательных элементов
Пытаюсь вывеси номер первого столбца состоящего из отрицательных элементов,но выводится номер первого отрицательного элемента, не могу понять как решить проблему
<code>
Idx = -1

j = 0
for j in range(n):
    i=0
    while (i<n) and (Idx == -1):
        if A[i][j] < 0:
            Idx = i
        i=i+1
return Idx
</code>

алгоритм должен быть такой:

пройти по всем столбцам матрицы

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

при нахождении столбца - выдать его номер

т.е. по хорошему код должен быть таким:

def find(matrix, cols, rows):
    for col in range(cols):
        is_success = True
        for row in range(rows):
            if matrix[row][col] >= 0:
                is_success = False
                break
        if is_success:
            return col
    return -1

можно чуть покороче, но и менее производительнее:

def find(matrix, cols, rows):
    for col in range(cols):
        if [row for row in range(rows) if matrix[row][col] >= 0] == []:
            return col
    return -1

или так, что красивее :)

def find(matrix, cols, rows):
    for col in range(cols):
        if any(True for row in range(rows) if matrix[row][col] >= 0):
            return col
    return -1

или так:

if all(matrix[row][col] < 0 for row in range(rows)):
    return col


Ошибка при объявлении двух глобальных переменных

if message.content.lower().startswith('!m_change'):
    global DIR
    global MODE
    if (DIR == 'arts/normal' and MODE == 'Обычный.'):
        DIR = 'arts/hentai'
        MODE = 'Хентай.'
    elif (DIR == 'arts/hentai' and MODE == 'Хентай.'):
        DIR = 'arts/normal'
        MODE = 'Обычный.'
    print('Запрос на переключение режима. Текущий режим: ' + MODE)
    await message.channel.send('Режим переключён.')
    return

При объявлении переменных
DIR и
MODE глобальными, в консоли появляется ошибка:

name 'MODE' is used prior to global declaration

, но ошибка не появляется, если объявляется только одна переменная, DIR или MODE.
Как исправить эту ошибку?

Поместите объявление
<code>
global DIR
global MODE
</code>
перед вызовом функции


Почему не вызывает функцию?
Я пишу бота в Телеграм
Вот код:

import telebot
from telebot import types
from config import *
from Keyboards import *
import PostgreSQL

bot = telebot.TeleBot(SECRET_TOKEN)
status = None
addr = None
print('/' + command_to_update)

@bot.message_handler(commands=['start'])
def start_message(message):
    global status

    bot.send_message(message.chat.id, 'Привет, начнем! \nЗарегистрируйся ==>')
    bot.send_message(message.chat.id, 'Напиши имя')
    status = 'waiting for name'

@bot.message_handler(commands=[command_to_update])
def update_superadmin_chat_id(message):
    print('test block command_to_update')
    superadmin = int(message.chat.id)
    bot.send_message(message.chat.id, 'Обновлено!')

@bot.message_handler(content_types=['text'])
def continue_text(message):
    global status
    global name
    global menu
    global confirm
    global addr
    global superadmin

    if status != 'waiting for name':
        return

    name = message.text
    username = message.from_user.username
    addr = message.chat.id
    print(addr, '- addr')
    #print(type(addr))
    PostgreSQL.register(message.chat.id, name) #База данных
    bot.send_message(message.chat.id, 'Думаю все... \nОжидай когда тебя подтвердят...', reply_markup=menu)
    bot.send_message(superadmin, 'Подтвердить пользователя: \nОтправлено: @' + str(username), reply_markup=confirm)
    status = 'None'

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    print('step callback 1')
    global addr
    global status
    global superadmin

    print('step callback 2')
    if call.data == "confirm":
        status = 'waiting for balance.step1'
        print('step callback 3')
        print('status -', status)

        #bot.send_message(superadmin, 'Balance')

print('test step2')
@bot.message_handler(content_types=['text'])
def step2_callback(message):
    print('step 2')
    global addr
    global status
    global superadmin
    global is_number
    balance = is_number(message.text)

    print(message.chat.id, '- message.chat.id')
    print(status, '- status')

    if message.chat.id != superadmin and status != 'waiting for balance.step1':
        print('canceled')
        return
    if balance == True:
        bot.send_message(superadmin, '*Нет*, это должно быть целым числом`...`')
        status = 'waiting for balance'
        print('Zero')
        return

    print('ifs OK')
    PostgreSQL.confirm(addr, balance) #База данных
    print('confirm OK')
    bot.send_message(addr, 'Вы были подтверждены!')
    print('send_message OK')
print(step2_callback)

if __name__ == '__main__':
    bot.polling(none_stop=True)

Почему функция
step2_callback не вызывается?
Спасибо!

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

step2_callback(message)
Во-вторых - у вас находится 2 обработчика
@bot.message_handler(content_types=['text']).
Поэтому и советую изменить структуру вашего кода.
Если вам нужно использовать шаги для обработки следующего шага - используйте метод
bot.register_next_step_handler. В интернете предостаточно информации, как его использовать.
В-третьих - советую избавляться от использования
global, а записывать переменные для ботов, например - в словарь. Но это уже по Вашему вкусу =)


Ошибка при построении модели нейронной сети на TF-IDF и Sklearn
Пытаюсь обучить нейронную сеть определять цену квартиры в зависимости от ее описания.
В csv для тренировки 300.000 квартир с ценами. Засовываю все описания в единую строку, чтобы потом применить метод TF-IDF, определяющий важность каждого слова в таргете.
И уже на этапе формирования этой большой строки выпадает ошибка:
<code>
Your notebook tried to allocate more memory than is available. It has restarted.
</code>
Пробовал и с GPU и с TPU на Colab Google - не помогает.

Помогло последовательное считывание файла датасета:
<code>
train = pd.DataFrame()
counter = 1
for num in pd.read_csv('train.csv', chunksize=1000000, low_memory=False):
    print('Reading {}'.format(counter))
    train = pd.concat([train, num], ignore_index=True)
    counter += 1
</code>
Работает и на Kaggle и в Colab- ошибка, связанная с переполнением памяти, не появляется. Может быть, кому-то пригодится.


Проблема с заменой значения

a = my_stat.query('n_users > 0')['n_users'].median()

my_stat = my_stat.loc[(my_stat['n_users'] < 0, 'n_users')] = a

my_stat = my_stat.fillna(0)

Cам DataFrame:

session_value,time,group,n_users
0.0,12,B,9
,11,A,-1
1.0,8,A,1
2.0,9,B,3
2.0,10,B,9
3.0,8,A,8
,11,B,5
0.0,9,A,4
0.0,8,B,-11
0.0,9,A,-20

В переменной
session_value замените все пропущенные значения на нули.
В переменной
n_users замените все отрицательные значения на медианное значение переменной
n_users (без учета отрицательных значений, разумеется).

# В переменной session_value замените все пропущенные значения на нули.
df["session_value"] = df["session_value"].fillna(0)

# В переменной n_users замените все отрицательные значения
# на медианное значение переменной n_users

# маска для нахождения отрицательных значений в ["n_users"]
neg_usr_mask = df["n_users"].lt(0)

df.loc[neg_usr_mask, "n_users"] = df.loc[~neg_usr_mask, "n_users"].median()

результат:

In [58]: df
Out[58]:
   session_value  time group  n_users
0            0.0    12     B      9.0
1            0.0    11     A      5.0
2            1.0     8     A      1.0
3            2.0     9     B      3.0
4            2.0    10     B      9.0
5            3.0     8     A      8.0
6            0.0    11     B      5.0
7            0.0     9     A      4.0
8            0.0     8     B      5.0
9            0.0     9     A      5.0


Создание функции для части кода
В данном хендлере:

@dp.callback_query_handler(text='call')
async def answer(call: CallbackQuery):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    for row in result:
        if row == '1':
            cursor.execute("SELECT `Tab` FROM `Spisok` WHERE `Par` = 'rez'")
            row = cursor.fetchone()
            await call.message.answer(row[0])

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

async def answer(call: CallbackQuery):
        connect = sqlite3.connect('main.db')
        cursor = connect.cursor()
        cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
        result = cursor.fetchone()
        if result is None:
            print('none')
        for row in result:

Сделайте
contextmanager:

from contextlib import contextmanager

@contextmanager
def get_user(call: CallbackQuery):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    else:
        for row in result:
            yield row

@dp.callback_query_handler(text='call')
async def answer(call: CallbackQuery):
    with get_user(call) as row:
        if row == '1':
            cursor.execute("SELECT `Tab` FROM `Spisok` WHERE `Par` = 'rez'")
            row = cursor.fetchone()
            await call.message.answer(row[0])


Перенос переменной при выводе в консоль
подскажите как на переносимой строке отображать переменную?
пробовал так:
<code>
msg = "1я"
print("Внимание программа продолжаться не будет\nобнаружена ошибка, текст ошибки:" +  \n + msg)
</code>

если я правильно понял
способ 1:

print("текст", msg, sep='\n')

способ 2:

print(f"текст\n{msg}")

способ 3:

print("текст")
print(msg)

если я понял не правильно - то используйте способ 2 и вставляйте переменную туда, куда вам хочется


Удаление символа из строки (Python)
столкнулся с проблемой у меня был код:
<code>
a = "aabbcc"
b = a.replace("a","")
</code>
и он известно почему удаляет все "a", но можно ли удалить только 1 a(любую), а при отсутствии таковой не выдавать ошибок.

<code>
b = a.replace("a","", 1)
</code>
Удалит только одно вхождение (первое).


Python Поиск соседних элементов в матрице, некорректный вывод
Новичок, делаю первые шаги в программировании. Задача: получить на выводе соседние элементы в матрице по заданным координатам. Написал такой код:
<code>
li = []
m = int(input('m'))
n = int(input('n'))
i = int(input('i'))
j = int(input('j'))

for i in range(0, m):
    ele = list(map(int, input().split()))
    li.append(ele)

def get_adjacent_indices(i, j, m, n):
  n_list = []
  if i > 0:
    n_list.append((li[i-1][j]))
  if i + 1 < m:
    n_list.append((li[i+1][j]))
  if j > 0:
    n_list.append((li[i][j-1]))
  if j + 1 < n:
    n_list.append((li[i][j+1]))
  return sorted(n_list)

print(get_adjacent_indices(i, j, m, n))
</code>
Код работает исправно, если список с вложенными списками заранее объявить в переменной li, если же использовать ввод, то результат будто смещается, и получаю неверный результат. Например, при li = [[1, 2, 3], [0, 2, 6], [8, 4, 2], [3, 7, 1]] правильный вывод будет [2, 2, 7, 8], если использовать ввод, то [1, 3, 4]. Почему так происходит? Как исправить код?

уф - нашел ваше ошибку!!!

def get_adjacent_indices(i, j, m, n):

  print(i, j, m, n) # посмотрим, что на вход получает функция

и смотрим что выводится -
2 1 4 3 если использовать подготовленные данные и
3 1 4 3 - если вводить с клавиатуры
а дело все в цикле

for i in range(0, m):

который тоже использует
i и эта
i потом идет на вызов функции

print(get_adjacent_indices(i, j, m, n)

но значение этой
i уже не то, которое вводилось пользователем, а то которое она получила на последнем этапе цикла
for i in range(0, m):, т.е.
m
используйте другую переменную или вообще так:

for _ in range(0, m):
    ele = list(map(int, input().split()))
    li.append(ele)

и все заработает
P.S.

li кстати можно и в 1 строчку было бы определить:

li = [list(map(int, input().split())) for _ in range(m)]


Перевести код командной строки в тело кода python
Есть следующая команда, которая работает напрямую через командную стоку:
ffmpeg -f concat -safe 0 -i vidlist.txt -c copy output_1.mp4
(она объединяет видеофайлы без кодирования)
Так же есть код на python который создает эти самые видео.
Как выполнить код для командной строки в теле самого скрипта python?

1. Вызовите os.system. Например:
<code>
os.system('ffmpeg -f concat -safe 0 -i vidlist.txt -c copy output_1.mp4')
</code>
Интерпретатор Python вызовет команду и дождётся её завершения. Это проще всего.
2. Используйте пакет который вызывает ffmpeg из Python минуя командную строку. Например kkroening/ffmpeg-python.


Событие при вызове диспетчера задач
Возник вопрос при создании программы, использую Python и модуль Tkinter. Основная цель сделать так, чтобы при нажатии сочетания клавиш Ctrl + Alt + Delete происходило определенное действие, к примеру исполнялся такой код:

mb.showinfo("INFO", "Вы попытались вызвать диспетчер задач")

Были идеи создать это все примерно так:

def call(event):
    mb.showinfo("INFO", "Вы попытались вызвать диспетчер задач")

root = Tk()
root.update()
root.bind('<Control-Alt-Delete>', call)

Но в результате данный код был проигнорирован программой. Заранее благодарю за ваш ответ.

Как-то так:

import keyboard
keyboard.add_hotkey('ctrl+alt+del', lambda: mb.showinfo("INFO", "Вы попытались вызвать диспетчер задач"))

А чтоб перекрыть добавьте
suppress = True.
Че трояны пописываем? ;)


Как упростить код python?
Помогите упростить код телеграм бота на пайтоне. Все работает, но если добавить еще хендлеры для других дней недели и в каждом будет группа, то код получится громаднейший
<code>
@dp.message_handler(text='ПН')
async def send_text(message: types.Message):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (message.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    for row in result:
        if row == 'СВ-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__PN_n'")
            row = cursor.fetchone()
            await message.answer(row[0], reply_markup=il_1)
        elif row == 'СП-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SP_31__PN_n'")
            row = cursor.fetchone()
            await message.answer(row[0], reply_markup=il_1)
        elif row == 'СА-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SA_31__PN_n'")
            row = cursor.fetchone()
            await message.answer(row[0], reply_markup=il_1)

    connect.close()

@dp.message_handler(text='ВТ')
async def send_text(message: types.Message):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (message.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    for row in result:
        if row == 'СВ-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__VT_n'")
            row = cursor.fetchone()
            await message.answer(row[0], reply_markup=il_3)
        elif row == 'СП-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SP_31__VT_n'")
            row = cursor.fetchone()
            await message.answer(row[0], reply_markup=il_3)
        elif row == 'СА-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SA_31__VT_n'")
            row = cursor.fetchone()
            await message.answer(row[0], reply_markup=il_3)

    connect.close()

@dp.callback_query_handler(text='PN_p')
async def answer(call: CallbackQuery):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    for row in result:
        if row == 'СВ-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__PN_p'")
            row = cursor.fetchone()
            await call.message.answer(row[0], reply_markup=il_2)

@dp.callback_query_handler(text='PN_n')
async def answer(call: CallbackQuery):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    for row in result:
        if row == 'СВ-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__PN_n'")
            row = cursor.fetchone()
            await call.message.answer(row[0], reply_markup=il_1)

@dp.callback_query_handler(text='VT_p')
async def answer(call: CallbackQuery):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    for row in result:
        if row == 'СВ-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__VT_p'")
            row = cursor.fetchone()
            await call.message.answer(row[0], reply_markup=il_4)

@dp.callback_query_handler(text='VT_n')
async def answer(call: CallbackQuery):
    connect = sqlite3.connect('main.db')
    cursor = connect.cursor()
    cursor.execute('SELECT grup FROM Users WHERE id = ?', (call.from_user.id,))
    result = cursor.fetchone()
    if result is None:
        print('none')
    for row in result:
        if row == 'СВ-31':
            cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = 'SV_31__VT_n'")
            row = cursor.fetchone()
            await call.message.answer(row[0], reply_markup=il_3)
</code>

Декоратор, это функция. Ее использование через @ — синтаксический сахар. Вы можете поступить так:

async def send_text(message: types.Message):
    pass

send_text_handlers = [dp.message_handler(send_text, text=wd) for wd in ('ПН', 'ВТ')]

Работа с группами рефакторится так:

groups = {'СВ-31': 'SV_31', 'СП-31': 'SP_31' }

def fetch_for_group(group_code):
    cursor.execute("SELECT `raspisanie` FROM `Schedule` WHERE `grup` = f'{group_code}__PN_n'")
    row = cursor.fetchone()
    return row[0]

async def send_text(message: types.Message):
    ...
    for row in result:
        if row in groups.keys():
           info = fetch_for_group(groups[row])
           await message.answer(info, reply_markup=il_1)

Аналогично рефакторятся остальные блоки кода.


IndexError при переборе матрицы по индексу
У меня есть двумерная матрица:

[['a0' 'a1' 'a2']

 ['b0' 'b1' 'b2']

 ['c0' 'c1' 'c2']]

Я пытаюсь создать словарь, где ключ - элемент матрицы, а значение - список связанных элементов (правого и нижнего соседа). Если правого или нижнего соседа нет, связанный список должен содержать только один элемент.
Почему-то я в блоке
else: получаю значение
x==2, и соответственно ошибку в 19 строчке:
IndexError: index 3 is out of bounds for axis 0 with size 3. Хотя это значение x должно обрабатываться в первом блоке
if.
Что я делаю не так?

```
import numpy as np

''' Создаю матрицу с помощью модуля numpy.'''
list_1 = [['a0', 'a1', 'a2'], ['b0', 'b1', 'b2'], ['c0', 'c1', 'c2']]
matrix = np.array(list_1)
dict = {}
''' Перебираю значения "x" и "y" для перебора элементов матрицы по индексу.'''
for x in range(3):
    for y in range(3):
            a = matrix[x][y]
            if x == 2:
                d = matrix[x][y+1]
                dict[a] = (d)
            if y == 2:
                c = matrix [x+1][y]
                dict[a] = (c)
            else:
                print(x)
                c = matrix [x+1][y]
                d = matrix[x][y+1]
                dict[a] = (c, d)
print(dict)

Значение
x никак не влияет на то,  выполняется
else или нет. Блок
else относится к
if y == 2, поэтому выполняется всегда, когда
y не равен 2, и не имеет значения чему равен
х, хоть 0, хоть 2.


Ошибка в python уровня - новичок в ООП
Есть код:
<code>
class Hash_table:
    def __init__(self):
        self.hash_table = [[] for i in range(HASH_SIZE)]

    def add_word(self, word:str):
        hash_id = hash(word)
        hash_id = hash_id if hash_id >= 0 else -hash_id
        hash_id = hash_id % HASH_SIZE
    if not (word in self.hash_table[hash_id]):
        self.hash_table[hash_id].append(word)

with open("input.txt", "r") as f:
    line = f.read().split()
    for word in line:
        if word != "" and word != "\n" and word != " ":
            hash_table.add_word(word)
</code>
Выводится ошибка

File "/home/chort/ЛабыАСД/lab14.py", line 20, in
hash_table.add_word(word)
TypeError: add_word() missing 1 required positional argument: 'word'

Как это исправить, и что я сделал не так?

Для метода
add_word первым параметром указан параметр
self, значит это метод экземпляра класса и вызывать его можно только предварительно создав экземпляр класса:

hash_table = Hash_table()
hash_table.add_word(word)

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

def add_word(self, word:str):
    hash_id = hash(word)
    hash_id = hash_id if hash_id >= 0 else -hash_id
    hash_id = hash_id % HASH_SIZE
if not (word in self.hash_table[hash_id]):
    self.hash_table[hash_id].append(word)

Должно быть так:

def add_word(self, word:str):
    hash_id = hash(word)
    hash_id = hash_id if hash_id >= 0 else -hash_id
    hash_id = hash_id % HASH_SIZE
    if not (word in self.hash_table[hash_id]):
        self.hash_table[hash_id].append(word)

И константа
HASH_SIZE нигде не задана. Вероятно, это константа класса:

class Hash_table:
    HASH_SIZE = 1024
    def __init__(self):
        self.hash_table = [[] for i in range(Hash_table.HASH_SIZE)]
    ...
        hash_id = hash_id % Hash_table.HASH_SIZE


Решение задач с модификацией кода

Определите, при каком наименьшем введённом значении переменной s программа выведет число больше 600.

s = int(input())
n = 1
while n < 21:
      s = s - 1
      n = n + 2
print(s)

for s in range(100000, 100000):
      s1 = s
      n = 1
      while n < 21:
          s = s - 1
          n = n + 2
      if n > 600:
          print(s1)

Как найти промежуток, при котором программа хоть что-нибудь выведет?

изменив ваш код на:

for s in range(1000):
    s1 = s
    n = 1
    while n < 21:
         s1 = s1 - 1
         n = n + 2
    if s1 > 600:
        break
print(s)

можно узнать ответ:

611


django ограничение в моделях
Есть вот такие модели:
<code>
class Catrige(Product):
    model = models.ForeignKey(Model,models.CASCADE, verbose_name="Модель")
    original = models.BooleanField(verbose_name="Оригинал")

class Printer(Product):
    firm = models.ForeignKey(Firm, models.CASCADE, verbose_name="Производитель")
    printerModel = models.ForeignKey(PrinterModel, models.CASCADE, verbose_name="Модель принтера")
    name = models.CharField(max_length=100, verbose_name="Имя принтера")
    ip = models.CharField(max_length=30, verbose_name="ip-адрес")
    status = models.ForeignKey(PrinterStatus, models.CASCADE, verbose_name="Статус принтера")
    catriges = models.ManyToManyField(Catrige,verbose_name="Установленый картридж", blank=True)
</code>
Каким образом можно ограничить добавление картриджа если он уже используется?
Именно на уровне модели что бы нельзя было не в админпанели добавлять уже используемые модели и на формах.

зачем у принтеров и картриджей отношение многие ко многим? У вас же не может один картридж стоять в двух разных принтерах, сделайте просто внешний ключ, который не позволит разным принтерам иметь один и тот-же картридж.
Вам не нужны будут дополнительные ограничения, у каждого картриджа может быть только одно устройство, если модели будут примерно такими.
<code>
class Catrige(Product):

    model = models.ForeignKey(Model,models.CASCADE, verbose_name="Модель")
    original = models.BooleanField(verbose_name="Оригинал")

    # тут делаем связь многие картриджи к одному устройству
    printer = models.ForeignKey(Printer, related_name='catriges', on_delete=models.SET_NULL)

class Printer(Product):
    firm = models.ForeignKey(Firm, models.CASCADE, verbose_name="Производитель")
    printerModel = models.ForeignKey(PrinterModel, models.CASCADE, verbose_name="Модель принтера")
    name = models.CharField(max_length=100, verbose_name="Имя принтера")
    ip = models.CharField(max_length=30, verbose_name="ip-адрес")
    status = models.ForeignKey(PrinterStatus, models.CASCADE, verbose_name="Статус принтера")

    # тут связь нам не нужна, доступ к картриджам будет через related_name - cartriges
    # catrige = models.ForeignKey(Catrige, related_name='printer', verbose_name="Установленый картридж", blank=True)

Printer.objects.first().catriges.all()
<QuerySet [Catrige1, Catrige2]>
</code>


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

Привет!!!
-где-то
;приехать
=>>Hello
пол-лимона;
попросил))))
!!!
Ёжик1
а

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

Использовал регулярку, чтобы удалить все символы, что не подходят нам: не буквы и не дефисы. После удалил слева и справа дефисы.
Пример:
<code>
import re

words = [
    'Привет!!!',
    '-где-то',
    ';приехать',
    '=>>Hello',
    'пол-лимона;',
    'попросил))))',
    '!!!',
    '  ',
    'Ёжик1',
    'а',
    "П_Р_И_В_Е_Т"
]

def get_clean_word(word: str) -> str:
    word = re.sub('[^a-zа-яё-]', '', word, flags=re.IGNORECASE)
    word = word.strip('-')
    return word

list_clean = [get_clean_word(word) for word in words]
print(list_clean)
# ['Привет', 'где-то', 'приехать', 'Hello', 'пол-лимона', 'попросил', '', '', 'Ёжик', 'а', 'ПРИВЕТ']
</code>