Не отображаются поля формы в django
Не отображаются поля в django форме только кнопка отправить
views.py

class rateZoneView(generic.DetailView):
    model = Zone
    form_class = RateForm
    template_name = 'cityRating/rate.html'

urls.py

from django.urls import path
from django.conf.urls import url
from . import views

app_name = 'cityRating'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    url(r'^register/$', views.RegisterFormView.as_view(),name='register'),
    url(r'^login/$', views.LoginFormView.as_view(),name='login'),
    url(r'^rate/(?P<pk>\d+)/',views.rateZoneView.as_view(),name='ratezone')
]

forms.py

class RateForm(ModelForm):
class Meta:
    model = Profile
    fields = ['zone_crime_level','zone_roads_health','zone_ecology_level','zone_medicine_level']

models.py

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
zone_crime_level = models.IntegerField(default=0)
zone_roads_health = models.IntegerField(default=0)
zone_ecology_level = models.IntegerField(default=0)
zone_medicine_level = models.IntegerField(default=0)

rate.html

  <!DOCTYPE html>
<html>
  <head>
    <title></title>
  </head>
  <body>

            <div>
        <h4></h4>
        <form action="" method="post">
            {% csrf_token %}
            {{ form.as_p  }}
            <input type="submit" value="Submit" />
        </form>

    </div>

  </body>
</html>

Для отображения формы с помощью
CBV стоит использовать
FormView, однако там не будет доступа к экземпляру модели.

class rateZoneView(generic.FormView):
    form_class = RateForm
    template_name = 'cityRating/rate.html'


Как отфильтровать DF передавая в него Series c метками True/False
Прошу подсказать, есть такое задание:
Создайте новый столбец - mcc_code+tr_type, сконкатенировав значения из соответствующих столбцов. (*)
Для получившегося столбца определите дисперсию сумм трат тех категорий, в которых не менее 10 наблюдений.

transactions['mcc_code_and_tr_type'] = transactions['mcc_code'].astype(str) + transactions['tr_type'].astype(str)
groups = transactions.groupby(['mcc_code_and_tr_type']).size() > 10

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

17111110     True
17311010    False
17311110    False
17991110     True
27411110    False
27411210    False
30001010     True
30001100     True
30001110     True
30001200     True
30001210     True
30006000     True
30006010    False

Как мне отфильтровать исходный DF, там около милиона записей, но серия всего 900 (по кол-ву индексов не совподает). Прошла мысль, что сортировать вообще не надо. Сумма трат это значения по столбцу amount со отрицательный значением. (<0)
DF как пример

amount  term_id     gender  mcc_code_and_tr_type
345083  -1257.71    248523  1.0     59121010
694663  -67377.47   462049  NaN     60112010
527513  56147.89    85814   NaN     60117010
573203  -110049.87  NaN     NaN     60112010
460705  -11229.58   10367164    1.0     59411010
402169  -10645.64   293228  0.0     54111010
137120  -3076.90    00035644    1.0     54991110

Чтобы оставить в DataFrame только те группы, которые содержат минимум N строк, можно воспользоваться
DataFrame.groupby(...).filter(lambda x: len(x) >= N).
Пример:
Исходный DF:

In [178]: df
Out[178]:
   grp  amt
0    1   11
1    1   12
2    1   13
3    2   14
4    2   15
5    3   16
6    4   17

Решение - оставлем только те строки, для которых существует минимум 2 одинаковых
grp (т.е. в итоге должны остаться только записи с
grp:
1 и
2):

N =  2
res = df.groupby("grp").filter(lambda x: len(x) >= N)

Результат:

In [185]: res
Out[185]:
   grp  amt
0    1   11
1    1   12
2    1   13
3    2   14
4    2   15

PS я думаю, посчитать дисперсию труда не составит.


Проблемы при попытке преобразовать картинку в base64, Python3, Django
Есть такая функция в python3:
<code>
def image_to_base64(image_file, format_img='jpg'):
    encoded_string = base64.b64encode(image_file.read())
    return 'data:image/jpeg;base64,' + str(encoded_string)
</code>
Она принимает 2 аргумента: ImageField object из django и формат изображения, функция работает, но появляется такая проблема - строка возвращается в таком формате:
data:image/jpeg;base64,b'сама строка'.
Вопрос, что значит выражение b' ', откуда оно берётся и как это убрать, костылять вырезая из полученной строки b' ' как-то не очень хочется, может кто-то знает более правильный способ?

b64encode получает и возвращает набор байт (байтовую строку). Если байтовую строку преобразовать в строку с помощью
str, то в начало добавится
b и все содержимое будет обернуто в кавычки (то же самое произойдет если вы попытаетесь вывести эту строку, например, через
print). Вам нужно эту байтовую строку декодировать в обычную строку с помощью метода
decode (в данном случае будет применена кодировка по-умолчанию, насколько я помню это
'latin'):

return 'data:image/jpeg;base64,' + encoded_string.decode()


Как продолжить обучение модели?
Предположим я тренировал модель таким образом:

filename = 'model.h5'
checkpoint = ModelCheckpoint(filename, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
model.fit(trainX, trainY, epochs = 100, batch_size=256, validation_data=(testX, testY), callbacks=[checkpoint])

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

model.fit(trainX, trainY, epochs = 100, batch_size=256, validation_data=(testX, testY), callbacks=[checkpoint])

и еще раз:

model.fit(trainX, trainY, epochs = 100, batch_size=256, validation_data=(testX, testY), callbacks=[checkpoint]

былo равносильно:

model.fit(trainX, trainY, epochs = 200, batch_size=256, validation_data=(testX, testY), callbacks=[checkpoint]

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

from keras.models import load_model

model = load_model('/path/to/saved_model')

в этом случае в память загрузится состояние модели, которое было последним сохранено во время
checkpoint, т.е. с лучшим показателем
val_loss.


Почему после 10% символ % удваивается?
<code>
import sys
x = 40
a = x-1
per = 0
for i in range(x):
    if i != 0:
        per = a/x
        per = per*100
        per = round(per)
    print('['+'-'*i+' '*a+']'+str(per)+'%' , end='\r')
    a-=1
    sleep(.1)```
</code>

Try this code. Symbol
\r just move the pointer to 1st position, but not clear the screen. Second
% symbol remains after the previous output

Попробуйте этот код. Символ
\r просто сдвигает указатель на начальную позицию, но не очищает экран. Второй символ
% остаётся от предыдущего вывода (10%)

import sys
from time import *

x = 40
a = x-1
per = 0
for i in range(x):
    if i != 0:
        per = a/x
        per = per*100
        per = round(per)
    print('['+'-'*i+' '*a+']'+str(per) + '% ', end='\r')
    a-=1
    sleep(.1)

Result

Результат:

[---------------------------------------]0%


Порядок присваивания в пайтон
Я никак не могу найти в интернете этот вопрос, поэтому пишу сюда. Задача такая: написать алгоритм сортировки пузырьком, записывая каждый шаг в массив и вывести историю изменений в консоль.
У меня в консоль выводится только самое последнее изменение несколько раз. Почему так происходит? Как мне исправить эту ошибку, чтоб выводилась вся история?
<code>
def bubble_sort(colors):
    # Сюда записываем историю сортировки и исходные значения
    history = []
    history.append(colors)
    # Сортировка пузырьком
    for i in range(len(colors) - 1):
        for j in range(len(colors) - 1):
            if colors[j] < colors[j + 1]:
                # Обмен значений
                colors[j], colors[j + 1] = colors[j + 1], colors[j]
            history.append(colors)

    return history

def main():

    colors = [0x33, 0x23, 0x22, 0x44, 0xFF]
    result = bubble_sort(colors)
    # Вывод на экран всей истории
    for i in range(len(result)):
        print(result[i])

main()
</code>

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

history.append(colors)

на

history.append(colors.copy())

PS. Вместо

for i in range(len(result)):
    print(result[i])

в питоне используется

for i in result:
    print(i)

И старайтесь не давать переменным имена из одной буквы. Даже
num или
index намного понятней, чем просто
i.


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

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

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

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

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

Я пишу програму которая должна найти имя и счет тй:
с начала пользователь вводит имя, затем програма ищет его имя в файле, а затем из остатка строки делает счет. Строка должна выглядеть так
Thomas 50, моя проблема в том что я не могу найти и преобразовать строку в счет. Текстовый файл должен выглядеть так

Thomas 50
Elice 100
Tom 200

ну как  то  так  наверное:
<code>
def get_score_for_name(path_to_file, name):
    score_out = []
    with open(path_to_file) as file_handler:
        for name_ in file_handler:
            name_list = name_.split()
            if name_list[0] == name:
                score_out.append(name_list[1])
    return score_out
</code>
где path_to_file  - путь  к вашему файлу, name - имя, по которому надо найти счет (если имен несколько выведет столько же значений счетов)


как при запуске обновить Gui при наличии конфигарационного файла config.ini(если он присутсвует...)
<code>
from configparser import ConfigParser config = ConfigParser()

config.read('config.ini') print(config.get('main', 'server_inside')) print(config.get('main', 'server_outside')) from kivy.app import App from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen from configparser import ConfigParser import os

config = ConfigParser()

Builder.load_string(""" <MenuScreen>:
    canvas.before:
        Color:
            rgba: 255, 255, 255, 0.5
        Rectangle:
            pos: self.pos
            size: self.size

    Button:
        text: 'обновити'
        pos_hint: {"center_y": 0.91, "center_x": 0.75}
        size_hint: 0.5, 0.06
        on_press: root.get_option_for_button()

    Button:
        id: btn1
        text: "1"
        on_release: app.get_option_for_button1()
        pos_hint: {"center_y": 0.15, "center_x": 0.25}
        size_hint: 0.5, 0.06

""")

# Declare both screens class MenuScreen(Screen):

    pass

class SettingsScreen(Screen):

    pass

sm = ScreenManager() sm.add_widget(MenuScreen(name='menu')) sm.add_widget(SettingsScreen(name='settings'))

class TestApp(App):
    config.read("config.ini")

    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()
</code>
в конфиге кнопка 1 уже называется по другому, хочу прочитать её из файла
но не знаю как это сделать...(
подскажите пжслта

Надеюсь в основном файле ваш код выглядит правильно. Но изменить текст кнопки можно так:
<code>
from kivy.clock import Clock
...
    def build(self):
        self.sm = ScreenManager()
        self.menuscreen = MenuScreen(name='menu')
        self.settingsscreen = SettingsScreen(name='settings')
        self.sm.add_widget(self.menuscreen)
        self.sm.add_widget(self.settingsscreen)
        # добавляем крошечную задержку, чтобы успели подгрузиться все данные, иначе может быть ошибка
        Clock.schedule_once(self.changename)
        return self.sm

    def changename(self, *args):
        # проверяем есть ли файл
        if os.path.isfile('config.ini'):
            config.read('config.ini')
            # не знаю в каком поле содержится имя для кнопки
            # пусть для примера будет 'buttonname'
            self.menuscreen.ids.btn1.text = config.get('buttonname')
</code>


Convert string to camel case codewars
Прохожу задания в Codewars и появилась проблема в этом коде
<code>
def to_camel_case(text):
    l = list(text)
    for i in l:
        if i == '_' or i == '-':
            l.remove(i)
            text = ''.join(l)
        elif len(text) == 0:
            return text
    return text
</code>
По условию задачи нужно убрать все знаки - и _, а после них буква должна быть заглавной. Основную задачу выполнил, но вот как сделать буквы заглавными не знаю как.

import  re
a = 'hjshf-df45_fsdf-fgbcn-puiouio'

print(''.join(map(str.capitalize, re.findall(r'[^-_]+', a))))
# HjshfDf45FsdfFgbcnPuiouio


os.system(ping) всегда возвращает 1
Есть небольшой код на проверку доступности ір адреса
<code>
import os

ip = "8.8.8.8"
status = os.system("ping {}".format(ip))
if status == 0:
   print("Ok")
else:
   print:("bad try")
</code>
Но она все время возвращает 1. В чем может быть проблема?

Решение проблемы
<code>
import os
import multiprocessing
import subprocess

DNULL = open(os.devnull, 'w')
ip_request = "192.168.0.1"
status = subprocess.call(["ping","-n","1",ip_request],stdout = DNULL)
if status == 0:
   print ("It`s up!")
else:
    print ("It`s down!")
</code>
Для Linux вместо "-n" использовать "-c"


Ошибка telebot.anihelper.ApiException
Есть бот для телеграмма, который парсит стену с группы ВК и отправляет её в телеграм канал.
При попытке запустить, стену он парсит успешно, но отправить в канал — не может.

Traceback (most recent call last):
File "main.py", line 208, in <module>
check_posts_vk()
File "main.py", line 126, in check_posts_vk
bot.send_message(CHANNEL, text + '[](' + image_url + ')', parse_mode='Markdown')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128)

Еррорящий код:

    if len(images) > 0:
        image_url = str(max(img["sizes"], key=lambda size: size["type"])["url"])

        bot.send_message(CHANNEL, text + '[](' + image_url + ')', parse_mode='Markdown')
        # между квадратными скобками стоит world joiner. М.б. из-за него еррорит?

Помогите, плиз

Просто используй HTML

mention= f'{text}'
bot.send_message(CHANNEL, mention, parse_mode="HTML")


Python. Проверить, является ли число степенью тройки. Выводит None
<code>
def is_power_three(n):
    print(n)
    if n == 1:
        return 'Є степенем трійки'
    if n < 1:
        return 'Не є степенем трійки'
    is_power_three(n/3)

n = int(input('Введіть N: '))
print(is_power_three(n))
</code>
Обязательно использовать рекурсию.

Ваш метод в конце концов ничего не возвращает, сделайте вот так:
<code>
def is_power_three(n):
    print(n)
    if n == 1:
        return 'Є степенем трійки'
    if n < 1:
        return 'Не є степенем трійки'
    return is_power_three(n/3)
</code>


Как в c# применить нейросеть на python для создания синтеза речи?

Есть готовая нейросеть на python, которая позволяет создать синтез речи
Мне нужно сделать приложение WinForms с полем ввода текста и кнопкой для воспроизведения этого текста.

Как мне соединить c# и нейросеть на python?

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

public string run_cmd(string cmd, string args)
    {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = "PATH_TO_PYTHON_EXE";
        start.Arguments = string.Format("\"{0}\" \"{1}\"", cmd, args);
        start.UseShellExecute = false;// Do not use OS shell
        start.CreateNoWindow = true; // We don't need new window
        start.RedirectStandardOutput = true;// Any output, generated by application will be redirected back
        start.RedirectStandardError = true; // Any error in standard output will be redirected back (for example exceptions)
        using (Process process = Process.Start(start))
        {
            using (StreamReader reader = process.StandardOutput)
            {
                string stderr = process.StandardError.ReadToEnd(); // Here are the exceptions from our Python script
                string result = reader.ReadToEnd(); // Here is the result of StdOut(for example: print "test")
                return result;
            }
        }
    }

А так же вызвать скрипты.

public string PatchParameter(string parameter, int serviceid)
    {
        var engine = Python.CreateEngine(); // Extract Python language engine from their grasp
        var scope = engine.CreateScope(); // Introduce Python namespace (scope)
        var d = new Dictionary<string, object>
        {
            { "serviceid", serviceid},
            { "parameter", parameter}
        }; // Add some sample parameters. Notice that there is no need in specifically setting the object type, interpreter will do that part for us in the script properly with high probability

        scope.SetVariable("params", d); // This will be the name of the dictionary in python script, initialized with previously created .NET Dictionary
        ScriptSource source = engine.CreateScriptSourceFromFile("PATH_TO_PYTHON_SCRIPT_FILE"); // Load the script
        object result = source.Execute(scope);
        parameter = scope.GetVariable<string>("parameter"); // To get the finally set variable 'parameter' from the python script
        return parameter;
    }


Распарсить несколько ответов
Get-запросом получаю нное кол-во сообщений. В каждом сообщении есть  ключ content_id_out и его значение. Кодом ниже достаю. Но достаю из одного. Вопрос: Как достать значения этого ключа из ВСЕХ сообщений и сложить в словарь?
<code>
dii = json.loads(news)
act = dii['items'][0]['content_id_out']
</code>

Пример:

dii = json.loads(news)

d = dict()

for x in dii['items']:
    act = x['content_id_out']
    d[act] = None

UPD.

dii = json.loads(news)
ids = [x['content_id_out'] for x in dii['items']]


Поиск ближайщих точек гаолокации
Есть БД с отелями и у каждого отеля есть геолокация. Когда пользователь отправляет свою геолоакцию нужно найти ближайшие отели в радиусе примерно 1 км. Можно ли сделать это с функционалом языка? Например php or python

Можно.
Примерно такую же задачу пришлось решать очень давно
Вот пример запроса на Yii1
<code>
Yii::app()->db->createCommand()
                    ->select('geo_blocks.location, SQRT(POW((:lon - longitude), 2) + POW((:lat - latitude),2)) as S')
                    ->from('geo_blocks')
                    ->where('geo_blocks.location IN (' .$strCitiesId. ')')
                    ->having('S < (:distance/111)')
                    ->order('S ASC')
                    ->bindValues(array(
                        ':lon' => $items['longitude'], //координаты от пользователя
                        ':lat' => $items['latitude'],//координаты от пользователя
                        ':distance' => 30, //расстояние в км
                    ))
                    ->queryRow();
</code>


Обменять элементы двух массивов на месте так, чтобы их новый контент также был обращен вспять
Это тестовая функция

exchange_with(a, b)
Test.assert_equals(a, ["c", "b", "a"])
Test.assert_equals(b,['7', '6', '5', '4', '3', '2', '1']

Дан вот такой пример:

# before

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

other_list = [1, 2, 3]

exchange_with(my_list, other_list)

# after

my_list == [3, 2, 1]

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

Задача написать функцию! Вот моё решение но тест на тестируемой системе не прохожу

a = ["1", "2", "3", "4", "5", "6", "7"]

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

def exchange_with(a, b):
    a, b = b[::-1], a[::-1]
    return f"{a},\n {b}"

print(exchange_with(a, b))

Вот что выдаёт print()

['c', 'b', 'a']

['7', '6', '5', '4', '3', '2', '1']

Подскажите где моя ошибка?

Ваша ошибка в том, что снаружи функции
exchange_with массивы
a и
b не изменились. Вам внутри функции надо менять содержимое существующих массивов
a и
b, а не присваивать этим переменным (параметрам) ссылки на новые массивы.

def exchange_with(a, b):
    tempA = a.copy()
    tempB = b.copy()
    a.clear()
    b.clear()
    # insert items from tempB into a in reverse order
    # insert items from tempA into b in reverse order


Как достать то, что находится после span (селекторы html)
Как достать то, что находится после
span?
Мой парсер делает немного не то

def box (film_url,headers):
smth_list = []
session = requests.Session()
request = session.get(film_url, headers = headers)
if request.status_code == 200:
    soup = bs(request.content, 'html.parser')
    divs = soup.select('div.short-info')
    for div in divs:
        years = div.select('span')
        year = years[0].text if years else ''
        smth_list.append(year)
    print(smth_list)
else:
    print('INSIDE PARSING FAILED')

['КиноПоиск:', 'IMDb:', 'Год:', 'Страна:', 'Жанр:', 'Перевод:', 'Дата выхода:', 'Длительность:', 'Режиссер:', 'В ролях:']

Но вывести я хочу то, что находится после
span, то-есть сам рейтинг, год, страну и тд.
Для наглядности прикрепляют html код

<div class="fright">
<div class="short-info kp"><span>КиноПоиск:</span> 7.3</div>
<div class="short-info imdb"><span>IMDb:</span> 7.2</div>
<div class="short-info"><span>Год:</span> 1998</div>
<div class="short-info"><span>Страна:</span> США</div>
<div class="short-info"><span>Жанр:</span> мелодрама, комедия</div>
<div class="short-info"><span>Перевод:</span> Octopus, TVShows, GoldTeam,
Журавлев, Одноголосый, ColdFilm, SET</div>
<div class="short-info"><span>Дата выхода:</span> 21 сентября 1998</div>
<div class="short-info"><span>Длительность:</span> 22 мин.</div>
<div class="short-info"><span>Режиссер:</span> Джеймс Берроуз</div>
<div class="short-info"><span>В ролях:</span> Эрик МакКормак, Дебра Мессинг,
Меган Маллалли, Шон Хейс, Шелли Моррисон, Гарри Конник мл., Ли-Эллин Бейкер,
Бобби Каннавале, Том Гэллоп, Лесли Джордан</div>

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

['1998','США','мелодрама, комедия',...]

from bs4 import BeautifulSoup as Soup
from bs4.element import Tag

if __name__ == '__main__':
    html = """<div class="fright">
<div class="short-info kp"><span>КиноПоиск:</span> 7.3</div>
<div class="short-info imdb"><span>IMDb:</span> 7.2</div>
<div class="short-info"><span>Год:</span> 1998</div>
<div class="short-info"><span>Страна:</span> США</div>
<div class="short-info"><span>Жанр:</span> мелодрама, комедия</div>
<div class="short-info"><span>Перевод:</span> Octopus, TVShows, GoldTeam,
Журавлев, Одноголосый, ColdFilm, SET</div>
<div class="short-info"><span>Дата выхода:</span> 21 сентября 1998</div>
<div class="short-info"><span>Длительность:</span> 22 мин.</div>
<div class="short-info"><span>Режиссер:</span> Джеймс Берроуз</div>
<div class="short-info"><span>В ролях:</span> Эрик МакКормак, Дебра Мессинг,
Меган Маллалли, Шон Хейс, Шелли Моррисон, Гарри Конник мл., Ли-Эллин Бейкер,
Бобби Каннавале, Том Гэллоп, Лесли Джордан</div>
"""

    h = Soup(html, 'html.parser').find_all('div', {'class': 'short-info'})

    lst = []

    div: Tag
    for div in h:
        span = div.find_next('span')
        if span:
            span.replace_with('')
        lst.append(div.text.strip())
    print(lst)


Помогите пожалуйста решить задачу [закрыт]

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

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

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

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

Лифт
В торговом центре этажи нумеруются так: …, –3,–2,–1,1,2,3, … (нулевого этажа нет!). Вася спустился на лифте с этажа с номером A на B этажей, а затем поднялся на лифте на C этажей. Требуется определить, на каком этаже он оказался.
Входные данные
Вводятся три числа A, B и C. A — целое число от –100 до 100, не равное нулю. B и C — натуральные числа, не превосходящие 100.
Выходные данные
Выведите одно число — номер этажа, на котором окажется Вася.
<code>
a=int(input())
b=int(input())
c=int(input())
if a<0:
    if -(a-b)>c:
        print(a-b+c)
    elif -(a-b)<=c:
        print(a-b+c-1)
else:
    if b>=a and -(a-b)<=c or b<a:
        print(a-b+c)
    elif b>=a and(-c)>(a-b):
        print(a-b-1+c)
</code>

Если не мудрить, то достаточно подкорректировать реальный номер подземных этажей и вернуть назад.
<code>
if a < 0:
    a += 1
a = a - b + c
if a <= 0
    a -= 1
</code>
Всё.


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

class MyClass:
    def __init__(self, *argv):
        for i in range(int((len(argv) - 3) / 2)):
            self[argv[2 * i - 2]] = argv[2 * i - 1]

Сам main.py:

t = MyClass("name", "Ivan", "surname", "Ivanov")

Но проблема в том, что у экземпляра t класса MyClass аттрибутов  name и  surname нет (это я проверяю с помощью функции dir(t)). Как я могу исправить эту пробллему, чтобы я могла задавать переменное количество аттрибутов для определенного обьекта класса?

Вам нужен
setattr

class MyClass:

    def __init__(self, *argv):

        for i in range(int((len(argv)) / 2)):
            key = argv[2 * i]
            value = argv[2 * i + 1]
            setattr(self, key, value)  # вот так вот

Ну и с индексами вы что-то перемудрили (если передано четыре аргумента, то
int((len(argv) - 3) / 2) получается равным нулю и цикл вообще не выполняется), я поправил.


тестирование функции python - укажите на ошибку
Сначала создал функцию 'city_functions.py'

def get_city_country(city, country, population=''):

    """строит отформатированное имя города и стране."""
    if population:
        full_name = f"{city}, {country} - population {population}"
    else:
        full_name = f"{city}, {country}"

    return full_name.title()

Затем это отформатировал в 'names.py'

from city_functions import get_city_country

print("Enter 'q' at any time to quit.")

while True:

    city = input("\nIn what city you are born? ")
    if city == 'q':
        break
    country = input("In what country the city are? ")
    if country == 'q':
        break
    population = input("And how many people leave there? ")
    if population == 'q':
        break
    elif population == '':
        pass

    formated_name = get_city_country(city, country, population)

    print(f"{formated_name}")

Создал функционал для тестирования 'test_cities'

import unittest
from city_functions import get_city_country

class NamesTestCase(unittest.TestCase):
    """тесты для 'city_function.py."""

    def test_city_country_name(self):
        """имена вида 'Santiago, Chile' работают правильно?."""
        formated_name = get_city_country('santiago', 'chile')
        self.assertEqual(formated_name, 'Santiago, Chile')

    def test_city_country_population_name(self):
        """работает ли правильно? 'Santiago, Chile - population 5000000."""
        formated_name = get_city_country('santiago', 'chile', 5000000)
        self.assertEqual(formated_name, 'Santiago, Chile - population 5000000')

if __name__ == '__main__':
    unittest.main()

пока не добавил необязательный параметр
population оно работало хорошо, укажите на ошибку пожалуйста!

Если запустить тест, то будет такой вывод:

.F
======================================================================
FAIL: test_city_country_population_name (__main__.NamesTestCase)
работает ли правильно? 'Santiago, Chile - population 5000000.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/insolor/Projects/stackoverflow/utest/test_cities.py", line 15, in test_city_country_population_name
    self.assertEqual(formated_name, 'Santiago, Chile - population 5000000')
AssertionError: 'Santiago, Chile - Population 5000000' != 'Santiago, Chile - population 5000000'
- Santiago, Chile - Population 5000000
?                   ^
+ Santiago, Chile - population 5000000
?                   ^

----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)

Вот тут тест вам явно указывает на проблему:

    self.assertEqual(formated_name, 'Santiago, Chile - population 5000000')
AssertionError: 'Santiago, Chile - Population 5000000' != 'Santiago, Chile - population 5000000'
- Santiago, Chile - Population 5000000
?                   ^
+ Santiago, Chile - population 5000000
?                   ^

Этот вывод означает, что ожидалось что population будет с маленькой буквы, а получили с большой.
Так произошло из-за того, что метод строки
.title() в функции
get_city_country делает каждое слово с большой буквы. Чтобы так не происходило, можно применять метод
.title() не ко всей конечной строке, а только к названиям города и страны:

def get_city_country(city, country, population=''):
    """строит отформатированное имя города и стране."""
    city = city.title()
    country = country.title()
    if population:
        full_name = f"{city}, {country} - population {population}"
    else:
        full_name = f"{city}, {country}"

    return full_name

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


Telebot Проверка на пересланные сообщения
Всем привет, может кто подсказать как сделать проверку на то является ли сообщение пересланным

if message.forward_from != None:

или

if message.reply_to_message != None:


Как периодически ставить задани в очередь вместо их выполнения
Можно ли как-то с помощью
celery не выполнять задания через каждые x секунд, а отправлять их в очередь, чтобы одно задание ждало пока не закончится другое? Но чтобы добавление происходило каждые x секунд?
В таком варианте ожидания не происходит и задания выполняются одновременно

@periodic_task(run_every=timedelta(seconds=10), name='task_1')
def task_1():
    time.sleep(7)
    print(f'{datetime.now().strftime("%H:%M:%S")} Задание 1 закончено')

@periodic_task(run_every=timedelta(seconds=10), name='task_2')
def task_2():
    time.sleep(7)
    print(f'{datetime.now().strftime("%H:%M:%S")} Задание 2 закончено')

Так как celery использует multiprocessing для выполнения заданий, Вы можете использовать
multiprocessing.Semaphore([value]) для того чтоб притормозить выполнение заданий.

import multiprocessing

sema = multiprocessing.Semaphore(1)

@periodic_task(run_every=timedelta(seconds=10), name='task_1')
def task_1():
    sema.acquire()
    time.sleep(7)
    print(f'{datetime.now().strftime("%H:%M:%S")} Задание 1 закончено')
    sema.release()

@periodic_task(run_every=timedelta(seconds=10), name='task_2')
def task_2():
    sema.acquire()
    time.sleep(7)
    print(f'{datetime.now().strftime("%H:%M:%S")} Задание 2 закончено')
    sema.release()

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


def и for, проблема с выводом последовательности [закрыт]

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

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

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

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

сижу экспериментирую, вместо перечисления букв выдает мне 'N o n e' по буквам
<code>
def func():
    input("Введите слово и мы разберем его по-буквам: ")
word= func()
word= str(word)
for letter in word:
    print(letter)

input("Press Enter")
</code>

def func():
    x = input("Введите слово и мы разберем его по-буквам: ")
    return x
word= func()
for letter in word:
    print(letter)
input("Press Enter")

Во-первых, почитайте о
return в функциях и тогда поймёте почему у вас выводится None. Во-вторых, когда вы прописываете
input, то всё введенное вами является строкой. Потому
word = str(word) абсолютно бесполезная строка


Ползунок контроля момента проигрывания аудиофайла работает не так, как я планировал
В моем коде есть словарь
self.dict. Он хранит пути к аудиофайлам.
Для каждого аудиофайла создаются кнопки
play_btn и
pause_btn, название которых говорит само за себя.

self.qsl - это ползунок, который контролирует момент воспроизведения файла.
Сейчас он работает с ошибкой, и я хотел бы это поправить.

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

from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.dict = {
            'bibi.mp3': [],
            'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3': []
        }
        self.song = ''

        self.player = QtMultimedia.QMediaPlayer()
        self.player.stateChanged.connect(self.player_state)

        self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
        self.qsl.sliderMoved[int].connect(self.set_play_position)
        self.qsl.sliderReleased.connect(self.slider_released)
        self.qsl.setEnabled(False)

        self.box = QtWidgets.QGridLayout(self)

        for line, song in enumerate(self.dict):
            play_btn = QtWidgets.QPushButton('Play', clicked = lambda ch, song = song: self.play(song))
            pause_btn = QtWidgets.QPushButton('Pause', clicked = self.pause, enabled = False)

            label = QtWidgets.QLabel(song)
            self.box.addWidget(play_btn, line, 0)
            self.box.addWidget(pause_btn, line, 1)
            self.box.addWidget(label, line, 2)

            self.dict[song].append(play_btn)
            self.dict[song].append(pause_btn)

        self.play_repeat = False
        self.repeat_btn = QtWidgets.QPushButton('Repeat', clicked = self.repeat)
        self.box.addWidget(self.qsl, 2, 0, 1, 3)
        self.box.addWidget(self.repeat_btn, 3, 0, 1, 3)

        self.play_pause = True
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.play_mode)
        self.timer.start(1000)

    def play_mode(self):
        if self.play_pause == False:
            self.qsl.setMinimum(0)
            self.qsl.setMaximum(self.player.duration())
            self.qsl.setValue(self.qsl.value() + 1000)

    def slider_released(self):
        self.player.setPosition(self.qsl.value())

    def set_play_position(self, val):
        pass
#        print(val)

    def play(self, song):
        if self.player.isAudioAvailable() == False:
            self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
            self.dict[song][1].setEnabled(True)
            self.song = song

        if self.song == song:
            pass
        else:
            self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
            self.dict[self.song][1].setEnabled(False)
            self.dict[song][1].setEnabled(True)
            self.song = song

        self.player.play()
        self.play_pause = False
        self.qsl.setEnabled(True)

    def pause(self):
        self.player.pause()
        self.play_pause = True

    def player_state(self, state):
        if state == 0:
            self.Play_Pause = True
            self.qsl.setSliderPosition(0)
            self.qsl.setEnabled(False)
            if self.play_repeat == True:
                self.Play_Pause = False
                self.play(self.song)

    def repeat(self):
        if self.play_repeat == False:
            self.play_repeat = True
        else:
            self.play_repeat = False

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle('MP3-player, PyQt5')
    window.show()
    sys.exit(app.exec_())

Такие ошибки очень тяжело искать !

в методе
player_state вы
self.Play_Pause написали с заглавной буквы, вместо
self.play_pause
в этом же методе вместо
self.play(self.song) - надо
self.player.play()
в методе
__init__ -
self.play_repeat = True

Пробуйте

from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.dict = {
            'bibi.mp3': [],
            'D:/_Qt/EXE/Mp3/new_build/QThread_mp3/img/zvuki_prirody.mp3': []
        }
        self.song = ''

        self.player = QtMultimedia.QMediaPlayer()
        self.player.stateChanged.connect(self.player_state)

        self.qsl = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
        self.qsl.sliderMoved[int].connect(self.set_play_position)
        self.qsl.sliderReleased.connect(self.slider_released)
        self.qsl.setEnabled(False)

        self.box = QtWidgets.QGridLayout(self)

        for line, song in enumerate(self.dict):
            play_btn = QtWidgets.QPushButton('Play', clicked = lambda ch, song = song: self.play(song))
            pause_btn = QtWidgets.QPushButton('Pause', clicked = self.pause, enabled = False)

            label = QtWidgets.QLabel(song)
            self.box.addWidget(play_btn, line, 0)
            self.box.addWidget(pause_btn, line, 1)
            self.box.addWidget(label, line, 2)

            self.dict[song].append(play_btn)
            self.dict[song].append(pause_btn)

        self.play_repeat = True                                                   # - False / + True

        self.repeat_btn = QtWidgets.QPushButton('Repeat', clicked=self.repeat)
        self.box.addWidget(self.qsl, 2, 0, 1, 3)
        self.box.addWidget(self.repeat_btn, 3, 0, 1, 3)

        self.play_pause = True
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.play_mode)
        self.timer.start(1000)

    def play_mode(self):
        if self.play_pause == False:
            self.qsl.setMinimum(0)
            self.qsl.setMaximum(self.player.duration())
            self.qsl.setValue(self.qsl.value() + 1000)

    def slider_released(self):
        self.player.setPosition(self.qsl.value())

    def set_play_position(self, val):
        pass

    def play(self, song):
        if self.player.isAudioAvailable() == False:
            self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
            self.dict[song][1].setEnabled(True)
            self.song = song

        if self.song == song:
            pass
        else:
            self.player.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl(song)))
            self.dict[self.song][1].setEnabled(False)
            self.dict[song][1].setEnabled(True)
            self.song = song

        self.player.play()
        self.play_pause = False
        self.qsl.setEnabled(True)

    def pause(self):
        self.player.pause()
        self.play_pause = True

    def player_state(self, state):
        if state == 0:
            self.play_pause = True                         # -Play_Pause / + play_pause
            self.qsl.setSliderPosition(0)
            self.qsl.setEnabled(False)
            if self.play_repeat == True:
                self.play_pause = False                    # -Play_Pause / + play_pause

###                self.play(self.song)                    # ---
                self.player.play()                         # +++

    def repeat(self):
        if self.play_repeat == False:
            self.play_repeat = True
            self.repeat_btn.setText("Repeat")              # +++
        else:
            self.play_repeat = False
            self.repeat_btn.setText("Not Repeat")          # +++

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle('MP3-player, PyQt5')
    window.show()
    sys.exit(app.exec_())


Задача (олимпиадная)
Замок имеет форму большого квадрата, составленного из N × N маленьких квадратиков. Внешние квадратики являются башнями, именно они играют основную роль в защите замка от неприятеля. Например, если замок имеет размер 4 × 4, то у него 12 башен (смотрите второй рисунок, башни на нем выделены серым цветом).
Замок охраняют K полков, которые необходимо разместить по башням. В одной башне можно разместить несколько полков, но при этом в каждой башне должен находиться хотя бы один полк, иначе неприятель легко захватит эту башню. Если все башни защищены, то неприятель выбирает для атаки одну из четырех сторон замка, которую защищает наименьшее число полков (то есть суммарное число полков во всех башнях данной стороны квадрата минимально).
Определите, как нужно разместить полки для наилучшей защиты замка.
Входные данные
Первая строка входных данных содержит число N — размер замка (2 ≤ N ≤ 100). Вторая строка входных данных содержит число K — количество полков, охраняющих замок (0 ≤ K ≤ 100).
Выходные данные
Выведите единственное число — количество полков на наименее укрепленной стороне замка при наилучшем размещении полков. Если имеющихся полков недостаточно для защиты всех башен, выведите число 0.
<code>
n = int(input())
k = int(input())
if n==0 or k==0:
    print(0)
elif n==1:
    print(k)
elif k<=n:
    print(1)
else:
    z =n**2
    d = (n-2)*(n-2)
    b = z-d
    o = n+(k-b)//2
    print(o)
</code>

n = int(input())
k = int(input())
b = 4*(n-1)
if b > k:
  print(0)
else:
  print(n+(k-b)//2)


Номер появления слова
Изучаю Python на курсере и не могу заметить ошибку в коде при решении следующей задачи:
Во входном файле (вы можете читать данные из файла input.txt) записан текст. Словом считается последовательность непробельных подряд идущих символов. Слова разделены одним или большим числом пробелов или символами конца строки. Для каждого слова из этого текста подсчитайте, сколько раз оно встречалось в этом тексте ранее.
Формат ввода
Вводится текст.
Формат вывода
Выведите ответ на задачу.
Пример:
Входные данные:
one two one tho three
Вывод программы:
0 0 1 0 0
Когда тестирую код то ответ правильный однако курсера пишет что ответ не правильный. Прошу подсказать конкретно в какой части кода у меня ошибка.
Мой код:
<code>
#  Открываем файл с данными, создаем словарь и список
fin = open('input.txt', 'r', encoding='utf8')
words = dict()
letterWord = []
# создаем список слов из текста в файле fin
for line in fin.readlines():
    for word in line.split(' '):
        letterWord.append(word)
#  убираем в словах списка лишние знаки
nList = []
for word in letterWord:
    nList.append(word.rstrip('\n').strip('.').strip(',').strip(';'))

#  формируем словарь с количеством одинаковых слов в списке
for i in nList:
    words[i] = words.get(i, 0) + 1
    print(words[i] - 1, end=' ') #  выводим номер появления слова
fin.close()
</code>

Моя гипотеза: про точку и остальные разделители в условии не говорилось -
поэтому "one" и "...one" на курсере может считаться как 2 разных слова - а у вас считается как одно и тоже.
Вам следует убрать "очистку от ненужных знаков".


Ошибка в программе бота в вк
<code>
import vk_api
import time
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType

 vk_session = vk_api.VkApi(token ='я убрал')
 vk = vk_session.get_api()
longpoll = VkBotLongPoll(vk_session, я убрал)

 for event in longpoll.listen():
if event.type == VkBotEventType.MESSAGE_NEW:
    if event.object.text.lower() == 'калькулятор':
     vk.messages.send(peer_id=event.object.peer_id, message='Включаю калькулятор', random_id=0)
        vk.messages.send(peer_id=event.object.peer_id, message='Введите первое число', random_id=0)
        for event in longpoll.listen():
            if event.type == VkBotEventType.MESSAGE_NEW:
                a = event.object.text.lower()
           vk.messages.send(peer_id=event.object.peer_id, message='Введите второе число',random_id=0)
                for event in longpoll.listen():
                    if event.type == VkBotEventType.MESSAGE_NEW:
                        b = event.object.text.lower()
                vk.messages.send(peer_id=event.object.peer_id, message='Что делtv(+,-)',random_id=0)
                        for event in longpoll.listen():
                            if event.type == VkBotEventType.MESSAGE_NEW:
                                wh = event.object.text.lower()
                                if wh == "+":
                                    s = int(a) + int(b)
            vk.messages.send(peer_id=event.object.peer_id, message='Сумма равна ' str(s),random_id=0)
                                elif wh == "-":
                                    s = int(a) - int(b)
     vk.messages.send(peer_id=event.object.peer_id, message='Разность равна ' + str(s), random_id=0)
                                else:
     vk.messages.send(peer_id=event.object.peer_id,message='Выбрананеверная операция!!',random_id=0)
</code>
Первый раз программа запустилась идеально. Я начал набирать "калькулятор" второй раз, и мне выдало "Выбрана неверная операция!!". Что делать? Как избавится от цикла и чтобы все работало. Заранее спасибо

Нельзя делать такое большое кол-во циклов, тк если один игрок зайдет в один блок, то всех остальных также туда закинет
<code>
for event longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW:
        text = event.object.text.lower()
        if "реши" in text:
            text = text.split("реши")[-1]
            try:
                answer = eval(text)
                vk.messages.send(peer_id=event.object.peer_id, message=f"Ответ: {answer}",random_id=0)
            except:
                vk.messages.send(peer_id=event.object.peer_id, message="Ошибка",random_id=0)
</code>
Для того, чтобы калькулятор сработал, игроку нужно будет ввести команду: Реши [пример]
К примеру: Реши 5+5


Не устанавливается модуль PyAutoGui
У меня Windows, использую среду PyCharm.
Я в терминале прописываю: "pip install pyautogui".
Начинается установка, но вскоре вылетает такая ошибка:"The headers or library files could not be found for zlib, a required dependency when compiling Pillow from source."
Как можно исправить?

Если Вы ввели "pip install pyautogui" в терминал PyCharm -
то попробуйте ввести его в командную строку cmd,
я попробовал и у меня не было никаких проблем.


PermissionError: [Errno 13] Permission denied: './' во время subprocess.run
Выполняю команды с помощью

execution = subprocess.run(to_run, input=test, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                       encoding="utf-8", timeout=timelimit)

В таком порядке

['g++', '/Users/islamshaykhiev/Downloads/main.cpp', '-o', '3solve.out']
['chmod', '+x', '3solve.out']
['./', '3solve.out']

Во время последней команды возникает ошибка

PermissionError: [Errno 13] Permission denied: './'

В чем проблема?
Сам код main.cpp

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double
#define all(v) v.begin(), v.end()
#define trace(x) cout << #x "=" << x << endl
#define int128 __int128

#define int long long
const int mod = 1e9 + 7;

const int maxn = 5e5 + 10;

signed main() {
    cin.tie();
    ios_base::sync_with_stdio(false);
    int x1, y1, r1, d1, x2, y2, r2, d2;
    cin >> x1 >> y1 >> r1 >> d1 >> x2 >> y2 >> r2 >> d2;
    double dist = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) - r1 - r2;
    cout << dist / (d1 + d2) << "\n";
}

Каждая команда состоит из имени запускаемой программы и передаваемых ей параметров командной строки. В качестве программ можно указывать исполняемые файлы и скрипты, в которых прописана строка
#! путь/до/интерпретатора.
Соответственно, вы пытаетесь запустить программу
./, которой не существует (это ссылка на текущую папку). Вместо этого надо указать сразу имя того, что вы скомпилировали:

['./3solve.out']

Если забыть про
./ в начале, операционная система начнёт искать программу в системных папках.


цикл for в Python, простой вопрос

for х in ["spam”, "eggs”, "ham”]:
    ...
    print(x, end=’ ’)

результат:
spam eggs ham
И зачем все это делалось если можно просто через принт их провести? Умоляю, человеческим языком объясните что и зачем это нужно.
Нашел на оф.сайте Питона:
for loops are traditionally used when you have a block of code which you want to repeat a fixed number of times. The Python for statement iterates over the members of a sequence in order, executing the block each time. Contrast the for statement with the ''while'' loop, used when a condition needs to be checked each iteration, or to repeat a block of code forever

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


Ошибка 'return' outside function- как решить?
Есть 2 файла. При запуске generate_page должна произойти запись строки в файл index.html.
Сейчас при запуске на локальном сервере в консоли такие ошибки:

Traceback (most recent call last):
  File "D:\programming\Python\kyb\mod3 html\3\generate_all.py", line 3, in <module>
    from horoscope import generate_prophecies
  File "D:\programming\Python\kyb\mod3 html\3\horoscope.py", line 26
    return prophecies
    ^
SyntaxError: 'return' outside function
[Finished in 0.1s]

horoscope.py

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

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

for i in range(total_num):
    forecast = ""
for j in range(num_sentences):
    t = random.choice(times)
    a = random.choice(advices)
    p = random.choice(promises)

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

    forecast = forecast + full_sentence
    prophecies.append(forecast)

    return prophecies

generate_all.py

# coding: utf-8

from horoscope import generate_prophecies
from datetime import datetime as dt

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

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

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

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

#####################

today = dt.now().date()

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

Разберитесь с отступами в horoscope.py. В таком виде работает:
<code>
import random

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

def generate_prophecies(total_num=5, num_sentences=3):
    prophecies = []
    for i in range(total_num):
        forecast = ""
        for j in range(num_sentences):
            t = random.choice(times)
            a = random.choice(advices)
            p = random.choice(promises)
            full_sentence = f"{t.title()} {a} {p}."
            if j != num_sentences - 1:
                full_sentence = full_sentence + " "
    forecast = forecast + full_sentence
    prophecies.append(forecast)
    return prophecies
</code>


Как вызвать атрибуты функции и списка и изменить её значение?
Есть примерно такой код

class Rheology:

    def __init__(self):
        self.rpm_600 = 0
        self.rpm_300 = 0
        self.rpm_200 = 0
        self.rpm_100 = 0
        self.rh.rpm_6 = 0
        self.rh.rpm_3 = 0

    def visc(self):
        pv = self.rpm_600 - self.rpm_300
        return pv

    def func_1():
        return self.rh.rpm_6 * self.rh.rpm_3

    def func_2():
        pass

rh = Rheology()

func_list = [rh.rpm_600, rh.rpm_300]

for i in func_list:
    # не знаю как правильно написать...
    i = int(input('Введите значение'))

print('Решение 1: ', rh.visc())
print('Решение 2: ', rh.func_1())

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

rh = Rheology()
rh.rpm_600 = int(input('Введите значение'))
rh.rpm_300 = int(input('Введите значение'))
rh.rpm_200 = int(input('Введите значение'))
rh.rpm_100 = int(input('Введите значение'))
rh.rpm_6 = int(input('Введите значение'))
rh.rpm_3 = int(input('Введите значение'))

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

class Rheology:
#    def __init__(self):
#        self.rpm_600 = 0
#        self.rpm_300 = 0

    def visc(self, rpm_600, rpm_300):
        self.rpm_600 = rpm_600
        self.rpm_300 = rpm_300
        pv = self.rpm_600 - self.rpm_300
        return pv

rh = Rheology()

_list = []
for i in range(2):
    _list.append(int(input(f'Введите значение {i+1}: ')))

print(rh.visc(*_list))

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

class Rheology:
    def __init__(self, kwargs):
        self.rpm_600 = kwargs['rpm_600']
        self.rpm_300 = kwargs['rpm_300']
        self.rpm_200 = kwargs['rpm_200']
        self.rpm_100 = kwargs['rpm_100']
        self.rpm_6 = kwargs['rpm_6']
        self.rpm_3 = kwargs['rpm_3']

    def visc(self):
        pv = self.rpm_600 - self.rpm_300
        return pv

    def func_1(self):
        return self.rpm_6 * self.rpm_3

    def func_2(self):
        pass

_dict = {
    'rpm_600': 0,
    'rpm_300': 0,
    'rpm_200': 0,
    'rpm_100': 0,
    'rpm_6': 0,
    'rpm_3': 0,
}

for k in _dict:
    _dict[k] = int(input(f'Введите значение {k}: '))

#print(_dict)
rh = Rheology(_dict)

print('Решение 1: ', rh.visc())
print('Решение 2: ', rh.func_1())


Как конвертировать .py в .exe
Я создал игру на питоне используя библиотеки
pygame,
wxPython и хочу конвертировать главный файл в
.exe так чтобы эта игра работала на таком устройстве на котором нету питона или использованных библиотек.
Есть ли какая-то прога или библиотека для исполнения этой задачи?
Нужно чтобы работало в Windows, и как конвертировать .exe в исполняемый файл для OSX ?

Попробуйте cx_Freeze.

python -m pip install cx_Freeze --upgrade

В корне вашей игры создаете файл "setup.py" примерно такого содержания:

from cx_Freeze import Executable, setup

# Список всех файлов и папок вашего проекта, за исключением исполняемого,
# находящихся в корневой папке
include_files = ['game', 'test']  # file or directory

options = {
'build_exe': {
    'include_msvcr': True,
    'build_exe': 'name_exe',
    'include_files': include_files,
    }
}

# Задаем исполняемый файл и свою иконку.
executables = [
    Executable("game.py", icon='game.ico'),
]

setup(
    name="game",
    version="1.0",
    description="Game",
    executables=executables,
    options=options,
)

Ну а дальше из корневой папки выполняем

python setup.py build


Выскакивает ошибка:TypeError: '<' not supported between instances of 'list' and 'int'
Нужно написать функцию которая принимает в себя элементы списка в качестве аргумента и возвращает его с элементами число которых не превышает 20
Если делать без функции тобиш так:

j=[2,4,16,32,64]
j2 = [i for i in j if i < 21]
print(j2)

То это все работает
Но если через функцию:

def function(*array):
  finaly_array = [i for i in array if i < 21]
  return finaly_array

function([2,4,6,8,10,20,22,40,142])

То выбивает ошибку:
TypeError: '<' not supported between instances of 'list' and 'int'

def function(array):
    finaly_array = [i for i in array if i < 21]
    return finaly_array

function([2, 4, 6, 8, 10, 20, 22, 40, 142])


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

def smart_int_input():
    try:
        return int(input("number = "))
    except:
        print("Must be number!!!")
        return smart_int_input()
# __main__
smart_int_input()

Если без функций:

while True:
    try:
        test = int(input("number = "))
        break
    except ValueError:
        print("Must be number!!!")

print(test)


Помогите решить задачку на питоне
Напишите программу, которая бы «Подбрасывала» условную монету 100 раз и сообщала, сколько раз выпал
орел, а сколько - решка.
Проблема в том, что я не знаю как правильно показать сумму всех ста "подбросов" Я тут чего-то понаписал, скажите, правильно ли я мыслю, и все-таки помогите ее сделать) Неплохо было бы если бы вы могли посоветовать сайт с такими задачками.
<code>
coin= random.randint(1,2)
tries=1
side1=""
side2=""

while not tries == 100:
    side1=int()
    side2=int()
    coin= random.randint(1,2)
    tries = tries + 1
    if coin ==1:
        side1=coin+side1
    elif coin ==2:
        side2=coin+side2
        side2=int(side2/2)
    print(coin, side1, side2)

</code>

Попробуйте так:
<code>
from random import randint

tries = 100
list_coin = []

while tries:
    list_coin.append(randint(1, 2))
    tries -= 1

print('рел - {}, решка - {}'.format( list_coin.count(1), list_coin.count(2)))
</code>


Импорт модулей прямо в функцию или class :python
<code>
def drive_list_func():
    from win32api import GetLogicalDriveStrings

    return GetLogicalDriveStrings()
</code>
Можно ли таким образом импортировать модуль прямо в функцию и не по говнокодерски ли это?
Так как это достаточно удобно, ведь он (как я понял) удаляется из памяти после использования функции.

«Можно ли таким образом импортировать модуль прямо в функцию и не по говнокодерски ли это?»

Можно, но это по «говнокодерски», как вы правильно сказали.
См. «PEP 8 - руководство по написанию кода на Python», часть Импорты:

Импорты всегда помещаются в начале файла, сразу после комментариев к модулю и строк документации, и перед объявлением констант.

«... ведь он (как я понял) удаляется из памяти после использования функции.»

Вы абсолютно прав.
Но оно того не стоит.
Потому что смысл для импорта модуля нет в том, чтоб он что-то делал — хорошо написанный модуль не делает ничего кроме определений функций, классов и переменных-констант.
Значит, он сам не использует много памяти (скажем, 1 KB для 100 строк кода), потому что он сам не вызывает эти функции и не создает объекты этих классов.
(Значит, какая-то маленькая память после импорта использована, но пока вы не вызовете импортованую функцию или не создаете объекты, никакой дополнительной памяти не нужно.)
Потому

команды
import пишутся в начале программы (модуля) — память не освобождается,
функции / классы используются внутри функций — после окончания вызванной функции память освобождается.


Как объединить несколько вариантов проверки в одно сравнение в if, Python?
не знаю можно ли объединить несколько условий в одно
Пример:

if x==2 or x==3 or x==4 ....

Я хочу это как-то покороче записать

Это можно сделать так:

if s in (2,3,4)

python будет сравнивать переменную "s" с числами 2,3,4.

Вы можете проверит есть х в списке нужных значений :
<code>
allowed_list = [2,3,4,5]
if x in allowed_list:
    print(x)
</code>


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

print("Gold: " + str(gold))

И есть файл const.txt
В нём записано:

gold = 100

И нужно чтобы программа забрала это значение, или лучше создать .ini?

Создаем файл settings.json
{"gold": 100, "silver": 30, "cuprum": 1000}

Будем хранить параметры в виде пары ключ:значение (словарь) и использовать JSON для хранения.

Пример программы
<code>
import json

def load_settings(filename):
    with open(filename) as json_file:
        settings = json.load(json_file)
    return settings

def save_settings(settings, filename):
    with open(filename, 'w') as outfile:
        json.dump(settings, outfile)

settings=load_settings("settings.json")
print(settings["gold"])

settings["silver"]=1000
save_settings(settings, "settings.json")
</code>


Скопировать Excel строку из другого листа
Подскажите, есть ли возможность используя Python и библиотеку openpyxl скопировать целиком строку (row) с одного листа на другой?
Например так:
<code>
for row in sheet:
     sheet2.append(row)
</code>
Сейчас такой код у меня не работает.

Данный пример добавляет вторую строку из листа
Sheet2 в конец листа
Sheet1 с сохранением форматирования:

from copy import copy
from openpyxl import load_workbook

def copy_cell(src_sheet, src_row, src_col,
              tgt_sheet, tgt_row, tgt_col,
              copy_style=True):
    cell = src_sheet.cell(src_row, src_col)
    new_cell = tgt_sheet.cell(tgt_row, tgt_col, cell.value)
    if cell.has_style and copy_style:
        new_cell._style = copy(cell._style)

filename = r"c:\temp\test.xlsx"
wb = load_workbook(filename)
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']

ws1_last_row = ws1.max_row

for i,row in enumerate(ws2.iter_rows(min_row=2, max_row=2), 1):
    for cell in row:
        copy_cell(ws2, cell.row, cell.column,
                  ws1, ws1_last_row+i, cell.column)

wb.save(filename)


Зачем нужен оператор continue в Python?
Неужели только для того, чтобы пропустить цифру?
<code>
count = 1

while True:
    count += 1
    if count == 504:
        continue
    if count > 520:
        break
    print (count)
</code>

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

for i in range(10):
    if i in [1, 5 , 6]:
        continue
    print(i, end=" ")

Для данного примера вывод будет такой:

0 2 3 4 7 8 9


Python 3: ошибка 'name '...' is not defined"
Хочу сделать некий "автостатус" для бота, использу. для этого str(status_message_from_cycle) выставляя ему значение в цикле:

def status_cycle1():
    status_message_from_cycle = str("test 1")

def status_cycle2():
    status_message_from_cycle = str("test 2")

interval = 2

def statusPeriodicFunction():
    status_cycle1()
    status_cycle2()

def startTimer():
    threading.Timer(interval, startTimer).start()
    statusPeriodicFunction()

Позже это значение выставляется в конфиге:

self.status_message = str(status_message_from_cycle)

Но после интерпретаций кода выходит:

File "/media/mint/F3D8-BADB/MusicBot/musicbot/config.py", line 88, in init
      self.status_message = str(status_message_from_cycle)
  NameError: name 'status_message_from_cycle' is not defined

В питон область видимости переменной по умолчанию локальная. К примеру следующий код не изменит глобальную переменную

var_a = "original value"

def modify_var_a():
  var_a = "changed value" # создана новая переменная

modify_var_a()
print(var_a) # >>> original value

Чтобы явно указать использование переменной из внешней области видимости нужно использовать ключевое слово
global с названием переменной до того, как она будет использована во внутренней области видимости. Если же есть несколько вложенных областей видимости, то можно получить доступ либо к глобальной области видимости при помощи
global, либо же к "ближайшей" используя
nonlocal.

var_a = 1

def modify_a():
  var_a = 2 # другая переменная с тем же именем, что и глобальная

  def modify_a1():
    global var_a
    var_a = 3

  modify_a1()

  def modify_a2():
    nonlocal var_a
    var_a = 5

  modify_a2()

  print("modify_a::var_a =", var_a)

modify_a()
print("::var_a =", var_a)

modify_a::var_a = 5
  ::var_a = 3

Это же происходит и в вашем случае. В функции
status_cycle1 создаётся новая переменная
status_message_from_cycle но она не выходит за область видимости функции. Нужно сначала создать глобальную, затем в функции указать, что используется именно глобальная, а затем её модифицировать.


Как использовать результат выражения из условия в ветке самого условия?
Вопрос по архитектуре кода. Допустим, есть множество
elif'ов. В "верхних" условиях результат выражения не используется внутри ветки. Среди нижних есть условие, где результат выражения из
if'а используется внутри ветки.

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

Примерный код:

def task(val):
    if val % 2:
        print("cond1")  # результат выражения не используется
    elif val % 3:
        print("cond2")
    elif val % 5:
        print(val % 5)  # Тут результат из if'а используется внутри ветки
                        # и высчитывается второй раз. Этого хотелось бы избежать
    else:
        print("else")

task(6)

Знаю, что в Python 3.8 появился моржовый оператор, который решил бы мою проблему, но в системе используется Python 3.7, необходимо решение под него.

Воспользуйтесь стандартной functools.lru_cache() для кеширования результатов вызова функции:
<code>
from functools import lru_cache

@lru_cache(maxsize=2**14)
def my_long_running_func(arg1):
    return arg1 % 5

def task(val):
    if val % 2:
        print("cond1")  # результат выражения не используется
    elif val % 3:
        print("cond2")
    elif my_long_running_func(val):
        print(my_long_running_func(val))  # Используется кешированный результат функциии
    else:
        print("else")
</code>


Как взять данные из Treeview?
Как сделать открытие окна при нажатии на строку Treeview Tkinter? То есть пользователь жмёт на строку с нужными ему данными и открывается новое окно, где те же самые данные что и в этой строке + всё остальное из БД. Как вывести данные из БД в отдельное окно я знаю, а вот как взять данные из выделенной строки в Treeview никак не пойму. Подскажите, пожалуйста

Допустим, нам нужно чтобы при выборе строки в дереве выполнялось какое то действие, при этом нужно получить доступ к данным в выбранной строке. Для реакции на выбор строки нужно привязаться к событию
<<TreeviewSelect>> дерева (в принципе можно использовать другое событие, например двойной клик левой кнопкой мыши -
<Double-Button-1>). Дальше через метод дерева
selection нужно получить список id выделенных элементов. Дальше по id можно получить значения в строке.

def on_select(event):
    # вывод текстовых id всех выбранных строк
    # (их может быть несколько, если при создании дерева не было указано selectmode='browse')
    print(treeview.selection())

    # Если привязывались не к событию <<TreeviewSelect>>,
    # то тут нужно проверить, что вообще что-то выбрано:
    if not treeview.selection():
        return

    # Получаем id первого выделенного элемента
    selected_item = treeview.selection()[0]

    # Получаем значения в выделенной строке
    values = treeview.item(selected_item, option="values")
    print(values)

treeview.bind('<<TreeviewSelect>>', on_select)


Параллельное выполнение циклов while в Python 3
Мне нужно добавить игровое время, которое будет идти в несколько раз быстрее обычного времени, делаю это через цикл while. Все циклы должны работать параллельно, а не поочерёдно. Как это сделать?
Код не дописан, но суть, я думаю, поняли.
<code>
import time
import progressbar
import random
print("Игра CastleHouse открыта! Версия: beta 0.1!")
for ar in "   ":
    print(ar)
print("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -")
print("Добро пожаловать в королевство CastleHouse!")
print("Развивайтесь и станьте великим в этом текстовом мире!")
print("Для начала получите информацию о себе командой info.")
print("Чтобы посмотреть команды введите help.")
money = 0
health = 100
force = 1
food = 100
time1 = 0
time2 = 0
while True:
    time2+=1
    time.sleep(0.3)
    if time2==60:
        time1+=1
    if (time1 == 24) and (time2 >= 00):
        time1 = 0
        time2 = 0
while True:
    a = input(">>> ")
    if a == ("info"):
        print("Деньги: "+str(money)+"$")
        print("Здоровье: "+str(health))
        print("Сила: "+str(force))
        print("Еда: "+str(food))
        print("Чтобы начать работу введите job.")

    if a == ("job"):
        raboti = ["Шахта", "Лесопилка"]
        for rabota in raboti:
            print("* "+rabota)
        nc = input(">>> ")
        if nc == (raboti[0]):
            time.sleep(1)
            bar = progressbar.ProgressBar().start()
            for i in range(101):
                bar.update(i)
                time.sleep(0.2)
            bar.finish()
            zarp = random.randint(1,40)
            print("У вас было: "+str(money)+"$")
            money += zarp
            print("У вас стало: "+str(money)+"$")
            health-=5
            food-=5
            print("Вы потратили 5 здоровья и 5 голода.")
        if nc == (raboti[1]):
            print("Вы выбрали работу "+raboti[1])
            print("Начинаем работать...")
            time.sleep(1)
            bar = progressbar.ProgressBar().start()
            for i in range(101):
                bar.update(i)
                time.sleep(0.1)
            bar.finish()
            zarp = random.randint(1,20)
            print("У вас было: "+str(money)+"$")
            money += zarp
            print("У вас стало: "+str(money)+"$")
            health-=2
            food-=3
            print("Вы потратили 2 здоровья и 3 голода.")
    if a == ("help"):
        print("* job - работа.")
        print("* info - информация о себе.")
        print("* help - помощь.")
        print("* stopgame - закончить игру.")
        print("* medic - сходить в больницу.")
        print("* shop - сходить в магазин.")
        print("* time - игровое время.")
        print("* inv - инвентарь.")
        print("* use - использовать.")
    if a == ("stopgame"):
        print("Заканчиваем игру...")
        time.sleep(2)
        health=0
    if health >=101:
        health=100
    if a == ("medic"):
        health = 100
        ranf = random.randint(0,50)
        money -= ranf
        print("Вы сходили в больницу, потратив на лечение "+str(ranf)+"$.")
    if money <= -1:
        print("Вы обанкротились и заболели. На лечение и еду вам не хватает денег.")
        health = 0
    if a == ("shop"):
        print("Вы входите в магазин и видите товары:")
        tovaru = ["Чай", "Аптечка", "Яблоки", "Лотерейный билет"]
    if a == ("time"):
        print(str(time1)+":"+str(time2))

    if health <= 0:
        print("Конец игры. Ваше здоровье упало до нуля.")
        time.sleep(3)
        break
</code>

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

from threading import Thread

...

time1 = 0
time2 = 0

def time_tick():
    global time1, time2

    while True:
        time2 += 1
        time.sleep(0.3)
        if time2 == 60:
            time1 += 1
        if (time1 == 24) and (time2 >= 00):
            time1 = 0
            time2 = 0

thread_time = Thread(target=time_tick)
thread_time.start()
...


вставить суммирующий столбец в DataFrame Pandas
Голову сломал, как вставить в имеющийся DataFrame новый столбец, полученный суммированием значений слайса столбцов DataFrame?
Допустим, есть DataFrame:

type 01 02 03 04 05 06 07 08 09 10 11 12
t1   1  1  1  1  1  1  1  1  1  1  1  1
t2   2  2  2  2  2  2  2  2  2  2  2  2
t3   1  2  3  4  5  6  7  8  9  10 11 12

Хочу получить:

type 01 02 03 04 05 06 07 08 09 10 11 12 total
t1   1  1  1  1  1  1  1  1  1  1  1  1  12
t2   2  2  2  2  2  2  2  2  2  2  2  2  24
t3   1  2  3  4  5  6  7  8  9  10 11 12 78

Допустим,
df = pd.DataFrame(np.random.randn(8, 3), columns=['A', 'B', 'C']).
Пока придумал только:
df['total'] = df.transpose().sum().transpose()


Tkinter, оптимизация разрешения окна
Писал олимпиадную задачу, и вот возникла проблема. Если запускать программу на разных операционных системах (или мониторах) интерфейс часто ломается.
Возможно, есть какие-то путь оптимизации окна? Можно ли задать значения параметров
width и
height в процентах от расширения монитора, или что-то вроде этого?

По сути, подобной возможности нет. Но можно узнать расширение монитора пользователя и указать какой либо процент от него. Например, окно с расширением в 80% от монитора:
<code>
import tkinter

root = tkinter.Tk()
x = root.winfo_screenwidth()  # размер  по горизонтали
y = root.winfo_screenheight()  # размер по вертикали

root.geometry('{}x{}'.format(int(x*0.8), int(y*0.8))) # обязательно должно быть целое число

tkinter.mainloop()
</code>


SQLAlchemy.Один ко многим к себе
Могу ли я сделать отношение в SQLAlchemy, так, чтобы экземпляр объекта хранил в себе несколько других экземпляров этого же класса?Чтобы было понятнее: у меня есть таблица пользователей, и каждый пользователь может иметь,например,подписчиков, которые тоже являются пользователями. Можно ли это реализовать при помощи
sqlalchemy.orm.relationship или других инструментов SQLAlchemy?Заранее спасибо!

Да, можете. У вас в таблице Users, должно быть поле id_user и pid_user (ид родительского пользователя).
Модель такой таблицы на алхимии будет следующей:
<code>
class User(Base):
    __tablename__ = 'user'

    id_user = Column(Integer, primary_key=True, unique=True)
    pid_user = Column(ForeignKey('user.id_user', ondelete='CASCADE', onupdate='CASCADE'), index=True)
    name = Column(String(15))

    respondent = relationship('User', remote_side=[id_user])
</code>


В чем проблема кода?
Хотел добавить стикер в телеграм бота, а получается такая вот проблемка

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

file = open('D:\\Folder\\Folder1\\','rb')

или так, литерал
r в данном случае отключает экранирование.

file = open(r'D:\Folder\Folder1\','rb')


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

def group_timestamp(dataset, size=False):
    """
        dataset - dataset
        returns: grouped data by timestamp
    """
    if size==False:
        data = dataset.groupby(['time']).mean()
        print('Trades from grouped data: {}'.format(data.shape[0]))
    else:
        if size==True:
            data_1 = dataset[['time','p']]
            data_2 = dataset[['time','s']]
            data_1 = data_1.groupby(['time']).mean()
            data_2 = data_2.groupby(['time']).sum()
            data = pd.concat([data_1, data_2],axis=1)
    return data

Вторая функция:

def get_target_size(data, predict_step = 5, trades = 5, limit=5):
    """
        data - dataset for preprocessing
        predict_step - the number of trades in the future where we want to predict the movement
        trades - the number of trades in the past we use for prediction
        return: X, y - attributes and target for models
    """
    data['step'] = data['p'].shift(predict_step)
    data['step_vol'] = data['s'].shift(predict_step)
    data['step-1'] = data['p'].shift(predict_step+1)
    for i in range(1, trades+1):
        data[i] = data['step-1'].pct_change(i)
    data.dropna(inplace = True)
    data['y'] = data['p'] - data['step']
    data['y'] = data['y'].apply(lambda s: 1 if s > 0 else 0)
    data['y'] = data.apply(filter_size, limit = limit, axis=1)
    y = data['y']
    y = y[:-trades]
    X = data.drop(['p', 'step', 'step-1', 'y', 'step_vol'], axis=1)
    X = X[:-trades]
    print('Classes distribution:')
    print(data['y'].value_counts())
    print('X shape: {}'.format(X.shape))
    print('y shape: {}'.format(y.shape))
#     print('Examples of X data: {}'.format(X.head()))
#     print('Examples of y data: {}'.format(y.head()))
    return X, y

Третья функция:

def data_split(X, y, size_valid = 0.15, size_test = 0.1):
    """
        X - attributes
        y - target variable
        size_valid - the size of the validation set. Might be (0...1). Uses for the model evaluation
        size_test - the size of the test set. Might be (0...1). Uses for the model predictions
        return:
            - X_train_t - dataset for training, attributes
            - y_train_t - dataset for training, target
            - X_train_v - dataset for validation after training, attributes
            - y_train_v - dataset for validation after training, target
            - X_test - dataset for testing the model after training, attributes
            - y_test - dataset for testing the model after training, target
    """
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=size_test)
    X_train_t, X_train_v, y_train_t, y_train_v = train_test_split(X_train, y_train, test_size=size_valid)
    print('Train set size: {}, {}'.format(X_train_t.shape, y_train_t.shape))
    print('Validation set size: {}, {}'.format(X_train_v.shape, y_train_v.shape))
    print('Test set size: {}, {}'.format(X_test.shape, y_test.shape))
    return (X_train_t, y_train_t, X_train_v, y_train_v, X_test, y_test)

Обучение модели:

clf = LGBMClassifier()
clf.fit(X_train, y_train)

Сейчас я использую эти функции друг за другом, вызывая следующую функцию, после предыдущей.
Как эти 3 функции завернуть в один
pipeline?
Нужно ли для этого изменять функции, описанные выше?
Я хочу иметь что-то вроде:

pipeline = Pipeline([
    ('group_time', group_timestamp),
    ('get_target', get_target_size),
    ('split', data_split),
    ('clf',LGBMClassifier)])

    pipeline.fit(X_train,y_train)

Спасибо

Вы задали слишком обширный вопрос. Попробую ответить на некоторые моменты...

разделение на обучающую и тестовую выборку обычно делается до / вне pipeline
в функции
get_target_size() - вы создаете и возвращаете
y кроме
X. Сорее всего это не будет работать потому, что метод
.fit() обычно возвращает
self, а метод
.fit_transform() обычно возвращает трансформированный
X. Ни один из них не возвращает
y, соответственно все манипуляции с
y - не сохраняются в
pipeline, т.е. теряются

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


Как я могу передать переменную в функцию к которой применен valueChanged?
Мне нужно передать переменную в функцию. Я пробовал это сделать через
lambda, но почему-то функция не видит переменную
val.

    menuAnimation = QtCore.QVariantAnimation()
    menuAnimation.valueChanged.connect(lambda val=1: self.resizeMenu(val))

def resizeMenu(self,value,val=''):
    print(val)

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

Попробуйте так:
<code>
    menuAnimation = QtCore.QVariantAnimation()
    # menuAnimation.valueChanged.connect(lambda val=1: self.resizeMenu(val))
    menuAnimation.valueChanged.connect(lambda value, val=1: self.resizeMenu(value, val))

def resizeMenu(self, value, val=''):
    print(val)
</code>


Python. Помогите, работа со строками
Например:
text = "какой то текст"
Нужно вывести text без "какой", как это сделать?

Если вам нужно убрать конкретное количество букв в начале, вы можете вывести так:

text = "какой то текст"
print(text[len('какой '):]) # то же самое, что print(text[6:])

Если нужно убрать именно первое слово, независимо от его длины, это можно сделать так:

text = "какой то текст"
print(text.split(' ', 1)[1])

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

то текст


Как правильно пользоваться Pandas для вычисления частоты вхождений в DataFrame?
Имею DataFrame:

ID  2020-01 2020-02 2020-03
1   'ex1'   'ex1'   'ex3'
2   'ex1'   'ex1'   'ex3'
3   'ex2'   'ex2'   'ex3'
4   'ex1'   'ex1'   'ex3'
5   'ex2'   'ex3'   'ex3'

Хочу получить следующий DataFrame:

      '2020-01' 2020-02' 2020-03'
'ex1'  3        3        0
'ex2'  2        1        0
'ex3'  0        1        3

Я, конечно, реализовал это циклами, но это же можно и нужно сделать в стиле Pandas.


Изменение величины (от-до) исходя из другой величины (от-до)
Помогите в вопросе, может кто сталкивался.
Не могу сам додуматься как написать в математической формуле решение.
Есть величины длины и высоты от которых будет меняться третье число (оно допустим от 0 до 8), именно, что от 0 до 8 иначе перебор или недобор.
То есть, есть величины:
<code>
from random import*
width     #длина  - величина изменяемая пользователем (от 0 до 640)
height    #высота - величина изменяемая пользователем (от 0 до 360)
width_max = 640     #длина - величина постоянная
height_max = 360    #высота- величина постоянная
size      # размер от 0 до 8ми (который мы будем получать имея входные данные "длины" и "высоты")
</code>
И необходимо изменять Size исходя из значения width и height, чем больше тем больше другое...
Если кто-то поможет в написании формулы или подскажет может уже есть готовая функция (изменения значения от-до исходя из значений от-до)
Заранее спасибо.

Можно рассмотреть такой вариант. Width от 0 до 4, height от 0 до 4.

   max_width =640
   max_height =360
   bit_width=max_width//4
   bit_height=max_height//4

   d_width= width /bit_width
   d_height= height /bit height
   size = d_width + d height
   size_int = round (size, 0)

Вообще чтобы перевести отрезок [0,a] в [0,b] нужно все элементы [0,a] умножить на b/a.
Для пилообразной функции с максимумом в 300 и нулем в 150 и 450 получаем

   d_width = 4-4*abs(witdh-300)/150


Пропадает возможность делать слайс по периоду после объединения двух DataFrame Pandas
Имею два DataFrame (res, descr) со следующим набором колонок:

MultiIndex([(          'bucket', '2020-01'),
            (          'bucket', '2020-02'),])

Момент, на который здесь необходимо обратить внимание, это тип данных второго элемента MultiIndex, а именно
pandas._libs.tslibs.period.Period:

type(descr.columns[0][1]) # pandas._libs.tslibs.period.Period
type(res.columns[0][1])   # pandas._libs.tslibs.period.Period

В нужный момент объединяю массивы:

total_df = res.merge(descr, how='left', left_on='calculationID', right_on='calculationID', suffixes=('_res', '_descr'), sort=True)

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

MultiIndex([(                'bucket', 2020-01),
            (                'bucket', 2020-02),])

То есть, визуально, второй элемент MultiIndex уже не заключен в кавычки.
При этом, тип этого элемента по-прежнему
pandas._libs.tslibs.period.Period:

type(total_df.columns[0][1]) # pandas._libs.tslibs.period.Period

Проблема заключается в том, что в объединенном DataFrame пропадает возможность делать слайс по периоду во втором элементе.
До объединения датафреймов следующая конструкция позволяет отфильтровать только нужные месяцы:

descr.head(1).loc[:, idx[:, idx['2020-01': '2020-02']]]

Результат:

              confiscation_cost    days_for_confiscation
period        2020-01   2020-02    2020-01   2020-02
calculationID
ID 1          10        20         1         2

Если же пытаюсь тем же способом отобрать в объединенном DataFrame столбцы, ловлю ошибку
KeyError: '2020-01':

In: total_df.head(1).loc[:, idx[:, idx['2020-01': '2020-02']]]
Out: ...KeyError: '2020-01'

UPD1 код для генерации тестовых массивов:

res = {
    ('bucket', pd.Period('2020-01', 'M')): {'ID1': '1.0', 'ID2': '1.0', 'ID3': '1.0', 'ID4': '1.0', 'ID5': '1.0'},
    ('bucket', pd.Period('2020-02', 'M')): {'ID1': '1.0', 'ID2': '1.0', 'ID3': '1.0', 'ID4': '1.0', 'ID5': '1.0'},
    ('bucket', pd.Period('2020-03', 'M')): {'ID1': '1.0', 'ID2': '1.0', 'ID3': '1.0', 'ID4': '1.0', 'ID5': '1.0'},
    ('bucket', pd.Period('2020-04', 'M')): {'ID1': '1.0', 'ID2': '1.0', 'ID3': '1.0', 'ID4': '1.0', 'ID5': '1.0'},
      }
res = pd.DataFrame(res)
res.index.rename('calculationID', inplace=True)

descr = {
    ('mark', pd.Period('2020-01', 'M')): {'ID1': 'm1', 'ID2': 'm1', 'ID3': 'm2', 'ID4': 'm2', 'ID5': 'm1'},
    ('mark', pd.Period('2020-02', 'M')): {'ID1': 'm1', 'ID2': 'm2', 'ID3': 'm3', 'ID4': 'm4', 'ID5': 'm2'},
    ('mark', pd.Period('2020-03', 'M')): {'ID1': 'm1', 'ID2': 'm2', 'ID3': 'm3', 'ID4': 'm4', 'ID5': 'm2'},
    ('mark', pd.Period('2020-04', 'M')): {'ID1': 'm1', 'ID2': 'm2', 'ID3': 'm3', 'ID4': 'm4', 'ID5': 'm2'},
}
descr = pd.DataFrame(descr)
descr.index.rename('calculationID', inplace=True)

"Костылем" является обращение в слайсе через pd.Period:

total_df.loc[:, idx[:, pd.Period('2020-01'):pd.Period('2020-02')]]

Результат:

              bucket            mark
              2020-01  2020-02  2020-01  2020-02
calculationID
ID1           1.0      1.0      m1       m1
ID2           1.0      1.0      m1       m2
ID3           1.0      1.0      m2       m3
ID4           1.0      1.0      m2       m4
ID5           1.0      1.0      m1       m2

В идеале конечно понять почему в исходных массивах (до объединения) все работает без дополнительного явного преобразования строки в объект класса Period.


Ошибка при добавлении поста
Разбираю книгу "Меле А. - Django 2 в примерах", все делал пошагово, настроил файл models.py следующим образом:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Post(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
    )
    title = models.CharField(max_length=250)  # поле заголовка статьи
    slug = models.SlugField(max_length=250, unique_for_date='publish')  # поле для формирования url
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')  # внешний ключ(один к многим) автор статьи
    body = models.TextField()  # содержание статьи/текст
    publish = models.DateTimeField(default=timezone.now)  # дата публикации
    created = models.DateTimeField(auto_now_add=True)  # дата создания
    updated = models.DateTimeField(auto_now=True)  # дата изменения
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')  # статус статьи

    class Meta:  # класс, содержащий метаданные: порядок сортировки по убыванию даты публикации
        ordering = ('-publish',)

    def __str__(self):  # метод __str__ возвращает отображение объекта понятное человеку
        return self.title

выполнил миграции, создал суперюзера. И при добавлении поста в админке получаю следующую ошибку:

Exception Type: OperationalError at /admin/blog/post/add/
Exception Value: no such table: main.auth_user__old

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

Это ошибка
Django, которая была исправлена в более новых версиях.
Просто обновите framework:

pip install -U django


Как убрать 're.Match object..' из строки вывода?
ищу слово в строке регуляркой

str0 = r'хххх хххххххх Х. ххх ХХХ хххх 7б-206'
room = (re.search(r'[0-9]{1,2}[а-я]{1}-[0-9]*[а-я]*', str0))
print(room)

Результат:
<re.Match object; span=(41, 47), match='7б-206'>
Можно ли получить чистое значение '7б-206'?

import re
str0 = r'хххх хххххххх Х. ххх ХХХ хххх 7б-206'
room = (re.search(r'[0-9]{1,2}[а-я]{1}-[0-9]*[а-я]*', str0))
print(room.group(0))

Результат:

7б-206


Как сделать так, чтобы при вводе не цифр, выдавалось сообщение об ошибке, в python tkinter
Есть текстовое поле:
<code>
txt = Entry(window,width=15)
txt.grid(column=1, row=0)
txt.focus()
</code>
Как сделать чтобы если пользователь вводил не число, то выскакивало сообщение об ошибке?

import tkinter as tk
from tkinter import messagebox

class window:
    def __init__(self, master1):
        self.panel2 = tk.Frame(master1)
        self.panel2.grid()
        self.button2 = tk.Button(self.panel2, text = "Quit", command = self.panel2.quit)
        self.button2.grid()
        vcmd = (master1.register(self.validate),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.text1 = tk.Entry(self.panel2, validate = 'key', validatecommand = vcmd)
        self.text1.grid()
        self.text1.focus()

    def validate(self, action, index, value_if_allowed,
                       prior_value, text, validation_type, trigger_type, widget_name):
        if value_if_allowed:
            try:
                float(value_if_allowed)
                return 1
            except ValueError:
                messagebox.showerror("Title", "your error")
                return 0

        else:
            messagebox.showerror("Title", "your error")
            return 0

root1 = tk.Tk()
window(root1)
root1.mainloop()


Решите в целых числах уравнение ax + b = 0

Задача:
Даны числа a и b. Решите в целых числах уравнение ax+b=0. Выведите все
  целочисленные решения этого уравнения, если их число конечно, выведите
  слово "NO", если решений нет, выведите слово "INF", если целочисленных
  решений бесконечно много.
Входные данные:
  Вводятся два целых числа, не превышающих 30000 по абсолютному
  значению.
Выходные данные:
  Выведите ответ на задачу.
Примеры:

Ввод:

6
-2

Вывод:

NO

Ввод:

1
-7

Вывод:

7

Что не так с кодом? Выдает, что ответ неверный:

a=int(input())
b=int(input())
if a!=b:
  if b%a==0:
    print (-b//a)
  else:
     print('NO')
  if b==0:
   print ('INF')
else:
  print ('NO')

a = int(input())
b = int(input())

if (a == 0 and b == 0):
    print('INF')
elif (a == 0 or (b % a) != 0):
    print('NO')
else:
    print(int(-b / a))


Умножение индексов, без создания новых c выводом по условию
Как решить задание, не сходиться с ответом (ответ не знаю). Мне кажется проблема в том, что не правильно отработал с индексами, наплодил много новых, а не изменил лишь имеющиеся сто.
Вот задание:
Возведите каждое значение серии в 3 степень, а значения индекса увеличьте в 3 раза.
Ответьте на следующие вопросы через запятую (без пробелов)

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

Так пробую решить:

np.random.seed(242)
    d = pd.Series(data = np.random.normal(size=100))
    n_i = np.arange(0,100)
    n_i = n_i*3
    d = d**3
    d1 = pd.Series(data = d, index = n_i)
    logical_results = (d1 < 2.6) & (d1.index % 2 != 0)
    print(np.sum(d1[logical_results]))
    logical_results = (d1 < 0)
    len(d1[logical_results])
    #ответ -0.23,17

Попробовал метод @MaxU ,но не сходиться с его ответом. В чем дело?

np.random.seed(242)
### Type your code here
d = pd.Series(data = np.random.normal(size=100))
d = d**3
d.index *= 3
print(d.loc[(d.index % 2 ) & (d < 2.6)].sum())
(d < 0).sum()

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

# Возведите каждое значение серии в 3 степень
d = d**3
# значения индекса увеличьте в 3 раза
d.index *= 3

ответ 1:

In [19]: d.loc[(d.index % 2 != 0) & (d < 2.6)].sum()
Out[19]: -15.150748101821666

ответ 2:

In [143]: (d < 0).sum()
Out[143]: 51

пояснения:

(d < 0) - вернет серию значений типа
bool. В Pandas, как и в Python,
True - представлена значением
1,
False - значением
0. Соответственно если просуммировать список / ndarray / pd.Series элементов с типом данных
bool то получим число элементов со значением
True.
Пример:

In [157]: np.array([False, False, False, True, True]).sum()
Out[157]: 2


Как указать тип временных данных при загрузке датафрейма?
Есть файлик с данными вида '%Y-%m-%d'

datetime_click
2017-03-01
2017-03-02
2017-03-03
2017-03-04
2017-03-05

Можно ли при загрузке его в датафрейм сразу указать для колонки формат datatime?
Или другими словами что подставить сюда?

df = pd.read_csv('result.csv', dtype={'datetime_click':'????????????'})

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

def convert_to_datetime(row):
    prom_data = datetime.strptime(row['datetime_click'], '%Y-%m-%d')
    return prom_data
df['datetime_click'] = df.apply(convert_to_datetime, axis=1)

И только потом фильтровать с помощью следующего алгоритма

startDate = '2017-03-03'
endDate = '2017-03-04'
startDate_datetime = datetime.strptime( startDate, '%Y-%m-%d' )
endDate_datetime = datetime.strptime( endDate, '%Y-%m-%d' )
df = df[(df['datetime_click'] >= startDate_datetime) &
        (df['datetime_click'] <= endDate_datetime)]

Нельзя ли как то сразу использовать этот алгоритм?

Воспользуйтесь параметром pd.read_csv(parse_dates=[...]):
<code>
df = pd.read_csv('result.csv', parse_dates=['datetime_click'])
</code>


Не могу добавить функцию в телеграм боте [закрыт]

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

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

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

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

Не могу добавить функцию

import random
def random_text():
  array = [
  'Текст',
  'Текст',
  'Текст',
  'Тексt'
  ]

  print( "Текст: " + random.choice(array) )

  if random.choice(array) == 'Текст':
    print("It's working")
  else:
    print("Текст")
random_text()

В телеграм бота

import telebot
import random

bot = telebot.TeleBot("Token Bota")

@bot.message_handler(content_types=['text'])
def start(message):
    if message.text == 'Random':#Если пользователь напишет рандом,то
     #здесь должна запуститься функция
    else:
        bot.send_message(message.from_user.id, 'Я тебя не понимаю')

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

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

def random_text():
    array = [
        'Текст',
        'Текст',
        'Текст',
        'Тексt'
    ]

    if random.choice(array) == 'Текст':
        return "It's working"
    else:
        return "Текст"

а вот так подключить её в бота:

@bot.message_handler(content_types=['text'])
def start(message):
    if message.text == 'Random':
        bot.send_message(message.from_user.id, random_text())
    else:
        bot.send_message(message.from_user.id, 'Я тебя не понимаю')


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

def filter_size(row, limit=20):
    if (row['y']==1) & (row['s']>limit) & (row['step_vol']>limit):
        val = 1
    else:
        val = 0
    return val

Как видите, в этой функции есть 2 параметра:
row,
limit
Функцию filter_size, я использую внутри  другой функции:

def get_target_size(data, predict_step = 5, trades = 5):
    """
        data - dataset for preprocessing
        predict_step - the number of trades in the future where we want to predict the movement
        trades - the number of trades in the past we use for prediction
        return: X, y - attributes and target for models
    """
    data['step'] = data['p'].shift(predict_step)
    data['step_vol'] = data['s'].shift(predict_step)
    data['step-1'] = data['p'].shift(predict_step+1)
    for i in range(1, trades+1):
        data[i] = data['step-1'].pct_change(i)
    data.dropna(inplace = True)
    data['y'] = data['p'] - data['step']
    data['y'] = data['y'].apply(lambda s: 1 if s > 0 else 0)
    data['y'] = data.apply(filter_size, axis=1)
    y = data['y']
    y = y[:-trades]
    X = data.drop(['p', 'step', 'step-1', 'y', 'step_vol'], axis=1)
    X = X[:-trades]
    print('Classes distribution:')
    print(data['y'].value_counts())
    print('X shape: {}'.format(X.shape))
    print('y shape: {}'.format(y.shape))

    return X, y

Как я могу изменять параметры первой функции
filter_size (скажем, я хочу задать
limit=50) при вызове второй функции
get_target_size?
Сейчас мне приходтся каждый раз корректировать функцию
filter_size, когда я хочу изменить
limit, что не очень удобно

def get_target_size(data, predict_step=5, trades=5, limit=50):
    ...
    data['y'] = data.apply(filter_size, limit=limit, axis=1)
    ...


Объединить два DataFrame, имеющих заголовки разных уровней, по общему полю
Имею два массива, совпадающих по ID, но разных по набору колонок - в одном заголовки 2-х уровневые, в другом - одноуровневые.
Первый, допустим, df1 (содержит информацию о значениях profit и loss в разрезе месяцев и ID):

           profit            loss
period     2020-01  2020-02  2020-01  2020-02
ID
1          10       10       1        4
2          20       20       2        5
3          30       30       3        6
4          40       40       4        7

Второй df2 (содержит некое строковое описание конкретного ID в месяце):

period  2020-01  2020-02
ID
1       'str1'   'str1'
2       'str1'   'str1'
3       'str1'   'str2'
4       'str1'   'str2'

Надо получить res:

           profit            loss              description
period     2020-01  2020-02  2020-01  2020-02  2020-01  2020-02
ID
1          10       10       1        4        'str1'   'str1'
2          20       20       2        5        'str1'   'str1'
3          30       30       3        6        'str1'   'str2'
4          40       40       4        7        'str1'   'str2'

Делаю так:

res = df1.merge(df2, how='left', left_on='ID', right_on='ID')

Получаю предупреждение:

UserWarning: merging between different levels can give an unintended result (2 levels on the left, 1 on the right)

Задача:
в df2 добавить заголовок 1-го уровня description, чтобы обеспечить одинаковый уровень - ?


Проблемы с запуском Celery-задач в асинхронной функции
В проекте, в качестве endpoint'ов используются асинхронные функции.
Есть необходимость запускать Celery-задачу внутри endpoint'а.
Функция (celery task):

@celery_app.task
def some_celery_func(arg1):
    ...

Запускаю её внутри асинхронной функции (endpoint'а) следующей командой:

some_celery_func.delay(11)

В терминале запущен воркер:
celery -A <myproj> worker -E -l INFO
Версия Celery: 4.4.0
Версия Python: 3.7
Проблема:
Celery задача запускается, в буквальном смысле, через раз.
Вопрос:
В чём может быть проблема и как её возможно разрешить?

Установил причину такого поведения.
Дело в том, что worker'ы подвисли и "превратились в демонов" оторвавшись от родительского процесса.
Как выяснил:

Отключил worker в терминале.
Открыл админ-панель rabbitmq.
Открыл "Очередь" -> выбрал главную очередь.

Инициировал запуск Celery-задачи.
В графике увидел, что не смотря на то, что мой worker выключен rabbitmq принял запрос и обработал его.
В терминале, с помощью htop, просмотрел текущие процессы и треды.
Принудительно завершил подвешанные worker'ы.
Далее:

Запустил worker в терминале.
Повторно инициировал несколько запусков Celery-задачи.
В графике и в терминале увидел, что все задачи успешной отработаны.

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