Selenium. Найти элемент по изменяющемуся id, match, несколько элементов
В Вконтакте есть "написать сообщение":

<div class="im_editable im-chat-input--text _im_text" tabindex="0" contenteditable="true" id="im_editable450262838" role="textbox" aria-multiline="true"></div>
im-chat-input--text - попадается два раза, тот, который интересует - второй

Такое написание будет правильно?

driver.find_element_by_class_name('im-chat-input--text[1]')

Как найти элемент с ID
im_editable450262838
по маске типа
im_editable*?

driver.find_element_by_id('im-chat-input--text*')

Можно ли в Selenium искать через MATCH, чтобы просто вставить кусок кода, по примеру, и потом ввести значения:

driver.find_MATCH ('class ="im_editable im-chat-input--t')

Правильно будет так:

el = driver.find_elements_by_class_name('im-chat-input--text')[1]

Поиск по маске
im_editable*:

el = driver.find_element_by_xpath("//div[starts-with(@id,'im_editable')]")

Поиск по куску кода
Любой самый сложный элемент состоит из атрибутов и их значений. Используйте
xpath для поиска.
В общем случае:

driver.find_element_by_xpath("//elementType[@firstAttributeType = 'firstAttributeValue'][@secondAttributeType='secondAttributeValue'][@thirdAttributeType='thirdAttributeValue']....");
Например:

driver.find_element_by_xpath("//*[@class='im_editable'][@class='im-chat-input--t']");
Подробнее про
xpath можно почитать, например, в Мануал по XPath


Обработка сообщений ВКонтакте Python
Есть бот ВК на Python 3. Используется библиотека vk_api.
Предположим, есть такой код:
<code>
bot_longpoll = VkBotLongPoll(vk_session, group_id) # получаю longpoll api
vk = vk_session.get_api()
for event in bot_longpoll.listen(): # слушаю longpoll
   if event.type == VkBotEventType.MESSAGE_NEW:
       if event.object.text == f'Ник Пользователь':
           vk.messages.send(random_id=random.getrandbits(32), peer_id=event.object.peer_id,
                         message='тут чтот-то надо писать')
</code>
В чем суть? event.object.text - это ВСЁ (его содержание) сообщение от пользователя, который написал "Ник Пользователь", можно ли сделать так, чтобы бот не проверял слово ник в evente и проверял только Пользователь (сам ник)? Если да, то можно, пожалуйста, способы реализации этого?

Используйте
event.object.text.lower().split()
Первая функция будет менять регистр на нижний, а вторая будет разделять слова по пробелу.
Например:

words = event.object.text.lower().split()
if words[1] == 'username':
    pass # что-то делается

Про
split почитайте тут, а про
lower тут


Как замедлить имитацию ввода символов selenium
Как замедлить имитацию ввода символов:
При использовании функции
.send_keys вводимые предложения из переменной съедаются и пишутся не сначала, а где-то с середины

text_message = 'bla-bla-bla-bla-bla-bla-bla-blabla-blabla-bla-bla-bla-bla-bla'

buf = driver.find_elements_by_class_name('im-chat-input--text')
buf.time.sleep(wait_1).set(text_message).set_value(text_message).time.sleep(wait_1).send_keys(Keys.ENTER)

как написать sleep правильно?

Можно замедлить таким образом:
<code>
text_message = 'bla-bla-bla-bla-bla-bla-bla-blabla-blabla-bla-bla-bla-bla-bla'
buf = driver.find_elements_by_class_name('im-chat-input--text')

for ch in text_message:
    buf.send_keys(ch)
    time.sleep(wait_1)

buf.send_keys(Keys.ENTER)
</code>


Проверка сессии в каждом руте
У меня есть небольшой сайт на Flask. На некоторых рутах я хочу проверять, активна ли сессия которая несет в себе
cookie и введенные пользователем данные. Как только ко мне пришла эта идея,я сделал следующую функцию:

def check_for_main_sess():
    if flask.session.get('user_data') is None:
        return flask.redirect(flask.url_for('authorize'))
    return flask.redirect(flask.url_for('home'))

Но,после прохода даже через
return, она не перенаправляла на нужную страницу,а просто проходила мимо. Тогда я сделал декоратор похожего вида:

def check_main_sess(func):
    def check_main_sess_inner():
        if flask.session.get('user_data') is None:
            return flask.redirect(flask.url_for('authorize'))
        return func()
    return check_main_sess_inner

К сожалению,он тоже не работает. Что я делаю не так?

После исправления функции декоратора
check_main_sess_inner, при выходи из if'a должна возвращать
flask.redirect(flask.url_for('home'))


Как в этой программе можно реализовать ввод с клавиатуры?
<code>
import tkinter as Tk

class Calculator:
    """Main class that constructs the calculator and handles user input and calculations"""

    def __init__(self, parent):
        # Глобальные переменные
        self.operations = {'+': False,
                           '-': False,
                           '*': False,
                           '/': False}
        self.first_number_selected = 0
        self.second_number_selected = 0

        # Расширение элементов для заполнения
        expand_button = Tk.N + Tk.E + Tk.S + Tk.W

        # Установка дисплея
        self.display_label = Tk.Label(parent, text='0', font=('DS-Digital', 27, 'bold italic'),
                                      bg='#c2d899', fg='#3a3e47', height=1, width=20, relief="sunken")
        self.display_label.grid(row=0, column=0, columnspan=7, sticky=expand_button)

        # Создание кнопок
        # Кнопки с цифрами
        Tk.Button(parent, height=2, width=12, text='1', bg='#5a5c68', fg="#ffffff", bd='4', font=("Helvetica", 9, "bold"), command=self._number_callback(1)).grid(row=2, column=0)
        Tk.Button(parent, height=2, width=12, text='0', bg='#5a5c68', fg="#ffffff", bd='4', font=("Helvetica", 9, "bold"), command=self._number_callback(0)).grid(row=2, column=1)

        # Операционные кнопки
        for position, operator in enumerate(self.operations.keys()):
            k=0
            Tk.Button(parent, text=operator, height=2, width=12, bg='#bdc1c8', fg="#ffffff", bd='4', font=("Helvetica", 9, "bold"), command=self._operation_callback(operator)).grid(row=3, column=position+k)
        Tk.Button(parent, text='C', height=2, width=25, bg='#bdc1c8', fg="#ffffff", bd='4', font=("Helvetica", 9, "bold"), command=self.reset).grid(row=2, column=2, columnspan=2, sticky=expand_button)
        Tk.Button(parent, text='ToDec', height=2, width=15, bg='#bdc1c8', fg="#ffffff", bd='4', font=("Helvetica", 9, "bold"), command=self.bintodec).grid(row=2, column=4, columnspan=1)
        Tk.Button(parent, text='ToBin', height=2, width=15, bg='#bdc1c8', fg="#ffffff", bd='4', font=("Helvetica", 9, "bold"), command=self.dectobin).grid(row=3, column=4, columnspan=1)
        Tk.Button(parent, text='=', height=2, bg='#bdc1c8', fg="#ffffff", bd='4', font=("Helvetica", 9, "bold"), command=self.calculate_result).grid(row=4, columnspan=7, sticky=expand_button)

    def number_pressed(self, button_number):
        """Эта функция вызывается, когда нажимаются 1 или 0"""

        if not any(self.operations.values()):
            if self.first_number_selected == 0:
                self.first_number_selected = button_number
                self.display_label['text'] = str(button_number)
            else:
                self.display_label['text'] += str(button_number)
                self.first_number_selected = int(self.display_label['text'], 2)
        elif self.second_number_selected == 0:
            self.second_number_selected = button_number
            self.display_label['text'] = str(button_number)
        else:
            self.display_label['text'] += str(button_number)
            self.second_number_selected = int(self.display_label['text'], 2)

    def _number_callback(self, number):
        """Вспомогательный метод, который создает функцию обратного вызова
         для каждой из кнопок, обозначающих цифры."""
        return lambda: self.number_pressed(number)

    def operation_selected(self, operation):
        """Эта функция срабатывает при нажатии +, -, * или /.
         Сначала проверяется, введены ли первое и второе число.
         Если это так, рассчитывается результат операции и отображается на дисплее,
             затем устанавливается операция для последнего введенного числа.
         Это позволяет многократно вычислять до нажатия кнопки «=»."""
        if self.second_number_selected and self.first_number_selected:
            self.first_number_selected = self.calculate_result()
            self.display_label['text'] = str(self.first_number_selected)

        self._reset_operations()
        self.operations[operation] = True

    def _operation_callback(self, sign):
        """Вспомогательный метод, который создает функцию обратного вызова
         для каждой из кнопок, которые обозначают операции."""
        return lambda: self.operation_selected(sign)

    def _reset_operations(self):
        """Сброс всех нажатых операций"""
        for operator in self.operations.keys():
            self.operations[operator] = False

    def calculate_result(self):
        """Выполняются вычисления, затем устанавливает переменные для будущих операций с результирующим числом"""
        result = self.first_number_selected
        if self.operations['+']:
            result = self.first_number_selected + self.second_number_selected
        elif self.operations['-']:
            result = self.first_number_selected - self.second_number_selected
        elif self.operations['*']:
            result = self.first_number_selected * self.second_number_selected
        elif self.operations['/']:
            result = round(self.first_number_selected / self.second_number_selected, 3)
            result = int(result, 2) if result.is_integer() else result

        self.first_number_selected = result
        self.second_number_selected = 0  # Resets for next calculation if the clear button is not pressed
        self._reset_operations()
        self.display_label['text'] = bin(result)[2:]

        return result

    def bintodec(self):
        self.display_label['text'] = int(self.calculate_result())

    def dectobin(self):
        self.display_label['text'] = bin(self.calculate_result())[2:]

    def reset(self):
        """Сбросить все переменные в их состояние по умолчанию"""
        self.first_number_selected = 0
        self.second_number_selected = 0
        self._reset_operations()
        self.display_label['text'] = '0'

    @staticmethod
    def run():
        frame = Tk.Tk()
        frame.geometry()
        frame.wm_title('Двоичный калькулятор')
        frame.resizable(width=False, height=False)
        Calculator(frame)
        frame.mainloop()

def main():
    Calculator.run()

if __name__ == '__main__':
    main()
</code>

В
__init__ добавить привязку к событию нажатия клавиши:

parent.bind("<Key>", key_pressed)

Добавить метод
key_pressed (100% правильность не гарантирую, но логика примерно такая):

def key_pressed(self, event):
    if event.char in '01':
        self.number_pressed(int(event.char))
    elif event.char in '+-*/':
        self.operation_selected(event.char)


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

s = "I'm global variable"

def foo():
    print(s)
    s = 'Reset global variable'

foo()

Я предполагал, что когда интерпретатор дойдёт до строки print(s), он поймёт, что в области видимости функции foo такой переменной не существует. Следовательно начнёт искать её во внешней области видимости, но там она есть.
Однако в результате в консоль выводится следующее сообщение об ошибке:

Traceback (most recent call last):
  File "index.py", line 7, in <module>
    foo()
  File "index.py", line 4, in foo
    print(s)
UnboundLocalError: local variable 's' referenced before assignment

Проблема исчезает, если закомментировать строку

s = 'Reset global variable'

но мне всё равно не понятен механизм

Марк Лутц - "Изучаем Python", глава 20, страница 596

Как известно, имена, которым выполняется присваивание внутри функции,
  по умолчанию рассматриваются как локальные – они располагаются в
  области видимости функции и существуют только во время работы функции.
  Но я еще не говорил, что локальные переменные определяются статически,
  во время компиляции программного кода в инструкции def, а не в
  соответствии с операциями присваивания, производимыми во время
  выполнения. Эта особенность становится причиной появления самых
  причудливых сообщений в группе новостей, получаемых от начинающих
  программистов. Обычно, если внутри функции имени не присваивается
  какое-либо значение, поиск его будет производиться в области видимости
  объемлющего модуля. Но посмотрите, что произойдет, если добавить
  инструкцию присваивания переменной X после ее использования.
<code>
X = 99
>>> def selector():
... print(X) # Переменная еще не существует!
... X = 88 # X классифицируется как локальная переменная
... # То же самое происходит при “import X”, “def X”...
>>> selector()
Traceback (most recent call last):
...текст сообщения об ошибке опущен...
UnboundLocalError: local variable ‘X’ referenced before assignment
</code>
Было получено сообщение о том, что переменная не определена, но
  причина его появления не очевидна. Этот программный код компилируется
  интерпретатором во время ввода в интерактивной оболочке или во время
  импорта модуля. Вовремя компиляции Python обнаруживает операцию
  присваивания переменной X и делает вывод, что X – это локальное имя
  везде в теле функции. Но во время выполнения функции, из-за того, что
  к моменту вызова инструкции print операция присваивания еще не
  производилась, интерпретатор сообщает о том, что имя не определено.
  Согласно этому правилу использования имен, он говорит, что обращение к
  локальной переменной X произведено до того, как ей было присвоено
  значение. Фактически любая операция присваивания внутри функции
  создает локальное имя. Операция импортирования, =, вложенные
  инструкции def, вложенные определения классов и так далее – все
  трактуются именно таким образом. Проблема возникает из-за того, что
  операция присваивания делает имена локальными для всей функции, а не
  только для той ее части, которая следует за инструкцией присваивания.

Читать учебники - полезно.


Как взять срез строки, начиная со предельных слов?
Есть список строк(каждая более 200 символов)
Необходимо проверить каждую строку на наличие определённых слов и взять срез в 5 символов с момента вхождения этих слов(включительно)
Например :
Ключевые слова: ‘что’, ‘в’
[‘Привет! Как дела, что делаешь?’, ‘а наши люди в булочную на такси не ездят’]
В первом случае должно возвращаться ‘что д’
Во втором - ‘в бул’

Можно при помощи регулярных выражений.
Опишу регекс:

(?= ) - positive lookahead - находим значение в скобках, потом отматываем анализатор к его началу;

\b \b - ищем целые слова (флаг
re.UNICODE нужен, чтобы срабатывало для кириллицы)

(?: ) - non-matching group - то, что в этих скобках - должно быть найдено, но не выводится в качестве отдельной группы

| - или одно слово, или другое. Сюда можно добавлять ещё слов

.{5} - выбираем 5 символов

import re

find_regex = re.compile(r'(?=\b(?:Что|в)\b).{5}', re.UNICODE|re.IGNORECASE)

lines = [
    'Привет! Как дела, что делаешь? Не ходи в кино!',
    'а наши люди в булочную на такси не ездят',
    'test'
]
matches = []
for line in lines:
    matches += re.findall(find_regex, line)
print(matches)

Результат:

['что д', 'в кин', 'в бул']

Здесь можно поэкспериментировать: regex101.com


Ошибка в переводе формата даты pandas
Коллеги,
помогите с ошибкой в корректный перевод даты.
Есть датафрейм:
df:

name  date
Fora  08.04.2019 14:04
Jara  17.12.2018 17:29
Aura  04.07.2018 16:40

все типы изначально non-null object
Следующим кодом я хочу корректно изменить тип date как формату даты, но при этом сохранить изначальный вид даты:

df['date'] = pd.to_datetime(df['date']).dt.strftime('%d.%m.%Y')

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

name  date
Fora  04.08.2019
Jara  17.12.2018
Aura  07.04.2018

т.е. то что должно быть днем стало месяцем :((( Буду признателен за подсказку, как это сделать грамотно и без ошибок!

А ещё есть параметр
format:

df["date"] = pd.to_datetime(df["date"], format="%d.%m.%Y", dayfirst=True)

   name       date
0  Fora 2019-08-04
1  Jara 2018-12-17
2  Aura 2018-04-07


np.set_printoptions(formatter={'int':hex})
Я конвертирую numpy массив в шестнадцатеричные числа

np.set_printoptions(formatter={'int':hex})
np.array([1,2,3, 65535])

Получаю такой вывод:

array([0x1, 0x2, 0x3, 0xffff])

Однако, мне необходимо наличие "ведущих нулей", то есть, чтобы я получал массив вида:

array([0x0001, 0x0002, 0x0003, 0xffff])

То есть, чтобы после 0x шло ровно 4 символа (Я не перехожу границу 0xffff).
Подскажите, пожалуйста, как это можно сделать?

Можно добавить соответствующее форматирование:

np.set_printoptions(formatter={'int': lambda x:"{:#06x}".format(x)})
np.array([1,2,3, 65535])

Вывод:

array([0x0001, 0x0002, 0x0003, 0xffff])


Не работает оператор [закрыт]

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

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

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

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

Всем привет, начал изучать пайтон по книге, и пошла речь по оператору break, то код не запускается, в чем проблема?
<code>
while True:
    s = input('Введите что-то:')
    if s == 'Выход':
       break
     print('Длина строки:', len(s))
print ('Завершение  ')
</code>

У вас в коде есть ошибки, из-за них код и не работает.
Вот исправленный и рабочий код:

while True:
    s = input('Введите что-то:')
    if s == 'Выход':
        break
    print('Длина строки:', len(s))
print('Завершение  ')

Ошибки:
1. Лишний пробел перед строкой:

print('Длина строки:', len(s))

2. Перед break 7 пробелов, а должно быть 8.
И еще есть недочеты:
1. Между последним print и круглой скобкой не должно быть пробела.
2. Ну и вообще по хорошему в самом конце кода у вас должна быть пустая строка.


Применение рекурсии при обходе дерева
Проблема в следующем: если я указываю возвращение перед рекурсивным вызовом функции:
return find(node, counter) - она завершается раньше времени, пропуская первые ветки дерева. Если не указываю:
find(node, counter) - обходит все узлы, но не возвращает счетчик (counter). Как мне обойти все дерево?

def Count(self):
    if not self.Root:
        return 0
    tree = self.Root
    counter = 1
    def find(tree, counter):
        for node in tree.Children:
            counter += 1
            if node.Children:
                return find(node, counter) # this place
        return counter
    count = find(tree, counter)
    return count

Чтобы составить рекурсивную функцию, нужно думать рекурсивно :)
Допустим у нас уже есть корректная функция
find которая делает то, что нам нужно - считает количество узлов начиная с некоторого корня.
Тогда для текущего узла нам нужно посчитать количество узлов для всех детей, вызвав
find для каждого, а так же прибавить к этой сумме единицу - текущий узел.

def Count(self):
    def find(tree):
        return 1 + sum(find(node) for node in tree.Children)

    return 0 if self.Root is None else find(self.Root)


Вставить строку с данными словаря в Excel файл
Есть Excel файл в котором находится 22 столбца, а количество строк изначально 0.
Пример файла:

id col1 col2 col3  ...

1  sds  dsd  sdsd  ...
2  saa  asd  asda  ...
3  dsd  sds  dsds  ...
.  ...  ...  ....

Не получается вставить в данный файл строку данные словаря. Значения словаря соответствуют значению строки в приложении собраного с помощью Pyside2:

main_dict = {
'id' : 23 ,
'col1' : 'some_date' ,
'col2' : 'some_date',
'col3' : 'some_date'}

То есть, ключи словаря это столбцы Excel файла.

ValueError: If using all scalar values, you must pass an index

Код который я использую (отступы соблюдены):

def insert_data():
df = pd.read_excel('file.xlsx' , sheet_name= 'Sheet1' )
# print(df)

data = []
index = []

main_dict = {
'id' : 23 ,
'col1' : 'some_data' ,
'col2' : 'some_data',
'col3' : 'some_data' ,
'col4' : 'some_data',
'col5' : 'some_data',
'col6' : 'some_data' ,
'col7' : 'some_data',
'col8' : 'some_data',
'col9' : 'some_data',
'col10' : 'some_data',
'col11' : 'some_data' ,
'col12' : 'some_data',
'col13' : 'some_data',
'col14' : 'some_data' ,
'col15' : 'some_data',
'col16' : 'some_data',
'col17' : 'some_data',
'col18' : 'some_data' ,
'col19' : 'some_data',
'col20' : 'some_data',
'col21' : 'some_data',
}

data.append(list(main_dict.values()))
index.append(main_dict['id'])

new = pd.DataFrame(data, columns=main_dict.keys(), index=index)
res = df.append(new)

Пример:
Исходный DataFrame:

In [6]: df
Out[6]:
   id col1 col2 col3
0   1  aaa  bbb  ccc
1   2  aa2  bb2  cc2

In [8]: list(main_dict.values())
Out[8]: [23, 'some_date', 'some_date', 'some_date']

Добавляем строку в DF:

In [9]: df.loc[main_dict['id']] = list(main_dict.values())

In [10]: df
Out[10]:
    id       col1       col2       col3
0    1        aaa        bbb        ccc
1    2        aa2        bb2        cc2
23  23  some_date  some_date  some_date

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

data = []
index = []

main_dict = {
    'id' : 23 ,
    'col1' : 'some_date' ,
    'col2' : 'some_date',
    'col3' : 'some_date'}
data.append(list(main_dict.values()))
index.append(main_dict['id'])

main_dict = {
    'id' : 24,
    'col1' : 'some_date_2',
    'col2' : 'some_date_2',
    'col3' : 'some_date_2'}
data.append(list(main_dict.values()))
index.append(main_dict['id'])

new = pd.DataFrame(data, columns=main_dict.keys(), index=index)

res = df.append(new)

In [20]: res
Out[20]:
    id         col1         col2         col3
0    1          aaa          bbb          ccc
1    2          aa2          bb2          cc2
23  23    some_date    some_date    some_date
24  24  some_date_2  some_date_2  some_date_2


Сравнить 2 датафрейма и показать изменения
Подскажите, пожалуйста как при сравнение 2-х датафреймов в pandas вывести только произошедшие изменения по условиям.
df1:

Id   Name  Amount Contract_ID  Date
195   ART   200     23rt       2019-02-21
264   Pict  150     18f        2019-01-17
482   Tras  379     427df      2019-02-10
294   Fish  375     29fg       2019-02-11

df2

Id   Name  Amount  Contract_ID  Date
195    ART   250      23rt       2019-03-26
190    Tree  100      312ft      2019-03-15
482    Tras  379      427df      2019-03-20
264    Pict  50       18f        2019-04-01
294    Fish  450      29fg       2019-04-20
294    Fish  100      26394rt    2019-03-20

Нужно получить следующий результат - создать датафрейм где будут только те row, где произошло увеличение суммы, либо новые row:

df_update:
195    ART   250      23rt       2019-03-26
190    Tree  100      312ft      2019-03-15
294    Fish  450      29fg       2019-04-20
294    Fish  100      26394rt    2019-03-20

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

df_update = df1.merge(df2, how='outer', indicator=True).query("_merge == 'right_only'")

Пошаговое решение:
делаем
"FULL OUTER JOIN" по столбцам
['Id','Name','Contract_ID'] с индикацией. Столбцы второго DF, не участвующие в объединении, получат суфикс
_new:

m = (d1.merge(d2, how='outer', on=['Id','Name','Contract_ID'],
              suffixes=['', '_new'], indicator=True))

In [39]: m
Out[39]:
    Id  Name  Amount Contract_ID       Date  Amount_new   Date_new      _merge
0  195   ART   200.0        23rt 2019-02-21         250 2019-03-26        both
1  264  Pict   150.0         18f 2019-01-17          50 2019-04-01        both
2  482  Tras   379.0       427df 2019-02-10         379 2019-03-20        both
3  294  Fish   375.0        29fg 2019-02-11         450 2019-04-20        both
4  190  Tree     NaN       312ft        NaT         100 2019-03-15  right_only
5  294  Fish     NaN     26394rt        NaT         100 2019-03-20  right_only

заполним отсутствующие значения в столбцах
['Amount', 'Date'] из соответствующих строк в
DF2 (этот шаг можно пропустить):

m[['Amount', 'Date']] = (m[['Amount', 'Date']]
                         .apply(lambda c: c.combine_first(m[f'{c.name}_new'])))

In [41]: m
Out[41]:
    Id  Name  Amount Contract_ID       Date  Amount_new   Date_new      _merge
0  195   ART   200.0        23rt 2019-02-21         250 2019-03-26        both
1  264  Pict   150.0         18f 2019-01-17          50 2019-04-01        both
2  482  Tras   379.0       427df 2019-02-10         379 2019-03-20        both
3  294  Fish   375.0        29fg 2019-02-11         450 2019-04-20        both
4  190  Tree   100.0       312ft 2019-03-15         100 2019-03-15  right_only
5  294  Fish   100.0     26394rt 2019-03-20         100 2019-03-20  right_only

выбираем только интересующие нас строки:

m.query("Amount_new > Amount or _merge=='right_only'")

In [42]: m.query("Amount_new > Amount or _merge=='right_only'")
Out[42]:
    Id  Name  Amount Contract_ID       Date  Amount_new   Date_new      _merge
0  195   ART   200.0        23rt 2019-02-21         250 2019-03-26        both
3  294  Fish   375.0        29fg 2019-02-11         450 2019-04-20        both
4  190  Tree   100.0       312ft 2019-03-15         100 2019-03-15  right_only
5  294  Fish   100.0     26394rt 2019-03-20         100 2019-03-20  right_only


Python. Уникальные и ключ и значение в словаре
Прошу помощи.
Есть словарь:

my_dict = {'aaa': 40, 'aaa': 40, 'aaa': 30, 'bbb': 40, 'bbb': 30, 'bbb': 40}

не соображу, как оставить в словаре только уникальные ключ/значение. В результате должно быть:

my_dict = {'aaa': 40, 'aaa': 30, 'bbb': 40, 'bbb': 30}

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

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

my_set = {('aaa', 40), ('aaa', 40), ('aaa', 30),
          ('bbb', 40), ('bbb', 30), ('bbb', 40)}

print(my_set)
# Остались только уникальные пары:
# {('aaa', 40), ('aaa', 30), ('bbb', 30), ('bbb', 40)}


Простейшее веб-приложение [закрыт]

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

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

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

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

Необходимо сделать простейшее веб-приложение, которое будет отвечать json'ами на различные GET и POST запросы.

Вопрос: какую библиотеку/фреймворк лучше использовать?

Интересуют именно библиотеки/фреймворки для создания простейших веб-приложений, т.к., как мне кажется, Django и Flask (других не знаю) слишком "навороченные" для такого.

Думаю, что Flask замечательно подойдет под эти требования, минимальное количество строчек кода для создания хэндлеров GET/POST запросов + большое количество документации, ну и "plug and play", не требуется танцев с бубнами чтобы все это заработало. А так, есть еще aiohttp и tornado, но это уже не будет просто в плане реализации.


Парсинг многострочного текст Python
Хочу распарсить многострочный текст

re.findall(just_text_(\w+)].*another text = (\d+), mytext, re.S)

Пример текста

[just_text_FIRST_TARGET]
some_text
some_text
another text = 1
some_text
some_text
some_text
some_text
some_text
some_text

[just_text_SECOND_TARGET!]
some_text
some_text
another text = 2
some_text
some_text
some_text
some_text
some_text
some_text

Но на выходе не получаю ничего.
Флаги Dotall и Multiline использовал.
На выходе надо получить
[(FIRST_TARGET,1),(SECOND_TARGET,2)]
Никто с подобным не сталкивался?

Все нормально работает:

import re

mytext = '''
[just_text_FIRST_TARGET]
some_text
some_text
another text = 111
some_text
some_text
some_text
some_text
some_text
some_text

[just_text_SECOND_TARGET]
some_text
some_text
another text = 112
some_text
some_text
some_text
some_text
some_text
some_text
'''

print(re.findall(r'\[just_text_(\w+)\].*?another text = (\d+)', mytext, re.S))

Результат:

[('FIRST_TARGET', '111'), ('SECOND_TARGET', '112')]

.*? дает минимальное совпадение (без вопроса будет результат
[('FIRST_TARGET', '112')], т.е. будет взято максимально возможное совпадения для данной строки)

re.MULTILINE (он же
re.S) нужен только если вы хотите чтобы знак
^ матчил начало строки.


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

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

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

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

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

Белочка разгрызает кучу орешков, которая равна факториалу числа N, и находит в них изумруды. Количество изумрудов получается равным первой цифре факториала.
Функция
int squirrel(int N)
получает параметром целое неотрицательное число N, и возвращает первую цифру факториала N!

def squirrel(self, N):
    s = 1
    factorial = 1
    emerald = 0
    nf = 0
    if(N == 0 or N == 1):
        emerald = 1
        return emerald
    for i in range(2, N+1):
        factorial *= i
    nf = factorial
    while nf != 0:
        nf = nf//10
        s *= 10
    emerald = int(factorial//(s / 10))
    return (emerald)

вроде и тесты сделал

import random
class my_work:
  def squirrel(self, N):
    s = 1
    factorial = 1
    emerald = 0
    nf = 0
    if(N == 0 or N == 1):
        emerald = 1
        return emerald
    for i in range(2, N+1):
      factorial *= i
      nf = factorial
    while nf != 0:
      nf = nf//10
      s *= 10
    emerald = int(factorial//(s / 10))
    return (emerald)

class my_test:
  def test1(self):
    test = my_work()
    print(test.squirrel(0))

  def test2(self):
    test = my_work()
    print(test.squirrel(1))

  def test3(self):
    test = my_work()
    for i in range(10):
      y = random.randint(0,10)
      print(test.squirrel(y))

test = my_test()
test.test3()

При синтаксической ошибке программа не запускается,а эта работает как-то, несмотря на целочисленное деление на вещественное число.
Лишнее выкинул:
<code>
def squirrel(N):
    emerald = 1
    for i in range(2, N+1):
        emerald *= i
    while emerald >= 10:
        emerald //= 10
    return emerald
</code>


Как преобразовать pd.series символьные строки в np.array?
Есть dataset, признак pixel, у него внутри описание пикселей в символьном виде:

'100 54 123 423 43'

Как преобразовать его в
numpy.array?

import numpy as np
import pandas as pd
df=pd.DataFrame([['100 50 77 80'],['40 50 69 77']],columns=['pixels'])
#на выходе хочу преобразовать каждый объект pixels в np.array(2,2)
#прошу прощения не умею работать со stackoverflow

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

In [45]: a = df.pixels.str.split(expand=True).astype(int).values

In [46]: a
Out[46]:
array([[100,  50,  77,  80],
       [ 40,  50,  69,  77]])

In [47]: a.dtype
Out[47]: dtype('int32')

PS чтобы получить
np.array размером 2,2 из 8 чисел вы должны объяснить по какому принципу вы их хотите получить... ;)

UPDATE:

на выходе хочу преобразовать каждый объект pixels в np.array(2,2)

судя по описанию вам нужна 3D матрица размерности:
(<# of rows in DF>, 2, 2)

In [7]: a = a.reshape(-1, 2, 2)

In [8]: a
Out[8]:
array([[[100,  50],
        [ 77,  80]],

       [[ 40,  50],
        [ 69,  77]]])

In [9]: a.shape
Out[9]: (2, 2, 2)


Замена данных в колонке DataFrame по условию
Имеется
df с колонками
col1 и
col2. Задача состоит в том, что в случае наличия в
col1 определенного значения, например
'0&&&&', выполнялось доопределение данных из
col2 с помощью регулярки
pattern = r'\d{2}U[A-Z]{2}' и записывалось в
col1. Запись должна выполняться только при нахождении одного совпадения.
Мое решение:

df = pd.DataFrame({'col_1': ['0&&&&','0&&&&','1&&&&'],
                   'col_2': ['Протон 13UBN','out 00UBN 10UKA', '10UBB'],
                   index=1, 2, 3})

def define_units(row):
    pattern = r'\d{2}U[A-Z]{2}'
    if row['col1'] == '0&&&&':
        result = re.findall(pattern, row['col2'])
        if len(result) == 1:
            return result[0]
        else:
            return row['col1']
    else:
        return row['col1']

df['col1'] = df.apply(define_units, axis=1)

Было:

Index  col1    col2
1     0&&&&   Протон 13UBN
2     0&&&&  out 00UBN 10UKA
3     0&&&&  10UBB

Стало:

Index  col1    col2
1     13UBN   Протон 13UBN
2     0&&&&  out 00UBN 10UKA
3     0&&&&  10UBB

Возникшие сложности:
1) Хотел бы значение условия
if row['unit'] == '0&&&&', а именно,
(0&&&&), передавать в функцию параметрически. Не очень понимаю, как это можно сделать.
2) Хотел бы записывать в df только доопределенные данные. А при данном подходе приходиться еще и перезаписывать данные не удовлетворяющие условию.

Исходный DF:

In [29]: df = pd.DataFrame({'col_1': ['0&&&&','0&&&&','1&&&&'],
    ...:                    'col_2': ['Протон 13UBN','out 00UBN 10UKA', '10UBB']},
    ...:                    index=[1, 2, 3])

In [30]: df
Out[30]:
   col_1            col_2
1  0&&&&     Протон 13UBN
2  0&&&&  out 00UBN 10UKA
3  1&&&&            10UBB

Вспомогательный Series:

In [31]: tmp = df['col_2'].str.findall(r'\d{2}U[A-Z]{2}')

In [32]: tmp
Out[32]:
1           [13UBN]
2    [00UBN, 10UKA]
3           [10UBB]
Name: col_2, dtype: object

Замена:

In [33]: df.loc[(df['col_1'] == '0&&&&') & tmp.str.len() == 1, 'col_1'] = tmp.str[0]

Результат:

In [34]: df
Out[34]:
   col_1            col_2
1  13UBN     Протон 13UBN
2  0&&&&  out 00UBN 10UKA
3  1&&&&            10UBB

PS
df.apply(function, axis=1) - один из самых медленных способов работы с Pandas DataFrame
PPS все функции поиска и замены в Pandas работают с единственным RegEx шаблоном - передать сразу несколько шаблонов не получится. Вместо этого иногда можно использовать более сложные шаблоны.


Ошибка cv2.error
Когда я запускаю строку
<code>
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
</code>
(используется opencv-python 4.1.0), ничего не работает. Ошибка:

cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1658: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

У другого человека тот же код работает. В чём может быть проблема?

Скорее всего вы не указали полный путь к соответствующему XML:
haarcascade_frontalface_default.xml или указали его неверно:

faceCascade = cv2.CascadeClassifier(r'C:\<full_path_to...>\Library\etc\haarcascades\haarcascade_frontalface_default.xml')

Похожий вопрос на SO...


Как ввести массив с клавиатуры?
Как вводить элементы массива с клавиатуры? Задание: Дан массив целых чисел. Найти сумму и произведение элементов массива, расположенных между первым и вторым нулевыми элементами.
<code>
l = [1, 4, 0, 3, 2, 7, 3, 1, 0, 34]
t, c, k = 1, 0, 0
for i in l:
  if i == 0:
     if k == 1: break
     k = 1
     continue
  if k == 1:
     t *= i
     c += i

print(t)
print(c)
</code>

Ввод чисел через пробел:

my_list = [int(el) for el in input().split()]

Первый и второй ноль можно найти через index (проверка на вхождение обоих нулей - count(0)):

first = my_list.index(0)
second = my_list.index(0, first + 1)

Сумма:

s = sum(q[first+1:second])

Произведение:

from functools import reduce
mul = reduce(lambda x, y: x*y, q[first+1:second])


Разработать функцию, которая для заданного натурального числа N возвращает количество его делителей
Возникла проблема с заданием, не могу найти ошибку:
Разработать функцию, которая для заданного натурального числа N возвращает количество его делителей. С помощью данной функции: для заданного числа А вывести на экран следующее по отношению к нему число, имеющее столько же делителей, сколько и число А.
Например, если ввести число 4, то должно вывести 6, но не ничего не выводится
<code>
def function(n):
  i=1
  m=0
  while i<=n:
    if n%i == 0:
      m+=1
      i+=1
  print(m)
a=int(input())
b=a+1
while function(a)!= function(b):
  b=+1
else:
  print(b)
</code>

Для 4 следующее будет 9, т.к. у 6 четыре делителя, а нечётное количество - только у квадратов
Ошибки:
- i нужно было увеличивать в любом случае
- функция должна возвращать результат
- инкремент b+=1,а не b=+1
<code>
def function(n):
    i=1
    m=0
    while i<=n:
        if n%i == 0:
            m+=1
        i+=1
    return m
a=int(input())
b=a+1
while function(a)!= function(b):
    b+=1
print(b)
</code>


Шкала Scale и её параметры [закрыт]

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

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

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

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

Может кто-нибудь объяснить за что отвечает каждая строчка кода шкалы, как её использовать и как написать её минимумом кода.
Вот код найденный на pythonworld.ru, так ничего и не объяснил.
<code>
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Scale")
        self.style = Style()
        self.style.theme_use("default")

        self.pack(fill=BOTH, expand=1)

        scale = Scale(self, from_=0, to=100,
            command=self.onScale)
        scale.pack(side=LEFT, padx=15)

        self.var = IntVar()
        self.label = Label(self, text=0, textvariable=self.var)
        self.label.pack(side=LEFT)

    def onScale(self, val):
        v = int(float(val))
        self.var.set(v)

def main():
    root = Tk()
    ex = Example(root)
    root.geometry("250x100+300+300")
    root.mainloop()

if __name__ == '__main__':
    main()
</code>

Действительно минимальный пример (который ничего не делает, только создает ползунок в окне):

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

scale = ttk.Scale(root)
scale.pack()

root.mainloop()

Печать значения в консоль при перемещении движка:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

def on_scroll(val):
    print(val)

scale = ttk.Scale(root, from_=0, to=100, command=on_scroll)
scale.pack()

root.mainloop()

Получение значения в произвольный момент (при нажатии кнопки) через привязанную переменную:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

scale_var = tk.IntVar()
scale = ttk.Scale(root, from_=0, to=100, variable=scale_var)
scale.pack()

def on_button_press():
    print(scale_var.get())

button = ttk.Button(text="Press me", command=on_button_press)
button.pack()

root.mainloop()


Проблема при установке Pygame через pip
Пробую установить библиотеку Pygame для Python через pip. Запускаю командную строку и пишу:

pip install pygame

Но происходит ошибка:

"pip" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Версия Python 3.7, pip установлен, но установить Pygame всё равно не получается. Решения своей проблемы не нашёл. Помогите, пожалуйста.

Галочку в установщике python'a Поставь (там написанно (add to PATH) примерно)


как удалять сразу несколько объектов одной кнопкой?
Суть программы:
пишите имена в entry и он выводит имена вниз,так вот,когда нажимаешь на кнопку clear all names все имена должны стереться я сделал это с помощью
.destroy(), но когда нажимаешь на кнопку clear all names стирается только одно имя.Как сделать чтобы стирались все имена?
Вот сама программа:

from tkinter import *

root = Tk()
root.geometry('500x500')
# --- clear_and_save ---
def clear_and_save():
    # --- names commands ---
    global save_lbl
    save_lbl = Label(text=message.get())
    save_lbl.pack()
    # --- entry clear command ---
    name.delete(0,'end')
# --- clear function ---
def clear():
    destroy_object = [save_lbl]
    for i in destroy_object:
        i.destroy()

welcome = Label(text='write down')
# --- people's name ---
message = StringVar()
name = Entry(textvariable=message)
#--- save btn ---
save_btn = Button(root,text='save >>',command=clear_and_save)
# --- clear btn ---
clear_btn = Button(root,text='clear all names',command=clear)
# --- pack all objects ---
welcome.pack()
name.pack()
save_btn.pack()
clear_btn.pack()

root.mainloop()

Самая простая реализация вашей проблемы это просто обновлять один виджет, а не создавать каждый раз новый

from tkinter import *

root = Tk()
root.geometry('500x500')

# --- clear_and_save ---
def clear_and_save():
    # --- names commands ---
    save_lbl["text"] = save_lbl["text"] + "\n" + message.get()
    # --- entry clear command ---
    name.delete(0, 'end')

# --- clear function ---
def clear():
    save_lbl.destroy()

save_lbl = Label()
welcome = Label(text='write down')
# --- people's name ---
message = StringVar()
name = Entry(textvariable=message)
# --- save btn ---
save_btn = Button(root, text='save >>', command=clear_and_save)
# --- clear btn ---
clear_btn = Button(root, text='clear all names', command=clear)
# --- pack all objects ---
welcome.pack()
name.pack()
save_btn.pack()
clear_btn.pack()

save_lbl.pack()
root.mainloop()

Ну или если вам принципиально создавать все время
Label  то можно все это засунуть во
Frame и за счет функции
pack_slaves() удалить их
forget()ом

from tkinter import *

# --- clear_and_save ---
def clear_and_save():
    # --- names commands ---

    Label(frame, text=message.get()).pack()

    # --- entry clear command ---
    name.delete(0, 'end')

# --- clear function ---
def clear():
    frame_list = frame.pack_slaves()
    for i in frame_list:
        i.forget()

root = Tk()
root.geometry('500x500')
frame = Frame(root)

welcome = Label(text='write down')
# --- people's name ---
message = StringVar()
name = Entry(textvariable=message)
# --- save btn ---
save_btn = Button(root, text='save >>', command=clear_and_save)
# --- clear btn ---
clear_btn = Button(root, text='clear all names', command=clear)
# --- pack all objects ---
welcome.pack()
name.pack()
save_btn.pack()
clear_btn.pack()
frame.pack()

root.mainloop()


как обратиться к переменной в функции?
как обратиться к переменной в функции?
например есть код:
<code>
def func1():
  a = Label(text='aaa')
a.destroy()
</code>
Но это выведет ошибку, так как же обратиться к этой переменной?

как обратиться к переменной в функции?

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

a = Label(text='aaa')
a.destroy()

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

def createLabel (text):
    a = Label (text=text)
    return a

a = createLabel ('my label')


Проблема с функцией sleep() и root.after() на Python
Возникла проблема с функцией sleep() на языке программирования Python. Допустим, я создаю программу виртуального питомца и мне нужно определить для него функцию сна, её название -
sleep_f. Для этого я программирую следующие действия:

Идентификация нужных объектов -
Frame (это просто чёрный фон) и
Button (кнопка 'Back')
Удаление ненужных объектов - кнопка
Sleep
Появление
Frame
Задержка
Появление кнопки 'Back'

Примерный код приведён снизу:

from tkinter import *
import time
import random
root = Tk()
root.geometry('300x300')
sleep = 50
button = Button(text = 'Sleep', command = lambda: sleep_f())
button.place(x = 0, y = 0)
def sleep_f():
    global sleep
    if sleep < 51:
        sleep_ = Frame(bg = 'black', width = 300, height = 300)
        back = Button(text = 'Back')
        button.place_forget()
        sleep_.place(x = 0, y = 0)
        time.sleep(random.randint(5, 15))
        sleep = 100
        back.place(x = 25, y = 200)
root.mainloop()

И вроде бы всё хорошо, но на самом деле нет. Оказалось, что когда я нажимаю кнопку
Sleep, которая вызывает функцию, кнопка залипает и запускается задержка, а только после неё появляется фон и кнопка 'Back'. А мне требуется так, чтобы сначала появлялся фон, запускалась задержка, и уже после этого появлялась кнопка 'Back'. Надеюсь понятно. Помогите, пожалуйста.
UPD: Попробовал способ с
root.after(), также безуспешно.

from tkinter import *
import time
import random
root = Tk()
root.geometry('300x300')
sleep = 50
button = Button(text = 'Sleep', command = lambda: sleep_f())
button.place(x = 0, y = 0)
def sleep_f():
    global sleep
    if sleep < 51:
        sleep_ = Frame(bg = 'black', width = 300, height = 300)
        back = Button(text = 'Back')
        button.place_forget()
        sleep_.place(x = 0, y = 0)
        sleep = 100
        root.after(random.randint(5000, 15000), back.place(x = 25, y = 200))
root.mainloop()

Что я делаю не так?
UPD: Вопрос решён

Вот рабочий пример
<code>
from tkinter import *
import time
import random
import threading

root = Tk()
root.geometry('300x300')
sleep = 50
button = Button(text = 'Sleep', command = lambda: sleep_f())
button.place(x = 0, y = 0)

def timer(timeout, func):
    Timer = threading.Timer(timeout, func)
    Timer.start()
    # timeout - время в секундах
    # func - функция которая выполнится после истечения времени

def wakeup():
    global sleep
    sleep = 100
    back = Button(text = 'Back')
    back.place(x = 25, y = 200)

def sleep_f():
    global sleep
    if sleep < 51:
        sleep_ = Frame(bg = 'black', width = 300, height = 300)
        sleep_.place(x = 0, y = 0)
        timer(random.randint(5, 15), wakeup)

root.mainloop()
</code>


Как вывести случайное изображение на экран?
У меня есть девять изображений названных по принципу первое число, точка, второе число (например 1.1 2.3) мне нужно вывести случайное изображение по двум параметрам
код получился примерно такой:
<code>
import os
import random
a=random.randint(1,3)
b=random.randint(1,3)
os.startfile(r'D:\mt\a.b.png')
</code>
как написать последнюю строчку таким образом, чтобы систеа восприняла a.b как переменнные из которых формируется название, а не как название

Можно так

r'D:\mt\%d.%d.png' % (a, b)

а можно и так

r'D:\mt\{}.{}.png'.format(a, b)

Если Python 3.6 или новее, то можно ещё так

rf'D:\mt\{a}.{b}.png'


python modbus_tk: отсутствие ответа от slave (arduino)
Решая задачу обмена информацией по COM-порту с Arduino Mega 2560 с помощью modbus_tk столкнулся с проблемой отсутствия ответа от slave.
Пример кода:

import serial
import time

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu

# PORT = 1
PORT = '\\\\.\\COM7'

def main():
    logger = modbus_tk.utils.create_logger("console")

try:
    #Connect to the slave
    master = modbus_rtu.RtuMaster(
        serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N',
                      stopbits=1, xonxoff=0)
    )
    master.set_timeout(5.0)
    master.set_verbose(True)
    logger.info("connected")

    logger.info(master.execute(1, cst.READ_COILS, 0, 11))

except modbus_tk.modbus.ModbusError as exc:
    logger.error("%s- Code=%d", exc, exc.get_exception_code())

if __name__ == "__main__":
    main()

Вывод логгера:

2019-05-12 12:50:50,172 INFO    modbus_rtu.__init__ MainThread  RtuMaster
\\.\COM7 is opened
2019-05-12 12:50:50,177 INFO    mbus_server.main    MainThread  connected
2019-05-12 12:50:52,178 DEBUG   modbus.execute  MainThread  -> 1-1-0-0-0-11-
125-205
2019-05-12 12:50:57,178 DEBUG   modbus.execute  MainThread  <-
Traceback (most recent call last):
File "C:/data/partner_live/mbus_server.py", line 50, in <module>
    main()
File "C:/data/partner_live/mbus_server.py", line 27, in main
    logger.info(master.execute(1, cst.READ_COILS, 0, 11))
File "C:\Python37\lib\site-packages\modbus_tk\utils.py", line 39, in new
    raise excpt
File "C:\Python37\lib\site-packages\modbus_tk\utils.py", line 37, in new
    ret = fcn(*args, **kwargs)
File "C:\Python37\lib\site-packages\modbus_tk\modbus.py", line 306, in
    execute
    response_pdu = query.parse_response(response)
File "C:\Python37\lib\site-packages\modbus_tk\modbus_rtu.py", line 46, in
    parse_response
    raise ModbusInvalidResponseError("Response length is invalid
{0}".format(len(response)))
modbus_tk.exceptions.ModbusInvalidResponseError: Response length is invalid 0

Process finished with exit code 1

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

Немного абстрагировался от проблемы и внимательнее почитал форумы, например
вот этот. Оказалось, что ардуино сбрасывается после открытия порта и прежде, чем посылать первый запрос необходимо добавить выдержку времени (не менее секунды), таким образом заработал следующий код:
<code>
import serial
import time

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu

# PORT = 1
PORT = '\\\\.\\COM7'

def main():
    logger = modbus_tk.utils.create_logger("console")

try:
    #Connect to the slave
    master = modbus_rtu.RtuMaster(
        serial.Serial(port=PORT, baudrate=9600, bytesize=8, parity='N',
                      stopbits=1, xonxoff=0)
    )
    master.set_timeout(5.0)
    master.set_verbose(True)
    logger.info("connected")
    time.sleep(1)

    logger.info(master.execute(1, cst.READ_COILS, 0, 11))

except modbus_tk.modbus.ModbusError as exc:
    logger.error("%s- Code=%d", exc, exc.get_exception_code())

if __name__ == "__main__":
    main()
</code>


Как вывести результаты GridSearchCV для классификатора sklearn.svm.SVC?
Задача - подгрузить текстовую выборку, нормализовать её в числовую форму, подбор параметра сети.
Имею:

import sklearn
from sklearn import svm, datasets
newsgroups = datasets.fetch_20newsgroups(subset='all', categories=['alt.atheism', 'sci.space'])
X=newsgroups.data  #данные
y=newsgroups.target #индексы
from sklearn.feature_extraction.text import TfidfVectorizer as tfv
vector = tfv()  # TF-IDF
data_X = vector.fit_transform(X)  #тестовая выборка
import numpy as np
from sklearn.model_selection import KFold
grid = {'C': np.power(10.0, np.arange(-5, 6))} #указание параметров словаря
cv = KFold(n_splits=5, shuffle=True, random_state=241)  #конструктор разбиений
from sklearn.model_selection import GridSearchCV
clf = sklearn.svm.SVC(kernel='linear', random_state=241)  #классификатор
gs = GridSearchCV(clf, grid, scoring='accuracy', cv=cv) #подбор параметров
gs.fit(data_X, y)

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

for a in gs.grid_scores_:
    a.mean_validation_score # оценка качества по кросс-валидации
    a.parameters # значения параметров

Но это для старой версии. Для последней как-то так:

gs.best_estimator_
gs.best_params_
gs.best_score_

Удобнее всего будет преобразовать
gs.cv_results_ (результат настройки сети параметров) в Pandas.DataFrame.
Пример:

grid = {
    'C': np.power(10.0, np.arange(-1, 2)),
    'kernel': ['rbf', 'linear'],
}
gs = GridSearchCV(clf, grid, scoring='accuracy', cv=cv,
                  n_jobs=-1, verbose=1, return_train_score=True) #подбор параметров
gs.fit(data_X, y)

Сетка параметров:

In [22]: grid
Out[22]: {'C': array([ 0.1,  1. , 10. ]), 'kernel': ['rbf', 'linear']}

Создаем DataFrame из
gs.cv_results_:

res = pd.DataFrame(gs.cv_results_)

Получилось:

In [19]: res
Out[19]:
   mean_fit_time  std_fit_time  mean_score_time  std_score_time  ... split3_train_score split4_train_score mean_train_score  std_train_score
0       3.368227      0.116977         0.814210        0.058673  ...           0.565430           0.549335         0.552632         0.007027
1       2.908841      0.158428         0.727257        0.025806  ...           0.961512           0.967810         0.964305         0.004109
2       3.504162      0.136986         0.799417        0.056557  ...           0.565430           0.549335         0.552632         0.007027
3       1.824952      0.080142         0.426784        0.016244  ...           0.999300           1.000000         0.999720         0.000343
4       3.601515      0.124061         0.748441        0.045909  ...           0.565430           0.549335         0.552632         0.007027
5       1.842038      0.092328         0.407099        0.009595  ...           1.000000           1.000000         1.000000         0.000000

[6 rows x 22 columns]

In [20]: res.columns
Out[20]:
Index(['mean_fit_time', 'std_fit_time', 'mean_score_time', 'std_score_time', 'param_C', 'param_kernel', 'params',
       'split0_test_score', 'split1_test_score', 'split2_test_score', 'split3_test_score', 'split4_test_score',
       'mean_test_score', 'std_test_score', 'rank_test_score', 'split0_train_score', 'split1_train_score',
       'split2_train_score', 'split3_train_score', 'split4_train_score', 'mean_train_score', 'std_train_score'],
      dtype='object')

Выберем только интересующие нас столбцы:

In [21]: res.filter(regex='^(?:mean|param)')
Out[21]:
   mean_fit_time  mean_score_time param_C param_kernel                           params  mean_test_score  mean_train_score
0       3.368227         0.814210     0.1          rbf      {'C': 0.1, 'kernel': 'rbf'}         0.552632          0.552632
1       2.908841         0.727257     0.1       linear   {'C': 0.1, 'kernel': 'linear'}         0.950168          0.964305
2       3.504162         0.799417       1          rbf      {'C': 1.0, 'kernel': 'rbf'}         0.552632          0.552632
3       1.824952         0.426784       1       linear   {'C': 1.0, 'kernel': 'linear'}         0.993281          0.999720
4       3.601515         0.748441      10          rbf     {'C': 10.0, 'kernel': 'rbf'}         0.552632          0.552632
5       1.842038         0.407099      10       linear  {'C': 10.0, 'kernel': 'linear'}         0.993281          1.000000


Вызов методов инициализации при множественном наследовании
Предположим, у меня есть два класса, имеющих методы
__init__ и третий, наследующий их:

class A:
    def __init__ (self, x):
        self.x = x

class B:
    def __init__ (self, y):
        self.y = y

class C (A, B):
    def __init__ (self, **kwargs):
        A.__init__(self, **kwargs)
        B.__init__(self, **kwargs)

obj = C(**{'x': 5, 'y': 10})
#TypeError: __init__() got an unexpected keyword argument 'y'

Можно ли каким-либо образом осуществить инициализацию, не перечисляя вручную все аргументы для двух классов в параметрах
С.__init__?

В модуле
inspect есть функция
getfullargspec, которая для любой функции возвращает список её аргументов. Нулевым элементом этого списка идёт список обязательных аргументов. Для метода класса в нём первым будет
self. Соответственно, если для результата
getfullargspec взять срез
[0][:1] - то это и будут те имена, которые нужно передать в метод после
self.

from inspect import getfullargspec

def filter_args(all_kwargs, func):
    func_kwargs = getfullargspec(func)[0][1:]

    return {k: v for (k, v) in all_kwargs.items()
            if k in func_kwargs}

class A:
    def __init__ (self, x):
        self.x = x

class B:
    def __init__ (self, y):
        self.y = y

class C (A, B):
    def __init__ (self, **kwargs):
        a_kwargs = filter_args(kwargs, A.__init__)
        A.__init__(self, **a_kwargs)
        b_kwargs = filter_args(kwargs, B.__init__)
        B.__init__(self, **b_kwargs)

obj = C(**{'x': 5, 'y': 10})

print(obj.x)
print(obj.y)

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

class A:
    def __init__ (self, **kwargs):
        self.x = kwargs['x']

class B:
    def __init__ (self, **kwargs):
        self.y = kwargs['y']

class C (A, B):
    def __init__ (self, **kwargs):
        A.__init__(self, **kwargs)
        B.__init__(self, **kwargs)

obj = C(**{'x': 5, 'y': 10})

print(obj.x)
print(obj.y)


ImportError при попытке установки модулей с помощью pip
При попытке установить какой-либо модуль через консоль операционной системы Linux Ubuntu 16.04 LTS на виртуальной машине VirtualBox с помощью модуля pip появляется ошибка ImportError.
Пример:
<code>
    pip install dm-sonnet
    Traceback (most recent call last):
      File "/usr/bin/pip", line 9, in <module>
        from pip import main
    ImportError: cannot import name main
</code>
Подскажите, как исправить

sudo -H pip3 install --upgrade pip

sudo -H pip3 install --upgrade pipenv

Еще вот так возможно, если не от root.

pip install --user dm-sonnet


Django не видит модель после её перемещения в каталог models
Я переопределил модель User:

class Profile(AbstractUser):

    class Meta:
        ordering = ['id']
        verbose_name = u'человека'
        verbose_name_plural = u'Люди'

Прописал ее в
settings.py:

AUTH_USER_MODEL = 'main.Profile'

где
main - название моего приложения.
В
admin.py:

from .models import Profile

admin.site.register(Profile)

И в целом все прекрасно работало, тестилось. Заполнял тестовыми пользователями. Проблема проявилась после того, как я добавил модели для диалога в новом файле
dialogue.py подпапки
models моего проекта (вместе с
__init__.py):

from django.db import models
from main.models import Profile

class Dialogue(models.Model):
    Partakers = models.ManyToManyField(Profile)

class Message(models.Model):
    Sender = models.ForeignKey(Profile)

Ошибка:

    (hello) D:\django\site\hello>d: & cd D:\django\hello\Scripts & activate.bat & cd
 D:\django\site\hello & python manage.py runserver
Unhandled exception in thread started by <function wrapper at 0x02B93B70>
Traceback (most recent call last):
  File "D:\django\hello\lib\site-packages\django\utils\autoreload.py", line 228,
 in wrapper
    fn(*args, **kwargs)
  File "D:\django\hello\lib\site-packages\django\core\management\commands\runser
ver.py", line 116, in inner_run
    autoreload.raise_last_exception()
  File "D:\django\hello\lib\site-packages\django\utils\autoreload.py", line 251,
 in raise_last_exception
    six.reraise(*_exception)
  File "D:\django\hello\lib\site-packages\django\utils\autoreload.py", line 228,
 in wrapper
    fn(*args, **kwargs)
  File "D:\django\hello\lib\site-packages\django\__init__.py", line 27, in setup

    apps.populate(settings.INSTALLED_APPS)
  File "D:\django\hello\lib\site-packages\django\apps\registry.py", line 116, in
 populate
    app_config.ready()
  File "D:\django\hello\lib\site-packages\django\contrib\admin\apps.py", line 23
, in ready
    self.module.autodiscover()
  File "D:\django\hello\lib\site-packages\django\contrib\admin\__init__.py", lin
e 26, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "D:\django\hello\lib\site-packages\django\utils\module_loading.py", line
50, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "c:\python27\Lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
  File "D:\django\hello\lib\site-packages\django\contrib\auth\admin.py", line 7,
 in <module>
    from django.contrib.auth.forms import (
  File "D:\django\hello\lib\site-packages\django\contrib\auth\forms.py", line 22
, in <module>
    UserModel = get_user_model()
  File "D:\django\hello\lib\site-packages\django\contrib\auth\__init__.py", line
 199, in get_user_model
    "AUTH_USER_MODEL refers to model '%s' that has not been installed" % setting
s.AUTH_USER_MODEL
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'ma
in.Profile' that has not been installed

Модели удалил. Потом и файл удалил. Перезапустил runserver, но ошибка осталась
Нашел в сети похожую проблему, но так и не понял, как ее исправить

Если вы создаёте модуль
main.models в виде каталога, то за его содержимое отвечает файл
main/models/__init__.py.
Если файл
main/models/__init__.py пустой, то Django не увидит никаких моделей и выдаст ошибку.
Все подмодули внутри модуля
main.models никем не будут импортироваться автоматически; вам нужно сделать это самостоятельно. Например, если у вас есть модель
Profile в файле
main/models/profile.py, то в файле
main/models/__init__.py нужно прописать что-то вроде этого:

import main.models.profile

или

from . import profile

или прописать модель явно:

from .profile import Profile

Все способы равнозначны в том смысле, что подмодуль
profile загрузится во всех случаях и Django сможет обнаружить модель
main.Profile, прописанную в
AUTH_USER_MODEL.

В какой-то момент вы пытались поместить модель
Profile в файл
main/models/__init__.py и получить её в файле
main/models/profile.py примерно таким образом:

from main.models import Profile

В общем случае это не сработает, потому что скорее всего получится циклический импорт. Как я сказал выше, вам нужно подгрузить файл
profile.py импортом вида
import main.models.profile, но получается, что этот файл зависит от
from main.models import Profile, но файл
__init__.py зависит от
import main.models.profile, но файл
profile.py зависит от
from main.models import Profile, но файл
__init__.py зависит от
import main.models.profile и так далее до бесконечности. Когда выполняется код в файле
profile.py, код создания модели
Profile в файле
__init__.py банально ещё не успел выполниться — в итоге всё ломается к чертям, и
Profile просто не обнаруживается.
Это можно решить, переместив
import main.models.profile в самый конец файла
__init__.py — тогда модель
Profile успеет создасться до того, как файл
profile.py будет загружен. Но лучше во имя чистоты архитектуры избавиться от циклических импортов и вообще не помещать никаких моделей в файл
__init__.py и оставить там только импорты подмодулей.


Спарсить после конкретного класса в Beautiful Soup (Python)
Подскажите, у меня парсится сайт, который содержит такой html:

<li class=""><a class="1NPSa" href="/models/0/">1</a></li>
<li class="current"><a> 2 </a></li>
<li class=""><a class="1NPSa" href="/models/80/"> 3 </a></li>

Надо спарсить все class="1NPSa", но именно после class="current"

list = soup.findAll("a", class_="1NPSa")
print(list)
[<li class=""><a class="1NPSa" href="/models/0/">1</a></li>
 <li class="current"><a> 2 </a></li>
 <li class=""><a class="1NPSa" href="/models/80/"> 3 </a></li>]

Как это реализовать?

Вот такой код с этим справится:

from bs4 import BeautifulSoup

test_html = """
<li class=""><a class="1NPSa" href="/models/0/">1</a></li>
<li class="current"><a> 2 </a></li>
<li class=""><a class="1NPSa" href="/models/80/"> 3 </a></li>
<li class=""><a class="1NPSa" href="/models/81/"> 4 </a></li>
"""

soup = BeautifulSoup(test_html, 'html.parser')
current = soup.find("li", class_="current")
found = [x.find("a") for x in current.find_next_siblings("li")]
print(found)

P.S. Не делайте имена переменных совпадающими со стандартными именами Python, как, например,
list. Могут быть проблемы...


Редактирование определенных частей текста на python
Мне необходимо сделать что бы скрипт на Python мог редактировать определенную строку из конфига. Допустим:

  {
    "name": "Insane Augewehr",
    "type": "Premium Workshop Augewehr Skin",
    "description": "Painted on his gun, the absolute madman!\n\n<color=#64c819>Workshop Contributors:\nDebski</color>\n\nWhen equipped this applies the <color=#64c819>Insane</color> appearance to the Augewehr in-game.",
    "name_color": "64c819",
    "itemdefid": 757,
    "marketable": false,
    "scraps": 0,
    "item_id": 1362,
    "item_skin": 170,
    "item_effect": 0,
    "vehicle_id": 0
  },

Из этой части конфига мне нужно допустим заменить item_id на 1200 и item_skin на 175. В конечном итоге должно выглядеть так:

  {
    "name": "Insane Augewehr",
    "type": "Premium Workshop Augewehr Skin",
    "description": "Painted on his gun, the absolute madman!\n\n<color=#64c819>Workshop Contributors:\nDebski</color>\n\nWhen equipped this applies the <color=#64c819>Insane</color> appearance to the Augewehr in-game.",
    "name_color": "64c819",
    "itemdefid": 757,
    "marketable": false,
    "scraps": 0,
    "item_id": 1200,
    "item_skin": 175,
    "item_effect": 0,
    "vehicle_id": 0
  },

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

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

import json

s = """{
    "name": "Insane Augewehr",
    "type": "Premium Workshop Augewehr Skin",
    "description": "Painted on his gun, the absolute madman!",
    "name_color": "64c819",
    "itemdefid": 757,
    "marketable": false,
    "scraps": 0,
    "item_id": 1362,
    "item_skin": 170,
    "item_effect": 0,
    "vehicle_id": 0
  }"""

d = json.loads(s)
print(d)

После загрузки, переменная
d является словарём (dict) в котором можно менять значения стандартнми методами. После изменений, переменную
d можно сохранить в файл.
Еще один вариант скрипта на Python:

import re
import os

filename = './test.json'

# Открываем 2 файла, один читаем, в другой суффиксом .new пишем:
with open(filename, 'r') as fp1, open(filename + '.new', 'a') as fp2:
    for line in fp1:
        if line.find('item_id') > 0:       # Если встроке находится нужный параметр (подстрока)
            line = re.sub(r'[0-9]+', '1200', line, 1)  # То меняем у этого параметра значение с помощью регулярного выражения
        elif line.find('item_skin') > 0:
            line = re.sub(r'[0-9]+', '175', line, 1)

        fp2.write(line)

# Заменяем старый файл ./test.json содержимым из ./test.json.new
os.rename(filename + '.new', filename)


Как cделать вычитание дробей?
Вообщем, задали нам калькулятор дробей. Всё получилось, но если 1\1 - 1\2 то выдает 0.
Я так и не нашел решение данной проблемы
<code>
from tkinter import *
from math import *

def aaa(event):
    a = int(assq.get())
    b = int(ass1q.get())
    c = int(ass2q.get())
    d = int(ass3q.get())
    e = ass4q.get()
    z=b
    x=d
    while z!=x:
        if z>x:
            z=z-x
        else:
            x=x-z

    if z > x:
        qwerty=z*(b//z)*(d//z)
    else:
        qwerty=x*(b//x)*(d//x)

    if e == '+':

        pop1=((qwerty//b)*a)+((qwerty//d)*c)
        k = gcd(pop1,qwerty)

        if pop1 == 0:
            labd2['text']=''
            labd['text']='0'
            laba['text']=''
            lab['text']=''
        elif (pop1//k)>=(qwerty//k):
            labd2['text']=str((pop1//k)//(qwerty//k))
            laba['text']=str((pop1//k)%(qwerty//k))
            lab['text']=str(qwerty//k)
            labd['text']='_'
        else:
            labd2['text']=''
            labd['text']='_'
            laba['text']=str(pop1//k)
            lab['text']=str(qwerty//k)
        if lab['text']!='0'and((pop1//k)%(qwerty//k)) == 0:
            laba['text']=''
            lab['text']=''
            labd['text']=''
    ####################вот и вычитание#################################
    if e == '-':
        pop2=((qwerty//b)*a)-((qwerty//d)*c)
        k = gcd(pop2,qwerty)

        if pop2 == 0:
            labd2['text']=''
            labd['text']='0'
            laba['text']=''
            lab['text']=''
        elif (pop2//k)>=(qwerty//k):
            labd2['text']=str((pop2//k)//(qwerty//k))
            laba['text']=str((pop2//k)%(qwerty//k))
            lab['text']=str(qwerty//k)
            labd['text']='_'
        else:
            labd2['text']=''
            labd['text']='_'
            laba['text']=str(pop2//k)
            lab['text']=str(qwerty//k)
        if lab['text']!='0'and((pop2//k)%(qwerty//k)) == 0:
            laba['text']=''
            lab['text']=''
            labd['text']='0'
    if e == '*':
        pop3=(a*c)
        qwerty=(b*d)
        k = gcd(pop3,qwerty)

        if pop3 == 0:
            labd2['text']=''
            labd['text']='0'
            laba['text']=''
            lab['text']=''
        elif (pop3//k)>=(qwerty//k):
            labd2['text']=str((pop3//k)//(qwerty//k))
            laba['text']=str((pop3//k)%(qwerty//k))
            lab['text']=str(qwerty//k)
            labd['text']='_'
        else:
            labd2['text']=''
            labd['text']='_'
            laba['text']=str(pop3//k)
            lab['text']=str(qwerty//k)
        if lab['text']!='0'and((pop3//k)%(qwerty//k)) == 0:
            laba['text']=''
            lab['text']=''
            labd['text']=''
    if e == ':':
        pop4=(a*d)
        qwerty=(c*b)
        k = gcd(pop4,qwerty)

        if pop4 == 0:
            labd2['text']=''
            labd['text']='0'
            laba['text']=''
            lab['text']=''
        elif (pop4//k)>=(qwerty//k):
            labd2['text']=str((pop4//k)//(qwerty//k))
            laba['text']=str((pop4//k)%(qwerty//k))
            lab['text']=str(qwerty//k)
            labd['text']='_'
        else:
            labd2['text']=''
            labd['text']='_'
            laba['text']=str(pop4//k)
            lab['text']=str(qwerty//k)
        if lab['text']!='0'and((pop4//k)%(qwerty//k)) == 0:
            laba['text']=''
            lab['text']=''
            labd['text']=''

root = Tk()

root.geometry('400x400+100+100')
root.title('Okno')
root['bg']='#999999'

assq = Entry(root,width=5)
assq.place(x = 20, y = 1)

ass1q = Entry(root,width=5)
ass1q.place(x = 20, y = 29)

ass2q = Entry(root,width=5)
ass2q.place(x = 90, y = 1)

ass3q = Entry(root,width=5)
ass3q.place(x = 90, y = 29)

ass4q = Entry(root,width=5)
ass4q.place(x = 55, y = 15)

butq = Button(root,bg='blue',width=5, height=2)
butq.place(x = 187, y = 100)
butq.bind('<Button-1>',aaa)

laba = Label(root,font='Ariel 8',bg='#999999')
laba.place(x = 160, y = 1)
lab = Label(root,font='Ariel 8',bg='#999999')
lab.place(x = 160, y = 30)
labd = Label(root,font='Ariel 8',bg='#999999',text='_')
labd.place(x = 160, y = 16)
labd2 = Label(root,font='Ariel 8',bg='#999999')
labd2.place(x = 145, y = 16)
labd3 = Label(root,font='Ariel 10',bg='#999999',text='=')
labd3.place(x = 130, y = 16)

root.mainloop()
</code>

Вычитание дробей

 a/b - c/d

даёт числитель и знаменатель

nom = a * d - c * b
den = b * d

Их можно сократить (целочисленно разделить на наибольший общий делитель, если он больше 1)


Почему не работает код? Эзотерический язык на питоне [закрыт]

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

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

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

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

Не выводит резльтат(документация языка(не питон)) Например в script.ph содержится hackType pentagon;
connect pentagon;
hack;
С помощью рандома при выполнении команды "connect pentagon;" должно вывести: "Connected!" или "Ah! Cool protection!"
Потом с помощью великого рандома при выполнении команды должно выдать "HACKED THIS SITE" или "oh ................ FBI OPEN UP!"
В итоге ничего не выводится. Вопрос: почему? Ошибок змейка не выдает.
Сам код

Для двух-сложных команд, как
hackType ppp,
connect ppp, замените операторы проверки с
== на
startswith:

if code[i].startswith('hackType'):


Как поймать deadlock в multiprocessing в Python?
В университете дали задание с использованием потоков/процессов и одна из задач состоит в том, что при доступе к одному и тому же файлу двумя потоками, должна возникнуть ошибка, мол невозможно получить двумя потоками доступ к одному файлу (эта ошибка решается добавлением Rlock). Посколку в Python "обитает" GIL, то было принято решение воспользоваться модулем multiprocessing, а как это реальзовать... непонятно.
<code>
def worker1(word):
    f = open("file.txt", 'w')
    f.write(word)
    f.close()

def worker2(word):
    f = open("file.txt", 'w')
    f.write(word)
    f.close()

multiprocessing.Process(target=worker1('worker1'),).start()
multiprocessing.Process(target=worker2('worker2'),).start()
</code>

Прошу вашей помощи.

Windows
Вот такая демка должна быть достаточна.
Файл открывается с флагом 0 в
dwShareMode, что означает

Prevents other processes from opening a file or device if they request delete, read, or write access.

import multiprocessing
import time
import ctypes
from ctypes.wintypes import DWORD

CREATE_ALWAYS = 2
GENERIC_WRITE = 0x40000000

def worker(word,i):
    print('Started {}'.format(i))
    try:
        handle = ctypes.windll.kernel32.CreateFileA("file.txt", GENERIC_WRITE, 0, None, CREATE_ALWAYS, 0, None )
        if handle == -1:
            # ctypes.WinError sets up an GetLastError API call for windows as an Python OSError exception.
            # So we use this to raise the error to our caller.
            raise ctypes.WinError()
        print('Process {}: File opened successfully'.format(i))
        time.sleep(2)
        written = DWORD()
        ctypes.windll.kernel32.WriteFile(handle, word, len(word), ctypes.byref(written), None)
        print('Process {}: Write completed'.format(i))
        ctypes.windll.kernel32.CloseHandle(handle)
    except Exception as e:
        print('Process {}: Cannot access file'.format(i))
        print('{}: {}'.format(type(e).__name__,e.args))
    print('Finished {}'.format(i))

if __name__ == '__main__':
    for i in range(2):
        multiprocessing.Process(target=worker, args=('worker{}'.format(i),i)).start()

Выводит:

Started 0
Process 0: File opened successfully
Started 1
Process 1: Cannot access file
PermissionError: (13, 'The process cannot access the file because it is being used by another process.', None, 32)
Finished 1
Process 0: Write completed
Finished 0

Posix
Сейчас ничего под рукой нет, чтобы протестировать, но должно работать. :)
Здесь приходится явно лочить файл после открытия. А так как это блокирующая операция, то делаем timeout при помощи модуля signal и соответствующей обвязки.

import multiprocessing
import time

import signal, errno
from contextlib import contextmanager
import fcntl

@contextmanager
def timeout(seconds):
    def timeout_handler(signum, frame):
        pass

    original_handler = signal.signal(signal.SIGALRM, timeout_handler)

    try:
        signal.alarm(seconds)
        yield
    finally:
        signal.alarm(0)
        signal.signal(signal.SIGALRM, original_handler)

def worker(word,i):
    print('Started {}'.format(i))
    with timeout(1):
        try:
            f = open("file.txt", "w")
            print('Process {}: File opened successfully'.format(i))
            fcntl.flock(f.fileno(), fcntl.LOCK_EX)
            print('Process {}: File locked successfully'.format(i))
            time.sleep(3)
            f.write(word)
            print('Process {}: Write completed'.format(i))
            fcntl.flock(f.fileno(), fcntl.LOCK_UN)
            print('Process {}: File unlocked'.format(i))
            f.close()
        except IOError as e:
            if e.errno != errno.EINTR:
                raise e
            print('Process {}: Cannot access file'.format(i))
        print('Finished {}'.format(i))

if __name__ == '__main__':
    for i in range(2):
        multiprocessing.Process(target=worker, args=('worker{}'.format(i),i)).start()


Восстановление неизвестных значений матрицы
Как восстановить недостающие значения матрицы в Python, зная, что векторы линейно зависимы?
например, в этом примере 2-й вектор больше, чем первый в 2 раза, а 3-й больше 2-го в 10 (но на деле мы не знаем эту зависимость).

import numpy as np

nan = np.NaN
data = np.array([[1,  nan,  5,   6,   nan, 20],
                 [2,  nan, nan,  nan,  4,  nan],
                 [20, nan, 100,  120,  40, nan]])

Ожидаемый результат: 2-й столбец может быть заменен, возможно, на основе распределения для каждого вектора (интуитивно представляю результат как то так)

[[  1.  7   5.   6.    2.   20.]
 [  2.  14  10.  12.   4.   40.]
 [ 20.  140 100. 120.  40.  400.]]

Матрица может быть больше, и линейное соотношение между векторами может быть выражено не так явно, как в этом примере, поэтому требуется универсальное решение.
Для этого требуется:

найти коэффициенты зависимости
заполнить пробелы
интерполировать оставшиеся пропуски

подскажите как это сделать?

Можно поробовать так:
Сначала создаем Pandas DataFrame для удобства:

import pandas as pd  #  pip install pandas

In [24]: df = pd.DataFrame(data)

получился следующий DF:

In [25]: df
Out[25]:
      0   1      2      3     4     5
0   1.0 NaN    5.0    6.0   NaN  20.0
1   2.0 NaN    NaN    NaN   4.0   NaN
2  20.0 NaN  100.0  120.0  40.0   NaN

теперь применим известные правила линейных зависимостей:

In [30]: df.loc[1].fillna(df.loc[0]*2, inplace=True)

In [31]: df.loc[2].fillna(df.loc[1]*10, inplace=True)

In [32]: df.loc[0].fillna(df.loc[1]/2, inplace=True)

получим:

In [33]: df
Out[33]:
      0   1      2      3     4      5
0   1.0 NaN    5.0    6.0   2.0   20.0
1   2.0 NaN   10.0   12.0   4.0   40.0
2  20.0 NaN  100.0  120.0  40.0  400.0

наконец интерполируем DataFrame по строкам, чтобы избавиться от оставшихся неизвестных:

In [36]: df.interpolate(axis=1, inplace=True)

In [37]: df
Out[37]:
      0     1      2      3     4      5
0   1.0   3.0    5.0    6.0   2.0   20.0
1   2.0   6.0   10.0   12.0   4.0   40.0
2  20.0  60.0  100.0  120.0  40.0  400.0


Tuple больше всех элементов по раздельности
У меня в программе есть несколько переменных, каждая из которых больше 5,например:

a = 13
b = 10
c = 20

Если проверить их в выражении:
if переменная < 5, то ответ для каждой переменной будет False, что логично.
Но, если объединить их в tuple,
abc = (a,b,c) то при проверке
if all(abc) < 5, вернется True.
Как, и почему это работает?

Как Вам уже сказал sashaaero:

Функция
all говорит о том, что ни один элемент iterable, что ты туда передал нельзя представить как
False.

Т.е., в Вашем случае
all([a,b,c]) вернёт результат
a != 0 and b != 0 and c != 0, т.е.
True. Дальше Вы сравниваете
True и
5

>>> True < 5
True

Вот поэтому вам и возвращается
True.

Если посмотреть документацию по функции all, то там приведён код того, как это работает:

def all(iterable):
   for element in iterable:
        if not element:
            return False
    return True

Т.е., опять-таки, как Вам сказал sashaaero, Вам необходимо передавать в
all множество результатов логических выражений:
all(i < 5 for i in [a,b,c]), что будет эквивалентно (для
a = 13,
b = 10,
c = 20)
all([False, False, False]).


Проект Эйлера. Задача 106. Суммы особых подмножеств: мета-проверка

Пусть S(A) представляет собой сумму элементов множества А размером n. Будем называть это множество особым суммарным множеством, если для любых двух непустых и непересекающихся подмножеств B и C справедливо следующее:
S(B) ≠ S(C); т.е. суммы элементов подмножеств не могут быть равными.
  Если B содержит больше элементов, чем C, то S(B) > S(C).
  Для этой задачи предположим, что данное множество состоит из n строго возрастающих элементов и оно уже соответствует второму правилу.
К удивлению, из 25 возможных пар подмножеств, которые можно получить из множества при n = 4, лишь одну из них надо проверить на равенство (первое условие). Подобным образом, при n = 7, лишь 70 из 966 пар подмножеств надо проверить на равенство.
Сколько пар подмножеств необходимо проверить на равенство из общего числа 261625 пар, которые можно образовать при n = 12?
Примечание: Данная задача имеет также отношение к задачам №103 и №105.

Вот некоторые особые множества для первых начальных n:
n = 1: {1}
n = 2: {1, 2}
n = 3: {2, 3, 4}
n = 4: {3, 5, 6, 7}
n = 5: {6, 9, 11, 12, 13}
Мой вопрос в следующем. Для n=4, действительно, есть 25 возможных уникальных пар непустых множеств. С этим согласен. Я не понимаю, почему проверить на 1 условие надо только одну.
Если я верно мыслю, то выполнение второго условия проверяется только для случая, когда размеры множеств отличны. Если второе условие выполняется, то проверка 1 условия пройдена автоматически. Это очевидно.
Однако если отсеять из 25 вариантов пары равного размера, то получается никак не 1 пара, а 9. Почему для n=4 в задаче проверяется на равенство только 1 пара?!
На всякий случай приведу свой код поиска пар подмножеств:
<code>
import itertools

a = [3, 5, 6, 7]

combinations = set()
pair_combinations = list()

for b in range(1, len(a)):
    combinations.update(itertools.combinations(a, b))

combinations = list(combinations)
combinations.sort()
num = 0

for b in combinations:
    b_ = list(combinations)
    b_.remove(b)
    for с in b_:
        sum_b = sum(b)
        sum_c = sum(с)
        len_set_b = len(list(b))
        len_set_c = len(list(с))

        set_b = set(b)
        set_c = set(с)

        # определяем непересекающиеся подмножества и проводим над ними проверку по условию
        if set_b.isdisjoint(set_c):
            # проверка, чтобы не дублировать пары
            if [с, b] not in pair_combinations:
                # if len_set_b == len_set_c:
                pair_combinations.append([b, с])

num = 0
for pair in pair_combinations:
    print(num, pair)
    num = num + 1
</code>

Пусть

A = {a, b, c, d}

Известно, что последовательность строго возрастающая:

a < b < c < d

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

a + b > c
a + b > d
...
b + c + d > a

Остается доказать первое правило, т.е. неравенство подмножеств одинакового размера:

a + b != c + d
a + c != b + d
a + d != b + c

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

a + b < c + d

Cо вторым так же, потому, что
b > a и
d > c, значит

a + c < b + d

а вот третий случай нужно проверить, потому, что хоть
b > a, но
c > d


Как можно запустить firefox через selenium с подключением расширений?
Подскажите, как можно запустить firefox через selenium с подключением расширений?

Мне помогло следующее решение:
<code>
ex = "{e58d3966-3d76-4cd9-8552-1582fbc800c1}.xpi"
ex_dir = "C:\\Users\\User\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\8gslq3cf.default\\extensions\\"
driver = webdriver.Firefox()
driver.install_addon(ex_dir + ex, temporary = True)
</code>


Как разбить число на несколько частей? [закрыт]

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

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

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

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

Пример:
Если число
1500000
То в список должен выглядеть так:

[1000000, 500000]

Если число например 4,3 млн, то так (входное число может быть любым):

[1000000, 1000000, 1000000, 1000000, 300000]

def million(input_number):
    divised = []
    while input_number != 0:
        if input_number > 1000000:
            input_number = input_number - 1000000
            divised.append(1000000)
        else:
            divised.append(input_number)
            input_number = input_number - input_number
    return divised


Несколько полей для Count
Имеется вот такой запрос

coordinates = Address.objects.filter(
    Q(created_date__gte=serializer.data['begin_date'])
    & Q(created_date__lte=serializer.data['end_date']),
    is_valid=True
).values('lat', 'lon')

Из которого я получаю данные в таком виде

<QuerySet [{'lat': 14.545, 'lon': 18.454}, {'lat': 14.545, 'lon': 18.454}, {'lat': 25.131, 'lon': 66.342}]>

Это координаты, широта и долгота, и они могут повторяться, как видно в примере
Как мне "схлопнуть" повторяющиеся значения и к ним добавить ещё ключ n, который будет указывать на кол-во повторений?

Можно использовать следующую конструкцию:
<code>
from django.db.models import Count

coordinates = Address.objects.filter(
    Q(created_date__gte=serializer.data['begin_date'])
    & Q(created_date__lte=serializer.data['end_date']),
    is_valid=True
).values('lat', 'lon').annotate(Count('lat'), Count('lon'))
</code>


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

Нужно 9 или 18 (для 64 бит) раз написать
<code>
sum += value % 10;
value /= 10;
</code>
Это безусловный способ (однако он использует наше знание о природе целых чисел).
Иначе прямым или косвенным образом будут использованы операторы сравнения для проверки окончания работы.


Как задать переменную окружения в Python
Мне нужно задать переменные окружения в python скрипте. Я хочу, чтобы все другие скрипты, вызываемые из python (shell-скрипты), которые будут дочерними процессами, видели набор переменных окружения. Значение - это число.
Когда я объявляю переменную вот так

os.environ ["DEBUSSY"] = 1

Происходит ошибка

TypeError: str expected, not int

Получается, что единица, должна быть строкой.
Я также хочу узнать, как читать переменные окружения в python (в более поздней части скрипта) после ее объявления.
Согласно правилам, решил перевести вопрос со stackoverflow.com

Переменные окружения должны быть строками, поэтому используйте

os.environ["DEBUSSY"] = "1"

Чтобы получить доступ к этой переменной позже, просто используйте

print os.environ["DEBUSSY"]

Дочерние процессы автоматически наследуют среду родительского процесса - никаких специальных действий с вашей стороны не требуется.


Ошибка в коде на python
Взял пример из книги на python 2(мб там все норм), в python 3 выводит ошибку, помогите найти:
<code>
my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  def binary_search(lists, item):
    low = 0
    high = len(lists) - 1

    while low <= high:
        mid = (low + high)/2
        guess = lists[mid]
        guess = guess
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        if guess < item:
            low = mid + 1
        return None

print (binary_search(my_list, 2))
</code>
Ошибка:

Traceback (most recent call last):   File "lesson.py", line 18, in

      print (binary_search(my_list, 2))   File "lesson.py", line 9, in binary_search
      guess = lists[mid] TypeError: list indices must be integers or slices, not float

В Python 2 эта строка
mid = (low + high) / 2 вернёт вам целое число, а в Python 3 - вещественное. Очевидно, число вроде
2.5 не может служить для индексации списка, о чём и написано в ошибке. Исправить можно заменой оператора деления на оператор целочисленного деления -
mid = (low + high) // 2.


Взаимодействие Sklearn и Numpy
Задача - регрессии через метод К_соседей.
Имею образцовый рабочий код:

from sklearn.neighbors import KNeighborsRegressor as KNR

kf=KFold(n_splits = 5, shuffle = True, random_state = 42)

estimator = KNR(metric='minkowski', n_neighbors=5, weights='distance')

results = cross_val_score(estimator=estimator, X=data, y=target, cv=kf, scoring='neg_mean_squared_error')

results

В результате получаю некоторый массив данных.
Повторяю код с уточнением метрик:

for k in numpy.linspace(1, 10, num=200):

    estimator = KNR(metric='minkowski', n_neighbors=k, weights='distance')
    results = cross_val_score(estimator=estimator, X=data, y=target, cv=kf,
    scoring='neg_mean_squared_error')
    results

И натыкаюсь на несовпадение типов входных данных для K (
numpy.linspace -
float) и
n_neighbors=k (
sklearn -
int).

TypeError: n_neighbors does not take <class 'numpy.float64'> value, enter integer value

А как задавать
float под требования
int?
Понятно, что никак. Но условия задачи предполагают, что я используя команду
linspace, это сделаю.

np.linspace() - возвращает массив вещественных чисел.
Число соседей в алгоритме KNN не может быть вещественным / нецелым числом.
Попробуйте так:

for k in [3,5,7]:
    estimator = KNR(metric='minkowski', n_neighbors=k, weights='distance')
    ....

UPDATE:

условие задачи: Переберите разные варианты параметра метрики p по
  сетке от 1 до 10 с таким шагом, чтобы всего было протестировано 200
  вариантов (используйте функцию
numpy.linspace)

for p in np.linspace(1, 100, 200):
    estimator = KNR(metric='minkowski', weights='distance', p=p)


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

data['prev_id']= data.sort_values('DATE_START').groupby('CLIENT')['ID'].transform(lambda x: x.shift())

Или так:

data['prev_id']= data.sort_values('DATE_START').groupby('CLIENT').shift()['ID']


Кэширование файла на стороне клиента возвращенный HttpResponse content_type="image/jpeg"
Как закэшировать фотографию/файл на стороне клиента, которую я беру с open и вывожу в HttpResponse content_type="image/jpeg"?
VIEW:

def q(request, slug, name):

    arr = {
        'png': 'image/png',
        'jpg': 'image/jpeg',
        'gif': 'image/gif',
    }

    current_time = datetime.datetime.utcnow()

    image_data = open(path, 'rb').read()
    response = HttpResponse(image_data, content_type = arr[extension])
    last_modified = current_time - datetime.timedelta(days=1)
    response['Last-Modified'] = last_modified.strftime('%a, %d %b %Y %H:%M:%S GMT')
    response['Expires'] = current_time + datetime.timedelta(days=30)
    response['Cache-Control'] = 'public, max-age=315360000'
    response['Date'] = current_time
    response['Cache-Control'] = 'no-cache'

    return response

Response headers:

Cache-Control: no-cache, max-age=900
Content-Length: 767365
Content-Type: image/gif
Date: 2019-05-06 20:21:25.134589
Expires: 2019-06-05 20:21:25.134589
Last-Modified: Sun, 05 May 2019 20:21:25 GMT
Server: WSGIServer/0.2 CPython/3.7.3
X-Frame-Options: SAMEORIGIN

Request headers:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Host: localhost:8088
If-Modified-Since: Sun, 05 May 2019 20:21:14 GMT
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36

Нужно было в settings.py добавить мидлвар для заголовков
<code>
MIDDLEWARE = [
    'django.middleware.http.ConditionalGetMiddleware', //этот мидлвар
]
</code>


Проверка результатов кросс-валидации с cross_val_score
Есть таблица из N столбцов.
Делаю так:
<code>
from sklearn.model_selection import KFold
from sklearn.neighbors import KNeighborsClassifier as KNC

index=data[:0]       ## *выделение ненужного*
dataK = data[list(range(1,14))]          ## *и нужного*
kf=KFold(n_splits = 5, shuffle = True, random_state = 42) ## *задание генератора разбиений*
estimator = KNC(n_neighbors=k) ## *классификатор*
results = cross_val_score(estimator=estimator, X=dataK, y=index, cv=kf) ## *проверка качества*
print(results.mean())
</code>
Получаю в итоге:

ValueError: Found input variables with inconsistent numbers of
  samples: [178, 0]

То ессть, несовпадение входа и образца.
В чем проблема?

Вы неправильно разбили данные. Попробуйте так:
<code>
X = data.iloc[:, 1:]
y = data.iloc[:, 0]
results = cross_val_score(estimator=estimator, X=X, y=y, cv=kf)
</code>
Документация по индексированию и работе со срезами в Pandas


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

Wrong answer in test #1 There should be two lines with "milk", found:
1
Неправильный ответ в тесте № 1 Должны быть найдены две строки с «молоком»:
1

Ошибку выдает не сам Python, а сайт, на котором размещено задание.
Есть задание, цитирую:

Давайте смоделируем настоящую кофемашину. Она имеет ограниченный запас
воды, молока и кофейных зерен, а также одноразовых стаканчиков. Кроме
того, она подсчитывает, сколько денег получает за продажу кофе.
Продаем кофе 3 видов: эспрессо, латте и капучино. Конечно, каждый тип
требует различного количества расходных материалов, за исключением
того, что все они требуют только одну одноразовую чашку. Во-вторых,
кофемашина должна пополняться специальным работником. В-третьих,
работник может быть в состоянии взять деньги из кофемашины.
Возможные действия: «купить кофе», «пополнить», «забрать деньги». Если
вы хотите купить кофе, введите «купить кофе». Чтобы пополнить все
расходные материалы для кофемашины, ввести «пополнить». Если вы пьете
напиток из кофемашины, введите его.
Если пользователь пишет «купить», он может выбрать: эспрессо, латте
или капучино.

Для приготовления эспрессо необходимо 250 мл воды и 16 г кофейных зерен, стоит $ 4.
Для латте кофеварке нужно 350 мл воды, 75 мл молока и 20 г кофейных зерен. Это стоит $ 7.
А для капучино нужно 200 мл воды, 100 мл молока и 12 г кофе. Это стоит $ 6.

Если пользователь пишет «забрать деньги», кофемашина "отдает" все
деньги.
На данный момент кофемашина имеет 550 долларов, 1200 мл воды, 540 мл
молока, 120 г кофейных зерен и 9 одноразовых стаканчиков.
Напишите программу, которая печатает состояние кофемашины,
обрабатывает один запрос от пользователя, а также печатает состояние
кофемашины после этого. Попробуйте использовать функции для реализации
каждого действия, которое может сделать кофемашина.

Вот мой код к задаче:
<code>
# machine_has
water = 1200
milk = 540
beans = 120
cups = 9
money = 550

# espresso
water_for_one_cup_espresso = 250
beans_for_one_cup_espresso = 16
price_for_one_cup_espresso = 4

# latte
water_for_one_cup_latte = 350
beans_for_one_cup_latte = 20
milk_for_one_cup_latte = 75
price_for_one_cup_latte = 7

# cappuccino
water_for_one_cup_cappuccino = 200
beans_for_one_cup_cappuccino = 12
milk_for_one_cup_cappuccino = 100
price_for_one_cup_cappuccino = 6

def buy():
    choice = int(input("What do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: 3 "))
    if choice == 1:
        print("The coffee machine has: ")
        print("%d of water" % (water - water_for_one_cup_espresso))
        print("%d of milk" % milk)
        print("%d of coffee beans" % (beans - beans_for_one_cup_espresso))
        print("%d of disposable cups" % (cups - 1))
        print("%d of money" % (money + price_for_one_cup_espresso))

    elif choice == 2:
        print("The coffee machine has: ")
        print("%d of water" % (water - water_for_one_cup_latte))
        print("%d of milk" % (milk - milk_for_one_cup_latte))
        print("%d of coffee beans" % (beans - beans_for_one_cup_latte))
        print("%d of disposable cups" % (cups - 1))
        print("%d of money" % (money + price_for_one_cup_latte))

    elif choice == 3:
        print("The coffee machine has: ")
        print("%d of water" % (water - water_for_one_cup_cappuccino))
        print("%d of milk" % (milk - milk_for_one_cup_cappuccino))
        print("%d of coffee beans" % (beans - beans_for_one_cup_cappuccino))
        print("%d of disposable cups" % (cups - 1))
        print("%d of money" % (money + price_for_one_cup_cappuccino))

def fill():
    water_to_fill = int(input("Write how many ml of water do you want to add: "))
    milk_to_fill = int(input("Write how many ml of milk do you want to add: "))
    beans_to_fill = int(input("Write how many grams of coffee beans do you want to add: "))
    cups_to_fill = int(input("Write how many disposable cups of coffee do you want to add: "))

    print("The coffee machine has:")
    print("%d of water" % (water + water_to_fill))
    print("%d of milk" % (milk + milk_to_fill))
    print("%d of coffee beans" % (beans + beans_to_fill))
    print("%d of disposable cups" % (cups + cups_to_fill))
    print("%d of money" % money)

def take():
    print("I gave you %d$" % money)
    print()
    print("The coffee machine has:")
    print("%d of water" % water)
    print("%d of milk" % milk)
    print("%d of coffee beans" % beans)
    print("%d of disposable cups" % cups)
    print("%d of money" % (money - money))

action = input("Write action (buy, fill, take): ")
if action == "buy":
    buy()
elif action == "fill":
    fill()
elif action == "take":
    take()
</code>

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

# machine_has
water = 1200
milk = 540
beans = 120
cups = 9
money = 550

# espresso
water_for_one_cup_espresso = 250
beans_for_one_cup_espresso = 16
price_for_one_cup_espresso = 4

# latte
water_for_one_cup_latte = 350
beans_for_one_cup_latte = 20
milk_for_one_cup_latte = 75
price_for_one_cup_latte = 7

# cappuccino
water_for_one_cup_cappuccino = 200
beans_for_one_cup_cappuccino = 12
milk_for_one_cup_cappuccino = 100
price_for_one_cup_cappuccino = 6

def buy():
    global water, milk, beans, cups, money

    choice = int(input("What do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: "))
    if choice == 1:
        water -= water_for_one_cup_espresso
        beans -= beans_for_one_cup_espresso
        cups -= 1
        money += price_for_one_cup_espresso
        print("Served espresso")

    elif choice == 2:
        water -= water_for_one_cup_latte
        milk -= milk_for_one_cup_latte
        beans -= beans_for_one_cup_latte
        cups -= 1
        money += price_for_one_cup_latte
        print("Served latte")

    elif choice == 3:
        water -= water_for_one_cup_cappuccino
        milk -= milk_for_one_cup_cappuccino
        beans -= beans_for_one_cup_cappuccino
        cups -= 1
        money += price_for_one_cup_cappuccino
        print("Served cappuccino")

def fill():
    global water, milk, beans, cups, money

    water_to_fill = int(input("Write how many ml of water do you want to add: "))
    milk_to_fill = int(input("Write how many ml of milk do you want to add: "))
    beans_to_fill = int(input("Write how many grams of coffee beans do you want to add: "))
    cups_to_fill = int(input("Write how many disposable cups of coffee do you want to add: "))

    water += water_to_fill
    milk += milk_to_fill
    beans += beans_to_fill
    cups += cups_to_fill

def take():
    global water, milk, beans, cups, money

    print("I gave you $%d" % money)
    print()
    money = 0

def state():
    print("The coffee machine has:")
    print("%d of water" % water)
    print("%d of milk" % milk)
    print("%d of coffee beans" % beans)
    print("%d of disposable cups" % cups)
    print("%d of money" % money)

state()
action = input("Write action (buy, fill, take): ")
if action == "buy":
    buy()
elif action == "fill":
    fill()
elif action == "take":
    take()
state()


Как прочитать файл в кодировке UCS-2 Big/Little Endian на Python
Есть файл, его нужно прочитать и, например, сделать из него список строк. Файл в формате UCS-2 Big/Little Endian. Как его правильно открыть с помощью модуля codecs?
Версия Python 3.7.0. Заранее спасибо.

Для чтения SMS с модема (они в ucs2) достаточно кодека UTF-16.

import codecs
codecs.decode(ucstext, "hex").decode('utf-16be')

Простейший декодировщик выглядит так:

def decodeUcs2(byteIter, numBytes=256):
    """ Decodes UCS2-encoded text from the specified byte iterator, up to a maximum of numBytes """
    userData = []
    i = 0
    try:
        while i < numBytes:
            userData.append(chr((next(byteIter) << 8) | next(byteIter)))
            i += 2
    except StopIteration:
        # Not enough bytes in iterator to reach numBytes; return what we have
        pass
    return ''.join(userData)

Не помню откуда его взял, но вроде с англоязычного ресурса где дружат только с ASCII.