как правильно объявить глобальные переменные?
Пытаюсь сделать файл настроек (colors.py) Суть в том чтобы при смене значения "THEME = " переменным присваивалось определенное значение. в данном случае все красиво, но пишет что переменная не является глобальной, ссылаться каждый раз именно на эту функцию не вариант. объявлять каждую переменную через global еще то занятие... подскажите как правильно и попроще прописать все переменные?

THEME = "Light"           # Light, Dark, WLight, WDark
ICONS = "Colors"          # Colors, Monochrome

def Light():
    # главные цвета программы
    color_background = "#F2F2F2"
    color_background_hover = "#E5E5E5"
    color_border = "#666666"
    # цвета иконки перемещения
    color_label = "#333333"
    color_label_hover = "#666666"
    # цвета иконок главного меню
    if   ICONS == "Colors":       color_icon = "#3497D8"; color_icon_select = "#ff6a00";
    elif ICONS == "Monochrome":   color_icon = "#333333"; color_icon_select = "#00000000";
    # цвета подгрупп
    color_group_background = "#F2F2F2"
    color_group_border = "#D3D3D3"
    color_group_border_hover = "#B6B6B6"
    # цвета контекстного меню
    color_context_background = "#FFFFFF"
    color_context_background_hover = "#333333"
    color_context_border = "#333333"

def Dark():
...
def WLight():
...
def WDark():
...

if   THEME == "Light":   Light()
elif THEME == "Dark":    Dark()
elif THEME == "WLight":  WLight()
elif THEME == "WDark":   WDark()

Вопрос решил очередным if:

# Настройки цветов
THEME = "Light"           # Light, Dark, WLight, WDark
ICONS = "Colors"          # Colors, Monochrome

if   THEME == "Light":
    # главные цвета программы
    color_background = "#F2F2F2"
    color_background_hover = "#E5E5E5"
    color_border = "#666666"
    # цвета иконки перемещения
    color_label = "#333333"
    color_label_hover = "#666666"
    # цвета иконок главного меню
    if   ICONS == "Colors":       color_icon = "#3497D8"; color_icon_select = "#ff6a00";
    elif ICONS == "Monochrome":   color_icon = "#333333"; color_icon_select = "#00000000";
    # цвета подгрупп
    color_group_background = "#F2F2F2"
    color_group_border = "#D3D3D3"
    color_group_border_hover = "#B6B6B6"
    # цвета контекстного меню
    color_context_background = "#FFFFFF"
    color_context_background_hover = "#333333"
    color_context_border = "#333333"
    print ("Light")

elif THEME == "Dark":
...

elif THEME == "WLight":
...

elif THEME == "WDark":
...

Дополнительный вопрос 2:
не получается встроить динамическое изменение темы при нажатии на кнопку,
и как правильно импортировать в icon.py?
файл main.py

from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QFrame, QLabel, QMenu
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import QPoint
from PyQt5 import QtWidgets as qtw
from PyQt5.QtGui import QPixmap
from PyQt5.QtSvg import QSvgWidget, QSvgRenderer

class Ui_MainWindow(QMainWindow):
# --- Основное Окно Программы ---
    def __init__(self):
        super().__init__()

        self.mwidget = QMainWindow(self)
        self.setWindowFlags(QtCore.Qt.Tool | QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        self.setGeometry(QtCore.QRect(100, 100, 200, 200))

        self.pbx1 = QPushButton(self)
        self.pbx1.setObjectName("pbx1")
        self.pbx1.setGeometry(QtCore.QRect(1, 15, 45, 45))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("G4.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pbx1.setIcon(icon)
        self.pbx1.setIconSize(QtCore.QSize(30, 30))
        self.pbx1.clicked.connect(lambda: self.setTheme(themes.ThemeDark))

# --- Показать Окно ---
        self.show()

    def setTheme(Theme):
        theme=Theme

# --- Запуск Окна Программы ---
if __name__ == "__main__":
    import themes
    theme=themes.ThemeLight
    button=themes.ButtonColors
    import sys
    app = QApplication(sys.argv)
    ex = Ui_MainWindow()
    sys.exit(app.exec_())

файл themes.py

class ThemeLight:
    # главные цвета программы
    color_background = "#F2F2F2"
    color_background_hover = "#E5E5E5"
    color_border = "#666666"
    # цвета иконки перемещения
    color_label = "#333333"
    color_label_hover = "#666666"
    # цвета подгрупп
    color_group_background = "#F2F2F2"
    color_group_border = "#D3D3D3"
    color_group_border_hover = "#B6B6B6"
    # цвета контекстного меню
    color_context_background = "#FFFFFF"
    color_context_background_hover = "#333333"
    color_context_border = "#333333"

class ThemeDark:
    color_background = "#000000"
    # ...

class ThemeWLight:
    color_background = ""
    # ...

class ThemeWDark:
    color_background = ""
    # ...

class ButtonColors:
    color_icon = "#3497D8"
    color_icon_select = "#ff6a00"

class ButtonMonochrome:
    color_icon = "#333333"
    color_icon_select = "#00000000"

файл icons.py

import themes
theme=themes.ThemeLight

CL    =   theme.color_label

# Иконка Label вертикальная
icon_label_vertical = """
<svg>
<path fill="%s" opacity="1.00" d=" M 154.00 14.00 C 158.66 14.00 163.33 14.00 168.00 14.00 C 167.99 18.67 168.00 23.33 168.00 28.00 C 163.33 28.00 158.67 28.00 154.00 28.00 C 153.99 23.33 154.00 18.67 154.00 14.00 Z" />
</svg>""" % CL

при нажатии на кнопку:

Process finished with exit code -1073740791 (0xC0000409)

Дополнительный вопрос 3:
Почему не меняет цвет setStyleSheet?
themes.py:

class ThemeLight:
    test = "#FF0000"

class ThemeDark:
    test = "#00FF00"

main.py:

from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QFrame, QLabel, QMenu
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtCore import QPoint
from PyQt5 import QtWidgets as qtw
from PyQt5.QtGui import QPixmap
from PyQt5.QtSvg import QSvgWidget, QSvgRenderer
import icons, themes

class Ui_MainWindow(QMainWindow):

# --- Основное Окно Программы ---
    def __init__(self):
        super().__init__()

        self.mwidget = QMainWindow(self)
        self.setWindowFlags(QtCore.Qt.Tool | QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        self.setGeometry(QtCore.QRect(100, 100, 200, 200))
        self.setStyleSheet("""
                  QFrame#frame {
                      background-color: %s;
                  }
            """ % theme.test)

        self.frame = QFrame(self)
        self.frame.setObjectName("frame")
        self.frame.setGeometry(QtCore.QRect(0, 0, 200, 200))

        print (theme.test)

        self.pbx1 = QPushButton(self)
        self.pbx1.setObjectName("pbx1")
        self.pbx1.setGeometry(QtCore.QRect(1, 15, 45, 45))
        self.pbx1.clicked.connect(lambda: setTheme(themes.ThemeDark))

# --- Показать Окно ---
        self.show()

def setTheme(Theme):
    theme=Theme
    print (theme.test)

# --- Запуск Окна Программы ---
if __name__ == "__main__":
    theme=themes.ThemeLight
    import sys
    app = QApplication(sys.argv)
    ex = Ui_MainWindow()
    sys.exit(app.exec_())

1) Объявляете глобальные переменные вне функций:

color_background = ""
color_background_hover = ""
color_border = ""
...
def Light():
...

2) Внутри функций, где будете менять значения глобальных переменных первой строкой пишите
global <переменная>:

...
def Light():
   global color_background, color_background_hover, ...

...

3) Теперь, все присваивания глобальным переменным изменят их

def Light():
   global color_background, color_background_hover, ...
   color_background = "#F2F2F2"
...

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

class Theme:
    # главные цвета программы
    color_background = ''
    color_background_hover = ''
    color_border = ''
    # цвета иконки перемещения
    color_label = ""
    color_label_hover = ""
    # цвета иконок главного меню
    color_icon = ''
    color_icon_select = ''
    ...

class ThemeLight(Theme):
    color_background = "#F2F2F2"
    color_background_hover = "#E5E5E5"
    color_border = "#666666"
    ...

class ThemeLightColors(ThemeLight):
    # color_background и остальные переменные уже определены в ThemeLight
    color_icon = "#3497D8"
    color_icon_select = "#ff6a00"
    ...

class ThemeLightMonochrome(ThemeLight):
    # color_background и остальные переменные уже определены в ThemeLight
    color_icon = "#333333"
    color_icon_select = "#00000000"
    ...

Использование:

# Создавать объект не нужно -- поля объявлены у самого класса
theme = ThemeLightColors
print(theme.color_background)
print(theme.color_icon)
print(theme.color_icon_select)
# #F2F2F2
# #3497D8
# #ff6a00

# Поэтому можно и так:
print(ThemeLightColors.color_background)
print(ThemeLightColors.color_icon)
print(ThemeLightColors.color_icon_select)
# #F2F2F2
# #3497D8
# #ff6a00

# Пример функции, принимающей темы
def set_theme(theme: Theme):
    print(theme.color_background)
    print(theme.color_icon)
    print(theme.color_icon_select)
    ...

set_theme(ThemeLightColors)
set_theme(ThemeLightMonochrome)


Преобразование временного формата
Как убрать ноль в начале строки во втором ассерте?
<code>
def time_converter(time):
        #replace this for solution
        time=time.split(':')
        for i,item in enumerate(time):
            time[i]=int(item)
        #z=list(time[0])
       # for i,item in enumerate(z):
          #  z[i]=int(item)
        if time[0]>12:
            time[0]-=12
            return str(time[0])+':'+str(time[1])+' p.m.'
        elif time[0]==12:
            return str(time[0])+':'+str(time[1])+' p.m.'
        elif time[0]<12:
            return str(time[0])+':'+str(time[1])+' a.m.'
        elif z[0]==0:

            return str(z[1])+':'+str(time[1])+' a.m.'

    if __name__ == '__main__':
        print("Example:")
        print(time_converter('12:30'))

        #These "asserts" using only for self-checking and not necessary for auto-testing
        assert time_converter('12:30') == '12:30 p.m.'
        assert time_converter('09:00') == '9:00 a.m.'
        assert time_converter('23:15') == '11:15 p.m.'
</code>
Вы предпочитаете использовать 12-часовой формат времени, но современный мир живет в 24-часовом формате и вывидите это повсюду. Ваша задача - переконвертировать время из 24-часового формата в 12-часовой, использкя следующие правила:
- выходной формат должен быть 'чч:мм a.m.' (для часов до полудня) или 'чч:мм p.m.' (для часов после полудня)
- если часы меньше 10 - не пишите '0' перед ними. Например: '9:05 a.m.'
Как убрать ноль в начале строки во втором ассерте?

Аналогичное соседнему ответу, но через
datetime:

from datetime import datetime

def time_converter(t: str):
    return datetime\
        .strptime(t, '%H:%M').strftime('%I:%M %p')\
        .lstrip('0').lower().replace('m', '.m.')

if __name__ == '__main__':
    print("Example:")
    print(time_converter('12:30'))

    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert time_converter('12:30') == '12:30 p.m.'
    assert time_converter('09:00') == '9:00 a.m.'
    assert time_converter('23:15') == '11:15 p.m.'


На каком языке лучше всего начать изучать программирование [закрыт]

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

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

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

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

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

В самую первую очередь, тебе нужно изучить алгоритмизацию. Это позволит мыслить "как программист" - умение разделить задачу на чёткую последовательность действий и условий. Человек знающий алгоритмизацию сможет писать на любом языке, т.к. ему понадобится лишь узнать, какими командами в синтаксисе нужного языка выражается действие, которое необходимо сделать.
Второе - выбрать направление. У программирования много отраслей, порой достаточно далёких друг от друга. Можно писать приложения, сайты, программы для мобильных устройств, игры, серверные, клиентские, и так далее. Когда направление выбрано - можно начинать смотреть видеоуроки для начинающих на ютубе, читать книги, и тд.
Третий этап - когда уже получены базовые знания синтаксиса, переписано несколько примеров из обучения - стараться комбинировать знания, придумывать что то своё, совмещая знания полученные в процессе обучение.
...ну и так далее
P.S.: По поводу английского - смотри фильмы с субтитрами, пользуйся не-русифицированными программами, но обучаться лучше по возможности используя русскоязычную документацию, т.к. переводя переводчиком с англ можно не понять тонкостей каких то аспектов.


Почему источник 'undef' не заменяется на источник 'other'?
Дана задача с исходными данными:

import pandas as pd
logs = pd.read_csv('/datasets/logs.csv')
logs['email'] = logs['email'].fillna(value='')

logs.loc[logs['source'] == 'None', 'source'] = 'email'

logs_grouped = logs.groupby('source').agg({'purchase': ['count', 'sum']})
logs_grouped['conversion'] = logs_grouped['purchase']['sum'] / logs_grouped['purchase']['count']

Необходимо:
объединить (с помощью замены значения источника) источник 'undef' c 'other' и подсчитать конверсию после замены 'undef' на 'other'.

logs.loc[logs['source'] == 'undef', 'source'] == 'other'

logs_grouped = logs.groupby('source').agg({'purchase': ['count', 'sum']})
logs_grouped['conversion'] = logs_grouped['purchase']['sum'] / logs_grouped['purchase']['count']
print(logs_grouped)

Почему источник 'undef' не заменяется на источник 'other'?

Причина в том, что вместо присваивания вы делаете сравнение:

logs.loc[logs['source'] == 'undef', 'source'] == 'other'
#  NOTE: -----------------------------------> ^^

Пример исходного DataFrame:

In [75]: df
Out[75]:
  source  purchase
0   None         1
1  undef         3
2    aaa         2
3    bbb         4
4    aaa         3
5  undef         1
6   None         2

Попробуйте сделать так:

In [76]: mapping = {"None":"email", "undef":"other"}

In [77]: df["source"] = df["source"].replace(mapping)

Результат:

In [78]: df
Out[78]:
  source  purchase
0  email         1
1  other         3
2    aaa         2
3    bbb         4
4    aaa         3
5  other         1
6  email         2

Кроме того
ser.sum() / ser.count() лучше заменить на
ser.mean():

In [79]: df.groupby("source")["purchase"].mean()
Out[79]:
source
aaa      2.5
bbb      4.0
email    1.5
other    2.0
Name: purchase, dtype: float64


Почему глобальная переменная не изменяется после её изменения в функции
Для понимания пространства имен и тестов создал скрипт из 3х файлов:
run.py

print(1)
from app import module1
print(6)
if __name__ == '__main__':
   print(7)
   module1.prepare_task()

app__init__.py  (empty)
app\module1.py

print(2)
print(5)
task_params = {1:11}
print(id(task_params))
from app import module2
def prepare_task():
    print(8)
    global task_params
    print(dir(), id(task_params))
    task_params = {}
    print(dir(), id(task_params))
    task_params['task1'] = {'task': module2.task1, 'data': 'some data'}
    print(task_params)
    task_params['task1']['task']()

app\module2.py

print(3)
from app.module1 import task_params
print(4)
print(task_params)
def task1():
    print(9)
    print(dir(), id(task_params))
    print(task_params)

Вопрос вот в чём:
1) если запустить как есть, вывод последней строки будет следующим и он меня устраивает:

{1: 11, 'task1': {'task': <function task1 at 0x0000022962905598>, 'data': 'some data'}}

Т.е.  получаю измененный в функции модуля 1 словарь.
2) если же раскомментировать в app\module1.py следующие 2 строки:
global task_params
task_params = {}
то вывод последней строки будет следующим и он меня НЕ устраивает:
{1: 11}
Я ожидал увидеть следующую последнюю строку:

{'task1': {'task': <function task1 at 0x0000022962905598>, 'data': 'some data'}}

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

"... операции непосредственного изменения объектов не рассматривают имена как локальные – это свойственно только операциям присваивания. Например, если имени L присвоен список, определенный на верхнем уровне в модуле, то такая инструкция, как L.append(X), внутри функции не будет классифицировать имя L как локальное, тогда как инструкция L = X — будет. В первом случае происходит изменение объекта списка, на который указывает L, а не самого имени L, – список L будет найден в глобальной области видимости, как обычно, и Python изменит этот список, без необходимости объявления имени global (или nonlocal). Этот пример должен помочь явственнее ощутить различия между именами и объектами: операция, изменяющая объект, совсем не то, что операция присваивания объекта имени." Доступ на присваивание к нелокальным именам
В нашем случае, когда в первом модуле мы пишем task_params = {}, мы делаем переменную task_params локальной. Вот и весь фокус.


Правильное оформление запроса MYSQL
Правильно ли такое оформление запроса? Выводит пустую таблицу при добавлении: HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
Или подскажите как отобрать данные за последний час?

sql = """
SELECT STR_TO_DATE(CONCAT(date, time), '%d.%m.%Y%h:%i:%s') AS datetime,
    last,
    vol,
    oper
    FROM all_trades
    HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
"""

Пример данных до запроса:

             date      time    last  vol  oper
0      14.10.2019  10:48:03  132330    1     S
1      14.10.2019  10:00:00  132840   24     B
2      14.10.2019  10:48:03  132330    1     B
3      14.10.2019  10:00:00  132840    1     S
4      14.10.2019  10:00:00  132830    1     S

Пример данных после запроса:

                 datetime    last  vol  oper
0     2019-10-14 10:48:03  132330    1     S
1     2019-10-14 10:00:00  132840   24     B
2     2019-10-14 10:48:03  132330    1     B
3     2019-10-14 10:00:00  132840    1     S
4     2019-10-14 10:00:00  132830    1     S

DDL таблицы:

+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| date  | text       | YES  |     | NULL    |       |
| time  | text       | YES  |     | NULL    |       |
| last  | int(11)    | YES  |     | NULL    |       |
| vol   | int(11)    | YES  |     | NULL    |       |
| oper  | varchar(7) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+

Полное оформление запроса:

connection = pymysql.connect(host='localhost', user='root', passwd='******', db='quotes')

sql = """
SELECT STR_TO_DATE(CONCAT(date, time), '%d.%m.%Y%h:%i:%s') AS datetime,
    last,
    vol,
    oper
    FROM all_trades
    HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
"""

df = pd.io.sql.read_sql(sql, connection)
connection.close()

Ваш запрос мягко говоря "не оптимален".
Использую
having, получается что базе данных приходится сначала преобразовать всю вашу таблицу к нужному виду, а потом уже отсекать лишние данные. Если таблица будет более менее большая, то ваш запрос начнет дико тормозить.
Для оптимизации вашего запроса, для начала предлагаю отсечь всё по дате добавив:

WHERE DATE_FORMAT(NOW(), '%d.%m.%Y') = date

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

and DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 HOUR), '%H:%i:%s') < time

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


Изменение одной переменной при изменении другой
Почему при изменении списка a меняется и список b и как от этого избавиться?
Если изменить функцию с init на обычную, ничего не изменится.
<code>
class nibba():
    def __init__(self):
        a = [1, 2, 3]
        b = a
        a.append(4)
        print(b)     # [1, 2, 3, 4]
nibba = nibba()
</code>

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

a = [1, 2, 3]
b = a
a.pop()
print(a,b) -> [1, 2], [1, 2]

изменится не только a, но и b, так как они ссылаются на один объект в памяти.
чтобы такого не было принято идти по двум инструкциям:

b = a[:]

либо

b = a.copy()


Как спарсить значения в строке?
Имеется строчка:
👤Rushka\n├❤566/500  ⚔778 🛡197\n├💪500 | 🎯1\n├🗣110 | 🤸🏽♂250\n├🔋9/19
Нужно спарсить значения: ник (👤), здоровья (❤), урон(⚔) и пр.
Написал вот так:

text = "👤Rushka\n├❤566/500  ⚔778 🛡197\n├💪500 | 🎯1\n├🗣110 | 🤸🏽♂250\n├🔋9/19"
param = re.findall(r'^👤(\w+)\b', text)
print(param)

symbols = ["👤", "⚔", "🛡"]
for value in text:
    print("value: " + value)
    for symbol in symbols:
        print("Symbol: " + symbol)
        print(re.findall(r'^{}(/w+)\b'.format(symbol), value))

Заметил, что в регулярное выражение в последней строчке не работает.
Почему оно не работает? Как лучше спарсить все значения?
p.s по итогу нужно занести значения в БД
p.s.s значения, которые имеют формат x/y (например, здоровье (❤566/500)) нужно брать второе значение, то бишь y.
Заранее спасибо!

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

import re
for c in '👤❤⚔🛡💪🎯🗣🤸🏽♂🔋':
    print(c, '\t', c.encode(encoding='unicode_escape'))
print()

text = ["👤Rushka\n├❤566/500  ⚔778 🛡197\n├💪500 | 🎯1\n├🗣110 | 🤸🏽♂250\n├🔋9/19",
        "👤BrainRTP\n├🤟 —\n├💣Мегатонна\n├❤14/14 | 🍗0% | ⚔18 | 🛡4\n├💪7 | 🎯3\n├🗣5 | 🤸🏽♂6\n├🔋5/5 | 👣0\n├🔥Нью-Рино\n├Портупея +3🛡 🔧100%\n├Вязаная шапка +1🛡 🔧66%\n├Мачете\n+11⚔ 🔧22%\n├🕳0\n├📦656💈0\n└Нейтральный",]
params = []
rx = re.compile(r'(?m)(👤|❤|⚔|🛡|💪|🎯|🗣|\U0001f938\U0001f3fd\u200d\u2642\ufe0f|🔋)\s*(?:\d+/)?(\w+)')
for t in text:
    params.append(dict(rx.findall(t)))
    for p in params[-1]:
        print(p, ':\t', params[-1][p])
    print()

Вывод:

👤   b'\\U0001f464'
❤    b'\\u2764'
    b'\\ufe0f'
⚔    b'\\u2694'
    b'\\ufe0f'
🛡   b'\\U0001f6e1'
💪   b'\\U0001f4aa'
🎯   b'\\U0001f3af'
🗣   b'\\U0001f5e3'
🤸   b'\\U0001f938'
🏽   b'\\U0001f3fd'
    b'\\u200d'
♂    b'\\u2642'
    b'\\ufe0f'
🔋   b'\\U0001f50b'

⚔ :     778
🎯 :     1
🔋 :     19
🤸🏽♂ :    250
🗣 :     110
💪 :     500
👤 :     Rushka
🛡 :     197
❤ :     500

⚔ :     18
🎯 :     3
🔋 :     5
🤸🏽♂ :    6
🗣 :     5
💪 :     7
👤 :     BrainRTP
🛡 :     4
❤ :     14

Демо на Rextester.
Объяснение регулярного выражения на RegEx101.


Простейшая реализация алгоритма линейной регрессии. В чем я ошибся?
Реализую алгоритм линейной регрессии от двух параметров. При увеличении датасета на порядок (с 10 до 100) значения параметров улетают в космос. Это моя ошибка или ограниченность данной реализации?
Код:
<code>
import matplotlib.pyplot as plt
import random

def lin_regr(param_x, param_y):
    """
    Градиентный спуск
    :param param_x: вектор значений датасета по оси x
    :param param_y: вектор значений датасета по оси y
    :return: оптимизированные значения параметров th0 и th1
    """
    th0, th1, alfa, eps = 50, 15, 0.002, 1e-6
    tmp0, tmp1 = 1, 1
    while abs(tmp0) >= eps or abs(tmp1) >= eps:
        tmp0 = alfa * derriv(param_x, param_y, th0, th1, '0')
        tmp1 = alfa * derriv(param_x, param_y, th0, th1, '1')
        th0 -= tmp0
        th1 -= tmp1
    return th0, th1

def derriv(vect_x, vect_y, t0, t1, str):
    """
    Производная от MSE
    :param vect_x: вектор значений датасета по оси x
    :param vect_y: вектор значений датасета по оси y
    :param t0: первый параметр
    :param t1: второй параметр
    :param str: строка. Отвечает за выбор производной (для t0 не нужно домнажать на x)
    :return: значение производной MSE в точке (t0, t1)
    """
    sum = 0
    for x, y in zip(vect_x, vect_y):
        if str is '1':
            sum += (t0 + x * t1 - y) * x
        else:
            sum += (t0 + x * t1 - y)
    return sum / len(vect_x)

if __name__ == '__main__':
    x = [100 * random.random() for i in range(30)]
    y = [100 * random.random() for i in range(30)]
    t0, t1 = lin_regr(x, y)
    plt.plot(*zip(x, y), marker='o', color="r", ls="")
    plt.plot([t0 + t1 * i for i in range(10)])
    plt.show()
</code>

Очень странная постановка задачи. Регрессия - это выявление ЗАВИСИМОСТИ одной переменной от другой. А какая у вас зависимость, если обе переменные генерируются независимо одна от другой??? Куда бедному градинету спускаться???
Ну, задайте ваши x b у например, как
<code>
x=random.random()
у=A*x + D + random.gauss(mu, sigma)
</code>
и будет вам счастье. Только подберите mu и sigma так, что-бы задача имела смысл.
Ну и в догонку - искать коэффициенты регрессии в случае одномерной (!) линейной(!!!) регрессии методом градиентного спуска  - это вообще-то говоря извращение.


Слайдер фото python 3
Хочу сделать слайдер для фото, в модуле slider.py.
Код (main.py):

from slider import *

faad = PhotoImage(file="knq.png")
sht = ttk.Label(f, image=faad)
m2 = ttk.Label(f, image=img2)
slider(sht, m2, 578, 0)

Код (slider.py):

def slider(file_n, widget, x, y):
    file_n = file_n
    widget = widget
    x = x
    y = y

widget.bind('<Enter>', file_n.place(x=x, y=y))

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

У вас вызов метода
place произойдет сразу при запуске программы, а не при событии
<Enter> (в метод
bind будет передан результат вызова метода
place, а не сам метод):

widget.bind('<Enter>', file_n.place(x=x, y=y))

Чтобы это не произошло, в качестве второго параметра нужно передавать функцию (метод) без скобок (тогда это не будет вызовом) или лямбда-функцию:

widget.bind('<Enter>', lambda event: file_n.place(x=x, y=y))


Помогите решить задачку (Python)
Требуется написать программу, которая находит сумму и произведение цифр четырёхзначного числа x.
Формат входных данных
Входной поток содержит одно целое число x (1000≤x≤9999).
Формат выходных данных
Требуется в одной строке вывести два числа — сумму и произведение цифр числа x.

расписал чтоб было понятно, но на будущее, прилагайте свои попытки, а то это выглядит будто вы просите решить что-либо за вас, а не просите помочь исправить ошибку
<code>
number = input()
digits, sum, multiply = [i for i in number], 0, 1
for digit in digits:
    sum += int(digit)
    multiply *= int(digit)

print(sum, multiply)
</code>


Добавление значений в три колонки openpyxl
Необходимо, чтобы значение добавлялось в каждую колонку, а не заменялось.
<code>
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A'] = input('One: ') # Если использовать A1, то будет замена значения колонки A1
ws['B'] = input('Two: ')
ws['C'] = input('Three: ')
wb.save("123.xlsx")
</code>

Значения добавляются в колонку и не заменяется,а дополняется:

from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook(filename = '123.xlsx')
sheet_ranges = wb['Sheet']
ddd = sheet_ranges['A1'].value
print(ddd)# смотрим изменения
ws = wb.active
ws['A1'] = input('One: ')+'|'+ddd
wb.save("123.xlsx")

Значения добавляются значение добавлялось в A1,A2,A3 и так далее. до A15.

from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook(filename = '123.xlsx')
ws = wb.active
sheet_ranges = wb['Sheet']
ddd = sheet_ranges['A1'].value
print(ddd)# смотрим изменения
asd = input('1: ')+'|'+ddd
for row in range(1, 16):
    ws.cell(column=1, row=row, value=asd)
wb.save("123.xlsx")


Ошибка в решении задачи python
Помогите, пожалуйста, только начал изучать и не могу понять, где накосячил
1) Попросите пользователя ввести 2 числа.
2) Сохраните в переменную результат деления первого числа на второе при условии, что делитель не равен 0. Если делитель равен 0, то сохранить в переменную строку: «бесконечность».
3) Вывести пользователю ответ в таком виде: «ЧИСЛО_1 / ЧИСЛО_2 = ОТВЕТ».
Мое решение выглядит как-то так
<code>
my_num1 = input("Введите число 1 ")
my_num2 = input("Введите число 2 ")
if my_num2 == 0:
chislo = "бесконечность"
else:
my_num_final = int(my_num1) / int(my_num2)
</code>
В итоге при запуске ругается на chislo = "бесконечность"

Обратите внимание на отступы

my_num1 = int(input("Введите число 1 "))
my_num2 = int(input("Введите число 2 "))
if my_num2 == 0:
    chislo = "бесконечность"
else:
    my_num_final = my_num1 / my_num2

и на приведение ввода к целому, чтобы можно было сравнивать
my_num2 с числом нуль


Количество чоканий за столом
Вообщем, нужно создать функцию с одним аргументом - (кол-во человек).
Далее, нужно чтобы функция могла вычислить кол-во "чоканье" с кол-вом людей, учитывая, что каждый "чокнулся" с каждым другим человеком. А также "чокаться" с самим с собой запрещено!
Не спрашивайте, откуда ко мне пришла такая идея...)
Пока что так, сделал проверку, если число равно 2, то в конце вычитаем 1, потому что факториал 2 = 1 * 2, а если ещё и убираем n, то остается 0...
Но сама функция пока вычисляет неправильно(
<code>
import math

def speech(n):
    if n == 2:
        x = (math.factorial(n)) - 1
        print(x)
    else:
        x = (math.factorial(n)) - n
        print(x)

speech(4)
</code>

Если я правильно помню комбинаторику, то вам нужно количество сочетаний из
n по 2.
Погуглил формулу, кажется, должно быть как-то так:

from math import factorial

def speech(n):
    nfac = factorial(n)
    nmfac = factorial(n-2)
    mfac = 2 # factorial(2)
    res = nfac / (nmfac * mfac)
    print(res)


проблема с vk_api на python
Вообщем, дело в том что код выдает ошибку -
AttributeError: 'Event' object has no attribute 'chat_id' с user_id все прекрасно работает, бот так же работает. Если можно как-нибудь по другому писать от лица бота в беседу, жду предложений. Заранее спасибо!

import random

import requests
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType

from commander.commander import Commander

def write_msg(chat_id, message):
    vk.method('messages.send', {'chat_id': chat_id, 'message': message, 'random_id': random.randint(0, 2048)})

token = "указан"
vk = vk_api.VkApi(token = token, login = 'указан', password = 'указан')
longpoll = VkLongPoll(vk)

x = ["февраля","января","марта","апреля","мая","июня", "июля","августа","сентября","октября","ноября","декабря"]
mood  = ["Хорошо","Отлично","Плохо","Бывало и лучше"]
uch = []

commander = Commander()
long_message = ""
print("Бот запущен")

messages = vk.method("messages.getConversations", {"offset": 0, "count": 1})
while True:
    for event in longpoll.listen():

        if event.type == VkEventType.MESSAGE_NEW:

            if event.to_me:

                request = event.text

                if request == "Бот" or request == "Бот, что ты умеешь" or request == "Бот, что ты делаешь" or request == "что ты делаешь" or request == "чир иы умеешь" or request == "Начать":
                    write_msg(event.chat_id, "Приветсвую! Все команды производятся через Бот, пример: Бот, как дела. Вот что я могу - 1. ... 2. ...")
                elif request == "Бот, конституция":
                    write_msg(event.chat_id, long_message)
                elif request == "Бот, как дела":
                    randmood = random.choice(mood)
                    write_msg(event.chat_id, randmood)
                elif request == "Бот, когда произойдет":
                    random2 = random.randrange(1,30,1)
                    random3 = random.randrange(2018,2035,1)
                    random4 = random.choice(x)
                    random5 = random.randrange(0,23,1)
                    random6 = random.randrange(0,59,1)
                    random7 = random.randrange(0,59,1)
                    s = str(random2)+str(" ")+str(random4)+str(", ")+str(random3)+str(" года, в ")+str(random5)+str(" час(ов), ")+str(random6)+str(" минут(у), ")+str(random7)+str( " секунд(у).")
                    write_msg(event.chat_id, s)
                elif request.split()[0] == "command":
                    write_msg(event.chat_id, commander.do(request[8::]))

Это из-за
VkLongPoll.
В документации указано, что это модуль для пользователей.
Так как Вы авторизуетесь с ключом сообщества, Вам требуется
VkBotLongPoll (и соответственно
VkBotEventType).
Обратите внимание на то, что он находится в другом модуле, а именно в
vk_api.bot_longpoll.

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

Авторизация

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

vk_session = VkApi(token='[access_token]')

Получение
LongPoll сервера

Здесь Вам дополнительно понадобится
id сообщества:

longpoll = VkBotLongPoll(vk_session, '[group_id]')

Получение сообщений

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

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW:

Отправка сообщения

Для того чтобы бот работал и в ЛС и в беседе, используйте
peer_id (вместо
chat_id и
user_id). Получить его можно следующим образом:

peer_id = event.obj['peer_id']


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

Я полагаю вам поможет numpy.where()
<code>
import numpy as np

x = np.array([[1, 2, 3], [1, 5, 6]])
i, j = np.where(x == 1)
print(i, j)

</code>


Помогите исправить код?
Нужно отформатировать текст, убрав пробелы, сделать первую буквы каждого слова заглавной и заменить все знаки (кроме цифр и букв) на точку
мы написали следующее:
<code>
def cleaner (string):
    return string.replace(' ','')
def capitalizer(string):
    return string.title()
def swapper (string):
    return string.replace('!', '.')
string = ['he!!!! huu!!']
clean_methods = [cleaner, capitalizer, swapper]
new_string = []
for element in string:
    for function in clean_methods:
        element = function(element)
new_string.append(element)
print(new_string)
</code>
помогите исправить код так, чтобы он заменял не только ! и в string можно было бы записывать несколько строк

Вернет список, по нему легко обращаться к строкам
<code>
import re

def transform(*_list):
    list_of_strings = [stroke for stroke in _list]
    total_list = []
    for string in list_of_strings:
        string = string.replace(' ', '')
        string = re.sub(r'(\W+)', r'.', string)
        string = string.title()
        total_list.append(string)
    return total_list
</code>


Как сверить одну строку со всеми строками из базы.txt, за тем если найдутся совпадения, то записать эту строку в отдельный текстовик?
В общем есть переменная w2.
Допустим, что
w2 = "космодром", теперь как мне сделать чтобы сравнить  w2 с каждой строкой из база.txt и если найдутся совпадения (хотя-бы одно), то есть даже "космодромы" или даже "космодромовцы" считается за совпадение, то записать в отдельный текстовик deleted.txt. А если после поиска по всей базе не найдется ни одно совпадение, то записать w2 на w3.

w3 = w2
Я не очень то и могу работать с файлами и строками, помогите пожалуйста, хотя-бы идеями.

Я создал txt файл где написал пару слов, надеюсь все правильно

кот
собака
космодром
рыбка
космодромчик
хорек
синичка
космодромодромдром

Дальше написал код

file_1 = 'base.txt'  #имя файла со словами
file_2 = 'deleted.txt'  #имя файла куда мы запишем совпадения
cosmodrom = 'космодром'  #проверочное слово(должно называться w2
sovpadeniya = []  #список куда мы запишем все слова которые совпадают с космодромом
with open(file_1) as name:  #открываем первый файл
    words = name.readlines() #сохраняем все строки в переменную words
for word in words: #перебираем каждую строку переменной
        if cosmodrom in word:  #проверяет, есть ли в строке космодром
            sovpadeniya.append(word) #если есть, то добавляет эту строку в список
if not sovpadeniya: #если список пусть
    w2 = w3 #я не особо понял что значит w2 = w3, но допустим если совпадений нет
else:  #если список не пуст
    with open(file_2, 'w') as name: #открываем второй файл
        for cosm in sovpadeniya: #для каждой строки в совпадениях
            name.write(cosm)  #записать в файл эту строку

Открываю второй файл, там:

космодром
космодромчик
космодромодромдром

Надеюсь сработает


Как изменить CSV file
После предикшена я получил CSV file

output = pd.DataFrame({'Id': test_data.Id,
                       'SalePrice': test_preds})
output.to_csv('submission.csv', index=False)

Но как мне сделать файл без заголовков Id и SalePrice - он сразу должен начинаться с этих двух значений:

1 0.3442
2 2.1312
и т.д.

Воспользуйтесь параметром header=False:

header : bool or list of str, default True
Write out the column names. If a list of strings is given it is
  assumed to be aliases for the column names.
Changed in version 0.24.0: Previously defaulted to False for Series.

<code>
output.to_csv('submission.csv', index=False, header=False)
</code>


Помогите решить задачу на python
сообщество.
Изучаю python, застрял на такой задаче
1) Напишите программу, которая будет принимать числа от пользователя и суммировать их, пока он не напишет слово «sum».
2) Когда пользователь напишет слово «sum», должна быть выведена сумма всех чисел и начат процесс заново.
3) Если пользователь напишет «exit» или «quit», программа должна быть завершена.
Помогите решить, пожалуйста

i = True
summa = 0
while i:
    prompt = input("> ")
    if prompt == "sum":
        print(summa)
        summa=0
    elif prompt == "quit" or prompt == "exit":
        print("Bye!")
        break
    else:
        try:
            summa+=int(prompt)
        except:
            print("Damn you!Wrong command!")


Не понимаю,почему не происходит вывод?

N = int(input())
a = []
for i in range (N):
    a.append(int(input()))

p = []

for j in a:
    j = str(j)
    if j == reversed(j):
        j = int(j)
        p.append (j)

print(max(p))

***Задача:***Тогда Маша подумала, что даже при фиксированном направлении письма запись некоторых чисел — например, 616 или 4224, — не зависит от того, с младших или со старших разрядов их начинать записывать. Интересно, а как часто встречаются такие числа-палиндромы?
Формат входных данных
В единственной строке записано натуральное число
N <= 100000.
Формат выходных данных:
Выведите N-ое в порядке возрастания число среди всех натуральных чисел, являющихся
палиндромами в десятичной записи. Нумерация начинается с единицы.
Пример
стандартный поток ввода, стандартный поток вывода:

21 121

reverse возвращает не строку, её можно сделать так:

 if j == "".join(reversed(j))

А короче будет запись с использованием среза

 if j == j[::-1]

И вообще откуда берётся ввод
a[]??

N = int(input())
c = 0
i = 0

while c < N:
    i += 1
    j = str(i)
    if j == j[::-1]:
        p = int(j)
        c += 1

print(p)


Циклический сдвиг. Python
<code>
import random
import math
import numpy as np

A=np.array([[1,2,3,4],[5,6,7,8]])
B=np.array([[0,0,0,0],[0,0,0,0]])
print(A)
L=2 #Количество строк
H=4 #Количество столбцов

for x in range(L):
    for y in range(H):
        if (y+1)==H:
            y=0

        B[x][y]=A[x][y+1]

print(B)
</code>
Хочу реализовать циклический сдвиг влево, для начала выбрал этот сдвиг равным 1. Но у меня не заполняется последний столбец. Помогите исправить
И еще скажите, как реализовать код, если сдвиг больше количества строк/столбцов

Воспользуйтесь numpy.roll():

In [61]: A
Out[61]:
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

In [62]: B = np.roll(A, -1, axis=1)

In [63]: B
Out[63]:
array([[2, 3, 4, 1],
       [6, 7, 8, 5]])

PS если вы используете
Numpy, то постарайтесь приучить себя использовать циклы только в безвыходных ситуациях.
Вот еще одно решение "в лоб" без использования циклов:

n = 1
B = np.column_stack((A[:, n:], A[:, :n]))

результат:

In [116]: B
Out[116]:
array([[2, 3, 4, 1],
       [6, 7, 8, 5]])

сравним скорость обработки для матрицы размерностью 1.000 x 1.000:

In [127]: a = np.random.randint(10**6, size=(1000, 1000))

In [128]: a.shape
Out[128]: (1000, 1000)

In [129]: b = np.zeros((1000, 1000))

In [130]: %%timeit
     ...: for x in range(a.shape[0]):
     ...:     for y in range(a.shape[1]):
     ...:         k = (y+1)%H
     ...:         b[x][y]=a[x][k]
     ...:
935 ms ± 13.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [135]: %%timeit
     ...: b = np.column_stack((a[:, n:], a[:, :n]))
     ...:
     ...:
2.52 ms ± 41 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [136]: %%timeit
     ...: b = np.roll(a, -n, axis=1)
     ...:
     ...:
2.49 ms ± 3.59 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [137]: 935 / 2.52
Out[137]: 371.031746031746

In [138]: 935 / 2.49
Out[138]: 375.50200803212846


Как можно заменить последний элемент в строке?
Необходимо прочитать строку и заменить последний элемент типа !? на точку. подскажите, пожалуйста, каким образом это можно сделать

Вот так можно:
<code>
res=text[:-1] + (lambda x: x if x not in ['!','?'] else '.')(text[-1])
</code>


TypeError: unsupported operand type(s) for %: 'list' and 'int'
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать натуральные значения от 1 до 10 000 включительно. Опишите на одном из языков программирования алгоритм, который находит минимум среди элементов массива, не делящихся нацело на 6, а затем заменяет каждый элемент, не делящийся нацело на 6, на число, равное
найденному минимуму. Гарантируется, что хотя бы один такой элемент в массиве есть. В качестве результата необходимо вывести изменённый массив, каждый элемент выводится с новой строчки. Например, для исходного массива из шести элементов:

14
6
11
18
9
24

программа должна вывести следующий массив

9
6
9
18
9
24

a = []
n = 30
k=10001
for i in range(0, n):
    a.append(int(input()))
    if a % 6 != 0:
        k=a if a<k else k
for i in range(0, n):
    if a % 6 != 0:
        a=k
print(a)

ошибка:

Traceback (most recent call last):
  File "jailed_code", line 6, in <module>
    if a % 6 != 0:
TypeError: unsupported operand type(s) for %: 'list' and 'int'

a = []
n = 30
k=10001
for i in range(0, n):
    x = int(input())
    # добавляем введенное число
    a.append(x)
    # и проверяем его на условие
    if x % 6 != 0:
        k=x if x<k else k

for i in range(0, n):
    # здесь тоже должно быть не имя списка, а его элемент
    if a[i] % 6 != 0:
        a[i]=k
print(a)


Фокусы с is и int в python
Начнём с str.
"Следите за руками":

>>> a = 'ab'
>>> b = a
>>> a == b
True
>>> a is b
True
>>> c = 'a'
>>> d = 'b'
>>> b = ''
>>> b = c + d
>>> a is b
False
>>> a == b
True

Пока всё предсказуемо.
Но вот чего смущает:

>>> a = 1
>>> b = a
>>> a is b
True
>>>
>>> c = 3
>>> d = 2
>>> b = 0
>>> b = c - d
>>> a is b
True  # Опля!
>>> a == b
True

Отчего сие, господа?
Почему именно int работает по другому?

Как и сказал @andreymal переменные в питоне кэшируются(по моему не только числа).
Это делается чтобы не загромождать пространство.
Можно провести экспeремент со скоростями с кэшом и без.
Отключите его  так.


Пакеты в python
У меня есть 2
pypi-server: один -- публичный, другой -- приватный. Как мне организовать
setup.py, чтобы подягивать зависимости и оттуда, и оттуда?

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

try:
    from pip._internal import main as pipmain
except:
    print('your version of pip is deprecated')
    from pip import main as pipmain

# Some code here

setuptools.setup(**kwargs)
pipmain(['install', '-r', 'requirements.private'])

Иными словами, я явно вызываю
pip. При этом, заранее я разделил на 2 части зависимости:
requirements.private,
requirements (публичный). Зависимости публичного репозитория будут установлены стандартными средствами
setuputool. Приватные -- при помощи непосредственно
pip. При этом, мы никак не завязываемся на систему (например, на alias, как это предлагается в одной из ссылок) и наш пакет полностью независим от окружения, что очень важно.


Как применить файл стилей .css в главном окне программы?
пробую в главном окне так:

    def __init__(self):
...
        self.setStyleSheet("Light.css")

в файле Light.css:

QFrame#frame {
    border: 1px solid #666666;
}

QPushButton {
    background-color: #E5E5E5;
    border: 1px solid #666666;
}

QPushButton:hover {
    background-color: #666666;
    border: 1px solid #000000;
}

def __init__(self):
    ...

    f = open("mystylesheet.qss")#QSS not CSS for pyqt5
    stylesheet = f.read()
    self.setStyleSheet(stylesheet)
    f.close()

    ...


Чтение SQL таблицы через Pandas
Есть SQL таблица, которая читается через Pandas.
Возможно ли изменить формат вывода даты и времени на
'2019-10-10 10:00:00' в одном столбце
datetime и сделать данный столбец индексом?

     date     time    open    high    low     close
0  20191010  100000  131030  131450  131030  131130
1  20191010  103000  131120  131120  130560  130770
2  20191010  110000  130780  131250  130630  131180
3  20191010  113000  131190  131230  130900  130920
4  20191010  120000  130920  131110  130740  130790
5  20191010  123000  130790  131170  130700  131100

connection = pymysql.connect(host='localhost', user='root', passwd='******', db='quotes')
stocks = pd.io.sql.read_sql("SELECT * FROM 30min", connection)
connection.close()


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

+-------------+------------+------------+
| ProductName | PromoStart |  PromoEnd  |
+-------------+------------+------------+
| A           | 2019-01-07 | 2019-01-13 |
| C           | 2019-02-25 | 2019-03-03 |
| B           | 2019-02-04 | 2019-02-10 |
| D           | 2019-03-04 | 2019-03-10 |
| A           | 2019-03-18 | 2019-03-24 |
| B           | 2019-04-08 | 2019-04-14 |
| C           | 2019-04-15 | 2019-04-21 |
| D           | 2019-04-22 | 2019-04-28 |
| B           | 2019-05-20 | 2019-05-26 |
| A           | 2019-06-24 | 2019-06-30 |
| ...         | ...        | ...        |
+-------------+------------+------------+

Я решил эту задачу следующей функцией:

df_date = pd.DataFrame()
for product_title in df['ProductName'].unique():
    df_temp = pd.DataFrame({
        'Date': pd.date_range(start='2019-01-01', end='2019-12-31', freq='D'),
        'ProductName': product_title,
        'IsPromo': 0,
        'DayInPromo': 0
    })

    for it in df[(df['ProductName'] == product_title)].index:
        A = pd.date_range(start=df.loc[it, 'PromoStart'], end=df.loc[it, 'PromoEnd'], freq='D')
        df_temp.loc[df_temp['Date'].isin(A), 'IsPromo'] = 1

    count=0
    for it in df_temp.index:
        if (df_temp.loc[it, 'IsPromo'] == 1):
            count += 1
            df_temp.loc[it, 'DayInPromo'] = count
        else:
            count = 0

    df_date = pd.concat([df_date, df_temp], axis=0, sort=False, ignore_index=True)

В результате я получаю необходимую мне таблицу, где количество строк = кол-во продуктов * кол-во дней:

+------------+-------------+---------+------------+
|    Date    | ProductName | IsPromo | DayInPromo |
+------------+-------------+---------+------------+
| 2019-01-07 | A           | 1       | 1          |
| 2019-01-08 | A           | 1       | 2          |
| 2019-01-09 | A           | 1       | 3          |
| 2019-01-10 | A           | 1       | 4          |
| ...        | ...         | ...     | ...        |
| 2019-12-14 | D           | 0       | 0          |
| 2019-12-15 | D           | 0       | 0          |
| 2019-12-16 | D           | 1       | 1          |
| 2019-12-17 | D           | 1       | 2          |
| ...        | ...         | ...     | ...        |
+------------+-------------+---------+------------+

Но, как мне кажется, я решаю задачу не совсем в стиле
Python и
pandas, используя циклы. Есть ли возможность переписать данную задачу в другом стиле?


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

[0.0828,0.0872, 0.08, 0.0658, 0.054, 0.0482, 0.039, 0.031, 0.0242, 0.019,
 0.0242, 0.0152, 0.0182, 0.0178, 0.022, 0.0232, 0.0282, 0.0342, 0.0272,
 0.0302, 0.0236, 0.0176, 0.0124, 0.0136, 0.0054, -0.002, -0.0104, -0.017,
 -0.0104, -0.017, -0.0176, 0.0428, 0.0472, 0.04, 0.0358, 0.034, 0.0282, 0.049,
 0.021, 0.0342, 0.039, 0.0242, 0.0252]

здесь экстремумы будут 0.0872 и -0.0176 и 0.049

Есть код, но он ничего не отображает:

from pandas import read_csv
import pandas as pd
import numpy as np
from scipy.signal import argrelextrema

df = pd.read_csv('E:\df_dif.csv')

data = np.array(df_dif['dif'])
print(argrelextrema(data, np.greater_equal,order=1))

>> (array([    50,     59,     61, ..., 456059, 456072, 456138], dtype=int32),)

Тоесть печатается индес, но и изменение индекса не помогает

Функция
argrelextrema(data, comparator, axis=0, order=1, mode='clip') возвращает индексы точек нижних или верхних экстремумов, в зависимости от указанной функции сравнения
comparator=<...>.
Можно отдельно получить индексы нижних экстремумов и индексы верхних экстремумов, объединить их и остортировать по возрастанию (т.к. это индексы исходных значений). И наконец, выбрать по полученным индексам все экстремумы.
Пример:

from scipy.signal import argrelextrema

In [33]: data = np.array([0.23,0.29,0.35,0.14,-0.05,-0.18,-0.13,-0.06,0.12,0.49,0.20])

In [34]: idx_minimas = argrelextrema(data, np.less)[0]

In [35]: idx_maximas = argrelextrema(data, np.greater)[0]

In [36]: idx = np.sort(np.concatenate((idx_minimas, idx_maximas)))

In [37]: idx
Out[37]: array([2, 5, 9], dtype=int64)

In [38]: data[idx]
Out[38]: array([ 0.35, -0.18,  0.49])

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

In [10]: data[idx].max()
Out[10]: 0.49

In [11]: data[idx].min()
Out[11]: -0.18


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

class Person:
    __slots__ = 'name', 'lastname'
    def __init__(self, name, lastname):
        self.name = name
        self.lastname = lastname

class Student(Person):
    pass

У экземпляров класса Person доступны только атрибуты представленные в слотах.
Класс Student может иметь и другие атрибуты помимо унаследованных от класса Person. А также экземплярам класса Student доступен
__dict__, который содержит в себе ключи атрибутов, но в нем будут отсутствовать атрибуты name и lastname.
Существует какой-нибудь property или магический метод, который дает программисту узнать есть ли у экземпляра иные атрибуты помимо представленных в
__dict__?

Встроенная функция
dir([objct]). Если ей передать в качестве аргумента объект класса, то она вернет все атрибуты данного класса и все атрибуты всех классов родителей (рекурсивно).
Пример:

In [10]: dir(Student)
Out[10]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__slots__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'lastname',
 'name']

Method Resolution Order:

In [11]: Student.mro()
Out[11]: [__main__.Student, __main__.Person, object]


Возврат нескольких строк из созданной функции
Разбираю упражнение "Викторина" из книжки. Программа должна читать из текстового файла строки.Я сделал функцию, которая открывает файл. Потом функцию, которая читает строку. Затем - строку которая должна выводить блок с несколькими строками, и вот здесь непонятно. Функция, которая должна выводить блок строк, возвращает все строки одним списком

Вывод:('Эпизод от которого вы не сможете отказаться\n', 'Вообразим, что вы гангстер, которого сдали сообщники. Вы конечно, \nрешаете удариться .........)

Но если я делаю отображение не через функцию, а именно:

print (next_line(the_file))
print (next_line(the_file))
print (next_line(the_file))

то все получается нормально

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

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

# функция open file - открывает файл
# если файла нет то говорит о том что невозможно открыть
def open_file(name,mode):
    '''открывает файл'''
    try:
       the_file = open(name,mode,encoding='utf-8')
    except IOError as e:
        print('невозможно открыть файл',name,'работа программы будет
завершена\n',e)
        input('нажмите энтер чтобы выйти')
        sys.exit()
    else:
        print('файл',name,'открыт')
        return the_file

# функция next line
# принимает файловый обьект и возвращает строку
def next_line(the_file):
    line = the_file.readline()
    line = line.replace('/','\n')
    return line

# функция next block
# читает очередной блок строк соответствующий одному вопросу
def next_bloc(the_file):
    '''возвращает очередной блок данных из игрового файла'''
    category = next_line(the_file)
    question = next_line(the_file)
    answer = []
    for i in range(4):
        answer.append(next_line(the_file))
        correct = next_line(the_file)
        if correct:
            correct = correct[0]
            explanation = next_line(the_file)
    return category,question,answer,correct,explanation

the_file = open('for_viktorina.txt','r')

def block(the_file):
    d = next_line(the_file)
    f = next_line(the_file)
    c = next_line(the_file)
    return d,f,c

print(block(the_file))

Ваша функция
def block(the_file): и так возвращает несколько элементов (как кортеж).
Просто, распакуйте кортеж:

d, f, c = block(the_file)
print(d)
print(f)
print(c)

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

print(*block(the_file), sep='\n')

Оператор
* перед
block раскладывает каждый элемент коллекции в отдельный параметр, т.е. это аналог:

d, f, c = block(the_file)
print(d, f, c)

А
sep='\n' говорит, что значения, переданные в
print нужно разделять символом перевода строки, а не пробелом (по умолчанию)


Удалить родительский тег в xml полностью с содержимым
Есть xml:

   <authors>

<author lang="RU" num="1">

<lastname>Иванов</lastname>

<initials>Иван Иванович</initials>

</author>

<author lang="RU" num="2">

<lastname>Петров</lastname>

<initials>Петр Петрович</initials>

<role>рецензент</role>

</author>

</authors>

Мне нужно удалить полностью тег
<author>, в котором содержится
<role>рецензент</role>. Пытаюсь сделать так:

    import xml.etree.ElementTree as ET

    tree = ET.parse('рецензенты.xml')
    root = tree.getroot()
    parent_map = dict((c, p) for p in tree.getiterator() for c in p)

    iterator = list(root.getiterator('author'))

for item in iterator:
    old = item.find('role')
    if old is None:
        continue
        text = old.text
        if 'рецензент' in text:
            parent_map[item].remove(item)
            continue

    tree.write('out.xml')

Хоть, этот код работает без ошибок, но теги не удаляются.
Подскажите, пожалуйста, как решить эту задачу. Должно получиться вот так:

<authors>

<author lang="RU" num="1">

<lastname>Иванов</lastname>

<initials>Иван Иванович</initials>

</author>

</authors>

Ошибка возникает из-за отсутствия проверки существования тэга
role. Так в приведённом примере, первый элемент
author данного тэга не содержит, поэтому переменная
old == None, но вместо того чтобы эту ситуацию отследить, происходит попытка чтения атрибута
text, которого не существует. Достаточно вставить такую проверку для предотвращения этой ошибки:

if old is None:
    continue

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

tree = ET.parse('рецензенты.xml')
root = tree.getroot()
parent_map = dict((c, p) for p in tree.iter() for c in p)

iterator = list(root.getiterator('author'))

for item in iterator:
    old = item.find('role')
    if old is None:
        continue
    text = old.text
    if 'рецензент' in text:
        parent_map[item].remove(item)
        continue

tree.write('out.xml')


Изменение текста inline-клавиатуры, python telebot
Есть ли способ изменить текст в кнопках inline, который был задан раньше? К примеру я задаю текст "Привет" на кнопку b1 и добавляю её в клавиатуру k1 с параметром action1, при выполнении которого текст на кнопке изменяется на "Пока"

Да, конечно.
Пример:
<code>
... Ваш код
kbEx = telebot.types.InlineKeyboardMarkup()
exBtn = telebot.types.InlineKeyboardButton("Старый", callback_data="test")
kbEx.row(exBtn)
... Ваш код
bot.callback_query_handler(func=lambda call: True)
def example(call):
    if call.data == "test":
        exBtn = telebot.types.InlineKeyboardButton("Новый", callback_data="hello")
        kbEx.row(exBtn)
</code>
Примерно так должно выглядить


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

n= line[1:-1].rstrip()

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

например 'hello word'
[1:-1] = 'ell wor'
[2:-3] = 'llo w'

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

s1 = 'hello word'
s2 = 'hello word3'
s3 = 'hello word4'
s = s1+s2+s3
s[1:-1] = 'ello wordhello word3hello word'

если это все в файле то:

myfile=open("myfile.txt")
n = ''
for line in myfile:
     n += line.rstrip()
print(n[1:-1])


Считать строку начиная с.. до
Нужно считать строки, начиная со 2ого элемента до конца строки
<code>
myfile=open("myfile.txt")

for line in myfile:
    n= line.split()[0][:2]
    print(n)
</code>

myfile=open("myfile.txt")

for line in myfile:
     n= line[1:].rstrip()
     print(n)


Кто знает, что хотели сказать разработчики Python своими внутренними функциями?
Читая одну "умную" книжку по python, наткнулся на общеизвестную пасхалку python:

>>import this

Вывод:

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Стало интересно, что из себя это всё представляет "внутри".

>>dir(this)

['__builtins__', '__doc__', '__file__', '__name__', '__package__','c', 'd', 'i', 's']

Немного потыкал функции и наткнулся на это:

>>> this.s

"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf orggre guna
  htyl.\nRkcyvpvg vf orggre guna vzcyvpvg.\nFvzcyr vf orggre guna
  pbzcyrk.\nPbzcyrk vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna
  arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl pbhagf.\nFcrpvny
  pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.\nNygubhtu cenpgvpnyvgl
  orngf chevgl.\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl
  fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb
  thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb
  qb vg.\nNygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er
  Qhgpu.\nAbj vf orggre guna arire.\nNygubhtu arire vf bsgra orggre guna
  evtug abj.\nVs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq
  vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs
  gubfr!"

Кому интересно - может глянуть другие методы...
Но больше всего заинтересовал этот метод...
Что тут написано, и на каком языке.
Может, кто знает?

На английском и написано. Зашифрован первый текст через шифр Цезаря со сдвигом 13.


Как создать пустой объект определенного типа?
Как в питоне создать пустой объект определенного типа?
Например, функция принимает параметр
x неизвестного типа, и надо создать в функции локальную переменную
y типа
x. Если
x будет списком, то создать пустой список (
y=[]), если кортежем -- пустой кортеж (
y=()), и т.д..

Не существует универсального способа создать объект произвольного типа, но если конструктор типа вызывается без аргументов, можно сделать так

y = type(x)()

>>> type([1,2,3])()
[]
>>> type((1,2,3))()
()
>>> type({1,2,3})()
set()


Python скриптовый язык?
Учительница по информатике сказала, что он скриптовый. Так ли это? Он же вроде компилируемый.
Мне 15, я не Senior разработчик, поэтому вопрос глупый. Я ведь даже на Python не пишу.

Python - интерпретируемый язык программирования.
Исходный код выполняется непосредственно, команда за командой (иногда — с минимальной подготовкой, буквально после разбора исходного кода в AST),— программа просто не может быть запущена без наличия интерпретатора.
В случае с самой распространенной реализацией (CPython: написанный на C, часто называемый просто “Python") ответ: интерпретируемый, с некоторой компиляцией. CPython компилирует исходный код на Питоне в байт код, а затем интерпретирует этот байткод, запуская его в процессе.
Частично взято и дополнено отсюда
Так же согласно

Python - это интерпретируемый объектно-ориентированный язык
  программирования высокого уровня...


Как применить title() ко всем ключам словаря в python?

In [5]: 'python'.title()
Out[5]: 'Python'

В python есть замечательный метод у строк -
title(). Выше в примере мы видим, что он делает.

In [6]: d = {'python': 'guido van rossum', 'ruby': 'Yukihiro Matsumoto'}
In [7]: d
Out[7]: {'python': 'guido van rossum', 'ruby': 'Yukihiro Matsumoto'}

Например, у нас есть словарь.
Его ключи:

In [8]: d.keys()
Out[8]: dict_keys(['python', 'ruby'])

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

In [10]: d
Out[10]: {'Python': 'guido van rossum', 'Ruby': 'Yukihiro Matsumoto'}

Спасибо!

Поскольку "нормальные" варианты уже написали в комментариях к вопросу, напишу в функциональном стиле:

new = dict(map(lambda kv: (kv[0].title(), kv[1]), d.items()))

Второй вариант:

new = dict(zip(map(str.title, d), d.values()))

Для полноты ответа все же добавлю более традиционные для Python варианты из комментариев к вопросу:

new = {k.title(): v for k, v in d.items()}

new = {k.title(): d[k] for k in d}


Ошибка при работе с контурами
При запуске этого кода:
<code>
import numpy as np
import cv2

image = cv2.imread('screenshoot10.jpg')
cv2.imshow('input image', image)

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

edged = cv2.Canny(gray, 30, 200)
cv2.imshow('canny edges', edged)

_, contours =
cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.imshow('canny edges after contouring', edged)

print(contours)
print('Numbers of contours found=' + str(len(contours)))

cv2.drawContours(image,contours, -1, (0,255,0), 3)
cv2.imshow('contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
</code>
получаю ошибку

OpenCV(4.1.1)
C:\projects\opencv-python\opencv\modules\imgproc\src\drawing.cpp:2509:
error: (-215:Assertion failed) npoints > 0 in function
'cv::drawContours'

Что я делаю неправильно?

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

contours, _ = cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

вместо

_, contours = cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)


Как можно упростить?

Пользователь вводит строку произвольной длины. Найти в строке самое длинное слово, в котором присутствуют подряд две согласные буквы. Если в строке присутствует слово с тремя согласными буквами подряд - завершить выполнение.

<code>
user_input = input('Enter here: ')

splited_user_input = user_input.split()

consonant_list =['b', 'c', 'd', 'f', 'g','h','j','k',
                 'l','m','n','p','q','r','s','t','v','w','x','z']

long_word = ''
add_word = ''

for word in splited_user_input:
    counter = 0
    for letter in word:
        if letter in consonant_list:
            counter += 1
        if counter == 2:
            add_word = word
        if counter == 3:
            add_word = 0
            break
        if letter not in consonant_list:
            counter = 0
    if add_word == 0:
        break
    if len(add_word) > len(long_word):
        long_word = add_word
if add_word == 0:
    pass
else:
    print(f'The longest word with the couple consonants: {long_word}')
</code>
Подскажите как можно упростить?

Можно попробовать смотреть сразу повторы букв в слове
<code>
user_input = input('Enter here: ')

consonant_list =['b', 'c', 'd', 'f', 'g','h','j','k',
                 'l','m','n','p','q','r','s','t','v','w','x','z']

longest_word = ''

for word in user_input.split():
    for cl in consonant_list:
        if cl*3 in word:
            longest_word = ''
            break
        if cl*2 in word:
            if len(word) > len(longest_word):
                longest_word = word
if longest_word == '':
    pass
else:
    print(f'The longest word with the couple consonants: {long_word}')
</code>


Какую среду разработки использовать для Django?
Решил изучить Django, до этого писал код в бесплатной версии Pycharm, но насколько я понимаю поддержка Django проектов только в платной версии. Поэтому хотел бы спросить какой IDE лучше всего использовать для Django

Я лично использую PyCharm. Так как работаю в Сбербанке, у них есть лицензионная версия для версии Professional.
Очень удобная программа для написания сайта, есть интеллисенс, плюс очень хорошее взаимодействие между urls, views, models и прочее.
Разметка для html, css, js


подскажите с циклом
<code>
string = input('Enter here: ')
while input("Хотите продолжить? [y/n]: ") =='y':
</code>
Если ответ не Y или N -  переспрашивать, пока не введет Y или N.
 Подскажите куда подставить for или if, при нажатии y - оно повторяет цикл при нажатии n завершает.

while True:
    _input = input("Хотите продолжить? [y/n]: ")
    if _input == 'n':
        print("Продолжать не будем !")
        break
    elif _input == 'y':
        print("Продолжайте...")
        break


Помогите реализовать дешифровку шифра одиночной перестановки по ключу
Написал такую функцию для шифрования методом одиночной перестановки по ключу, но не могу понять как сделать дешифровку полученного зашифрованного сообщения.
<code>
def getCipher(origin_key, origin_text):
clear_text = ''.join(origin_text.split(' ')).lower()
k = len(clear_text) // len(origin_key)

cipher = {}
for index, ch in enumerate(origin_key.lower()):
    if ch in cipher:
        cipher[ch] += clear_text[index * k : index * k + k]
    else:
        cipher[ch] = clear_text[index * k : index * k + k]

cipher_text = ''.join([''.join([cipher[key][index] for key in sorted(cipher.keys())]) for index in range(k)])
return ' '.join([cipher_text[index : index + k] for index in range(0, len(cipher_text), k)]).upper()

print(getCipher('ПЕЛИКАН', 'ТЕРМИНАТОР ПРИБЫВАЕТ СЕДЬМОГО В ПОЛНОЧЬ'))
</code>

Немного изменил предыдущий ответ, который, если помог, стоит отметить решением.

def encode(keyword, message, normalize=False):
    # True - отбрасывать пробелы при шифровании
    if normalize:
        message = ''.join(message.split())

    rows = len(message) // len(keyword)
    if len(message) % len(keyword) != 0:
        rows += 1

    indexes = sorted([(index, value) for index, value in enumerate(keyword)], key=lambda item: item[1])
    result = ''

    for row in range(rows):
        for index in indexes:
            position = index[0] * rows + row
            if position < len(message):
                result += message[position]
            else:
                result += ' '

    return result

def decode(keyword, cipher):
    rows = len(cipher) // len(keyword)
    if len(cipher) % len(keyword) != 0:
        rows += 1

    indexes = sorted([(index, value) for index, value in enumerate(keyword)], key=lambda item: item[1])
    indexes = sorted([(index, value) for index, value in enumerate(indexes)], key=lambda item: item[1][0])
    result = ''

    for index in indexes:
        for row in range(rows):
            position = index[0] + len(keyword) * row
            if position < len(cipher):
                result += cipher[position]

    return result

key = 'ПЕЛИКАН'
text = 'ТЕРМИНАТОР ПРИБЫВАЕТ СЕДЬМОГО В ПОЛНОЧЬ'

enc = encode(key, text, True)
print('ENCODE:', enc)
dec = decode(key, enc)
print('DECODE:', dec)
print()
enc = encode(key, text)
print('ENCODE:', enc)
dec = decode(key, enc)
print('DECODE:', dec)

Результат:

ENCODE: ГНВЕПЛТОААДРНЕВТЕЬИОРПОТМБЧМОРСОЫЬИ
DECODE: ТЕРМИНАТОРПРИБЫВАЕТСЕДЬМОГОВПОЛНОЧЬ

ENCODE: ВАЕЬРОТ ТТМИЧЕПО ОБЬРОРСГЫ МЛ ЕОВ ИНПД А Н
DECODE: ТЕРМИНАТОР ПРИБЫВАЕТ СЕДЬМОГО В ПОЛНОЧЬ


Отправка сообщений в группу Telegram
Необходимо через команду бота
/post отправить сообщение в группу (группы).
Сообщения могут быть произвольного размера и содержать в себе изображение\ссылки\аудиофайлы\документы
Не могу понять, как написать функцию отправки сообщения, используя
pyTelegramBotAPI.
Как можно это реализовать? Заранее спасибо!
Мой код:

import telebot

token = ''
bot = telebot.TeleBot(token)

@bot.message_handler(commands=['start', 'post'])
def command(message):
        if message.text == '/start':
           bot.reply_to(message, "Command START is working ")
        elif message.text == '/post':
           chat_id = ''
           bot.send_message(chat_id, message, text)

@bot.message_handler(content_types=["new_chat_members"])
def handler_new_member(message):
    user_name = message.new_chat_member.first_name
    bot.send_message(message.chat.id, f"Welcome, {user_name}!")

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

РЕШЕНИЕ
<code>
import telebot

token = 'TOKEN_HERE'
bot = telebot.TeleBot(token)

@bot.message_handler(commands=['post'])
def command(message):
    if message.text.split(" ", 1)[0] == "/post":
        chat_id = 'CHAT_ID_HERE'
        bot.send_message(chat_id, message.text.split(" ", 1)[1])

@bot.message_handler(content_types=["new_chat_members"])
def handler_new_member(message):
    user_name = message.new_chat_member.first_name
    bot.send_message(message.chat.id, f"Welcome, {user_name}!")

if __name__ == '__main__':
    bot.polling(none_stop=True)
</code>


В 9 случаях из 10 получаю aiohttp.errors.ServerDisconnectedError
При отправке некоторого количества запросов к api кодом ниже в 9 случаях из 10 падает с exception aiohttp.errors.ServerDisconnectedError:
<code>
async def procesed(urls):
    response = await fetch_all(urls)
    return response

async def fetch_all(urls):
    responses = asyncio.gather(*[asyncio.ensure_future(fetch(url)) for url in urls])
    return await responses

async def fetch(url):
    async with aiohttp.ClientSession(headers=HEADERS).get(url) as response:
    if response.status != 200:
        response.raise_for_status()
    data = await response.json()
    response.close()
    return {
        'key': data['key'],
        'summary': data['summary'],
        'description': data['description']
    }

def create_table():
    table_data = list()
    loop = asyncio.get_event_loop()
    raw_table_data = loop.run_until_complete(procesed(urls))
</code>
НО... Если я запускаю этот же код из virtualenv, то никаких проблем нет. Это происходит не только на одной системе. Проверены Win 10, MacOS 14.6.2 и Ubuntu 16.04. Куда копать?

<code>
async def fetch(url):
async with aiohttp.ClientSession(headers=HEADERS).get(url) as response:
if response.status != 200:
    response.raise_for_status()
data = await response.json()
response.close()
return {
    'key': data['key'],
    'summary': data['summary'],
    'description': data['description']
}
</code>
Вот тут не понятное инстанцирование новой сессии на каждый запрос, скорее всего из-за venv GC успевает подчищать не нужные более сессии, в отличии от обычного запуска.
Советую передавать ClientSession() в функцию как параметр. Это идиоматически и логичски верно, в отличие от текущего варианта.


объясните,как работает n-=1
У меня есть такой код,объясните как работает в нем
n-=1
Код:

fib1 = 0
fib2 = 1

n = int(input("Номер элемента ряда Фибоначчи: ")) -2 #вычитаем первые два значения которые уже учли

while  n > 0:
    fib_sum = fib1 + fib2 # по формуле находим искомое число
    fib1 = fib2 #приравниваем fib1 и fib2 чтобы в следующий расчетах был известен fib1
    fib2 = fib_sum # задаём в fib2 искомое число чтобы в следующий расчетах был известен fib2
    n -= 1

print(fib2)

В вашем примере декремент n-= - это просто укороченная запись выражения n=n-1. Pyhton позволяет некоторые вольности с подобными операторами. Например, можно использовать даже такое выражение:

n = 1
n-=-1 # У этого оператора есть даже название invader, по мотивам старой компьютерной игры
print(n)

#2

Однако, например
n+=a далеко не всегда равно
n=n+a:

a = [1]
b = a
a+=[2]
print(a)
print(b)
print(a is b)

#[1, 2]
#[1, 2]
#True

Но:

a = [1]
b = a
a = a+[2]
print(a)
print(b)
print(a is b)

#[1, 2]
#[1]
#False


Как исправить код в следующем примере?
Нужно сделать равнобедренный треугольник из
# используя
input.

n = int(input())
for i in range(n):
    print(' ' * (n - i) + '#' * (i + 1) + "#" * (i))

Вот код, но он не подходит для больших чисел. Если ввести больше 20, то треугольник становится прямоугольным.
Как это исправить?


Правильная последовательность скобок не работает с нечётными числами
У меня есть две функции (even_generate_brackets и odd_generate_brackets), в
первой функции у меня обрабатываются чётные числа и выводится правильная последовательность скобок соответственно. Что мне сделать со второй функцией, чтобы работала с нечётными цифрами?

def even_generate_brackets(n, count, stack, result):

    # Вывод не чётного числа скобок
    if count == n // 2 and len(stack) == 0:
        print(result)
        return

    # Обработка правой части со скобками
    if count < n // 2:
        even_generate_brackets(n, count + 1, stack + '(', result + '(')

    # Очистка "стека" и добавление противоположной скобки
    if len(stack) > 0:
        if stack[-1] == '(':
            even_generate_brackets(n, count, stack[:-1], result + ')')

def odd_generate_brackets(n, count, stack, result):

    # Вывод нечётного числа скобок
    if count == n // 2 and len(stack) == 0:
      print(result)
      return

    # Обработка правой части со скобками
    if count < n // 2:
        odd_generate_brackets(n, count + 1, stack + '(', result + '(')

    # Очистка "стека" и добавление противоположной скобки
    if len(stack) > 0:
      if stack[-1] == '(':
        odd_generate_brackets(n, count, stack[:-1], result + ')')

n = int(input())

#  Проверка на чётность и нечётность вводного числа
if (n % 2 == 0) & (n <= 12) & (n > 0):
  n = n + 2
  even_generate_brackets(n, 0, "", "")
elif (n % 2 != 0) & (n <= 12) & (n > 0):
  odd_generate_brackets(n, 0, "", "")

Вывод even_generate_brackets при значении n = 2:

(())
()()

Вывод odd_generate_brackets при значении n = 3:

()

Видимо вы имеете в виду четное и нечетное количество пар, но это как раз и не важно. Вот пример кода
<code>
def printBrackets(str, n):
    if (n > 0):
        shuffle(str, 0, n, 0, 0)
    return;

def shuffle(str, pos, n, open, close):
    if (close == n):
        for i in str:
            print(i, end="")
        print()
        return
    else:
        if (open > close):
            str[pos] = ')'
            shuffle(str, pos + 1, n, open, close + 1)
        if (open < n):
            str[pos] = '('
            shuffle(str, pos + 1, n, open + 1, close)

n = int(input("n= "))

str = [""] * 2 * n
printBrackets(str, n)
</code>


Не запускается скрипт для вывода правильной последовательности скобок
Есть код на для вывода правильной последовательности n элементов, переписал его под python, но он не работает. В чём моя ошибка?
JS:

    function getCombinations(space) {

    const result = [];

    for (let i = 0; i < space; ++i) {
        const leftSpace = i;
        const rightSpace = space - i - 1;
        const leftCombinations = leftSpace > 0 ? getCombinations(leftSpace) : [''];
        const rightCombinations = rightSpace > 0 ? getCombinations(rightSpace) : [''];

        for (const left of leftCombinations) {
            for (const right of rightCombinations) {
                result.push(`(${left})${right}`);
            }
        }
    }

    return result;

}

console.log(getCombinations(2));

Вот код на Python, который не работает:

def get_combinations(space):
  result = []
  for i in range(space):
    left_space = i
    right_space = space - i - 1
    left_combinations = get_combinations(left_space) if left_space > 0 else ['']
    right_combinations = get_combinations(right_space) if right_space > 0 else ['']

  for left in left_combinations:
    for right in right_combinations:
      result.append(f'({left}{right})')

  get_combinations(2)

Результат для 2 должен быть такой:

[ '()()', '(())' ]

Написано же: "Ожидается отступ."

def get_combinations(space):
    result = []
    ...

Зачем Вы на ходу меняете содержание вопроса так, что ответ становится бессмысленным?

Ладно. Теперь не мешало бы вернуть из Вашей функции значение.

def get_combinations(space):
    ...
    return result


Как проверить, что время относится к нужному диапазону?
Есть 2 объекта
datetime.time. Мне нужно проверить, что в первый попадает в диапазон получаса в любую сторону от второго. Как мне это сделать, с учетом того, что
timedelta нельзя использовать с
time?

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

from datetime import time, timedelta, datetime as DT

def is_in_interval(tm, int_time, delta=timedelta(minutes=30)):
    def to_dt(tm):
        return DT.combine(DT.today(), tm)
    return to_dt(int_time) - delta <= to_dt(tm) <= to_dt(int_time) + delta

Пример использования:

In [162]: is_in_interval(time(14, 33), time(15, 3), timedelta(minutes=30))
Out[162]: True

In [163]: is_in_interval(time(14, 33), time(15, 4), timedelta(minutes=30))
Out[163]: False


ValueError at /content/search Need 2 values to unpack in for loop; got 8
я пытаюсь реализовать поиск по нескольким таблицам в базе данных. Для этого я написал вот такую функцию во views.py:

def search(request):
    search_query = request.GET.get('search','')
    if search_query:
        post1 = plants.objects.filter(Q(latin_name__icontains=search_query) | Q(name__icontains=search_query))
        post2 = shrimp.objects.filter(Q(latin_name__icontains=search_query) | Q(name__icontains=search_query))
        post3 = snail.objects.filter(Q(latin_name__icontains=search_query) | Q(name__icontains=search_query))
        post4 = snag.objects.filter(Q(latin_name__icontains=search_query) | Q(name__icontains=search_query))

    else:
        post1 = plants.objects.all()
        post2 = shrimp.objects.all()
        post3 = snail.objects.all()
        post4 = snag.objects.all()
    result = [('растения', post1),('креветки', post2),('улитки', post3), ('коряги', post4)]
    return render(request,'content/search.html', context={'results': result})

search.html:

{% extends 'main_page/main_page.html' %}
{% load static %}
{% block css %}
  <link rel="stylesheet" href="{% static 'css/search.css' %}"/>
{% endblock %}
{% block content %}
  <div class="container-content">
    {% for result in results %}
      {% for name, element in result %}
        <p>{{ name }}</p>
        <div class="container-content-block">
          <div class="text">{{ element.latin_name }}</div>
          <div class="image">
            <img src="/{{ element.image.url }}/" alt="картинка не работает" width="170" height="200">
          </div>
          <div class="text">{{ element.price }} руб</div>
          <div class="text">{{ element.name }}</div>
          <form action="{% url 'add_to_basket' element.id %}" method="post">
            {% csrf_token %}
            <input class="btn btn-success" type="submit" value="В корзину">
          </form>
          <a href="{% url 'plants_info' element.id %}">
            <input class="btn btn-light" type="submit" value="Подробнее">
          </a>
          <!-- <input class="btn btn-success" value="В корзину" type="submit"> -->
        </div>
      {% endfor %}
    {% endfor %}
  </div>
{% endblock %}

это всё выдает мне ошибку "ValueError at /content/search
Need 2 values to unpack in for loop; got 8. " в месте, где вызывается функция render, но я не понимаю, как как её решить. Заранее спасибо.

Для первого варианта кода, поясняю
Проблема в 2 строках

    {% for result in results %}
      {% for name, element in result %}

Почему? Потому что у вас массив кортежей

    result = [('растения', post1),('креветки', post2),('улитки', post3), ('коряги', post4)]
При первом
for, вы перебираете кортежи. И вроде бы все верно, НО. Во второй строчке, вы снова пытаетесь перебрать элементы, но указав поля через запятую, вы говорите питону, что ожидаете распаковки значений. Поэтому и вознкает ошибка.
Есть 2 решения, красивое и не очень
1

    {% for name, element in results %}

2

    {% for result in results %}
        {% with result.0 as name %}
            {% with result.1 as element %}

Не за что :)


Воспользуйтесь scipy.optimize.minimize().
Пример:

from scipy.optimize import minimize

def f(k, y_true, y_pred_proba):
    return -f1_score(y_true, y_pred_proba >= k)

res_1 = minimize(f, [0.5], (actual_1, predicted_1), method="Nelder-Mead", tol=1e-5)
res_10 = minimize(f, [0.5], (actual_10, predicted_10), method="Nelder-Mead", tol=1e-5)
res_11 = minimize(f, [0.5], (actual_11, predicted_11), method="Nelder-Mead", tol=1e-5)

результаты:

In [91]: res_1
Out[91]:
 final_simplex: (array([[0.5      ],
       [0.5000061]]), array([-0.82758621, -0.82758621]))
           fun: -0.8275862068965518
       message: 'Optimization terminated successfully.'
          nfev: 38
           nit: 13
        status: 0
       success: True
             x: array([0.5])

In [92]: res_10
Out[92]:
 final_simplex: (array([[0.45     ],
       [0.4499939]]), array([-0.76923077, -0.76923077]))
           fun: -0.7692307692307692
       message: 'Optimization terminated successfully.'
          nfev: 42
           nit: 15
        status: 0
       success: True
             x: array([0.45])

In [93]: res_11
Out[93]:
 final_simplex: (array([[0.525    ],
       [0.5250061]]), array([-0.78787879, -0.78787879]))
           fun: -0.787878787878788
       message: 'Optimization terminated successfully.'
          nfev: 37
           nit: 13
        status: 0
       success: True
             x: array([0.525])

нас интересует значение с ключем
"x":

In [94]: res_10["x"]
Out[94]: array([0.45])

In [95]: res_11["x"]
Out[95]: array([0.525])


Проверка на существование переменной python
Есть у меня задание такого типа:

seven(times(five())) # must return 35
four(plus(nine())) # must return 13

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

if not variable.exist():
    string = ''

Как это можно описать в коде?

Вообще не понял задачи :) но псевдокод переводится в код вот так. Локальная переменная:

if 'variable' not in locals():
    variable = ''

Глобальная переменная:

if 'variable' not in globals():
        variable = ''


Как построить функцию linear как функцию активации из tensorflow.keras.layers Activation?

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout, BatchNormalization
from tensorflow.keras import utils

def createModel():
      model = Sequential() #Созадём сеть
      #Добавляем слои
      model.add(Dense(800, input_dim=784, activation="relu"))
      model.add(Dense(10, activation="linear"))
      model.add(Dense(10, activation="softmax"))
      #Компилируем сеть
      model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

      #Созвращаем созданную сеть
      return model

Нашла как строить график relu:

    import matplotlib.pyplot as plt
def plot(func, name_of_func:str, label:str):
    fig = plt.figure(figsize=(20, 10))
    fig.clear()
    X = np.linspace(-30, 30, 1000)
    y = func(X)

    plt.plot(X,
             y,
             label=label,
             color='blue',
             linewidth=3)

    plt.xlabel('x', fontsize=30)
    plt.ylabel('y', fontsize=30)
    plt.title(name_of_func, fontsize=30)
    plt.grid(True)
    plt.legend(loc='upper left', fontsize=30)
def relu(x:np.ndarray):
    return np.where(x >= 0, x, 0)
relu_label = r'$\sigma(x) = relu(x)$'
plot(relu, 'RELU', relu_label)

Как построить график linear из tensorflow.keras.layers как функции активации?

Вот исходный код функции активации keras.activations.linear():

def linear(x):
    """Linear (i.e. identity) activation function.
    # Arguments
        x: Input tensor.
    # Returns
        Input tensor, unchanged.
    """
    return x

Т.е. данная функция возвращает неизменным переданный ей аргумент
x.
PS врядли стоит чертить график данной функции... ;)


ошибка при создании функции в python [закрыт]

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

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

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

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

<code>
    what = input("Что вычисляем? (плотность,обьём,масса)")

if what == "плотность":
    a = int(input("введите массу:"))
    b = int(input("введите обьем:"))
    c = a / b
    print("Ваш результат:" + str(c))

if what == "масса":
    a = int(input("введите плотность:"))
    b = int(input("введите обьём:"))
    c = a * b
    print("ваш результат:" + str(c))

if what == "обьём":
    a = int(input("введите массу:"))
    b = int(input("введите плотность:"))
    c = a / b
    print("ваш результат:" + str(c))
if (what !="объём" and what !="масса" and what !="плотность"):
    print("вы ввели неверную функцию")
</code>
Когда пытаюсь сделать из этого кода функцию выдаёт ошибку,прошу помощи

Если я правильно понял вы хотели сделать так?
<code>
def math(what):
    if what == "плотность":
        a = int(input("введите массу:"))
        b = int(input("введите обьем:"))
        c = a / b
        print("Ваш результат:" + str(c))

    elif what == "масса":
        a = int(input("введите плотность:"))
        b = int(input("введите обьём:"))
        c = a * b
        print("ваш результат:" + str(c))

    elif what == "обьём":
        a = int(input("введите массу:"))
        b = int(input("введите плотность:"))
        c = a / b
        print("ваш результат:" + str(c))
    else:
        print("вы ввели неверную функцию")

what = input("Что вычисляем? (плотность,обьём,масса)")

math(what)
</code>


Помогите новичку разработать простенькую игру! [закрыт]

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

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

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

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

Играют два игрока.  Есть 10 палочек. Игроки по очереди берут от одной до трёх палочек. Играют до тех пор пока не закончатся палочки. Тот кто взял последним - тот проиграл.
Реализуйте игру таким образом, чтобы могли играть два человека. Изначально есть 10 палочек. На каждом ходу выводите на консоль текущее количество оставшихся палочек и просите ввести количество палочек, которое хочет взять игрок (который делает ход). Не забывайте менять очерёдность игроков и сокращать кол-во палочек. В конце надо вывести кто победил - первый или второй игрок.
P.S. Прошу, напишите к каждому шагу объяснение, иначе мне не понять, спасибо!)

как то так
<code>
count_of_sticks = int(input('введите количество палочек для игры: '))
gamer_1, gamer_2 = input('введите имя 1 игрока: '), input('введите имя 2 игрока: ')
current_gamer = gamer_1
while count_of_sticks > 0:
    print('количество оставшихся палочек: {}'.format(count_of_sticks))
    while True:
        number_to_delete = int(input('ход игрока {} (1 - 3): '.format(current_gamer)))
        if number_to_delete >= 1 and number_to_delete <= 3:
            break
    count_of_sticks -= number_to_delete
    current_gamer = gamer_2 if current_gamer == gamer_1 else gamer_1

print('Победил {}'.format(current_gamer))
</code>


Как написать функцию которая будет складывать одинаковые значение ключей в словарях?
Мне нужно написать код, в котором будет функция которая складывает значение похожих ключей из двух словарей, но я не знаю как написать данную функцию, помогите, заранее спасибо.
Вот код который надо дополнить этой функцией:
<code>
def print_shopping_list(pizza, salad):
# здесь код функции которая должна складывать значения похожих ключей в списках
# P.S для начало нужно перевести словари в множества методом set() и сохранить в переменной

pizza = {'мука, кг': 1,
     'помидоры, кг': 1.5,
     'шампиньоны, кг': 1.5,
     'сыр, кг': 0.8,
     'оливковое масло, л': 0.1,
     'дрожжи, г': 50}

salad = {'огурцы, кг': 1,
     'перцы, кг': 1,
     'помидоры, кг': 1.5,
     'оливковое масло, л': 0.1,
     'листья салата, кг': 0.4}

print_shopping_list(pizza, salad)
</code>

def print_shopping_list(pizza, salad):

    pizza_keys, salad_keys = pizza.keys(), salad.keys()
    set_of_products, total_dict = set(pizza_keys).union(set(salad_keys)), {}

    for element in set_of_products:
        if element in pizza_keys and element in salad_keys:
            total_dict[element] = pizza[element] + salad[element]
        elif element in pizza_keys:
            total_dict[element] = pizza[element]
        else:
            total_dict[element] = salad[element]

    for key in total_dict:
        print('{} - {}'.format(key, total_dict[key]))


Помогите решить проблему на Python
Почему не работает код?
Пишет elif a >= 10 and <= 19:
                      ^
SyntaxError: invalid syntax
<code>
a = int(input('Количество пакетов'))
TOVAR = 99

if a < 10:
    print('Нету скидки')
    b = a * TOVAR
    print(b)
elif a >= 10 and <= 19:
    print('Скидка 10%')
    b = a * TOVAR
    c = b * 0.10
    print('Вся сума с скидкою', c)
elif a >= 20 and <= 49:
    print('Скидка 20%')
    b = a * TOVAR
    c = b * 0.20
    print('Вся сума з скидкою', c)
elif a >= 50 and <= 99:
    print('Скидка 30%')
    b = a * TOVAR
    c = b * 0.30
    print('Вся сума с скидкою', c)
elif a >= 100:
    print('Скидка 40%')
    b = a * TOVAR
    c = b * 0.40
    print('Вся сума с скидкою', c)
</code>

Как и писали выше, потеряли переменную
<code>
a, TOVAR = int(input('Количество пакетов : ')), 99
if a < 10:
    print('Нет скидки\n{}'.format(a * TOVAR))
elif a >= 10 and a <= 19:
    print('Скидка 10%\nВся сума с скидкой : {}'.format(a * TOVAR * 0.1))
elif a >= 20 and a <= 49:
    print('Скидка 20%\nВся сума с скидкой : {}'.format(a * TOVAR * 0.2))
elif a >= 50 and a <= 99:
    print('Скидка 30%\nВся сума с скидкой : {}'.format(a * TOVAR * 0.3))
elif a >= 100:
    print('Скидка 40%\nВся сума с скидкой : {}'.format(a * TOVAR * 0.4))
</code>


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

async def on_message(message):
if message.channel.id == 624170997775335435:
    channel = c.get_channel(630044814297137203)
    msg = "[{1}] **{0.author}**: {0.content}".format(message, timestamp)
    if message.attachments:
        attachment = message.attachments[0].url
        msg + " + {0}".format(attachment)
        return msg
    await channel.send(msg)

Но в итоге он просто выводит мне сообщение, если прикрепленных файлов нет, а если они есть - он просто игнорирует сообщение.
Пример текста без прикрепленного файла:

[время] ник: текст

Пример текста с прикрепленным файлом:

[время] ник: текст + ссылка на прикрепленный файл

В 7 строке Вы не присваиваете результат переменной
msg.
Замените на:

msg += " + {0}".format(attachment)
#    ^

Также Вам следует удалить строку 8.


Как найти второй максимум в списке из последовательности чисел?
Можете просто примерно написать как думать, а то вообще идей нет

first_max = int(input())
second_max = int(input())
if first_max < second_max:
    first_max, second_max = second_max, first_max
element = int(input())
while element != 0:
    if element > first_max:
        second_max, first_max = first_max, element
    elif element > second_max:
        second_max = element
    element = int(input())
print(second_max)


Ошибка при отправке ботом сообщения vk_api
При отправке сообщения ботом пользователю, крашится с ошибкой:
vk_api.exceptions.ApiError: [901] Can't send messages for users without permission, у бота имеются все нужные разрешение в настройках, так же у пользователя нет запрета на сообщения.
Код:

import vk_api
from vk_api.utils import get_random_id
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType

vk_session = vk_api.VkApi(token="Тут ваш токен")

vk = vk_session.get_api()
longpoll = VkBotLongPoll(vk_session, "Айди сообщества (Не кастомное) пример: 94124211")

for event in longpoll.listen():
    if event.obj.text != "":
            if event.from_user:
                vk.messages.send(
                        user_id=event.obj.from_id,
                        random_id=get_random_id(),
                        message=event.obj.text)

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


Определение нового участника pyTelegramBotAPI
Пишу телеграм бота с использованием pyTelegramBotAPI для группы. Т.к в этом я полный чайник буду задавать вопросы (может много)
Как боту понять что новый участник зашел в группу и отправил соответствующие сообщение с приветствием?

    @bot.message_handler(content_types=["new_chat_members"])
    def handler_new_member(message):
        user_name = message.new_chat_member.first_name
        bot.send_message(message.chat.id, f"Добро пожаловать, {user_name}!")


Как сравнить текущую строку с предыдущей и затем записать в счетчик а если нет сразу в выходной файл с счетчиком?
Имеется файл с логами.
Как сравнить текущую строку с предыдущей и затем записать в счетчик а если нет сразу в выходной файл с счетчиком?
Суть вопроса выводить число событий NOK за каждую минуту в другой файл
входной текстовы файл
event.txt

      [2018-05-14 19:37:47.873687] OK
      [2018-05-14 19:38:25.873687] NOK
      [2018-05-14 19:38:39.873687] OK
      [2018-05-14 19:38:48.873687] NOK
      [2018-05-14 19:38:50.873687] NOK
      [2018-05-14 19:38:58.873687] NOK
      [2018-05-14 19:39:43.873687] OK
      [2018-05-14 19:39:46.873687] OK
      [2018-05-14 19:39:49.873687] NOK
      [2018-05-14 19:40:33.873687] NOK
      [2018-05-14 19:41:05.873687] OK
      [2018-05-14 19:41:46.873687] OK
      [2018-05-14 19:42:29.873687] OK
      [2018-05-14 19:42:55.873687] NOK
      [2018-05-14 19:43:38.873687] NOK
      [2018-05-14 19:43:40.873687] NOK
      [2018-05-14 19:44:06.873687] OK
      [2018-05-14 19:44:30.873687] NOK
      [2018-05-14 19:45:12.873687] NOK

на выходе должен быть примерно
output_log.txt

     [2018-05-17 01:57] 1
     [2018-05-17 01:58] 2

class Log:

    def __init__(self, source_file, output_file):
        self.source_file = source_file
        self.output_file = output_file
        self.log_statistic = []

    def read_file(self):
        count = 0
        with open(self.source_file, mode='r', encoding='utf8') as file:
            file_log = file.readlines()
            for line in file_log:
                if 'NOK' in line:
                    print(line[1:17])

parse_file = Log(source_file = 'events.txt', output_file = 'output_log.txt')
parse_file.read_file()

Проще всего сделать так

from collections import Counter

with open(self.source_file, mode='r', encoding='utf8') as file:
    counter = Counter(line[1:17] for line in file if 'NOK' in line)

with open('output_log.txt', 'w', encoding='utf8') as file:
    for date, count in counter.items():
        print(f'[{date}] {count}', file=file)

Правда данные запишутся в файл не сразу а только после полной обработки
event.txt. Это займет некоторое место в памти, но относительно небольшое, даже для лога, хранящего записи за сто лет.
В старых версиях python придется отсортировать получившийся словарь, потому, что порядок ключей там не гарантирован

    for date in sorted(counter):
        print('[{}] {}'.format(date, counter[date]), file=file)

Upd:
Ленивый способ. Не хранит в памяти вообще ничего лишнего, пишет данные по мере обработки.

import itertools

with open(self.source_file, mode='r', encoding='utf8') as file:
    with open('output_log.txt', 'w', encoding='utf8') as out:
        for date, group in itertools.groupby(file, key=lambda x: x[1:17]):
            count = sum(1 for line in group if 'NOK' in line)
            if count:
                print(f'[{date}] {count}', file=out)