Проверка возврата непустого значения
Кидаю GET-запрос. Получаю ответ в виде ключ-значение. Это тест и надо, чтоб он падал, если одно из значений пустое. Подскажите, как?
<code>
 r = requests.get(url + 'api/v1/currency/RUB/USD/CASH/')
reqs = r.content.decode('utf-8')
print(r.status_code)
print(reqs)

dict = json.loads(reqs)
print(dict)

print(dict["data"]["rate_kind"])
print(dict["data"]["curr_buy"])
</code>

Через
if и
get проверяйте элементы у словаря. Т.к. если запрашивать через квадратные скобки
rs['data'], то при отсутствии элемента будет выброшено исключение KeyError, а при запросе через
get
rs.get('data') при отсутствии ключа вернется
None:

rs = json.loads(reqs)
print('Ответ:', rs)

if not rs:
    raise Exception('Пустой ответ!')

if not rs.get("data"):
    raise Exception('В ответе отсутствует или пустое поле "data"')

if not rs.get("data").get("rate_kind"):
    raise Exception('В ответе отсутствует или пустое поле "data/rate_kind"')

if not rs.get("data").get("curr_buy"):
    raise Exception('В ответе отсутствует или пустое поле "data/curr_buy"')

print(rs["data"]["rate_kind"])
print(rs["data"]["curr_buy"])

Оператор
if not ... тут сможет проверить элемент на пустоту (пустая строка
"", пустой список
[], пустой словарь
{}, отсутствует
None, и т.п.)

PS. не используйте в качестве имени переменной
dict, т.к. это название встроенной функции (вот список) и после объявления этой переменной не сможете использовать эту функцию


Локальные имена во вложенных функциях
Имеется некий код:
<code>
def aaa():
    t = "text"

    def bbb():
        print(t)

    return bbb

v = aaa()
v()
</code>
В теле функции ааа создается функция bbb и она возвращается. Я не могу понять 2ух моментов:
1. Почему вызов V() не вызывает ошибку, ведь обхект функции должен уничтожится после выхода из тела.
2. Почему не уничтожается переменная t = "text"? Причина та-же самая ведь

Объект уничтожается только тогда, когда перестает быть нужным кому либо, в
CPython это происходит, когда количество ссылок на объект становится равным нулю.

v в данном примере - замыкание, имеющее доступ как к своим именам (в этом примере их нет), так и к именам внутри функции
aaa (т.е.
t,
bbb), других более внешних функций (тоже нет) и к глобальным именам относительно того места, в котором функция была объявлена, (т.е.
aaa,
v)
Замыкание это функция, которая захватила переменные функции ее породившей, или функций еще выше в иерархии, и имеет возможность с ними работать, даже если та функция уже завершилась.
Примеры:

def aaa(x):
    def bbb(y):
        def ccc(z):
            return x + y * z
        return ccc
    return bbb

print(aaa(5)(6)(7)) # 47

def message(secret):
    def helper():
        return f'Никто кроме меня не знает, что secret={secret!r}'
    return helper

f1 = message("password")
f2 = message("hack the internet")

print(f1()) # Никто кроме меня не знает, что secret='password'
print(f2()) # Никто кроме меня не знает, что secret='hack the internet'

def notinlist(lst):
    def helper(x):
        return x not in lst
    return helper

print(*filter(notinlist([1,3]), range(10))) # 0 2 4 5 6 7 8 9

И все то же самое, но с помощью анонимных "лямбда"-функций

def aaa(x):
    return lambda y: lambda z: x + y * z

def notinlist(lst):
    return lambda x: x not in lst

def message(secret):
    return lambda: f'Никто кроме меня не знает, что secret={secret!r}'


Загрузка файла(Python+Selenium)
Всем доброго времени суток!
Пишу автотест и столкнулся с проблемой.
Вовпрос звучит кратко:
Как загружать файлы при помощи Selenium?
Подробно:
При клике на ссылку, поидее, файл и сам должен скачиваться. И я даже настроил место для загрузки файлов по дефолту.
Но столкнулся с тем, что PDF файлы, при клике на ссылку, не скачиваются, а открываются в новом окне. По итогу загрузка не происходит.
Варианта в голове один:
Использовать requests библиотеку из Python
Как бы вы загрузили файл в данной ситуации? Посоветуйте пожалуйста!

Не могу добавить комментарий, к сожалению, поэтому ответом :
Вы уже успели попробовали варианты предложенные в этих вопросах?

Selenium Webdriver: How to Download a PDF File with Python?
Downloading a PDF using Selenium, Chrome and Python


Список Python и два файла
Как добавить строку из первого файла Python в другой файл
Например:
Во втором файле стоит:

a=[]

А в первом стоит:

from ty import a
x = (15/5)*3+1
a.append(int(x))

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

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

Пусть
ty.py:

items = []
print(items)

А второй файл:

from ty import items
import re

x = (15/5)*3+1
items.append(int(x))
print(items)

# Считаем файл
with open('ty.py', 'r', encoding='utf-8') as f:
    text = f.read()

# Заменим список на другой и сохраним
with open('ty.py', 'w', encoding='utf-8') as f:
    pattern = re.compile(r'(items = \[.*?\])')
    new_text = pattern.sub('items = {}'.format(items), text)
    f.write(new_text)


Строка (string) состоит из байтов, как извлечь из нее байты
Есть строка
use[1] = "строка \n string".encode('utf-8') перевожу в байт код и помещаю ее в таблицу Pandas и сохраняю таблицу в csv. В байт код для того чтобы можно было в дальнейшем извлечь строку так как она содержит \n знак переноса на новую строку. Если оставить с этим знаком то таблица в дальнейшем не читается.
далее читаю таблицу
train_dataset = np.genfromtxt('data', usecols=use[1:4], delimiter=';',dtype=object,skip_header=1). Данные перевожу из байт кода в utf-8  и у меня получилась строка из байтов тип String но там перечислены байты.

for x in range(train_dataset.shape[0]):
   train_dataset[x][0]=train_dataset[x][0].decode('utf-8')
   train_dataset[x][1] = train_dataset[x][1].decode('utf-8')
   train_dataset[x][2] = train_dataset[x][2].decode('utf-8')
print(train_dataset)

"b'\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0\\xb0 \\n \\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xb8\\xd0\\xbd\\xd0\\xb3'" результат это тип стринг, как перевести в тип byte

Не надо ничего выдумывать - Pandas замечательно справляется с переносами строк:

In [22]: df = pd.DataFrame({
    ...:   'id': [1,2,3],
    ...:   'text': ['aaa', 'xxx\nyyy\nzzz', 'ccc'],
    ...:   'val': [10,20,30]
    ...: })

In [23]: df
Out[23]:
   id           text  val
0   1            aaa   10
1   2  xxx\nyyy\nzzz   20
2   3            ccc   30

In [24]: print(df.loc[1, 'text'])
xxx
yyy
zzz

In [25]: df.to_csv('c:/temp/1.csv', index=False)

In [26]: pd.read_csv('c:/temp/1.csv')
Out[26]:
   id           text  val
0   1            aaa   10
1   2  xxx\nyyy\nzzz   20
2   3            ccc   30

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

id,text,val
1,aaa,10
2,"xxx
yyy
zzz",20
3,ccc,30

UPDATE: как прочитать CSV файл в Numpy NDArray:
воспользуйтесь атрибутом
DataFrame.values:

In [43]: pd.read_csv('c:/temp/1.csv').values
Out[43]:
array([[1, 'aaa', 10],
       [2, 'xxx\nyyy\nzzz', 20],
       [3, 'ccc', 30]], dtype=object)

начиная с версии 0.24.0 в Pandas существует метод DataFrame.to_numpy():

In [44]: pd.read_csv('c:/temp/1.csv').to_numpy()
Out[44]:
array([[1, 'aaa', 10],
       [2, 'xxx\nyyy\nzzz', 20],
       [3, 'ccc', 30]], dtype=object)


Можно ли итерировать параметр цикла 'for' внутри цикла?
понятно, что лобовой вариант не проходит:

for i in range(5):
    print(i)
    i=4

не проходит.     На печать выйдет:

0
1
2
3
4

Однако вопрос остается - можно как-то манипулировать i так, чтобыцикл "воспринимал" желаемые изменения?
Или в этом случае  -  только цикл while?
Я имею ввиду попытки типа:

r5 = range(5)
for i in r5:
    print(i)
    for i in range(4):
        r5.__iter__()

но так оно не работает (
-----------------------------------------------ЗАРАБОТАЛО--после ответа @Александр:

d = [2,7,9,10,11,15,19,20,21,30,31]
m_d = [[x,0] for x in d]

mark = 0
_ = iter(range(len(m_d)-1))
for i in _:
    while (m_d[i+1][0]-m_d[i][0] <2) and (i<len(m_d)-2):
        m_d[i][1] = mark
        next(_)
        i+=1
    m_d[i][1] = mark
    mark +=1
#  проверка на то, что последние элемент входит в маркируемый блок
if m_d[len(m_d)-1][0] - m_d[len(m_d)-2][0] <2:
    m_d[len(m_d)-1][1] = m_d[len(m_d)-2][1]

from pprint import pprint
pprint(m_d)

Дает желаемое

[[2, 0],
 [7, 1],
 [9, 2],
 [10, 2],
 [11, 2],
 [15, 3],
 [19, 4],
 [20, 4],
 [21, 4],
 [30, 5],
 [31, 5]]

Так ли плох мой код теперь?

Если вы всё-таки упорно не хотите использовать
while и вам нужно просто пропустить часть значений, и вы это хотите сделать именно с помощью манипулирования объектом после in, то можно сделать так:

r100 = iter(range(100))
for i in r100:
    print(i)
    for j in range(3):
        next(r100)

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

skip = 0

for i in range(100):

    if skip:
        skip -= 1
    else:
        print(i)
        skip = 3

Этот код сделает то же самое, но его проще читать, и меньше вероятность, что он станет причиной трудноотлавливаемой ошибки.


Как вставить в шаблон регулярного выражения обратный слеш?
Вирусописатели в очередной раз прислали сотрудникам архив со скриптом на Javascript. Там по хитрому собиратется какой-то адрес из обычных символов и символов в acsii (пример
\x65).
Так как изучаю Python хотел заменить эти ascii-символы на обычные прямо в тексте и потом собрать в адрес. Пытаясь определить ascii-символы через регулярное выражение наткнулся на такое что не могу написать обратный слеш в выражении. двойной обратный слеш дает два слеша а не один как рассчитывал.
Подскажите написание регулярного выражения для строки вида
"\x65".

Обратный слеш в регулярных выражениях - так как в них он имеет специальное значение - нужно писать как пару обратные слешов -
\\.
Но Питон сам использует в обычных строковых литералах обратный слеш для специяльных символов, например символа перехода на новую строку
\n. Потому в обычных строковых литералах Питона нужно писать обратный слеш тоже как пару обратных слешов -
\\. В итоге для 2 обратных слешов нужно их писать 4:
"\\\\"
Но возможный тоже другой - лучший подход. Литералы с буквой
r непосредственно перед открывающим апострофом или кавычкой понимает Питон буквенно, не интерпретируя их.
В итоге у вас 2 подхода, как перенести из Питона в регулярное выражение нужные 2 обратные слеши:

Написать 4 обратные слеши:
"\\\\" - Питон будет каждую пару слешов интерпретировать как один, или
Написать 2 обратные слеши, но начать строку с буквой
r:
r"\\".


Как получить все параметры из базы sqlite?
Мне нужно перед внесением в базу данных проверить все значения и если есть точное совпадение, то получить id этой строчки, если нет, то получить в ответ 0
Написал такой скрипт:
<code>
def chek_db(a):
    conn = sqlite3.connect('database.sqlite')
    res = conn.execute("SELECT q_id, q_title FROM q_main WHERE q_title LIKE" + '\'' + a + '\'')
    res1 = len(res.fetchall())

    if res1 == 0:
        result = 0
    else: result = 1

    return (result)
</code>
Пытался модернизировать, чтобы он в ответ отдавал q_id, но ничего не получается.

Раз у Вас точное соответствие, то зачем Вам оператор
like? Он используется при поиске по шаблонам
Вы не длину результат получайте, а сам результат.
Тут более подошла бы функция
fetchone(), так как ожидается одна или ни одной строки ответа, но я оставил как есть

Вот, что получилось в итоге:

def chek_db(a):
    conn = sqlite3.connect('database.sqlite')
    res = conn.execute("SELECT q_id FROM q_main WHERE q_title='" + str(a) + "'")
    res1 = res.fetchall()

    if res1:
        result = res1[0][0] # id находится в первой строке ответа на первом месте
        return result

    return 0


Pygame не может открыть аудио файл
Хочу получить длину аудио файла:

mixer.init()

def browse_file(self):
    self.filename = filedialog.askopenfilename()

def show_details(self):
    sound = mixer.Sound(self.filename)
    total_length = sound.get_length()
    print(total_length)

При запуске программы возникает ошибка:

pygame.error: Unable to open file 'C:/Users/\u0410\u043d\u0442\u043e\u043d\u0438\u043d\u0430/Desktop/Music.mp3

Дело в том, что
mixer.Sound может работать только с файлами форматов OGG или wav. Для того, чтобы проигрывать mp3-файлы необходимо использовать
pygame.mixer.music

pygame.mixer.music.load(self.filename)
pygame.mixer.music.play()

Однако в таком случае не получится получить длину файла. Это связано с тем, что pygame.mixer.Sound загружает аудиофайл в выделенный под него буфер, а pygame.mixer.music.load проигрывает музыку из потока и не загружает файл в память целиком. Цитата из документации

The difference between the music playback and regular Sound playback is that the music is streamed, and never actually loaded all at once.

Для того, чтобы получить длину файла можно воспользоваться модулем mutagen. Тогда Ваша функция будет выглядеть как-то так:

from mutagen.mp3 import MP3

def show_details(self):
    sound = MP3(self.filename)
    print(sound.info.length) # длина в секундах

В случае, если всё же хотите использовать
mixer.Sound придётся сконвертировать файлы mp3 в OGG или wav.


pd.read_sql предназначен для того, чтобы читать данные из базы. Чтобы складывать данные в базу, используйте
pandas.DataFrame.to_sql.
При этом обратите внимание на то, как он работает: ссылка на документацию
Этот метод вызывается у датафрейма, и он просто выгружает все данные в соответствующие колонки одной таблицы. Соответственно, нужно будет ваши данные сначала уложить в датафрейм.
Но, на самом деле, вообще не понятно, зачем вам здесь пандас. Вы можете просто использовать
conn.execute, чтобы выполнить ваш запрос.
UPD: По вашему вопросу в комментариях - попробуйте вот так:

db_connection = 'mysql+pymysql://AAA:OOO@localhost/PPAP'
engine = create_engine(db_connection)
conn = engine.connect()
# И дальше уже делаете ваши запросы через conn.execute


Вывод дня недели по заданной дате
Нужен Ваш совет.
Есть список, в котором указано расписание работы ресторанов, напр:

"Tres","Mon-Thu, Sun 11:30 am - 10 pm  / Fri-Sat 11:30 am - 11 pm"
"Bai Thong Thai Cuisine","Mon-Sat 11 am - 11 pm  / Sun 11 am - 10 pm"
"Sapporo-Ya Japanese Restaurant","Mon-Sat 11 am - 11 pm  / Sun 11 am - 10:30 pm"

Пишу программу, которая по вводу даты (напр. 02.02.2019 14:30) - выведёт все рестораны, которые работают в этот период.
Не работал раньше c модулем
Datetime.
Поделитесь мыслями, как можно это организовать?

import datetime
import calendar

print(calendar.day_abbr[datetime.date(2019, 2, 2).weekday()])
#Sat

Update (для формата "ДД.ММ.ГГГГ"):

import datetime
import calendar

mydate = "21.01.2019"

workdate = datetime.datetime.strptime(mydate, "%d.%m.%Y")
print(calendar.day_abbr[workdate.date().weekday()])
#Mon


распределение значений в столбце pandas
Имеется датафрейм:

id      date     score
12    15.05.19     4
34    10.04.19     3
17    02.06.19     7
19    30.07.19     5
25    28.05.19     6

имеется список ответственных лиц:

spisok = ['Ivanov', 'Petrov', 'Sidorov']

Хочу в результате получить - добавить в датафрейм колонку с ответственными лицами:

id      date     score   in_charge
12    15.05.19     4      Ivanov
34    10.04.19     3      Petrov
17    02.06.19     7      Sidorov
19    30.07.19     5      Ivanov
25    28.05.19     6      Petrov

Написал функцию, но не могу ее применить:

def an_distr(df, spisok):

    count = len(df)
    while count >= 0:
        for el in spisok:
            return el
            count = count - 1

df['in_charge'] = an_distr(df, spisok)

выдает ошибку

TypeError: 'function' object is not iterable

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

return el

функция вернёт значение и последующий код выполняться не будет.
Пришло на ум вот такое решение, что называется "в лоб":

# Формируем список, который будет добавлен в качестве столбца
s = [spisok[i % len(spisok)] for i in range(len(df))]

df['in_charge'] = s

>>> df
id      date  score in_charge
12  15.05.19      4    Ivanov
34  10.04.19      3    Petrov
17  02.06.19      7   Sidorov
19  30.07.19      5    Ivanov
25  28.05.19      6    Petrov


Lost connection to MySQL server during query в Telegram боте
Я написал Telegram бота и он отлично функционирует, но через несколько часов после запуска выдает ошибку:

2013: Lost connection to MySQL server during query

Как я могу исправить эту ошибку? Бот работает на удаленном сервере на базе Linux с командной строки. Использую mysql.connector, подключаюсь к базе так:
<code>
db = mysql.connector.connect(host="localhost", user="<имя пользователя>", password="<пароль>", database="<имя базы данных>")
</code>

Нужно увеличить wait_timeout и interactive_timeout.
Решение здесь


Передача данных между потоками
Необходимо запустить бесконечный поток, который будет периодически вызывать callback функцию, которая меняет данные в главном потоке. Пытаюсь делать как указано ниже в примере.
В примере ожидается, что грустные смайлики через пару секунд сменятся на веселые. Но нет. Программа запускается, функция foo_callback вызывается (если в нее вставить print("bla bla") в терминал нормально выводит), однако, если пытаться поменять значение переменной status, то ничего не происходит. Скорее всего я плохо курил потоки, подскажите, как достичь такого эффекта. Пробовал использовать очередь, но там необходимо окончание потока, а мне надо в процессе работы бесконечного потока периодически скидывать информацию в главный поток.
В принципе желаемого эффекта можно достичь передавая данные через глобальную переменную, но, черт, это же глобальная переменная, наверняка есть красивый способ.
Пример:
<code>
import time
from threading import Thread

def very_very_long_func(foo_callback):
    while True:
        time.sleep(2)
        foo_callback(":)")

status=":("

def it_callback(s):
    status=s

thrd = Thread(target = very_very_long_func, args= ( it_callback,))
thrd.start()

while thrd.is_alive():
    print(status)
    time.sleep(0.5)
</code>

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

import time
from threading import Thread

def very_very_long_func(foo_callback):
    while True:
        time.sleep(2)
        foo_callback(":)")

status = ":("

def it_callback(s):
    global status
    status = s

thrd = Thread(target=very_very_long_func, args=(it_callback,))
thrd.start()

while thrd.is_alive():
    print(status)
    time.sleep(0.5)

т.е. без
global status у вас просто внутри
it_callback будет создана переменная
status, которая исчезнет после того как функция завершится.


Количество ссылок на кешируемые объекты
В данный момент пытаюсь изучать python по книге Мартка Лутца. В одной из глав он рассказывает про типизацию и про разделяемые ссылки. Он пишет что некоторые объекты заранее кешированны, дабы частые числа и строки не создавались в угоду оптимизации. Мне не понятно вот что, при вызове функции sys.getrefcount(0) моя среда pyCharm даёт ответ 173 и мне в принцыпе понятно что это значит, но если в кач-ве параметра передать иное значение, например число 1234127832.11101, то ответ от функции будет равным 3. Я не понимаю откуда именно это число, ведь должно быть как 1, так как этот объект используется единожды. Прошу помочь!

Одна ссылка для константы, одна ссылка для аргумента передаваемого в
getrefcount и ещё одну создаёт компилятор в процессе работы.


Надо ли закрывать файл после чтения и записи .xlsx?
Надо ли закрывать доступ к файлу после чтения, записи файлов .xlsx, как по аналогии с чтением текстовых файлов через
file handle?
Открываю excel:

import pandas as pd
file = 'expru1.xlsx'
df = pd.read_excel(file, 'Лист1', header=None)

Необходимы ли дальше какие-либо действия, если сам файл 'expru1.xlsx' больше не нужен? Или можно работать с данными дальше?
Тот же самый вопрос - что делаем после записи файла:

df.to_excel('C:\\Users\\guzairovt\\forecast.xlsx', index=False)

Конец скрипта, или надо как-то закрывать доступ?

После того как команда
pd.read_excel(filename) отработает и вернет прочитанный DataFrame
filename будет автоматически закрыт.
Тоже самое происходит после того как отработает команда
df.to_excel(...).
Более того если вы хотите записать сразу несколько Excel листов (
sheets), то делать это надо так:

if you wish to write to more than one sheet in the workbook, it is
  necessary to specify an ExcelWriter object:

>>> df2 = df1.copy()
>>> with pd.ExcelWriter('output.xlsx') as writer:  # doctest: +SKIP
...     df1.to_excel(writer, sheet_name='Sheet_name_1')
...     df2.to_excel(writer, sheet_name='Sheet_name_2')


Наследование от инициализированного класса
Python 2.7
Есть возможность наследовать свойства из класса в класс:

class A:
    def __init__(self, a):
        self.aa = a

class B(A):
    def __init__(self, a, b):
        A.__init__(self, a)
        self.bb = b

c = B(10, "qwerty")
print c.aa, c.bb

В данном примере потомка можно создать только с нуля - заново. А как наследовать инициализированного родителя? Т.е. взять и от экземпляра
c наплодить потомков?
"Лобовой" вариант: входным параметром класс и всё переопределить из него, но хотелось бы избежать этого, т.к. придётся перебирать всё свойства и методы по-новой.
Меня интересует именно перенос всех свойств и методов из объекта в другой через инициализацию или метод. Также задачу можно решить слиянием двух классов например.
Для примера имеем 2 класса (представляйте что там не по одному а по гигантскому количеству свойств и методов):

class A:
    def __init__(self, a):
        self.aa = a

    def get_list_aa(self):
        return list(self.aa)

class B:
    def __init__(self, b):
        self.bb = b

    def get_tuple_bb(self):
        return tuple(self.bb)

Пробую получить
C1 - просто слияние двух инициализированных объектов-классов, или
C2 - использование в основе (наследование от инициализированного объекта-класса по сути) - результат такого содержания:

class C1:
    def __init__(self):
        self.aa = 'any value'
        self.bb = 'any_value'

    def get_list_aa(self):
        return list(self.aa)

    def get_tuple_bb(self):
        return tuple(self.bb)

class C2:
    def __init__(self, b):
        self.aa = 'any value'
        self.bb = b

    def get_list_aa(self):
        return list(self.aa)

    def get_tuple_bb(self):
        return tuple(self.bb)

Термин "наследование" применим только к классам. То, что хотите сделать вы, правильнее назвать "копированием" объектов.
Реализовать можно, например, так:
<code>
class A:
    def __init__(self, a):
        self.aa = a

class B(A):
    def __init__(self, a, b):
        A.__init__(self, a)
        self.bb = b

    # Добавляем этот метод
    def copy(self):
        return self.__class__(self.aa, self.bb)

c_1 = B(10, "qwerty")
print c_1.aa, c_1.bb

c_2 = c_1.copy()
print c_2.aa, c_2.bb
</code>


Python ввод в консоль(Читать кат) [закрыт]

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

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

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

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

Сейчас будет трудно, мне надо симулировать ввод в консоль(CMD), а точнее команду STOP. И... у меня даже идей нет(

библиотека pykeyboard поможет.
Ставится pip install PyUserInput
<code>
from pykeyboard import PyKeyboard
k = PyKeyboard()
k.type_string('STOP')
k.tap_key(k.enter_key)
</code>


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

Өлкетану қандай ғылым?

А) Белгілі бір өлке туралы білімдер жиынтығы
B) Ғылыми пәндердің обьектісі
C) Белгілі бір өлкенің өндіргіш күштері мен қоғамдық құрылысы
D) Белгілі бір өлкенің табиғат байлығы
E) Ғылыми зерттеулердің жиынтығы

Алғашқы кездері өлкетану ретінде нені түсінген?

А) Өлкенің табиғат жағдайларын зерттеуді
B) Белгілі бір өлке туралы білімдер жиынтығын
C) Белгілі бір өлкенің қоғамдық құрылысын
D) Белгілі бір өлкенің өндіргіш күштерін
E) Ғылыми зерттеулердің жиынтығын
Он просто выводит кучу непонятных символов, как это можно исправить?

Неправильно задана кодировка при открытии файла. По умолчанию ANSI. Вам нужна UTF-8.
Python3:

with open(filename, "r", encoding="utf=8") as file:
    #

Python2:

import io

with io.open(filename, "r", encoding="utf=8") as file:
    #


Python, работа с процессами
Хорошо, мне надо сделать так что бы python проверял видит ли он java.exe
Вот до чего я додумался:

procn = "java.exe"
while procn == "java.exe":
    for proc in psutil.process_iter():
             if proc.name() == procn:
                     print("Server is run")
             if proc.name() != procn:
                     print("Server is not run")

Но он всегда говорит что java.exe не запущен, почему?
Хотя:

procn = "java.exe"
while procn == "java.exe":
    for proc in psutil.process_iter():
             if proc.name() == procn:
                     print("Server is run")

Говорит что java.exe запущен....
Проблема решена

import psutil
dddd = ""
procn = "java.exe"
while True:
    is_run = any(proc.name() == procn
             for proc in psutil.process_iter())

    if is_run:
        dddd = "On"
    else:
        dddd = "Off"
    print(dddd)

Первый код перебирает все процессы и ДЛЯ КАЖДОГО выводит либо "Server is run", либо "Server is not run".
То есть, скорее всего где-то среди этих сообщений есть и сообщение о том, что сервер запущен, но его сложно заметить среди остальных.
Вам нужно сначала пройтись по всем процессам, определить, есть ли среди них хотя бы один 'java.exe', а уже потом выводить сообщение о том, что сервер запущен.
Например так:
<code>
is_run = any(proc.name() == procn
             for proc in psutil.process_iter())

if is_run:
    print("Server is run")
else:
    print("Server is not run")
</code>
PS: И, кстати, цикл while у вас имеет какое-то бессмысленное условие. Он у вас будет просто бесконечно повторятся, и совершенно не понятно, зачем вы это условие проверяете.


Задача на время работы, ошибка в коде
Условие задачи следующее:
В фирме решили учесть рабочее время своих сотрудников. Для этого по каждому сотруднику собирается информацию, показывающая время его прихода и ухода с работы. Напишите программу, получающую на вход строчку, состоящую из записей вида ВРЕМЯ_ПРИХОДА-ВРЕМЯ_УХОДА, разделённых пробелами, и возвращающую три числа: число дней, которое работник выходил на работу, а также число часов и минут, которое он провёл в офисе. Время прихода и ухода задано в формате h:m, 0 ≤ h < 24, 0 ≤ m < 60, уход всегда не раньше прихода.
Пример ввода:
7:45-14:30 8:00-12:18
Вывод:
2 11 3
Мой код, приведённый ниже (заранее прошу прощения, я только начал изучать питон) выдаёт ошибку на 5ом тесте, не подскажете в чём проблема, пожалуйста?
<code>
string = input()

help_string = string.split()

days = len(help_string)
hrs = 0
mins = 0

for i in range(days):
       help_1 = help_string[i].index(':')
       start_hrs = int(help_string[i][0 : help_1])
       ##print(start_hrs)

       help_2 = help_string[i][help_1 : help_1 + 4].index('-') + help_1
       start_mins = int(help_string[i][help_1 + 1 : help_2])
       ##print(start_mins)

       help_1 = help_string[i][help_2 : help_2 + 4].index(':') + help_2
       finish_hrs = int(help_string[i][help_2 + 1: help_1])
       ##print(finish_hrs)

       finish_mins = int(help_string[i][help_1 + 1 : ])
       ##print(finish_mins)

       hrs += finish_hrs - start_hrs - 1
       mins += finish_mins + (60 - start_mins)

if mins > 60:
        hrs += mins // 60
        mins -= (mins // 60) * 60

if hrs > 24:
       days += hrs // 24
       hrs -= (hrs // 24) * 24

print(days, hrs, mins)
</code>

Ваш код косячит на случаях, когда в итоговом времени получается круглое количество часов. Например, для случая 7:00-10:00 ваш код выдаёт ответ 2 часа и 60 минут.
Кажется, что это можно решить просто заменив в строчке

if mins > 60:

строгое неравенство на
>=


Можно ли изменять Proxy браузера после инициализации в Selenium WebDriver?
Во время инициализации браузера мы можем указать Proxy в настройках инициализации.
Вопрос: можем ли менять его по мере выполнения запроса?
Язык программирования: Python
Браузер: Chrome

Ответ "Да", но только в том случае, если мы создадим для этого специальное расширение, которое будет слушать определенное событие и менять настройки Proxy на основе параметров этого события.
Отличный пример есть здесь. Добавив listener, Вы сможете изменять Proxy динамически:
<code>
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.chrome.options import Options
import zipfile,os

def proxy_chrome(PROXY_HOST,PROXY_PORT,PROXY_USER,PROXY_PASS):
    manifest_json = """
            {
                "version": "1.0.0",
                "manifest_version": 2,
                "name": "Chrome Proxy",
                "permissions": [
                    "proxy",
                    "tabs",
                    "unlimitedStorage",
                    "storage",
                    "<all_urls>",
                    "webRequest",
                    "webRequestBlocking"
                ],
                "background": {
                    "scripts": ["background.js"]
                },
                "minimum_chrome_version":"22.0.0"
            }
            """

    background_js = """
    var config = {
            mode: "fixed_servers",
            rules: {
              singleProxy: {
                scheme: "http",
                host: "%(host)s",
                port: parseInt(%(port)d)
              },
              bypassList: ["foobar.com"]
            }
          };
    chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
    function callbackFn(details) {
        return {
            authCredentials: {
                username: "%(user)s",
                password: "%(pass)s"
            }
        };
    }
    chrome.webRequest.onAuthRequired.addListener(
                callbackFn,
                {urls: ["<all_urls>"]},
                ['blocking']
    );
        """ % {
            "host": PROXY_HOST,
            "port": PROXY_PORT,
            "user": PROXY_USER,
            "pass": PROXY_PASS,
        }

    pluginfile = 'extension/proxy_auth_plugin.zip'

    with zipfile.ZipFile(pluginfile, 'w') as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)

    co = Options()
    #extension support is not possible in incognito mode for now
    #co.add_argument('--incognito')
    co.add_argument('--disable-gpu')
    #disable infobars
    co.add_argument('--disable-infobars')
    co.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
    #location of chromedriver, please change it according to your project.
    chromedriver = os.getcwd()+'/Chromedriver/chromedriver'
    co.add_extension(pluginfile)
    driver = webdriver.Chrome(chromedriver,chrome_options=co)
    #return the driver with added proxy configuration.
    return driver
</code>


Сокращение строчки кода
Как мне можно сократить данную строчку?

maxn, maxm = a * maxm, a * maxm
Например, почему нельзя написать так?

maxn, maxm = a * maxm

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

maxn = maxm = a * maxm


Python, Protoc, Mac OS, Missing input file
Файлы .proto хранятся в:
/Users/alarih/Documents/objectdetection/object_detection/protos
Терминал:

protoc -I=/Users/alarih/Documents/objectdetection/object_detection/protos --python_out=/Users/alarih/Documents/objectdetection/object_detection/protos/*.proto
Missing input file.

Используйте
protoc -I <path> или
protoc --proto_path=<path>:

protoc -I /Users/alarih/Documents/objectdetection/object_detection/protos --python_out=/Users/alarih/Documents/objectdetection/object_detection/protos/*.proto

protoc --proto_path=/Users/alarih/Documents/objectdetection/object_detection/protos --python_out=/Users/alarih/Documents/objectdetection/object_detection/protos/*.proto


Почему работает не правильно моя программа?
Делаю вот этот номер . Пока что получается не очень

class multifilter:

    def judge_half(pos, neg):
        return pos >= neg

    def judge_any(pos, neg):
        return pos >= 1

    def judge_all(pos, neg):
        return neg == 0

    def __init__(self, iterable, *funcs, judge=judge_any):
        self.l = iterable
        self.f = funcs
        self.judge = judge
        self.i = 0

    def __iter__(self):
        return self

    def __next__(self):

        pos, neg = 0, 0
        if self.i >= len(self.l) - 1:
            raise StopIteration
        for i in self.f:
            if i(self.l[self.i]) == True:
                pos += 1
            else:
                neg += 1
        if self.judge(pos, neg) == True:
            self.i += 1
            return next(self)
        else:
            self.i += 1
            return self.l[self.i]

Но он выдает: фильтр работает не правильно. Я, скорее всего, не правильно понимаю принцип работы итератора. Вот что я думаю: когда я пишу
for i in multifilter(iterable, funcs, judge_any): я пишу
for i in iter(multifilter(iterable, *funcs, judge_any)) и на каждом проходе цикла вызывается
next(). Но что происходит, когда я пишу
list(multifilter(iterable, funcs, judge_any))? Подскажите что-нибудь почитать или посмотреть по итераторам. Только не habr! Их абстрактные классы меня только запутали
P.S я знаю, что меня просят реализовать это все на
yeld, но пока не изучу основы не хочу лезть в дебри

Интересная задачка...
А попробуйте так:

class multifilter:
    def __init__(self, iterable, *funcs, judge=None):
        # iterable - исходная последовательность
        # funcs - допускающие функции
        # judge - решающая функция

        self.funcs = funcs
        self.iterable = iterable

        if not judge:
            judge = multifilter.judge_any

        self.judge = judge

    @staticmethod
    def judge_half(pos, neg):
        # допускает элемент, если его допускает хотя бы половина фукнций (pos >= neg)
        return pos >= neg

    @staticmethod
    def judge_any(pos, neg):
        # допускает элемент, если его допускает хотя бы одна функция (pos >= 1)
        return pos >= 1

    @staticmethod
    def judge_all(pos, neg):
        # допускает элемент, если его допускают все функции (neg == 0)
        return neg == 0

    def __iter__(self):
        # возвращает итератор по результирующей последовательности
        for value in self.iterable:
            pos = 0
            neg = 0

            for func in self.funcs:
                if func(value):
                    pos += 1
                else:
                    neg += 1

            if self.judge(pos, neg):
                yield value

Пробуем:

def mul2(x):
    return x % 2 == 0

def mul3(x):
    return x % 3 == 0

def mul5(x):
    return x % 5 == 0

a = [i for i in range(31)] # [0, 1, 2, ... , 30]

print(list(multifilter(a, mul2, mul3, mul5)))
# [0, 2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30]

print(list(multifilter(a, mul2, mul3, mul5, judge=multifilter.judge_half)))
# [0, 6, 10, 12, 15, 18, 20, 24, 30]

print(list(multifilter(a, mul2, mul3, mul5, judge=multifilter.judge_all)))
# [0, 30]


Изменить значения индексов в dataframe, чтобы они начинались с нуля
После удаления ненужных строк в датафрейме индексы стали
[5, 7, 9, 15, 20] и т.д.
Можно ли их привести так, чтобы они начинались с нуля?

наиболее идиоматичный способ:

df = df.reset_index(drop=True)

или так:

df = df.set_index(np.arange(len(df)))


Объединение двух таблиц по конкретному столбцу
Как грамотно объединить таблицы по столбцу Б?
На примере будет наглядней. У меня есть таблица А и Б, количество строк не совпадает.
Табл. А:

   А  Б
0  1  2
1  1  3
2  2  2
3  2  3
4  2  1

Табл. Б:

   Б  В
0  1  4
1  2  5
2  3  6

Требуемый результат:
Табл. В:

   А  Б  Б  В
0  1  2  2  5
1  1  3  3  6
2  2  2  2  5
3  2  3  3  6
4  2  1  1  4

Как вы сами понимаете, мне требуется "подтянуть" значения из столбца В.
В SQL это решается просто, но как это можно сделать в питоне?

Это оч. просто:

In [439]: A.merge(B)
Out[439]:
   А  Б  В
0  1  2  5
1  2  2  5
2  1  3  6
3  2  3  6
4  2  1  4

PS по умолчанию метод DataFrame.merge() объединяет таблицы (
DataFrame'ы) по столбцам с совпадающими названиями. Также столбец(ы) для объединения можно указать явно, воспользовавшись параметрами:

on

left_on

right_on

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


Как определить, что блок данных из файла является последним
Задача: есть бинарный файл, размер которого кратен 16-ти байтам, с него считываются данные по 16 байт и далее над ними выполняются какие-то операции. Над последним блоком данных надо сделать другую операцию, отличную от предыдущих. Как определить, что блок данных был последним?
Считывание я реализовал следующим образом:

with open(filename, "rb") as fd:
    for chunk in iter(lambda: fd.read(16), b""):
        foo(chunk)

На ум приходит "грубое" решение: найти конец потока

fd.seek(0, 2)
end = fd.tell()
fd.seek(0, 0)

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

with open(filename, "rb") as fd:
    fd.seek(0, 2)
    end = fd.tell()
    fd.seek(0, 0)
    for chunk in iter(lambda: fd.read(16), b""):
        if fd.tell() < end:
            foo(chunk)
        else:
            bar(chunk)

Есть ли более элегантный способ решить эту задачу?

Не уверен насчёт элегантности, но почему бы не читать на один чанк вперёд?

with open(filename, "rb") as fp:
    prev_chunk = fp.read(16)
    while True:
        next_chunk = fp.read(16)
        if not next_chunk:
            bar(prev_chunk)
            break
        foo(prev_chunk)
        prev_chunk = next_chunk

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

def chunk_reader(fp, chunk_size):
    prev_chunk = fp.read(chunk_size)
    while True:
        next_chunk = fp.read(chunk_size)
        if not next_chunk:
            yield prev_chunk, True
            break
        yield prev_chunk, False
        prev_chunk = next_chunk

#

with open(filename, "rb") as fp:
    for chunk, is_last in chunk_reader(fp, 16):
        if is_last:
            bar(chunk)
        else:
            foo(chunk)


AttributeError: 'Employee' object has no attribute 'aggregate'
Имеется вот такой запрос

Employee.objects.get(pk=pk).aggregate(
            tasks_completed=Count(
                'crew_set__crewtask', filter=Q(
                    crew_set__crew_task_set__status=CrewTaskStatusChoices.SUCCESS
                )
            ),
            shifts_completed=Count(
                'crew_set__shift', filter=Q(
                    crew_set__shift__state=ShiftStateChoicesEnum.CLOSE
                )
            ),
            proceeds=Sum('crew_set__crewtask__completed_task__received_sum'),
            taken_tara=Sum(
                'crew_set__crewtask__completed_task__returned_packing__amount'
            )
        )

Когда я прогоняю его через pytest, мне возвращается ошибка

AttributeError: 'Employee' object has no attribute 'aggregate'

Вот весь трейсбек:

Traceback (most recent call last):
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/rest_framework/viewsets.py", line 116, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/rest_framework/views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/anton/.local/share/virtualenvs/expedition-rest-JKEEAQb-/lib/python3.7/site-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/anton/Рабочий стол/ais/expedition-rest/src/exrest/apps/employees/views.py", line 90, in stats
    Employee.objects.get(pk=pk).aggregate(
AttributeError: 'Employee' object has no attribute 'aggregate'

В чём может быть ошибка? Почему он говорит что нет такого атрибута? Соседние эндпоинты с aggregate такую ошибку не вызывают, всё работает

aggregate - это метод
QuerySet, а метод
get возвращает не
QuerySet, а экземпляр модели. Поменяйте их местами.


Сравнение нескольких объектов с переменной python
Ксть одна переменная message и несколько значений нужно сравнить их. Я пробовал через if но не получалось
<code>
if message == ('a','b','c') :
    print('right')
else:
    print('false')
</code>
Пробовал так как выше но не получалось.

if message in ('a','b','c'):
    print('right')
else:
    print('false')


Представить list в функцию
У меня есть список, например [10, 0, 2, 6, -1] который обозначает функцию: lambda x: x  4 + 2 * x  2 + 6 * x - 1
Есть ли какая то библиотека, или функция с помощью которой можно любой подобный список представить в виде такой функции? То есть ты в функцию передаёшь list а возращается функция

def factory(koefs):
    return lambda x: sum(a*x**n for (n, a) in enumerate(reversed(koefs)))

# Примеры работы:

# 3x**2 + 5
koefs = [3, 0, 5]
func = factory(koefs)
print(func(-1))  # 8
print(func(2))   # 17

# x**3 + x
koefs = [1, 0, 1, 0]
func = factory(koefs)
print(func(-1))  # -2
print(func(2))   # 10


Python SQLite3.connect не хочет работать, если до этого был открыт файл с помощью метода open()
Если открыть файл, содержащий пути к файлам БД в формате SQLite:

def get_logs_path(filename):
    with open(filename) as f:
        log_files =  f.readlines()
    f.close()
    return(log_files)

А затем по попробовать открыть по очереди полученные файлы:

log_files = get_logs_path('db_paths.txt')
for log_file in log_files:
    with sqlite3.connect(log_file.replace('\\', '\\\\')) as log:

Получаю ошибку: OperationalError: unable to open database file
Если передавать пути к файлу в виде списка (без чтения текстового файла) - все работает замечательно.
Подскажите пожалуйста ЧЯДНТ?

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

log_files =  f.readlines()

на

log_files = [line.strip() for line in f.readlines()]

PS: И, кстати, если вы открываете файл в контекстном менеджере
with, то закрывать файл уже не обязательно - контекстный менеджер сам об этом позаботится.


PyQt5. Как назначить "closeEvent" на "QPushButton"?
Я хочу назначить кастомный метод "closeEvent" на "QPushButton", но после вызова (
button.clicked.connect(self.close)) происходит ошибка, что переменная "event" является булевым значением:
AttributeError: 'bool' object has no attribute 'ignore'.
Вот код:

    def closeEvent(self, event):
        reply = QMessageBox.question(self, "Quit", "Are you sure you want to quit?",
                QMessageBox.Yes, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

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

closeEvent -- это метод-событие, его лучше не вызывать вручную.
Используйте метод close():

button.clicked.connect(self.close)

Полный работающий пример:

from PyQt5.Qt import QWidget, QApplication, QPushButton, QVBoxLayout, QMessageBox

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

        button = QPushButton('Close')
        button.clicked.connect(self.close)

        layout = QVBoxLayout()
        layout.addWidget(button)

        self.setLayout(layout)

    def closeEvent(self, event):
        reply = QMessageBox.question(self, "Quit", "Are you sure you want to quit?",
                QMessageBox.Yes, QMessageBox.No)

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

if __name__ == '__main__':
    app = QApplication([])

    mw = MainWindow()
    mw.show()

    app.exec()


Передача типов QObject из Python в QML
Хочу передать тип Interface из типа атрибута(свойство или функция тоже пойдет) класса Service в QML. Вот таким образом не получается:
<code>
import QtQuick 2.11
import Service 1.0
import QtQuick.Controls 2.11
import QtQuick.Layouts 1.11

ApplicationWindow {
    visible: true
    width: 640
    height: 240
    Service {
        id: service
    }
    ColumnLayout {
    Text {
        text: service.Text
    }
    Repeater {
        model: service.Interfaces
        delegate: Rectangle {
            color: "#b0dfb0"

            height: 80
            // как встроить сюда тип Interface?
            Text {
                text: "bar"
            }
            Text {
                text: modelData.Text
            }
            Repeater {
                // ...
            }
        }
    }
    }
}

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import pyqtProperty, QCoreApplication, QObject, QUrl
from PyQt5.QtQml import qmlRegisterType, QQmlComponent, QQmlEngine
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine

class Controller(QObject):
    @pyqtProperty(str)
    def Text(self):
        return "hello word"+repr(self)

class Interface(QObject):
    @pyqtProperty(str)
    def Text(self):
        return "bar"+repr(self)

    @pyqtProperty(list)
    def Controllers(self):
        return [Controller() for c in range(2)]

class Service(QObject):
    @pyqtProperty(str)
    def Text(self):
        return "foo"+repr(self)

    @pyqtProperty(list)
    def Interfaces(self):
        return [Interface() for i in range(2)]

if __name__ == '__main__':
    qmlRegisterType(Service, 'Service', 1, 0, 'Service')
    qmlRegisterType(Interface, 'Service', 1, 0, 'Interface')
    qmlRegisterType(Controller, 'Service', 1, 0, 'Controller')

    app = QGuiApplication(sys.argv)

    engine = QQmlApplicationEngine()
    engine.load("view.qml")
    engine.quit.connect(app.quit)
    sys.exit(app.exec_())
</code>
Можно как-то передать аргументы конструктора в QML и инициализировать тип тут на месте?

Тип Repeater отвечает за создание некоторого количества одинаковых объектов. В вашем случае, насколько я понимаю, это GUI подключенных устройств чьи свойства доступны через интерфейсы, получаемых из класса Service.
Возможный вариант реализации (ваш случай):

ApplicationWindow {

    Service
    {
        id: service
        // Изменилось количество устройств
        on<Сигнал_изменения_количества_устройств>: {
            rep.model = /*получить текущее количество устройств*/
        }
    }

    //...
    Repeater
    {
        id: rep
        Rectangle { // В делегате доступна переменная index
            Text {
                text: "Имя устройства: " + service.Interfaces[index].name
            }
        }
    }

}

Класс Service (С++):

public Service : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE const DeviceInterface& device(int index);
signals:
    void deviceCountChanged(int count);
}

Класс Service (PyQt) (пример тут) + с учетом вашего ответа:

class Service(QObject):
    @pyqtProperty(QQmlListProperty)
    def Interfaces(self):
        return QQmlListProperty(Interface, self, self._devices)

класс DeviceInterface должен быть зарегистрирован в qml


проверка label (tkinter) на пустое значение

res = StringVar()
result = Label(textvariable=res, bd=4, bg='#67ACB6', font='arial 15')
result.place(height=65, width=630, y=400, x=150)

Как проверить является ли label пустой строкой?
Я пытался использовать сравнение:

res == ''

но в этой переменной хранится 'PY_VAR3'

Если Вы хотите проверить, есть ли в метке
Label какой-либо текст, необходимо обратиться к параметру
"text":

result = Label(textvariable=res, bd=4, bg='#67ACB6', font='arial 15')
if result["text"] == "":
    ...

Если хотите проверить значение переменной типа
StringVar, тогда нужно воспользоваться методом
get():

res = StringVar()
if res.get() == "":
    ...


Работа с apply и transform в Pandas
В продолжение вопроса . Теперь пробую осветить проблему максимально широко.

Исходный датафрейм:

                                               price   qty  side  status
 tradeID                date
 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled
                        2018-09-05 11:00:00  7111.0  10.0  Sell  filled
 WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled
                        2018-09-08 18:00:00  6377.0  10.0  Sell  filled
 /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled

Я хочу применять различные формулы (например подсчет прибыли и пр.) и заполнять исходный датафрейм. Группируя обрабатываемые данные с помощью groupby('tradeID'). Например для подсчета профита были предложены два отличных варианта.

1 Вариант (от @MaxU):

    In [277]: df['profit'] = (df.sort_values(['tradeID','date', 'side'])
                                .groupby('tradeID')
                                ['price'].diff())

    In [278]: df
    Out[278]:
                                                 price   qty  side  status  profit
    tradeID                date
    71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled     NaN
                           2018-09-05 11:00:00  7111.0  10.0  Sell  filled  -171.5
    WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled     NaN
                           2018-09-08 18:00:00  6377.0  10.0  Sell  filled   -71.0
    /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled     NaN

2 Вариант(От @strawdog):

    df['profit']= df.groupby(level=[0]).transform(lambda x: x.shift(-1) - x)['price']
    print(df)

                                                 price   qty  side  status  profit
    71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled  -171.5
                           2018-09-05 11:00:00  7111.0  10.0  Sell  filled     NaN
    WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled   -71.0
                           2018-09-08 18:00:00  6377.0  10.0  Sell  filled     NaN

Но такие способы не подходят, если мы имеем несколько строк, где side==Sell(или Buy). Я не понимаю как использовать выбор по значению столбца в таких условиях. Я пробовал, что то вроде
self.df['profit'] = df.sort_values(['tradeID','date', 'side'])['price'].groupby('tradeID').apply(lambda x: x['price'][x['side']=='Sell'].mean() - x['price'][x['side']=='Buy'].mean()) Но получаю те или иные ошибки при подобных попытках, из-за не понимая принципа работы.
Вопрос: Как провести подсчет прибыли внутри каждого
tradeID на примере усложненного датафрейма (среднее арифметическое по Sell минус среднее арифметическое по Buy)? Столбцами
qty, status, date можно пренебречь.

Усложненный(новый) датафрейм:

                                                 price   qty  side  status
     tradeID                date
     71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled
                            2018-09-05 11:00:00  7111.0  5.0  Sell  filled
                            2018-09-05 11:30:00  7200.0  5.0  Sell  filled
     WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  5.0   Buy  filled
                            2018-09-08 10:02:00  6460.0  5.0   Buy  filled
                            2018-09-08 18:00:00  6500.0  10.0  Sell  filled

Решение в стиле "PIVOT":

res = (df.pivot_table(index='tradeID', columns='side',
                      values='price', aggfunc='mean')
         .eval("profit = Sell - Buy"))

Результат:

In [397]: res
Out[397]:
side                       Buy    Sell  profit
tradeID
71ZNeXwSQUqkxhKR9trvrQ  7282.5  7155.5  -127.0
WYgKLRv+Q9CuXic4FNEh0A  6454.0  6500.0    46.0


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

[index for index, bit in enumerate(bin(n)[:1:-1]) if bit == "1"]

Но в комментариях мне дали ссылку на подобный вопрос на англоязычном SO, где был вариант (который, на мой взгляд, должен быть быстрее моего) с побитовыми операциями, и вариант решения с ними выглядел так:

[index for index in range(n.bit_length()) if n & (1 << index)]

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

Время замерял следующим образом:

import time

N = 2**22

def bitwise(n : int) -> list:
    return [index for index in range(n.bit_length()) if n & (1 << index)]

def string(n : int) -> list:
    return [index for index, bit in enumerate(bin(n)[:1:-1]) if bit == "1"]

start = time.time()
for i in range(N):
    bitwise(i)
print(time.time() - start)

start = time.time()
for i in range(N):
    string(i)
print(time.time() - start)

Вывод:

57.37398672103882
  40.31372857093811

Похоже тормоза в загрузке
n в итератор. В варианте со строкой все операции решаются на стеке. В варианте
bitwise есть опкод
LOAD_DEREF 0 (n). Это означает, что
n не локальна и операции с ней будут чуть медленнее.
Но это ещё не всё. Подгрузка
n в вариант со строкой сделала функцию медленнее, но она все ещё бысрее битовой.


Почему не работает программа, выдает ошибку index out of range
Вводится 5 строк. Вывести слова в алфавитном порядке.
<code>
s = [input () for i in range (5)]
def quicksort (s):
    pivot = s[0]
    if len(s) == 1:
        return s

    less = [i for i in s[1:] if i <= pivot]
    greater = [i for i in s[1:] if i > pivot]
    return quicksort (less) + [pivot] + quicksort (greater)

print (quicksort (s))
</code>

Потому что проверку следует делать ДО обращения к элементу списка (т.к. элемента может и не быть)

if len(s) == 1:
    return s
pivot = s[0]

Также в функцию может прийти пустой список, поэтому необходимо ещё добавить проверку этого

if len(s) == 1 or len(s) == 0:
    return s


Вылетает ошибка в Lambda python
после выполнения строчки
<code>
a = map(lambda x: x*x, 5)
</code>
вылетает ошибка:

TypeError: ' int object is not iterable

Объясните ,пожалуйста, почему?

Вторым параметром
map должно быть значение итерируемого типа, т.е. что-то, что можно обойти поэлементно.
Например список, кортеж, строка (хоть ее элементы и не получится перемножить), и т.д.

a = map(lambda x: x*x, [5])

Результатом будет объект типа
map, который можно конвертировать в список:

lst = list(a)

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

print((lambda x: x*x)(5))


Нахождение наименьшего расстояния между строками и максимального номера строки для уникальных элементов массива
Требуется вычислить наименьшее расстояние между строками и максимальный номер строки, для каждого уникального элемента массива посредством Pandas и/или Numpy
Исходные данные:

Row - номер строки
c1, c2, c3 - столбцы с данными
Row, c1, c2, c3
1, 3, 5, 6
2, 2, 3, 8
3, 5, 4, 9
4, 2, 6, 8

Ожидаемый результат

Elem, Dist, Row
2, 2, 4
3, 1, 2
4, 0, 3
5, 2, 3
6, 3, 4
8, 2, 4
9, 0, 3

Доп. условия
В случае если элемент встречается в массиве не больше одного раза, то значение расстояние для него = 0. Каждая строка содрежит неповторяющиеся элементы.

def dist(c):
    if len(c) > 1:
        return c.diff().min()
    else:
        return 0

res = \
(df.set_index('Row')
   .stack()
   .reset_index(level=1, drop=True)
   .reset_index(name='elem')
   .groupby('elem')
   ['Row']
   .agg([dist, 'max'])
   .rename(columns={'max':'row'})
   .reset_index())

результат:

In [355]: res
Out[355]:
   elem  dist  row
0     2     2    4
1     3     1    2
2     4     0    3
3     5     2    3
4     6     3    4
5     8     2    4
6     9     0    3


Подскажите как мне проверить модель ML c реальными данными
<code>
from  sklearn import  datasets
iris=datasets.load_iris()

x=iris.data
y=iris.target

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.5)

from sklearn import neighbors
classifier=neighbors.KNeighborsClassifier()

classifier.fit(x_train,y_train)

predictions=classifier.predict(x_test)

from sklearn.metrics import accuracy_score
print(accuracy_score(y_test,predictions))

# 0.9333333333333333
</code>
Каким образом мне можно проверить модель, задав ему X - ы, что бы он выдал мне предикт по цветку:)

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

predictions=classifier.predict(x_test)

и получили массив предсказанных цветков:

In [308]: predictions
Out[308]:
array([1, 1, 1, 0, 2, 0, 0, 0, 0, 1, 0, 1, 2, 1, 1, 1, 2, 0, 2, 1, 1, 2, 1, 1, 1, 1, 0, 0, 2, 1, 0, 2, 2, 0, 2, 2, 2, 2, 1, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 2, 0, 0, 1, 2, 2, 0, 0,
       0, 2, 0, 0, 2, 0, 0, 0, 2, 2, 0])

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

In [305]: X_test_names = np.take(iris.target_names, predictions)

In [306]: X_test_names
Out[306]:
array(['versicolor', 'versicolor', 'versicolor', 'setosa', 'virginica', 'setosa', 'setosa', 'setosa', 'setosa', 'versicolor', 'setosa', 'versicolor', 'virginica', 'versicolor', 'versicolor',
       'versicolor', 'virginica', 'setosa', 'virginica', 'versicolor', 'versicolor', 'virginica', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'setosa', 'setosa', 'virginica',
       'versicolor', 'setosa', 'virginica', 'virginica', 'setosa', 'virginica', 'virginica', 'virginica', 'virginica', 'versicolor', 'virginica', 'setosa', 'setosa', 'setosa', 'versicolor',
       'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'versicolor', 'virginica', 'virginica', 'versicolor', 'versicolor', 'virginica', 'versicolor', 'virginica', 'setosa',
       'setosa', 'versicolor', 'virginica', 'virginica', 'setosa', 'setosa', 'setosa', 'virginica', 'setosa', 'setosa', 'virginica', 'setosa', 'setosa', 'setosa', 'virginica', 'virginica', 'setosa'],
      dtype='<U10')

UPDATE:

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

In [310]: X_new = np.array([[4.8, 3.7, 1.33, 0.11], [6.66, 2.99, 6.123, 2.33]])

In [311]: pred_new = classifier.predict(X_new)

In [312]: pred_new
Out[312]: array([0, 2])

In [313]: np.take(iris.target_names, pred_new)
Out[313]: array(['setosa', 'virginica'], dtype='<U10')


Как добавить в датафрейм столбец, с выполненной калькуляцией? Обрабатывая данные внутри мультииндекса
Еще один вопрос, в продолжение вчерашнего. Мне нужно посчитать профит по каждой отдельной сделке (
tradeID). (
tradeID и
date - индексы)
Вопрос - как грамотно добавить в датафрейм столбец
profit, с выполненной калькуляцией (
sell - buy просто например...)
Из-за маленького опыта я начал писать какие то ужасные вложенные циклы для этого. Но уверен что с Pandas все может быть проще. Пожалуйста подскажите направление движения.

Исходный датафрейм:

                                             price   qty  side  status
 tradeID                date
 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled
                        2018-09-05 11:00:00  7111.0  10.0  Sell  filled
 WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled
                        2018-09-08 18:00:00  6377.0  10.0  Sell  filled
 /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled

Хотелось бы получить что то такое:

                                             price   qty  side  status    profit
 tradeID                date
 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled
                        2018-09-05 11:00:00  7111.0  10.0  Sell  filled  -171.5
 WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled
                        2018-09-08 18:00:00  6377.0  10.0  Sell  filled  -71
 /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled

Заранее большое спасибо!

Такой вариант устроит?:
<code>
df['profit']= df.groupby(level=[0]).transform(lambda x: x.shift(-1) - x)['price']
print(df)

                                             price   qty  side  status  profit
71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled  -171.5
                       2018-09-05 11:00:00  7111.0  10.0  Sell  filled     NaN
WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled   -71.0
                       2018-09-08 18:00:00  6377.0  10.0  Sell  filled     NaN
</code>


NameError. Python не видит класс
Я учу python, в данный момент классы. Написав простую программу (на 90% списанную с учебника), компилятор выдаёт следующую ошибку: NameError: name 'Dog' is not defined. Как её исправить?
<code>
class Dog:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def bark(self):
        print("woof!")

    toby = Dog ("toby", "brown")
    print("This is ", toby.name,".")
    print("It's", toby.color)
    bark()

class Cat:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def meow(self):
        print("meow")
    felix = Cat ("felix", "white")
    print("This is ", felix.name, ".")
    print("It's", felix.color)
    meow()
</code>

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

class Dog:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def bark(self):
        print("woof!")

toby = Dog ("toby", "brown")
print("This is ", toby.name,".")
print("It's", toby.color)
bark()

class Cat:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def meow(self):
        print("meow")

felix = Cat ("felix", "white")
print("This is ", felix.name, ".")
print("It's", felix.color)
meow()


Задать мультииндекс Pandas
Пожалуйста помогите привести в порядок датафрейм.

Исходный датафрейм:

                     price   qty  side  status                 tradeID
 date
 2018-09-03 17:00:00  7282.5  10.0   Buy  filled  71ZNeXwSQUqkxhKR9trvrQ
 2018-09-05 11:00:00  7111.0  10.0  Sell  filled  71ZNeXwSQUqkxhKR9trvrQ
 2018-09-08 10:00:00  6448.0  10.0   Buy  filled  WYgKLRv+Q9CuXic4FNEh0A
 2018-09-08 18:00:00  6377.0  10.0  Sell  filled  WYgKLRv+Q9CuXic4FNEh0A
 2018-09-09 14:00:00  6376.5  10.0   Buy  filled  /6WmcfJ1QcWWwPcwkXeoSw

Требуется объедение по tradeID. Тоесть что бы строки с одинаковым tradeID были объедененны по этому значения.
Пример нужного итогового датафрейма.

                                             price   qty  side  status
 tradeID                date
 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled
                        2018-09-05 11:00:00  7111.0  10.0  Sell  filled
 WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled
                        2018-09-08 18:00:00  6377.0  10.0  Sell  filled
 /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled

Заранее большое спасибо!

Воспользуйтесь методом DataFrame.set_index():
<code>
In [251]: df2 = df.set_index(['tradeID', df.index])

In [252]: df2
Out[252]:
                                             price   qty  side  status
tradeID                date
71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled
                       2018-09-05 11:00:00  7111.0  10.0  Sell  filled
WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled
                       2018-09-08 18:00:00  6377.0  10.0  Sell  filled
/6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled
</code>


Завершение процесса через определённое время
интересует такой вопрос,  как завершить запущенный процесс через определённое время. То есть, у меня есть функция обработки, она начинает работать и запускается процесс в системе, который может работать от 1 до 10 секунд, но если работает больше 10 секунд, процесс должен завершиться(мы должны его как-то "убить"). Сначала пытался использовать signal, но он только для Unix-систем, сейчас нашёл подобную тему  в модуле threading, но нормально реализовать не получается. У кого нибудь есть идеи или подобные наработки? Заранее спасибо.
По сути, в идеальном варианте надо сделать, чтобы thread1 работал не более 10 секунд, но как я понял закрыть поток принудительно нельзя, то есть получается надо ловить сам процесс? Или я немного не понимаю сути?
Прилагаю код (Это отладочный вариант и лишнее здесь будет убрано (через импорты можно отследить историю вариантов:))):
<code>
import os
import win32com.client
import zipfile
import threading
import sys
import pythoncom
import time
import subprocess

def process_exists(process_name):
    proc = subprocess.check_output(['TASKLIST']).decode('UTF-8', 'ignore').splitlines()
    #print(proc)
    for lines in proc:
        #print(lines)
        if process_name in lines:
            return True

def file_finder(directory = '', ext = '', function = ''):
    counter_good = 0
    for dir_path, dirs, files in os.walk(directory):
        for file_name in files:
            file_path = os.path.join(dir_path, file_name)
            error_file_name = file_name
            file_name, file_extension = os.path.splitext(file_path)
            if file_extension.lower() == ext: # ext - отбираемое расширение (.xxx)
                if function == 'doc2docx':
                    thread1 = threading.Thread(target=doc2docx, args=(file_path, error_file_name, directory,))
                    thread2 = threading.Timer(10, process_exists, args = ('WINWORD.EXE',))
                    thread1.start()
                    thread2.strat()
                    print(thread1.is_alive())
                    print(threading.active_count())

                    thread1.join()
                    thread2.join()

                    print(thread1.is_alive())
                    #while thread1.is_alive() == True:
                        #time.sleep(10)
                        #print(process_exists('WINWORD.EXE'))
                        #if process_exists('WINWORD.EXE') == True:
                            #os.system('taskkill /f /im WINWORD.EXE')
                            #print('Процесс был завершён принудительно')
                        #else:
                            #print('Процесс был завершён самостоятельно')
                        #Убиваем winword

                    #thread1.join()
                    #print('Процесс завершён')
                    #doc2docx(file_path, error_file_name, directory)
                    counter_good +=1
                    print('Обработано:' + str(counter_good) + ' файлов')
                elif function == 'docx2xml':
                    docx2xml(file_path, file_name, error_file_name, directory)
                else:
                    print('Не выбрана фунция обработки')

def doc2docx(path, err_name, directory):
    docx_file = '{0}{1}'.format(path, 'x')
    pythoncom.CoInitialize()
    try:
        print('Идёт обработка', path.encode('ascii', 'ignore'))
        word = win32com.client.Dispatch("Word.application")
        word.visible = 0
        wordDoc = word.Documents.Open(path, False, False, False)
        wordDoc.SaveAs2(docx_file, FileFormat = 16)
        wordDoc.Close()
        os.remove(path)
    except:
        try:
            wordDoc.close()
        except:
            pass
        os.rename(path, directory + '\\!Необработанные\\' + err_name)
    finally:
        pythoncom.CoUninitialize()
</code>

Ваша главная проблема - вы лупите по площадям, работая с процессом по имени -
winword.exe. Ваша задача - получить PID этого процесса и отслеживать его в отдельном потоке таймера.
Структура получается такая:

перед началом цикла запускаете поток с таймером;
в основном цикле, после
word = win32com.client.Dispatch("Word.application") получаете PID;
передаете PID в поток таймера, и он начинает контролировать процесс по PID. Если в течение 10 секунд он ещё жив - прибивает его - и ждет новых заданий;
выполняете операции с Word документом. Если зависли, поток с таймером прибъет Word процесс через 10 секунд;
повторяете цикл для нового документа, тем временем поток таймера может все еще наблюдать за старым процессом. Вы можете ему сообщить, что уже больше не надо;

Для получения PID посмотрите этот кусок кода на VB.Net (взят отсюда):

'get the window handle
Dim xlHWND As Integer = xlApp.hwnd

'this will have the process ID after call to GetWindowThreadProcessId
Dim ProcIdXL As Integer = 0

'get the process ID
GetWindowThreadProcessId(xlHWND, ProcIdXL)

Используйте
win32process.GetWindowThreadProcessId(hwnd) раз уж вы используете другие аналогичные модули.
Хотя ctypes мне кажется более предпочтительным, так как это встроенный в питон функционал: ctypes.windll.user32.GetWindowThreadProcessId

import ctypes
pid = ctypes.c_ulong()
ctypes.windll.user32.GetWindowThreadProcessId(hwnd, ctypes.pointer(pid))

Вообще говоря, при однопотоковой работе вам даже и PID не нужен. Подумаешь, снесет случайно Winword с вашим любимым, не сохраненным, документом. Но если Вам захочется конвертировать в несколько потоков, то тогда без PID не обойтись.
Добавлено
Мда, с PID для Word оказалось несколько сложнее. Но тем не менее, вот полностью рабочий вариант:

import queue
import ctypes
import threading
import time
import uuid
import win32gui
import os
import win32com.client
import pythoncom

exit_flag = False
timer_reset = False

PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_TERMINATE = 1

class Watchdog_Thread (threading.Thread):
    def __init__(self, queue_lock, queue, timeout):
        threading.Thread.__init__(self)
        self.queue_lock = queue_lock
        self.queue = queue
        self.timeout = timeout

    def run(self):
        global timer_reset
        global exit_flag

        while not exit_flag:

            # Waiting for task
            self.queue_lock.acquire()
            try:
                pid = self.queue.get_nowait()
                self.queue_lock.release()
            except queue.Empty as e:
                self.queue_lock.release()
                time.sleep(0.5)
                continue

            print("Started timer for process {}".format(pid))
            started = time.time()
            while True: # Waiting for timeout or process completion
                if timer_reset:
                    timer_reset = False
                    print("Process {} completed in {} seconds".format(pid, int(time.time()-started)))
                    break # Process completed, go wait for new task
                if started + self.timeout > time.time():
                    time.sleep(0.5)
                    continue

                # Kill the process
                handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION, False, int(pid))
                ctypes.windll.kernel32.TerminateProcess(handle, -1)
                ctypes.windll.kernel32.CloseHandle(handle)
                print("Killed process {}".format(pid))
                break # Process killed, go wait for new task

work_queue_lock = None
work_queue = None

def file_finder(directory = '', ext = '', function = ''):
    global exit_flag
    global work_queue_lock, work_queue

    pythoncom.CoInitialize()
    try:
        # Create lock to work with queue (get/put actions)
        work_queue_lock = threading.Lock()
        # Create queue for the actions
        work_queue = queue.Queue()
        # Created watchdog thread
        watchdog_thread = Watchdog_Thread(work_queue_lock, work_queue, 10)
        watchdog_thread.start()

        counter_good = 0
        for dir_path, dirs, files in os.walk(directory):
            if dir_path.lower().endswith('failed'): continue
            for file_name in files:
                file_path = os.path.join(dir_path, file_name)
                error_file_name = file_name
                file_name, file_extension = os.path.splitext(file_path)
                if file_extension.lower() == ext: # ext - отбираемое расширение (.xxx)
                    if function == 'doc2docx':
                        doc2docx(file_path, error_file_name, directory)
                        counter_good +=1
                        print('Processed:' + str(counter_good) + ' file(s)')
                    elif function == 'docx2xml':
                        docx2xml(file_path, file_name, error_file_name, directory)
                    else:
                        print('Не выбрана фунция обработки')

    except:
        print('Got exception')
    finally:
        exit_flag = True
        pythoncom.CoUninitialize()

def doc2docx(path, err_name, directory):
    global timer_reset
    docx_file = '{0}{1}'.format(path, 'x')
    try:
        print('Processing', path.encode('ascii', 'ignore'))
        word = win32com.client.Dispatch("Word.application")
        word.WindowState = 2 # wdWindowStateMinimize
        word.Caption = str(uuid.uuid1())
        word.Visible = True
        while True:
            hwnd = win32gui.FindWindow(None, word.Caption)
            if hwnd: break
            time.sleep(0.05)
        word.visible = False

        pid = ctypes.c_ulong()
        _ = ctypes.windll.user32.GetWindowThreadProcessId(hwnd, ctypes.pointer(pid))

        work_queue_lock.acquire()
        work_queue.put(pid.value)
        work_queue_lock.release()

        wordDoc = word.Documents.Open(path, False, False, False)
        wordDoc.SaveAs2(docx_file, FileFormat = 16)
        wordDoc.Close()
        timer_reset = True
        os.remove(path)
    except:
        print('Got exception')
        try:
            wordDoc.close()
        except:
            pass
        os.rename(path, directory + '/failed/' + err_name)

if __name__ == "__main__":
    file_finder('c:/temp/test', '.doc', 'doc2docx')


Результат tkinter.filedialog.askopenfilenames
Функция askopenfilenames() возвращает список выбранных файлов с их полными
путями, а мне надо только имена файлов без путей. Может существует какой-нибудь параметр для этой цели?

Можно ещё попробовать через
os.path.basename создать список из наименований файлов:

import os

# ...

filepaths = filedialog.askopenfilenames()
filenames = list(map(os.path.basename, filepaths))


Почему так в Python? [дубликат]

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

Целочисленное деление отрицательных целых чисел

                                (2 ответа)

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

Не пойму...

>>> 5 * 32 / 9
>>> 17

Но тут же:

>>> 5 * -32 / 9
>>> -18

5 * 32 / 9 = 17.7777...

Округляется к меньшему числу, тоесть к 17

5 * -32 / 9 = -17.7777...

Меньшее число -18


Как можно изменить/сократить/украсить код?
Учусь языку python, дошел до темы списки. Решил сделать простенький электронный журнал. Хочу узнать как можно бы было еще лучше написать данную программу. Спасибо заранее за FeedBack.
<code>
lis = []
i = int(input("Введите кол-во участников в классе: "))
k = 1
n = 0
while n < i:
    print (k,"участник")
    name = str(input("Имя участника: "))
    lis.append (name)
    surname = str(input("Фамилия участника: "))
    lis.append (surname)
    age = int(input("Возраст участника: "))
    lis.append (age)
    k = k + 1
    n = n + 1
sog = int(input("Желаете ли вы проверить данные? (1 - Да, 0 - Нет) "))
if sog == 1:
    vvod = str(input("Введите фамилию участника: "))
    vvod2 = lis.index(vvod)
    print ("Данные внесены в систему следующим образом: ",lis[vvod2-1], lis[vvod2], lis[vvod2+1],"лет")

else:
    print("Прощайте!")
    exit
</code>

По хранению данных

Вы можете использовать список списков, чтобы не искать информацию о каждом участнике, как
lis[i-1],
lis[i],
lis[i+1]. В случае списка списков, Вы сможете получать информацию так:
lis[i][0] # Имя,
lis[i][1] # Фамилия,
lis[i][2] # Возраст.
В Вашем коде это будет выглядеть так:

name = str(input("Имя участника: "))
surname = str(input("Фамилия участника: "))
age = int(input("Возраст участника: "))
lis.append([name, surname, age])

Также можно использовать список словарей, чтобы обращаться к полям участников более явно:

lis.append({ "name" : name, "surname" : name, "age" : age })

Затем к полям i-го участника Вы сможете обращаться, например, так:

lis[i]["surname"]

По коду

Зачем вам переменная
k? Только чтобы выводить
k участник, начиная с 1? В таком случае используйте
n+1 вместо
k, как Вам уже подсказали в комментариях.
Списки в Python не имеют фиксированную длину :) Добавлять участников можно в цикле
while True:, пока пользователь не впишет какое-нибудь служебное слово (например,
"quit")

while True:
    name = input("Имя участника (quit - выход): ")
    if name == "quit":
        break
    #...

Если Вы всё же хотите использовать
while n < i:, то лучше освободите переменную
n и воспользуйтесь циклом
for n in range(i):

sog = int(input("Желаете ли вы проверить данные? (1 - Да, 0 - Нет) ")) А если пользователь введёт не 0 или не 1? :) Можно было бы добавить какую-нибудь проверку :)

while True:
    try: # try except для того, чтобы обработать случай, если пользователь напишет не цифру (например, "y")
        sog = int(input("Желаете ли вы проверить данные? (1 - Да, 0 - Нет) "))
        if sog == 0 or sog == 1:
            break
        else:
            continue
    except:
        continue

Данные можно проверить только 1 раз и только для одного участника? Может, тоже стоит обернуть в
while True:, пока пользователь не введёт 0?

while sog == 1:
    # Выполняем проверку
    # ...
    while True:
        try: # try except для того, чтобы обработать случай, если пользователь напишет не цифру (например, "y")
            sog = int(input("Желаете ли вы проверить данные? (1 - Да, 0 - Нет) "))
            if sog == 0 or sog == 1:
                break
            else:
                continue
        except:
            continue

(Согласен, слишком много
while True:, но в Python отсутствует цикл
do {} while (), поэтому выкручиваются так :))

vvod = str(input("Введите фамилию участника: ")) А если будет введена фамилия, которой нет в списке участников? Думаю, лучше проверять перебором

# Для случая, когда у нас список словарей
vvod = str(input("Введите фамилию участника: "))
for member in lis:
    if member["surname"] == vvod:
        # Что-то делаем
        break
else:
    # Делаем что-то, если участника не нашли

Тут ещё можно дополнять и дополнять, но я устал...) Вообще, внешний вид кода (сократить/украсить) вещь довольно субъективная, так что тут на вкус и цвет. А про явные недочёты, типа ненужной переменной, плохого цикла и проверок на ввод пользователя я написал.


В коде множество элементов одни, а в отладчике они перемешаны
У меня есть множество элементов
<code>
x = {1, 2, 4, 6, 8, 10, 12, 15, 18, 20}
y = {3.60, 3.20, 2.57, 1.95, 1.45, 1.09, 0.9, 0.6, 0.3, 0.1}
</code>
Но когда я смотрю через отладчик Visual Studio, то там некоторые элементы идут в другом порядке(на следующем шаге после инициализации y):
y={0.9, 1.95, 2.57, 3.2, 3.6, 1.45, 1.09, 0.6, 0.3, 0.1}
В чем может быть проблема?

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


PHP Запуск скрипта-демона на python
Ubuntu 18.04
Почему при вызове моего питоновского скрипта-демона  из PHP страница бесконечно грузится? Вывод вроде как направляю в файл и использую nohup (как указанно в документации). P.S. Хочу сделать кнопку на сайте, при нажатии на которую скрипт будет вкл. и работать.
Мой php код:
<code>
    <?php
    $result = system('nohup python3 /home/scripts/script1.py & > output.txt', $retval);
echo $retval;
    ?>
</code>
Питон скрипт представляет из себя вечный цикл и записью данных в бд.

Команда
& фонового запуска процесса указана в неверной позиции. И еще полезно отсоединить stdin.
Важно не указывать второй аргумент, если не хотите дожидаться завершения процесса!

<?php
    system('nohup python3 /home/scripts/script1.py </dev/null &>output.txt &');
?>

Если всё-таки важно убедиться, что Python скрипт запущен корректно, то напишите запускающий скрипт.
start.py

#!/usr/bin/env python

import sys
import time
from subprocess import Popen

DETACHED_PROCESS = 0x00000000
CREATE_NEW_PROCESS_GROUP = 0x00000200
BELOW_NORMAL_PRIORITY_CLASS = 0x00004000
proc = Popen(
    [sys.executable, '/home/scripts/script1.py', 'argument1', 'argument2'],
    creationflags= DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | BELOW_NORMAL_PRIORITY_CLASS,
    close_fds = True
)

# Wait a bit in case process failed to start
time.sleep(2)

if proc.poll() is not None and proc.poll() > 0:
    raise RuntimeError('Cannot start process')

PHP

<?php
    $result = system('python3 /home/scripts/start.py 2>&1', $retval);
    echo $retval;
?>


Почему выдает ModuleNotFoundError?
У меня появилось желания устанавливать пакеты pip с помощью скрипта на Python. При этом у меня получилось сделать так что у меня работает, но на других ПК - нет. В начале идет установка, затем идет тест импорта, на котором и происходит ошибка.

# -*- coding: utf-8 -*-

import os
import sys

def InstallPackage():
  try:
    library = os.path.abspath(__file__)
    file = library.replace('Test.py', 'file.txt')
    print(f'[DEBUGGER] {library}')
    print(f'[DEBUGGER] {file}')
    os.system(f'cmd /c pip3 install -r {file}')
    return 0
  except:
    print('[DEBUGGER] An unknown error has occurred.')
    return 1
    pass

class ImportTesting:
  def sty():
    try:
      import sty
      return 0
    except ModuleNotFoundError as stderror:
      Template = '[DEBUGGER] An exception of type {0} occurred. Arguments:\n{1!r}'
      ErrorMessage = Template.format(type(stderror).__name__, stderror.args)
      print(ErrorMessage)
      return 1

  def colorama():
    try:
      import colorama
      return 0
    except ModuleNotFoundError as stderror:
      Template = '[DEBUGGER] An exception of type {0} occurred. Arguments:\n{1!r}'
      ErrorMessage = Template.format(type(stderror).__name__, stderror.args)
      print(ErrorMessage)
      return 1

def OutputTest():
  for i in range(91, 98):
    sys.stdout.write(fg(i) + 'Color Test \n' + rs.fg)
  return 0

if __name__ == '__main__':
  if not InstallPackage():
    if not ImportTesting.sty() and not ImportTesting.colorama():
      from sty import *
      import colorama
      colorama.init()
      OutputTest()

os.system("pause")

file.txt:

sty
colorama

Я вот так инсталю:

    DEPS = ['sty', 'colorama']
    CMD = 'install ' + " ".join(DEPS)
    import pip
    pip.main(CMD.split())

Возможно на других компах pip3 не в PATH, а так сработает.
Похоже удалили функцию, тогда через subprocess

try:
    import colorama
except:
    import sys
    import subprocess
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'sty', 'colorama' ])
    import colorama


PEP8 Ошибка E712 при отборе через .loc в DataFrame

df.loc[df.biz_id == True, 'biz_id_zak'] = 'b2b'
df.loc[df.biz_id == False, 'biz_id_zak'] = 'b2c'

Условие работает - данные отбираются. Загвоздка в том, что данная выборка противоречит рекомендациям PEP:
Comparison to true should be 'if cond is true:' or 'if cond:' (E712)
Пытался переписать внутри этой строчки:

df.loc[df.biz_id is True, 'biz_id_zak'] = 'b2b'

KeyError: 'cannot use a single bool to index into setitem'
А если так:

df.loc[df.biz_id == True, 'biz_id_zak'] = 'b2b'

SyntaxError: invalid syntax
Пытаюсь работать над своим 'плохо'-кодом, стараясь исправлять всё, что хоть как-то не нравится редактору. Помогите пожалуйста оптимальным однострочным условием, чтобы совместно с .loc работало.

Это ложное срабатывание линтера, а потому его лучше заглушить:
<code>
df.loc[df.biz_id == True, 'biz_id_zak'] = 'b2b'  # noqa: E712
</code>


Фильтрация строк DataFrame/Series по фрагменту строкового значения
Имеется Series-объект
df.col_1 - конкретный столбец датафрейма
df, содержащий строковые значения, типа:

1       В процессе исключения из ЕГРЮЛ c 20 февраля 20...
2       Контрагента могут ликвидировать. Внесена запис...
3       Контрагента могут ликвидировать. Внесена запис...
4       Контрагента могут ликвидировать. Внесена запис...
5       Контрагента могут ликвидировать. Внесена запис...
6       ФНС приняла решение о предстоящем исключении к...
7       В процессе исключения из ЕГРЮЛ c 27 февраля 20...
8       Контрагента могут ликвидировать. Внесена запис...
9       Контрагента могут ликвидировать. Внесена запис...
10      ФНС приняла решение о предстоящем исключении к...
11      Контрагента могут ликвидировать. Внесена запис...
12      Контрагента могут ликвидировать. Внесена запис...
13      ФНС приняла решение о предстоящем исключении к...
14      ФНС приняла решение о предстоящем исключении к...
15      ФНС приняла решение о предстоящем исключении к...

Необходимо отфильтровать такие наблюдения, которые содержать фрагмент, например "ФНС" в составе строки.
Код

df.col_1.filter(like='ФНС')

или

df.col_1.filter(regex='ФНС')

не дает нужного результата.

Воспользуйтесь Series.str.contains():
<code>
In [78]: df[df['col_1'].str.contains('ФНС')]
Out[78]:
                                                col_1
5   ФНС приняла решение о предстоящем исключении к...
9   ФНС приняла решение о предстоящем исключении к...
12  ФНС приняла решение о предстоящем исключении к...
13  ФНС приняла решение о предстоящем исключении к...
14  ФНС приняла решение о предстоящем исключении к...
</code>


Ошибка: TypeError: fit() missing 1 required positional argument: 'y'
Я пытаюсь сделать алгоритм на python, определяющий написанные от руки английские буквы, но при попытке обучения появляется ошибка.
Мой код:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier as knc

abc_train = pd.read_csv("alphabet.csv")

columns = ["let"]
for i in range(784):
    columns.append(f"px_{i+1}")
abc_train.columns = columns
label_name = abc_train["let"].values
let_train = abc_train.values[:, 1:]
pict_train = let_train.reshape(372450 , 28, 28)
knc = knc.fit( pict_train, label_name)

Ошибка:

TypeError                                 Traceback (most recent call last)
<ipython-input-54-5c26061e5501> in <module>
----> 1 knc = knc.fit( pict_train[1:14325], label_name)

TypeError: fit() missing 1 required positional argument: 'y'

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

Ошибка в том, что вы не создали объект класса
KNeighborsClassifier, а использовали метод класса
KNeighborsClassifier.fit().
Попробуйте так:

from sklearn.neighbors import KNeighborsClassifier

knc = KNeighborsClassifier(n_neighbors=5)

...

knc.fit(pict_train, label_name)

PS @gil9red отлично дополнил ответ в комментарии:

в питоне у методов объекта есть первый, неочевидный параметр
self, в
  который кладется ссылка на объект, что метод вызвал и в случае вызова
  метода классом (а не объектом), в тот параметр
self попал объект

pict_train, а
label_name, соответственно, попал в
X, поэтому и
  ругается на
y?


Regular Expression - вывод строки ПОЛНОСТЬЮ, а не только искомый фрагмент
Good afternoon, dear friends!
Подскажите, пожалуйста...
Есть определённая переменная
а в которой куча строк с данными.
При помощи:
re.findall  [\w\.+]+-[A-Za-z-]+   - вывожу найденные куски строк.
Каким образом, можно вывести строки целиком, содержащую данный фрагмент (
[\w\.+]+-[A-Za-z-]+) ???
________Пример кода:_______________________________________________________

import re

a = """A-1 Cafe Restaurant","Mon, Wed-Sun 11 am - 10 pm"
"Nick's Lighthouse","Mon-Sun 11 am - 10:30 pm"
"Paragon Restaurant & Bar","Mon-Fri 11:30 am - 10 pm  / Sat 5:30 pm - 10 pm"""

text_which_we_fond = r"[\w\.+]+-[A-Za-z-]+"  # шаблон поиска
all_results = re.findall(text_which_we_fond, a)

for i in all_results:
    print (i)

____________it will:_____________________________________________________________

Wed-Sun
Mon-Sun
Mon-Fri

_________________А нужно, чтобы программа выводила:____________________________
Строки целиком...

"A-1 Cafe Restaurant","Mon, Wed-Sun 11 am - 10 pm"
"Nick's Lighthouse","Mon-Sun 11 am - 10:30 pm"
"Paragon Restaurant & Bar","Mon-Fri 11:30 am - 10 pm  / Sat 5:30 pm - 10 pm

Каким образом это сделать?!

В Python гораздо удобнее разбить текст на строки с помощью
str.splitlines() (кстати, этот метод справляется с любыми последовательностями переноса строки), а затем отфильтровать только те строки, в которых есть совпадение с помощью предварительно откомпилированного регулярного выражения и метода
re.search:

text_which_we_fond = r"[\w.+]+-[A-Za-z-]+" # шаблон поиска
reg = re.compile(text_which_we_fond)       # откомпилированное регулярное выражение
all_results = list(filter(reg.search, a.splitlines()))

См. демо онлайн. Результат:

"A-1 Cafe Restaurant","Mon, Wed-Sun 11 am - 10 pm"
"Nick's Lighthouse","Mon-Sun 11 am - 10:30 pm"
"Paragon Restaurant & Bar","Mon-Fri 11:30 am - 10 pm  / Sat 5:30 pm - 10 pm"


Как ведет себя range в for? python [дубликат]

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

Как перебирает значения цикл for в Python 3.5

                                (1 ответ)

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

<code>
item = 5

for i in range(item):
    item -= 1
    print(i, range(item), item)
</code>
Что-то я запутался, как так получается, что когда range(0, 1) i = 3 и вообще, что тут происходит и как это работает? Почему i доходит до конца, хотя item уменьшается, разве он не должен быть закончится раньше.
Объясните пожалуйста поподробнее, заранее спасибо за ответ на мой глупый вопрос.

range вызывается только один раз. Эта функция возвращает итерируемый объект
range.

for i in range(item): в данном случае эквивалентно
for i in [0,1,2,3,4]:, т.е.
range не вызывается для каждой итерации, только единожды и далее цикл пробегает по элементам этой коллекции.


Перестает видеть файл после внесения изменений в коде
Создаю новый файл с кодом
<code>
str = input('Input text here')
str += "\n"

file = open('data/t.txt', 'w')
file.write(str)
file.close()
</code>
Все работает хорошо, проверяю папку data - файл есть. Далее меняю w на a, чтобы дозаписать что-то в файл и выдает ошибку  "[Errno 2] No such file or directory". Снова меняю на w - тоже не работает. Пробовала прописывать путь по-разному, в том числе абсолютный путь. Получается точно также. Когда создаешь новый файл с кодом - тоже создает текстовый файл и код перестает работать. Папка находится не на диске С.
Скажите, пожалуйста, в чем может быть проблема?

Указывая

не на диске C

Вы имели ввиду расшареный диск?
В любом случае, проблема скорее всего с хитро указанными правами доступа. При этом Вы можете создавать файлы, но не можете их модифицировать.
Попробуйте запустить:
<code>
icacls data
</code>
и проверьте ваши права доступа.
Здесь можно почитать про icacls.


Определить сколько чисел входят в интервал и записать ответ в массив
Есть массив
а состоящий из 10 случайных  чисел от 0 до 1. Нужно сделать 10 равных  интервалов и узнать сколько чисел попадут на каждый интервал и запписать ответы в массив
b.
Нужно заменить часть кода, где
if:

import random
import numpy
mas=[1,2,3,4,5,6,7,8,9,10]
p=[0,0,0,0,0,0,0,0,0,0]
for i in range(10):
  mas[i]=random.random()
  print(mas[i])
  if mas[i] > 0 and mas[i] < 0.1:
    p[0]=p[0]+1
  if mas[i] > 0.1 and mas[i] < 0.2:
    p[1]=p[1]+1
  if mas[i] > 0.2 and mas[i] < 0.3:
    p[2]=p[2]+1
  if mas[i] > 0.3 and mas[i] < 0.4:
    p[3]=p[3]+1
  if mas[i] > 0.4 and mas[i] < 0.5:
    p[4]=p[4]+1
  if mas[i] > 0.5 and mas[i] < 0.6:
    p[5]=p[5]+1
  if mas[i] > 0.6 and mas[i] < 0.7:
    p[6]=p[6]+1
  if mas[i] > 0.7 and mas[i] < 0.8:
    p[7]=p[7]+1
  if mas[i] > 0.8 and mas[i] < 0.9:
    p[8]=p[8]+1
  if mas[i] > 0.9 and mas[i] < 1:
    p[9]=p[9]+1
print()
print('среднее
значение:',numpy.mean(mas))
print()
for i in range(10):
  print(p[i])

Решение с использованием модуля Pandas:

import pandas as pd  #  pip install pandas
import numpy as np   #  pip install numpy

np.random.seed(123)
# создаем Pandas Series из 10-ти случайных чисел
m = pd.Series(np.random.rand(10))
print(m)

# корзины / интервалы
bins = np.linspace(0, 1, 11)

res = m.groupby(pd.cut(m, bins=bins)).count()

Результат:

In [42]: m
Out[42]:
0    0.696469
1    0.286139
2    0.226851
3    0.551315
4    0.719469
5    0.423106
6    0.980764
7    0.684830
8    0.480932
9    0.392118
dtype: float64

In [43]: res
Out[43]:
(0.0, 0.1]    0
(0.1, 0.2]    0
(0.2, 0.3]    2
(0.3, 0.4]    1
(0.4, 0.5]    2
(0.5, 0.6]    1
(0.6, 0.7]    2
(0.7, 0.8]    1
(0.8, 0.9]    0
(0.9, 1.0]    1
dtype: int64


Как получить московское время сейчас?
Необходимо в Python программе получить московское время сейчас. Как это сделать?

from datetime import datetime
import pytz     #   pip install pytz

moscow_time = datetime.now(pytz.timezone('Europe/Moscow'))
print(moscow_time)

2019-03-27 20:51:26.031936+03:00


Как найти количество способов набрать суму S из чисел в диапазоне от L до R?
Передо мной постала вот такая задача:

"Найти количество разложений числа S на числа в диапазоне от L - R"

И я недавно видел задачу про разложения с помощью ДП, идея в том чтобы разбить сумму на меншие которые зависят от предыдущих, если мы хотим набрать суму S из чисел 1, 2, 3 .. k, то cntS = cntS - 1 + cntS - 2 + cntS - 3 .. + cntS + k. Из этого достаточно просто опредилить значения cntS.
Но как быть если нам дан диапазон чисел от L до R, тобеш cntS = (cntS - R) + (cntS - R - 1) + (cntS - R - 2)  ... + (cntS - L).

Как получить сумму
S? Из числа
S-L и
L, из числа
S-L-1 и
L+1, ..., из числа
S - R и
R. Таким образом, количество способов набрать сумму

F(S) = F(S-L) + F(S-L-1) +.. F(S-R)

Для каждого слагаемого рекурсивно решим ту же самую задачу, пока не дойдём до значения
S=0, для которого количество способов равно единице.
Посчитанные значения
F(x) будем запоминать, чтобы не пересчитывать много раз - вот и мемоизация, или top-down ДП (в Python можно
@functools.lru_cache использовать)
Набросок с контролем вариантов (различающиеся порядком считаются за разные)

def numways(s, l, r, st):
    if s < 0:
        return 0
    if s == 0:
        print(st)
        return 1
    res = 0
    for i in range(l, min(s+1, r+1)):
        res += numways(s - i, l, r, st + str(i))
    return res

print(numways(8,2,4,""))


Может ли кодировка влиять на результат сравнения?
Пишу игру "Города" на Python. Список городов лежит в файле .txt(с кодировкой windows-1251). Мне необходимо на моменте подбора города исключить следующий вариант ответа: Абаза(юзер) Абаза(комп). Делаю следующее условие(см. второе условие после "and" в цикле):

def bot_city_func(city):
answer = ""
with open(filename) as file:
    for city_b in file.readlines():
        if city_b in list_used_cities:
            continue

        elif city_b[0].lower() == city[-1].lower() \
                and city_b.lower() != city.lower():
            answer = city_b
            list_used_cities.append(city_b)
            break

    if answer == "":
        answer = "Ваш город не существует или введён на другом языке."
return answer

Но он всё равно пропускает город Абаза, и отвечает пользователю по сути тем же городом который он написал, может дело в кодировке и поэтому Python считает что это разные слова?
Вот код остальной программы:

userCity = ""
while userCity != 'q':
    print("Введите 'q' для завершения игры")
    userCity = input("Введите город\n")
    bot_city = bot_city_func(userCity)
    if len(bot_city) > 8:
        print(bot_city)
        quit()
    bot_city = bot_city.split()
    print(bot_city[0] + "\nВам на " + bot_city[0][-1])

Тут две проблемы

Да, дело в кодировке (что легко провряется выводом прочитанного текста,
print (city_b) вместо "Абакан" выведет "Àáàêàí" и т.д.) , поэтому при открытии файла кодировку нужно явно указать:

with open(filename, encoding="cp1251") as file:
Последний символ в
city_b  будет не последняя буква в названии города, а символ перевода строки
\n, поэтому надо его отрезать:

for city_b in file.readlines():
    city_b = city_b[0:-1]


Необходимо преобразовать тест в список слов
Из текста необходимо вычленить все слова и добавить в список без знаков препинания.
Пример:
У нас имеется такой текст: 'От города до дачи полчаса езды. Я то и дело поглядывала по сторонам, но ничего подозрительного узреть
не смогла и вскоре успокоилась. Затем я увидела чудо.'
Должен получиться список слов ['От', 'города', 'до' ...]

import string

text = 'От города до дачи полчаса езды ... Затем я увидела чудо.'
words = text.translate({ord(c): None for c in string.punctuation}).split()


Почему этот фрагмент программы не является решением?
Уровень C. Напишите программу, которая заменяет во всей строке одну последовательность символов на другую.
Пример:
Введите строку:
(X > 0) and (Y < X) and (Z > Y) and (Z <> 5)
Что меняем: and
Чем заменить: &
Результат
(X > 0) & (Y < X) & (Z > Y) & (Z <> 5)
<code>
s = "(X > 0) and (Y < X) and (Z > Y) and (Z <> 5)"
s_need = str(input('Что ищем?'))
s_change = str(input('Чем заменяем'))
while s_need in s:
    del s[s.index(s_need)]
</code>
Почему del не работает

Попробуйте лучше так:
<code>
s = "(X > 0) and (Y < X) and (Z > Y) and (Z <> 5)"
s_need = input('Что ищем? ')
s_change = input('Чем заменяем: ')
s = s.replace(s_need, s_change)
</code>


Поиск дат в формате dd-MM-yyyy с 1900 по 2019 с помощью регулярных выражений в Python

pattern — это шаблон поиска регулярного выражения, в моем случае шаблон поиска даты. Как видим
result[1] = '65-58-3015' не является датой. Что нужно добавить в шаблон, чтобы искало только те даты, в который день принимает значения 1-31, месяц 1-12 и год 1900-2019?

import re
string = '34-3456 / 12-05-2007 / 65-58-3015 / 56-4532 / 11-11-2011 / 67-8945 / 12-01-2009'
pattern = r'\d{2}-\d{2}-\d{4}'

result = re.findall(pattern, string)
print(result)

> ['12-05-2007', '65-58-3015', '11-11-2011', '12-01-2009']