Редактирование переменной до конкретного символа
Скрипт определяет местоположение юзера в формате "Аsia/Yekaterinburg", но передавать другому скрипту он должен лишь город, то есть формат "Yekaterinburg". Нужно убрать все символы до "/" включительно, это возможно?

<code>
return "Asia/Yekaterinburg".split('/')[1];
</code>
P.S. если скрипт передает другому


Как запустить py скрипт без команды python в ZSH?
Пытаюсь понять как запустить скрипт из под виртуального окружения без его активации. Делаю так:

Добавил для файла права на исполнение:

sudo chmod +x myscript.py

Права на файл теперь выглядят так:
-rwxrwxr-x

Добавил в скрипт shebang в первой строчке:

#!/home/path/venv/bin/python3

Перезапустил терминал.

Использую ZSH. При попытке запустить скрипт получаю ошибку:

zsh: command not found: sitemap.py

Когда вы пытаетесь запустить скрипт командой
myscript.py, то система ищет такую команду в
PATH. И если вы не добавили в
PATH путь до каталога с вашим скриптом, то получите
command not found. Поэтому, чтобы запустить скрипт из текущего каталога, нужно указывать
./ перед именем скрипта.
С запуском скрипта не из текущего каталога проблем не будет - просто введите путь до скрипта:

scripts_folder/myscript.py

Если очень нужно, то можете добавить ваш каталог со скриптом в
PATH:

export PATH=$PATH:/path/to/script

Посмотреть содержимое
PATH можно так:

echo $PATH

После этого сможете откуда угодно запускать ваш скрипт просто написав
myscript.py


С помощью рекурсии посчитать количество одинаковых элементов в листе и собрать это в словаре
Помогите реализовать следующую функцию:

def count(data: list, pos=None, result: dict = None) -> dict:
    """
    You are given a list of strings and lists, which may also contain strings and lists etc. Your job is to
    collect these strings into a dict, where key would be the string and value the amount of occurrences of that string
    in these lists.

    :param data: given list of lists
    :param pos: figure out how to use it
    :param result: figure out how to use it
    :return: dict of given symbols and their count
    """

Вывод примерно такой.

print(count([[], ["J", "*", "W", "f"], ["j", "g", "*"], ["j", "8", "5", "6", "*"], ["*", "*", "A", "8"]]))

# {'J': 1, '*': 5, 'W': 1, 'f': 1, 'j': 2, 'g': 1, '8': 2, '5': 1, '6': 1, 'A': 1}

print(count([[], [], [], [], ["h", "h", "m"], [], ["m", "m", "M", "m"]]))

 # {'h': 2, 'm': 4, 'M': 1}

print(count([]))

# {}

print(count([['a'], 'b', ['a', ['b']]]))

# {'a': 2, 'b': 2}

Мои наброски:

if result is None and pos is None:
    result = {}
    pos = 0
if pos > len(data):
    return result
if isinstance(data[pos], str):
    return count_strings(data, pos + 1, result)
elif isinstance(data, list):
    return count_strings(data, 0, result)

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

from pprint import pprint
from itertools import chain
from collections import Counter
c = Counter()
for li in [[[], ["J", "*", "W", "f"], ["j", "g", "*"], ["j", "8", "5", "6", "*"], ["*", "*", "A", "8"]],
           [[], [], [], [], ["h", "h", "m"], [], ["m", "m", "M", "m"]]]:
    c.update(chain.from_iterable(li))
    pprint(c)
    c.clear()

Вывод:

Counter({'*': 5,
         'j': 2,
         '8': 2,
         'f': 1,
         'W': 1,
         'A': 1,
         'g': 1,
         '6': 1,
         '5': 1,
         'J': 1})
Counter({'m': 4, 'h': 2, 'M': 1})

Демо.
Для вывода использован pprint модуль.


Виндосовский перевод строки на линуксе
Можно ли использовать
print() на линуксе так, чтобы новая строка была
\r\n, а не
\n? Кроме явного указания этих символов. Типа вызвать какую-нибудь функцию из
os/sys, которая бы поменяла linux newline на windows newline во всех моих
print()?

Можно, для этого используется предпроцессор. Можно определить константу, которая в зависиости от задданных определений, будет делать сборку для windows и для linux разную. Как правило для проверки на линукс/виндовс используются определения
__linux__,
_WIN32,
_WIN64 их выставляет компилятор. В настройках проэкта можно задать параметры сборки.

#ifdef __linux__
   #define carrier_return "\n"
#elif _WIN32
   #define carrier_return "\r\n"
#elif _WIN64
   #define carrier_return "\r\n"
#else
   #warning choose windows or linux
   #define carrier_return "\r\n"
#endif

print("your text" carrier_return );

У
с в определенях строки можно использовать конструкцию
"строка1" "строка2" - при этом конкатенация произойдет на уровне компилятора. Вместо
"строка2" можно поставить макрос
carrier_return.


Почему реверсивный список возвращает None?
Я хочу занести реверсивный список в переменную, но ничего не выходит, он просто выводит None
<code>
a = list(map(int, input().split(' ')))
reverse_a = a.reverse()
print(reverse_a)

None
</code>
Как это исправить?(python 3.8)

Метод
reverse поворачивает сам список, но ничего не возвращает, используется так:

a = list(map(int, input().split(' '))) # 1 2 3 4 5
a.reverse()
print(a) # [5, 4, 3, 2, 1]

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

a = list(map(int, input().split(' '))) # 1 2 3 4 5 6
a_new = reversed(a)
print(list(a_new)) # [6, 5, 4, 3, 2, 1]

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

a = list(map(int, input().split(' '))) # 1 2 3 4 5
a_new = a[::-1]
print(a_new) # [6, 5, 4, 3, 2, 1]


Апельсины бочками
Бизнесмен Василий после прочтения известной книги решил открыть новый бизнес – отгружать апельсины бочками. Партнерам важно знать сколько именно бочек апельсинов отгружается каждый день.
Мобильный телефон Василия поддерживает только транслит, поэтому он передает сообщения вида "N bochek" . Например, "3 bochki" или "1 bochka" .
Напишите программу, которая выбирает правильное слово (из "bochka" , "bochek" , "bochki" ) в зависимости от N.
Входные данные
Одно число N (0 ≤ N ≤ 1000).
Выходные данные
Фраза на транслите
Пишет, что из 25 тестов, 1 ответ неверный. Что я не учел?
<code>
N = int(input())

if N <= 10 or N >= 20:
    if (N % 10) == 0 or ((N % 10) >= 5 and (N % 10) <= 9):
        print(str(N) + " bochek")
    elif (N % 10) == 1:
        print(str(N) + " bochka")
    else:
        print(str(N) + " bochki")
else:
    print(str(N) + " bochek")
</code>

Забыл учесть числа большие 100. Проблема решается рассмотрением остатка от деления на 100.
<code>
N = int(input())
M = N % 100

if M <= 10 or M >= 20:
    if (N % 10) == 0 or ((N % 10) >= 5 and (N % 10) <= 9):
        print(str(N) + " bochek")
    elif (N % 10) == 1:
        print(str(N) + " bochka")
    else:
        print(str(N) + " bochki")
else:
    print(str(N) + " bochek")
</code>


Координаты соседей
Для клетки с координатами (x, y) в таблице размером M × N выведите координаты ее соседей. Соседними называются клетки, имеющие общую сторону.
Даны натуральные числа M, N, x, y.
В выходной файл выведите пары координат соседей этой клетки в произвольном порядке.
Почему-то выдает 0 баллов, хотя подставлял числа, вроде ответы правильные.
<code>
M, N, x, y = int(input()), int(input()), int(input()), int(input())

if M != 1 and N != 1:
    if x == 1 and y == 1:
        print(x + 1, y)
        print(x, y + 1)
    elif x == 1 and y == N:
        print(x + 1, y)
        print(x, y - 1)
    elif x == M and y == 1:
        print(x - 1, y)
        print(x, y + 1)
    elif x == M and y == N:
        print(x - 1, y)
        print(x, y - 1)
    elif x == 1:
        print(x + 1, y)
        print(x, y + 1)
        print(x, y - 1)
    elif x == M:
        print(x - 1, y)
        print(x, y + 1)
        print(x, y - 1)
    elif y == 1:
        print(x - 1, y)
        print(x, y + 1)
        print(x + 1, y)
    elif y == N:
        print(x - 1, y)
        print(x, y - 1)
        print(x + 1, y)
    else:
        print(x - 1, y)
        print(x + 1, y)
        print(x, y + 1)
        print(x, y - 1)

else:
    if M == 1 and N != 1:
        if y == 1:
            print(x, y + 1)
        elif y == N:
            print(x, y - 1)
        else:
            print(x, y + 1)
            print(x, y - 1)
    elif N == 1 and M != 1:
        if x == 1:
            print(x + 1, y)
        elif x == M:
            print(x - 1, y)
        else:
            print(x + 1, y)
            print(x - 1, y)
</code>

M, N, x, y = int(input()), int(input()), int(input()), int(input())

if N > 1:
    if y == 1:
        print(x, y + 1)
    elif y == N:
        print(x, y - 1)
    else:
        print(x, y - 1)
        print(x, y + 1)
if M > 1:
    if x == 1:
        print(x + 1, y)
    elif x == M:
        print(x - 1, y)
    else:
        print(x - 1, y)
        print(x + 1, y)

На ваших входных:

N: 3
M: 3
x: 2
y: 2
...
2 1
2 3
1 2
3 2


Почему python неправильно переводит типы переменных?
Столкнулся с проблемой: при переводе переменной из
float в
int, python переводит числа с дробью в меньшую сторону. Например:
1.6 переведет не как
2, а как
1, хотя из курса математики известно, что должно быть
2. Объясните, почему это происходит и как с этим бороться?

Если хотите округлить

round(1.6, 0) = 2

int отбрасывает дробную часть

int(1.6) = 1

ceil возвращает ближайшее большее

math.ceil(1.6) = 2


Оптимизация программного кода

Формат входных данных
В первой строке записаны два целых числа n и m  (1≤m,n≤10^5) – количество банок, которые были нашей мишенью в тот день, и количество совершённых в тот день выстрелов.
В i-ой из следующих n строк описывается положение i-ой банки. Положение задаётся координатами проекции банки на вертикальную плоскость. Проекция представляет из себя прямоугольник, стороны которого параллельны нанесённой на эту плоскость системы координат. Ось Y этой системы направлена вертикально вверх, а ось X – горизонтально. А прямоугольник задаётся парой точек – своей левой нижней и правой верхней вершинами.
Гарантируется, что ни одна пара этих прямоугольников не имеет ни одной общей точки.
В i-ой из следующих m строк описывается положение i-ой пули в стене. Пули заданы в том же порядке, в котором они выходили из наших дул. Сама стена строго вертикальна, поэтому мы можем считать, что положение задаётся координатами проекции пуль на вертикальную плоскость. Причём траектории движения пуль были строго перпендикулярна этой плоскости. Сами точки задаются парой координат в уже описанной выше системе координат.
Расстояние между банками и стеной по сравнению с расстоянием до стреляющих настолько мало, что мы им пренебрегаем.
Примечание
Значения координат по модулю не превышают 10^9.
Формат выходных данных
В первой и единственной строке выведите m чисел, i-ое из которых говорит, какую из банок i-я пуля прошла насквозь, если такая имеется. Если i не задела ни одну банку, то выведите −1, иначе выведите порядковый номер во входных данных банки, которую поразила i-я пуля.

Вот сам код:
<code>
x1 = []
y1 = []
x2 = []
y2 = []
bullet_x = []
bullet_y = []
shots = []

n, m = map(int, input().split())

for i in range(0, n):
    a, b, c, d = map(int, input().split())
    x1.append(a)
    y1.append(b)
    x2.append(c)
    y2.append(d)

for i in range(0, m):
    x, y = map(int, input().split())
    bullet_x.append(x)
    bullet_y.append(y)

for j in range(0, m):
    b = False
    for i in range(0, n):

        if (x2[i] >= bullet_x[j] >= x1[i]) and (y2[i] >= bullet_y[j] >= y1[i]):
            b = i + 1

    if b and b not in shots:
        shots.append(b)

    else:
        shots.append(-1)

for i in range(len(shots)):
    print(shots[i], end=" ")
</code>

просто перепишите код на плюсах и он пройдет 57 тест ----
D1-D4
<code>
n,t,c =map(int, input().split())
req = input().split()
deps = {}
for i in range (n):
    name = input()
    deps[name] = list(input().split())[1:]
used = set()
order = []
def top_sort(cur):
    used.add(cur)
    for dep in deps[cur]:
        if dep not in used:
           top_sort(dep)
    order.append(cur)
for name in req:
    if name not in used:
       top_sort(name)
print(len(used))
if c == 2:
    print(*order)
</code>


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

In [3]: list(permutations(['a', 'b', 'c']))
Out[3]:
[('a', 'b', 'c'),
 ('a', 'c', 'b'),
 ('b', 'a', 'c'),
 ('b', 'c', 'a'),
 ('c', 'a', 'b'),
 ('c', 'b', 'a')]

Но я столкнулся с проблемой: я не понимаю, как положить в
list(permutations([])) этот список уникальных трёх или четырёх букв.
Есть идеи, как это реализовать?
Спасибо!

from itertools import chain, permutations

# Импортируем алфавит из стандартной библиотеки, чтобы не набивать его вручную
from string import ascii_lowercase as alphabet

result = list(chain(
                    permutations(alphabet, 3),
                    permutations(alphabet, 4),
                    ))


Билеты на метро
Билет на одну поездку в метро стоит 15 рублей, билет на 10 поездок стоит 125 рублей, билет на 60 поездок стоит 440 рублей. Пассажир планирует совершить n поездок. Определите, сколько билетов каждого вида он должен приобрести, чтобы суммарное количество оплаченных поездок было не меньше n, а общая стоимость приобретенных билетов – минимальна.
Дано одно число n - количество поездок.
Выведите три целых числа, равные необходимому количеству билетов на 1, на 10, на 60 поездок.
Пишет неполное решение(92 из 100).
<code>
n = int(input())

a = n % 60

if a >= 40:
    t = n // 60 + 1
    n = 0
    m = 0
else:
    t = n // 60
    if (a % 10) >= 9:
        n = a // 10 + 1
        m = 0
    else:
        n = a // 10
        m = a % 10

print(m, n ,t)
</code>


Сравнение количества вхождений одного значение в двух разных списках
Есть 2 отсортированных списка в котором рабочие бренды и нерабочие, также результирующий список:

good_brands = ['2XU', '2XU', '7 For All Mankind', '7 For All Mankind Kids', 'A2 by Aerosoles', 'ABLE', 'ADA Collection', 'Acorn', 'Acorn Kids', 'Adam Lippes', 'Adelyn Rae']
not_work_brands = ['1.STATE', '2(X)IST', '24th & Ocean', '2XU', '34 Heritage', '361 Degrees', '42 GOLD', '4Ward Clothing', '6 Shore Road by Pooja', 'BYBI (4)']
bad_brands = []

Нужно сравнить одинаковые значения в списках и если кол-во одинакового значения в good_brands больше, чем в not_work_brands, тогда в bad_brands мы его не добавляем
Например, в good_brands '2XU' два раза встречается, а в not_work_brands один раз, значит результат должен получится примерно такой:

bad_brands = ['1.STATE', '2(X)IST', '24th & Ocean', '34 Heritage', '361 Degrees', '42 GOLD', '4Ward Clothing', '6 Shore Road by Pooja', 'BYBI (4)']

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

set соберет все уникальные значения, а дальше из них выберем те, которые встречаются в первом списке реже, чем во втором
<code>
res = [x for x in set(good_brands + not_work_brands) \
        if good_brands.count(x) - not_work_brands.count(x) < 1]
</code>


Тип Треугольника
Определите тип треугольника (остроугольный, тупоугольный, прямоугольный) с данными сторонами.
Даны три натуральных числа – стороны треугольника.
Необходимо вывести одно из слов: right для прямоугольного треугольника, acute для остроугольного треугольника, obtuse для тупоугольного треугольника или impossible, если входные числа не образуют треугольника.
Почему то пишет неполное решение.
<code>
a = int(input())
b = int(input())
c = int(input())

if (a + b > c) and (c + b > a) and (a + c > b):
    if (a*a + b*b == c*c) or (a*a + c*c == b*b) or (c*c + b*b == a*a):
        print("right")
    elif (a*a + b*b > c*c) or (a*a + c*c > b*b) or (c*c + b*b > a*a):
        print("acute")
    elif (a*a + b*b < c*c) or (a*a + c*c < b*b) or (c*c + b*b < a*a):
        print("obtuse")
else:
    print("impossible")
</code>

Поменяй местами проверки на тупоугольный и остроугольный. В каждом тупоугольном треугольнике есть два острых угла, поэтому до проверки на тупоугольность твой код никогда не доходит - останавливается или на прямоугольном или на остроугольном.
Да и последний elif можно заменить на else.
<code>
if (a*a + b*b == c*c) or (a*a + c*c == b*b) or (c*c + b*b == a*a):
    print("right")
elif (a*a + b*b < c*c) or (a*a + c*c < b*b) or (c*c + b*b < a*a):
    print("obtuse")
else:
    print("acute")
</code>


Задача Квадратное уравнение
Даны действительные числа a, b, c. Найдите все решения квадратного уравнения ax2 + bx + c = 0.
Даны три действительных числа, a не равно 0.
Выведите два действительных числа, если уравнение имеет два корня, одно действительное число – при наличии одного корня. При отсутствии действительных корней ничего выводить не нужно.
Почему то пишет неправильное решение.
<code>
a = int(input())
b = int(input())
c = int(input())

d = (b**2) - (4*a*c)
l = 2 * a

if d == 0:
    print(-b/(2*a))
elif d > 0:
    print((-b + (d**(1/2))) / l, (-b - (d**(1/2))) / l)
</code>

Всё дело в динамической типизации.

d = (b**2) - (4*a*c) -  тип переменной d - float/int

d = d ** (1/2) - а тут, когда вы попытались найти корень числа, если, оно отрицательное - d принимает тип "комплексное число".
То-есть если брать корень отриц. числа - питон даст число комплексное, которое уже другой тип данных, и которое нельзя сравнивать с 0.
Сравнивайте d с 0 до вычисления корня


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

from datetime import datetime, timedelta  # Использую эту библиотеку
import math
hh = int(input())  # Ввожу часы в формате Int
mm = int(input())  # Ввожу минуты в формате Int
s = int(input())   # Тут еще одна нужная мне переменная
t1 = math.ceil((s / 100) * 7.25)  # Тут через предыдущую переменную считаю количество минут которые надо прибавить
date = datetime(year=1, month=1, day=1, hour=int(hh), minute=int(mm))  # Собственно присваиваю
date += timedelta(minutes=t1)  # И наконец прибавляю
print(date.strftime("%H:%M"))  # Вывожу

Все хорошо, кроме последней строчки - дело в том, что мне нужно выводить время в 24 - часовом формате, но с условием, что вместо
09:03 программа должна вывести
9:03
Пример(входные данные):
7
50
1000
Ожидаемый результат:
9:03
Вывод:
09:03

Учимся читать документацию: вместо
%H используй
%-H (но работает не на всех осях).
Если не работает, то можно применить примерно такой костыль:

output = date.strftime("%H:%M")
if output[0] == "0":
    output = output[1:]
print(output)


Является ли код рекурсивным?
Я изучаю рекурсию и решил написать свою, для нахождения наибольшего числа в массиве.
<code>
def high(list, max):

    if list == []:

        return max

    elif list[0] > max:

        max = list[0]

    return high(list[1:], max)

list = [1,2,3,4,510,6]

high(list, 0)
</code>
Здесь я взял простой пример, но при многих других он тоже работает.
У меня по этому коду есть два вопроса:

Является ли это рекурсией вообще?
Корректно ли написана данная рекурсия?

Я бы сделал по-другому:

На вход подается только список, а не список и число.
Сначала обрабатываем тривиальные случаи (база рекурсии) - когда список пустой и когда в нем один элемент. Когда список пустой пусть возвращается
None. Когда в списке один элемент - очевидно он и является максимальным.
Если в списке более одного элемента, то сравниваем первый элемент и рекурсивно максимум из оставшихся элементов, и возвращаем большее из значений.

def my_max(s):
    if not s:
        return None
    elif len(s) == 1:
        return s[0]
    else:
        # return max(s[0], my_max(s[1:])
        x = my_max(s[1:])
        if s[0] > x:
            return s[0]
        else:
            return x

Чтобы не резать список (при сечении списка каждый раз создается новый объект списка, а это лишние накладные расходы на память и копирование списка), можно вторым параметром передавать индекс текущего ("начального") элемента, в остальном алгоритм остается тем же:

def my_max(s, i=0):
    if i >= len(s):
        return None
    elif i == len(s)-1:
        return s[i]
    else:
        x = my_max(s, i+1)
        if s[i] > x:
            return s[i]
        else:
            return x


У groupby есть опциональный параметр sort. По умолчанию индекс сортируется, если сказать False, то значения останутся в порядке появления
<code>
grouped_data = (volume \
        .groupby([pd.Grouper(level='datetime', freq='60min'), '<LAST>'], sort=False) \
        .agg({'<VOL>' : sum}))

                            <VOL>
datetime            <LAST>
2019-10-28 10:00:00 141990      2
                    141960      1
                    141970      4
                    141910      5
                    141930      1
                    141950      1
</code>


Как отсортировать посты, которые лайкнул пользователь в DJANGO?
Есть модель Post:

class Post(models.Model):
    text = models.TextField("Text", blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateTimeField("Date", auto_now_add=True, blank=True, null=True)
    image = models.ImageField("Image", upload_to="post_img", blank=True, null=True)
    likes = models.ManyToManyField(User, blank=True, related_name="post_like")

И мне нужно отсортировать в ListView посты так, чтобы были только те которые лайкнул пользователь.
Пытаюсь делать так, но не получается.

class PostUrLikes(LoginRequiredMixin, ListView):
    template_name = 'post_list.html'
    context_object_name = 'posts'

    def get_queryset(self):
        user = self.request.user
        return Post.objects.filter(user in F('likes'))

Помогите

Это сделать довольно просто, у тебя связь ManyToMany, поэтому ты сможешь с помощью
related_name которую указал в модели обратиться через User объект.

class Post(models.Model):
    ...
    likes = models.ManyToManyField(
        User,
        blank=True,
        related_name="post_like" # вот тут
    )

class PostUrLikes(LoginRequiredMixin, ListView):
    ...
    def get_queryset(self):
        user = self.request.user
        # Помимо .all() можно и другие ORM фишки использовать,
        # например filter(), order_by(), count() итд...
        return user.post_like.all()


Как сделать так, что бы строка ax.plot(x, y, label="y = ax^2+bx+c") выводила вместо a, b, c введённые числа
<code>
import matplotlib.pyplot as plt
from matplotlib.ticker import (MultipleLocator, FormatStrFormatter, AutoMinorLocator)

import numpy as np
x = np.linspace(-10, 10, 5000)

print ('Введите а')
a=float(input())
print ('Введите b')
b=float(input())
print ('Введите c')
c=float(input())
y=a*x*x + b*x + c

fig, ax = plt.subplots(figsize=(8, 6))
ax.set_title("Графики квадратичной функции: y=ax^2+bx+c", fontsize=16)
ax.set_xlabel("x", fontsize=14)
ax.set_ylabel("y", fontsize=14)
ax.grid(which="major", linewidth=1.2)
ax.grid(which="minor", linestyle="--", color="black", linewidth=0.5)
ax.plot(x, y, label="y = ax^2+bx+c")
ax.legend()
ax.xaxis.set_minor_locator(AutoMinorLocator())
ax.yaxis.set_minor_locator(AutoMinorLocator())
ax.tick_params(which='major', length=10, width=2)
ax.tick_params(which='minor', length=5, width=1)
plt.show()
</code>

Подставьте их

ax.set_title("Графики квадратичной функции: y = {}x^2+{}x+{}".format(a,b,c), fontsize=16)

и сюда

ax.plot(x, y, label="y = {}x^2+{}x+{}".format(a,b,c))


Есть ли разница между quit и exit?
Функция type показывает, что quit и exit являются одним объектом:

print(type(quit), type(exit))
# <class '_sitebuiltins.Quitter'> <class '_sitebuiltins.Quitter'>

Функция id возвращает разные идентификаторы:

print(hex(id(quit)), hex(id(exit)))
# 0x18caae42b70 0x18caae50630

Функция help возвращает одинаковое описание:

Help on Quitter in module _sitebuiltins object:

class Quitter(builtins.object)
 |  Methods defined here:
 |
 |  __call__(self, code=None)
 |      Call self as a function.
 |
 |  __init__(self, name, eof)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |
 |  __repr__(self)
 |      Return repr(self).
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)

В документации обе функции имеют общее описание

quit(code=None)
exit(code=None)

Objects that when printed, print a message like “Use quit() or Ctrl-D (i.e. EOF)
          to exit”, and when called, raise SystemExit with the specified exit code.

Но разница ведь должна быть?

Короткий ответ -- разницы нет, это объекты от одного класса
Quitter и разница будет только в наименовании:

print(quit)
# Use quit() or Ctrl-Z plus Return to exit

print(exit)
# Use exit() or Ctrl-Z plus Return to exit

Думаю,
quit и
exit добавлены для удобства работы с интерпретатором.

Для большего понимания нужно посмотреть исходный код _sitebuiltins.py:

class Quitter(object):
    def __init__(self, name, eof):
        self.name = name
        self.eof = eof
    def __repr__(self):
        return 'Use %s() or %s to exit' % (self.name, self.eof)
    def __call__(self, code=None):
        # Shells like IDLE catch the SystemExit, but listen when their
        # stdin wrapper is closed.
        try:
            sys.stdin.close()
        except:
            pass
        raise SystemExit(code)

А также исходный код site.py:

def setquit():
    """Define new builtins 'quit' and 'exit'.
    These are objects which make the interpreter exit when called.
    The repr of each object contains a hint at how it works.
    """
    if os.sep == '\\':
        eof = 'Ctrl-Z plus Return'
    else:
        eof = 'Ctrl-D (i.e. EOF)'

    builtins.quit = _sitebuiltins.Quitter('quit', eof)
    builtins.exit = _sitebuiltins.Quitter('exit', eof)

Аналогичный ответ на SO


Python random генератор чисел
<code>
import random

while True:
    numG = random.randint(0, 10)
    numG = round(numG)
    numQ = random.randint(0, 10)
    numQ = round(numQ)

    k = 0
    if numQ == numG:
        k += 1
        print("Mission complete!")
        print("Число раз {} {} {}".format(k, numG, numQ))
        break
    elif numQ != numG:
        k += 1
</code>
Почему происходит генерация одинаковых цифр в две разные переменные , и как сделать чтобы генерация была разная?

import random

k = 0
while True:
    numG = random.randint(0, 10)
    numG = round(numG)
    numQ = random.randint(0, 10)
    numQ = round(numQ)

    if numQ == numG:
        k += 1
        print("Mission complete!")
        print("Число раз {} {} {}".format(k, numG, numQ))
        break
    elif numQ != numG:
        k += 1

Происходило обнуление
k на каждой итерации цикла, нужно единоразово присвоить ей 0 до
while
Ну, и правильнее было бы сделать так:

import random

k = 0
while True:
    numG = random.randint(0, 10)
    numQ = random.randint(0, 10)

    k += 1
    if numQ == numG:
        print("Mission complete!")
        print("Число раз {} {} {}".format(k, numG, numQ))
        break


Ввод байтовой строки от пользователя
Столкнулся со следующей проблемой при вводе байтовой строки:
<code>
a = input() #b'YW\x94/{X\xce\xb9'
type(a) #<class 'str'>
</code>
Что нужно сделать с переменной "a" или с вводом, чтобы получить байтовую строку?

Возможно, вам нужно это?:
<code>
import ast
a = input() #b'YW\x94/{X\xce\xb9'
b = ast.literal_eval(a)
print(type(b))
print(b)

#<class 'bytes'>
#b'YW\x94/{X\xce\xb9'
</code>


Уникальность в random
Есть набор вопросов. Как сделать так, чтобы они не повторялись?
<code>
while True:
    question = random.choice(list(storage.keys()))
    print(question, end=' ')
    user_answer = input()

    # Проверяем ответ. Если правильный, то начисляется +1 балл. Регистр не имеет значение.
    if user_answer.lower() == storage[question].lower():
        point += 1
        print('\tВерно! У Вас', point, 'балла.')
</code>

Чтобы удалить ключ независимо от того, находится ли он в словаре, используйте форму
dict.pop() с двумя аргументами:

storage.pop('key', None)

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

del storage['key']

from random import choice

storage = {"Вопрос 1": "...",
           "Вопрос 2": "...",
           "Вопрос 3": "...",
           "Вопрос 4": "...",}

while storage:
    question = choice(list(storage.keys()))
    print(question, end=' ')
    user_answer = input()

    if user_answer.lower() == storage[question].lower():
        point += 1
        print('\tВерно! У Вас', point, 'балла.')
    storage.pop(question, None)


Убить процесс запущенный от sudo Python
Таким образом у меня запускается процесс

process = subprocess.Popen(['sudo','openvpn', '--auth-nocache', '--config', path], preexec_fn=os.setpgrp)

убиваю я его так

pgid = str(os.getpgid(process.pid))
print(pgid)
subprocess.check_output("sudo kill {}".format(pgid))

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

FileNotFoundError: [Errno 2] No such file or directory: 'sudo kill 6888': 'sudo kill 6888'

Что я делаю не так?

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

subprocess.check_output(['sudo', 'kill', str(pgid)])

Также можно указать параметр
shell=True, и тогда команда будет запущена под шелом со всеми вытекающими.

subprocess.check_output("sudo kill {}".format(pgid), shell=True)


Помогите исправить ошибки в программе, строящей параболу [закрыт]

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

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

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

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

TypeError: unsupported operand type(s) for *:
  'builtin_function_or_method' and 'float'

Выдаётся данная ошибка при запуске следующей программы:
<code>
    import matplotlib.pyplot as plt
    from matplotlib.ticker import (MultipleLocator, FormatStrFormatter,
                           AutoMinorLocator)
    import numpy as np

    x = np.linspace(-10, 10, 1000)

    print ('Введите а')
    a=input
    print ('Введите b')
    b=input
    print ('Введите c')
    c=input
    y=a*x*x + b*x + c

    fig, ax = plt.subplots(figsize=(8, 6))
    ax.set_title("Графики квадратичной функции: y=ax^2+bx+c", fontsize=16)
    ax.set_xlabel("x", fontsize=14)
    ax.set_ylabel("y", fontsize=14)
    ax.grid(which="major", linewidth=1.2)
    ax.grid(which="minor", linestyle="--", color="black", linewidth=0.5)
    ax.plot(x, y, label="y = ax^2+bx+c")
    ax.legend()
    ax.xaxis.set_minor_locator   (AutoMinorLocator())
    ax.yaxis.set_minor_locator   (AutoMinorLocator())
    ax.tick_params(which='major', length=10, width=2)
    ax.tick_params(which='minor', length=5, width=1)
    plt.show()
</code>

У вас неверно осуществлен ввод переменной
надо вот так
<code>
a = float(input())
</code>


не работает декодер
Нужно создать программу для шифрования введенной строки со смещением через команды(chr,ord) по таблице asii, и расшифровать эту строку не зная на сколько символов было смещение, в 9 строке ловлю ошибку unsupported operand type(s) for -: 'str' and 'int' подскажите как исправить
<code>
string = input('Введите строку: ')
for i in string:
    code=ord(i)-5
    print(code,end=' ')

j = 0
k = 1
while j<255:
    decode = chr(code) - k
    k-=1
    print(decode)
    print('Продолжить?')
    answer = input('')
    if answer == 'да':
        break
    else:
        continue
</code>

string = input('Введите строку: ')
code = ''
for i in string:
    code += str(ord(i)-5) + ' '
# print(code)

k = 1
while True:
    decode = ''
    for i in code.split():
        a = chr(int(i) - k)
        decode += a
    k-=1
    print(decode)
    answer = input('Продолжить да(1), нет(0)\n')
    if answer == '1':
        continue
    elif answer == '0':
        break

Вот что показывает на тестах (если я правильно понял, что требуется):

Введите строку: Привет
ЙквЬЯм
Продолжить да(1), нет(0)
1
КлгЭан
Продолжить да(1), нет(0)
1
ЛмдЮбо
Продолжить да(1), нет(0)
1
МнеЯвп
Продолжить да(1), нет(0)
1
Ножагр
Продолжить да(1), нет(0)
1
Опзбдс
Продолжить да(1), нет(0)
1
Привет
Продолжить да(1), нет(0)
0

Process finished with exit code 0


Как организовать передачу данных в pyqt5? (Попытка написания наивной файловой БД)
Раннее уже писала вопрос, в котором описывала часть моей текущей работы.
Вот ссылка:
В чем проблема кода на python? Работа с PyQt5 [switch between windows]
Там представлен код для "mainWindow.py", "addRecordWindow.py"
А вот и сам вопрос: Как мне следует организовать передачу данных? Идея заключается в том, чтобы из меню на главном окне я могла открыть новое (для добавления новой записи в файловую БД).
При этом, после ввода информации о новой записи, мне нужно чтобы на главном окне НЕ было отображения этих изменений, они должны записаться в переменную
hash_table, отображение должно будет происходить только после нажатия на кнопку
show, но над этим мне еще предстоит работать... Кстати, я, видимо, опять где-то накосячила и после нажатия на кнопку
Ok у меня выбрасывает всю программу...

from PyQt5.QtCore import pyqtSignal

from mainWindow import *
from addRecordWindow import *

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QMessageBox, QFileDialog
import sys
from HashTable import *

class AddRecordWin(QWidget, Ui_AddDialog):
    adding_data = pyqtSignal(str, str, str, str) # Создала атрибут для хранения информации

    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.okButton.clicked.connect(self.send_data)

    def send_data(self):
        self.adding_data.emit(self.idEdit.text(), self.serialNameEdit.text(), self.numSeriesEdit.text(),
                              self.isWatchedEdit.text()) # Пытаюсь записать данные из формы при нажатии на кнопку "Ok"
        self.close()

class MyWin(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.initialize_windows() # создаю окна
        self.work_with_menu() # описываю доступ к ним через меню

        # после открытия окна для добавления новой записи забираю данные
        self.add_w.adding_data[str, str, str, str].connect(self.handle_input)

    def handle_input(self, key, val1, val2, val3):
        self.hash_table.__add__(key, val1, val2, val3)

    def initialize_windows(self):
        self.add_w = AddRecordWin()

    def work_with_menu(self):
        self.actionNew.triggered.connect(self.create_new_hash_table)
        self.actionOpen.triggered.connect(self.open_hash_table)
        self.actionSave.triggered.connect(self.save_hash_table)
        self.actionAddRecord.triggered.connect(self.show_AddRecordWin)

    def create_new_hash_table(self):
        self.hash_table = HashTable()

    def open_hash_table(self):
        filename = QFileDialog.getOpenFileName(self, 'Open file', '/data.txt', "Image files (*.jpg *.gif)")
        file = open(filename)
        name_hash_table = file.read()
        #self.tableWidget. # Хочется, чтобы здесь отобразилась полученная информация
        self.textEdit.setText(name_hash_table)

    def save_hash_table(self):
        filename = QFileDialog.getSaveFileName(self, 'Open file', '/data.txt', "Image files (*.jpg *.gif)")
        file = open(filename)
        name_hash_table = file.read()
        self.hash_table.__save_data_base__(name_hash_table)

    def show_AddRecordWin(self):
        self.add_w.setupUi(self)
        self.add_w.show()

    def closeEvent(self, event):

        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes |
            QMessageBox.No, QMessageBox.No)

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

if __name__ == "__main__":
    app = QApplication(sys.argv)
    my_app = MyWin()
    my_app.show()
    sys.exit(app.exec_())

В моем классе
HashTable еще много чего нужно править, но функция
__add__ должна исправно добавлять новую запись.
[EDIT] Код моей наивной hash table (исправленный + новая функция для открытия файла
open_data_base):

import os

class Entry:
    def __init__(self, key, value1, value2=None, value3=None):
        self.hash = None
        self.key = key
        self.value1 = value1
        self.value2 = value2
        self.value3 = value3
        self.is_deleted = False

    '''def __eq__(self, other):
        if (self.hash == other.hash and self.key == other.key and self.value1 == other.value1 and
                self.value2 == other.value2 and self.value3 == other.value3 and self.is_deleted == other.is_deleted):
            return True
        else:
            return False'''

class HashTable(object):
    def __init__(self):
        self.table = [None] * 10
        self.load_factor = .75
        self.current_size = 0
        file_hashes = open('service_files/hashes.txt', 'w')
        file_hashes.close()
        file_output_result_search = open('service_files/output_result_search.txt', 'w')
        file_output_result_search.close()

    def str(self):
        out_file = open('service_files/hashes.txt', 'r')
        hashes = out_file.read().splitlines()
        out_file.close()
        for hash_ in hashes:
            print(self.str_element(int(hash_)))
        return None

    def str_element(self, hash_):
        if self.table[hash_].value2 is None and self.table[hash_].value3 is None:
            item = ['{!r}: {!r}'.format(self.table[hash_].key, self.table[hash_].value1)]
        elif self.table[hash_].value2 is None:
            item = ['{!r}: [{!r}, {!r}]'.format(self.table[hash_].key, self.table[hash_].value1,
                                                self.table[hash_].value3)]
        elif self.table[hash_].value3 is None:
            item = ['{!r}: [{!r}, {!r}]'.format(self.table[hash_].key, self.table[hash_].value1,
                                                self.table[hash_].value2)]
        else:
            item = ['{!r}: [{!r}, {!r}, {!r}]'.format(self.table[hash_].key, self.table[hash_].value1,
                                                      self.table[hash_].value2, self.table[hash_].value3)]
        return '{' + ', '.join(item) + '}'

    '''def __setitem__(self, key, value1, value2=None, value3=None):
        self.__clear__()
        entry = Entry(key, value1, value2, value3)
        for i in range(len(self.table)):
            entry.hash = self.__get_hash_code(key)
            if self.table[entry.hash] is None or self.table[entry.hash].is_deleted:
                self.table[entry.hash] = entry
                in_file = open('service_files/hashes.txt', 'w')
                print(entry.hash, sep='\n', file=in_file)
                in_file.close()
                self.current_size += 1
                if float(self.current_size) / len(self.table) >= self.load_factor:
                    self.__resize_table()'''

    def add(self, key, value1, value2=None, value3=None):
        entry = Entry(key, value1, value2, value3)
        entry.hash = self.__get_hash_code(key)
        if self.table[entry.hash] is None or self.table[entry.hash].is_deleted:
            self.table[entry.hash] = entry
            in_file = open('service_files/hashes.txt', 'a')
            print(entry.hash, sep='\n', file=in_file)
            in_file.close()
            self.current_size += 1
            if float(self.current_size) / len(self.table) >= self.load_factor:
                self.__resize_table()

    def getitem(self, key):
        index = self.__get_hash_code(key)
        if self.table[index] is not None:
            if self.table[index].key == key:
                if self.table[index].is_deleted:
                    raise KeyError('Key is not in the map')
                else:
                    return self.table[index].value1, self.table[index].value2, self.table[index].value3

        elif self.table[index] is None:
            raise KeyError('Key is not in the data base')
        else:
            raise KeyError('Hmm something has gone wrong here')

    def getitem_value(self, value1=None, value2=None, value3=None):
        self._binary_search(value1, value2, value3)
        in_file = open('service_files/output_result_search.txt', 'r')
        keys = in_file.read().splitlines()
        in_file.close()
        for key in keys:
            self.getitem(key)

    def _binary_search(self, value1=None, value2=None, value3=None):
        in_file = open('service_files/output_result_search.txt', 'w')
        out_file = open('service_files/hashes.txt', 'r')
        hashes = out_file.read().splitlines()
        out_file.close()
        if (value1 is not None) and (value2 is None) and (value3 is None):
            for hash_ in hashes:
                if self.table[int(hash_)].value1 == value1:
                    print(self.table[int(hash_)].key, sep='\n', file=in_file)
        elif (value1 is None) and (value2 is not None) and (value3 is None):
            for hash_ in hashes:
                if self.table[int(hash_)].value2 == value2:
                    print(self.table[int(hash_)].key, sep='\n', file=in_file)
        elif (value1 is None) and (value2 is None) and (value3 is not None):
            for hash_ in hashes:
                if self.table[int(hash_)].value3 == value3:
                    print(self.table[int(hash_)].key, sep='\n', file=in_file)
        else:
            return 'Error! Please, chose ONE field of search!'
        in_file.close()

    def __get_hash_code(self, key):
        return hash(key) % len(self.table)

    def __resize_table(self):
        new_table = [None] * (len(self.table) * 2)
        for i in range(len(self.table)):
            new_table[i] = self.table[i]

        self.table = new_table

    def __change__(self, key, value1, value2=None, value3=None):
        entry = Entry(key, value1, value2, value3)
        entry.hash = self.__get_hash_code(key)
        if self.table[entry.hash] is not None:
            self.table[entry.hash] = entry

    def delitem(self, key):
        index = self.__get_hash_code(key)
        if self.table[index] is not None:
            if self.table[index].key == key:
                if self.table[index].is_deleted:
                    raise KeyError('Key is not in the map')
                else:
                    self.table[index].is_deleted = True

                    out_file = open('service_files/hashes.txt', 'r')
                    hashes = out_file.read().splitlines()
                    out_file.close()

                    hashes.remove(str(self.table[index].hash))

                    in_file = open('service_files/hashes.txt', 'w')
                    print(hashes, sep='\n', file=in_file)
                    in_file.close()

                    self.current_size -= 1

    def delitem_value(self, value1=None, value2=None, value3=None):
        self._binary_search(value1, value2, value3)
        in_file = open('service_files/output_result_search.txt', 'r')
        keys = in_file.read().splitlines()
        in_file.close()
        for key in keys:
            self.delitem(key)

    def open_data_base(self, name_file):
        if self.table:
            self.clean()
        with open(name_file) as out_file:
            data = out_file.read().splitlines()
        out_file.close()
        for item in data:
            item = item.split(';')
            self.add(item[0], item[1], item[2], item[3])
        return None

    def save_data_base(self, name_file):
        in_file = open(name_file, 'w')
        out_file = open('service_files/hashes.txt', 'r')
        hashes = out_file.read().splitlines()
        out_file.close()
        for hash_ in hashes:
            print(self.table[int(hash_)].key, self.table[int(hash_)].value1, self.table[int(hash_)].value2,
                  self.table[int(hash_)].value3, sep=';', file=in_file)
        in_file.close()
        return None

    def clean(self):
        file_hashes = open('service_files/hashes.txt', 'w')
        file_hashes.close()
        file_output_result_search = open('service_files/output_result_search.txt', 'w')
        file_output_result_search.close()
        self.table = [None] * 10
        self.current_size = 0

    def __del__(self):
        os.remove('service_files/hashes.txt')
        os.remove('service_files/output_result_search.txt')
        del self.table
        del self.load_factor
        del self.current_size

На этом мои проблемы не закончились на самом деле... У меня выбрасывает окна для сохранения/открытия файла и ничего не открывается...
Скорее всего все это связано с моими скудными познаниями в том, как подключить какие-то функции к кнопкам, как обмениваться информацией... Я читала разные примеры в интернете, но мне сложно адаптировать полученную информацию под мой случай, потому прошу помощи.
P.s. Формулировка получилась довольно сумбурной, потому задавайте, пожалуйста вопросы, если нужно что-то дописать/дополнить в описании, то я с радостью это сделаю!

1)
У вас точно есть проблема с методом
handle_input, у него нет параметров, что он мог бы передать от сигнала:

    ...

        # после открытия окна для добавления новой записи забираю данные
        self.add_w.adding_data[str, str, str, str].connect(self.handle_input)

    def handle_input(self, id_value, serial_name, num_series, is_watched):
        # Отправляю данные в созданный
        self.hash_table.__add__(id_value, serial_name, num_series, is_watched)

2)
Рекомендую переименовать метод
def __add__(self, key, value1, value2=None, value3=None): в
def add(self, key, value1, value2=None, value3=None):.
Два нижних подчеркивания слева и справа объявляют метод магическим, что может привнести всякие сюрпризы.
Т.е. лучше вообще отказаться от практики называния своих методов (тот же
__save_data_base__) таким образом, если только намеренно не хотите перекрыть магический метод.

3)
Тут опечатка? Переменная
self.hesh_table нигде больше не используется

def create_new_hash_table(self):
    self.hesh_table = HashTable()

Т.к. сейчас обращение к
self.hash_table (например в
handle_input и
save_hash_table) вызовут исключение

4)
Если методы
handle_input или
save_hash_table будут вызваны раньше
create_new_hash_table, то будет исключение. Возможно этого никогда не будет, но я бы добавил в конструктор (
__init__) инициализацию поля:
self.hash_table = None, а в методах
handle_input и
save_hash_table проверку, что
self.hash_table существует перед вызовом его методов, пример:

def handle_input(self, key, val1, val2, val3):
    if self.hash_table:
        self.hash_table.add(key, val1, val2, val3)

Подобное нужно и для
save_hash_table

5)
В
filename = QFileDialog.getSaveFileName(self, 'Open file', '/data.txt', "Image files (*.jpg *.gif)") ошибка из-за того, что он возвращает кортеж из двух элементов: путь и фильтр.
Правильно так:

filename = QFileDialog.getSaveFileName(self, 'Open file', '/data.txt', "Image files (*.jpg *.gif)")[0]

Можно и так:

filename, _ = QFileDialog.getSaveFileName(self, 'Open file', '/data.txt', "Image files (*.jpg *.gif)")

6)
В
save_hash_table у вас будет ошибка в
open если указанного файла не существует:

    def save_hash_table(self):
        filename = QFileDialog.getSaveFileName(self, 'Open file', '/data.txt', "Image files (*.jpg *.gif)")
        file = open(filename)

Потому что, open имеет такую сигнатуру:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

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

file = open(filename, 'w')

И для записи в файл используется метод
write:
file.write(...)
Советую, для открытия файлов использовать конструкцию
with, например:

def save_hash_table(self):
    filename = QFileDialog.getSaveFileName(self, 'Open file', '/data.txt', "Image files (*.jpg *.gif)")
    with open(filename) as file:
        name_hash_table = file.read()
    self.hash_table.__save_data_base__(name_hash_table)


Как проверить простое ли число Python 3
Подскажите, пожалуйста, как правильно написать функцию
is_prime, принимающую
1 аргумент — число от
0 до
1000,
и возвращающую
True, если оно простое, и
False - иначе."

def is_prime(a):
    if a % a == 0 and a != 0:
        return True
    else:
        return False

a = int(input("Enter a number: "))
print(is_prime(a))

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

def is_prime(a):
    if a % 2 == 0:
        return a == 2
    d = 3
    while d * d <= a and a % d != 0:
        d += 2
    return d * d > a

print(is_prime(int(input("Enter a number: "))))

print( [ '{} - True'.format(i) for i in range(2, 1001)  if is_prime(i)])


Как правильно задать кодировку utf-8 в python при генерации файла?
Вот исходный код файла-генератора на python. Не могу настроить правильную кодировку при записи в файл, записывает кракозябру

from outfile import outfile_text
from datetime import datetime as dt

def generate_page(head, body):
    page = "<html lang='ru'>" + head + body + "</html>"
    return page

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

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

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

today = dt.now().date()
save_page(
    title = "Заголовок1",
    header = "Сегодня " + str(today),
    paragraphs = generate_texts(),
)

Пробовал написанное уже здесь решение Вывод UTF-8 CGI-скриптом на Python 3, не помогает.
Также там пишут, что надо настроить apache. Его можно настроить в openserver или для питона есть свой апач?
Версия python 3.7
Итоговый файл

<html lang='ru'>

<head>
    <meta charset='utf-8'>
    <title>×òî-òî ïðî ãîðîñêîïû</title>
</head>

<body>
    <h1>×òî äåíü 2019-10-30ãîòîâèò</h1>
    <p>Âå÷åðîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Ïîñëå Îáåäà îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Ïåðåä Ñíîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà.</p>
    <p>Óòðîì áóäüòå îòêðûòû äëÿ ãîñòåé èç çàáûòîãî ïðîøëîãî. Âå÷åðîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Âå÷åðîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà.</p>
    <p>Ïîñëå Îáåäà îæèäàéòå ãîñòåé èç çàáûòîãî ïðîøëîãî. Äí¸ì ïðåäîñòåðåãàéòåñü ãîñòåé èç çàáûòîãî ïðîøëîãî. Ïåðåä Ñíîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè.</p>
    <p>Ïåðåä Ñíîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Óòðîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Óòðîì ïðåäîñòåðåãàéòåñü ãîñòåé èç çàáûòîãî ïðîøëîãî.</p>
    <p>Äí¸ì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Ïîñëå Îáåäà áóäüòå îòêðûòû äëÿ ïðèÿòíûõ ïåðåìåí. Óòðîì áóäüòå îòêðûòû äëÿ íåîæèäàííîãî ïðàçäíèêà.</p>
</body>

</html>

В сети есть достаточное количество онлайн сервисов, которые позволяют расшифровать кракозябры в текст и попутно определить кодировки. Это поможет определить, что не так с кодировками. Например, расшифровка текста одного из абзацев позволяет определить, что в кракозябрах отображен исходных текст в кодировки CP1251, зашифрованные кодировкой CP1252. Во избежание подобного, нужно указывать кодировку при открытии файла.
Конкретно в вашем случае, нужно изменить функцию
save_page следующим образом:

def save_page(title, header, paragraphs, output='index.html'):
    with open(output, mode='w', encoding='utf-8') as fp:
        today = dt.now().date()
        page = generate_page(
            head=generate_head(title),
            body=generate_body(
                header=header,
                paragraphs=paragraphs
            )
        )
        print(page, file=fp)


Убрать рекурсией цифры из строки
Мне нужно при помощи рекурсии убрать все цифры из строки и вернуть перевернутое выражение
Я застрял на следующей рекурсии:

def recursion(s):
    if s == "":
        return s
    if s[0].isdigit():
        return s.replace(s[0], '')
    return recursion(s[1:]) + s[0]

после # идет то, что должно получаться
после ---> то, что получается с моим кодом

print(recursion("poo"))  # "oop" ---> это работает
print(recursion("3129047284"))  # '' ---> '129047284'
print(recursion("34e34f7i8l 00r532o23f 4n5ot565hy7p4"))  # "pyhton for life"  --->  '4e 4f7i8l 00r5 2o2 f 4n5ot565hy7p4'
print(recursion("  k 4"))  # " k  "  ---> это получилось

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

я поменял одну строчку в вашем коде - если цифра, просто её игнорируем

    if s[0].isdigit():
        return recursion(s[1:])

и всё работает

def recursion(s):
    if s == "":
        return s
    if s[0].isdigit():
        return recursion(s[1:])
    return recursion(s[1:]) + s[0]


No module named 'telegram.ext'
Использую библиотеку python-telegram-bot
Выдает ошибку:

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    from telegram.ext import Updater
ModuleNotFoundError: No module named 'telegram.ext'

Сам код:

import token_for_bot
from telegram.ext import Updater
from telegram.ext import CommandHandler
import logging

def start(update, context):
 context.bot.send_message(chat_id=update.effective_chat.id, text="hello world!")

start_handler =  CommandHandler('start', start)
dispatcher.add_handler(start_handler)

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
 level=logging.INFO)

updater = Updater(token= token_for_bot , use_context= True)
dispatcher = updater.dispatcher

updater.start_polling()

Библиотеку установил:

pip install python-telegram-bot --upgrade

В чем проблема?

Запуск твоей программы происходит путем команды
python main.py. Если ты запустишь интерпретатор командой
python, то увидишь, что он запускает python 2.7, а тебе нужно 3+
Для этого воспользуйся командой
python3 main.py.


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

def get_paper_2(h1, w1):
    pd = System.Windows.Forms.PrintDialog()
    ps= pd.PrinterSettings.PaperSizes
    d = {}
    for p in ps:
        if  "A" in p.PaperName or "А" in p.PaperName:
            h = round(p.Height*0.254)
            w = round (p.Width*0.254)
            if h1==h and w1==w:
                return p.PaperName
            elif h1==w and w1 == h:
                return p.PaperName

То есть например: есть формат листа
А2 = 594х420, на вход я подаю например не точные данные, а например
595х419, мне нужно чтобы формат был все равно А2
пробовал делать таким образом:

def compare_double(i1, i2):
    ma = (max(i1, i2))
    mi = (min(i1, i2))
    return ma/mi

d = {}
pd = System.Windows.Forms.PrintDialog()
ps= pd.PrinterSettings.PaperSizes
for p in ps:
    if  "A" in p.PaperName or "А" in p.PaperName:
        h = round(p.Height*0.254)
        w = round (p.Width*0.254)

        g = compare_double(h, w)
        d[g] = [ p.PaperName, h, w]
        vv = max(d, key=lambda x: abs(x - compare_double(h1, w1)))
        print(d[vv])

Но это работает не корректно.
Как мне найти лист максимально соответствующий размерам, которые я подаю на вход?

pformats = {297:'A4', 420:'A3', 210:'A5', 594:'A2'}

def find_closest(w: int, h: int) -> str:
    m = max(w, h)
    res = min(pformats.keys(), key=lambda x:abs(x-m))
    return pformats[res]

Тест:

print(find_closest(290, 210)) # A4
print(find_closest(302, 215)) # A4
print(find_closest(588, 405)) # A2


Python, как импортировать переменную, изменить её и сохранить в том же месте откуда импортировали
Импортирую переменную из файла, изменяю её. Теперь нужно сохранить её в измененном виде там же откуда взял.
Делал как в учебнике Марка Лутца - 4 издание стр.627. Написано абстрактно и предельно не понятно, я так понял инструкции import и from могут изменить локальные и глобальные переменные, но они не сохраняют изменения внесенные в импортируемую переменную - непосредственно в импортируемом файле. Хотя Лутц пишет, что изменяемый объект используется совместно и вроде как всё должно сохраняться. Кто ни будь просветите, как мне импортировать список, изменить и сохранить его в импортируемом файле.

# small.py
x = [0, 1, 2]

from small import x
x[0] = 6

Объект изменяемый. При открытии small.py я хотел бы видеть:

x = [6, 1, 2]

Нужно отличать изменение переменной на этапе выполнения программы и изменение исходного кода переменной.
Автор имеет ввиду изменение переменной в процессе выполнения. А пример в вопросе пытается изменить исходник на диске.
В первом случае автор прав. Но если же все таки нужно менять исходник, то можно поступить, как предложил @Hyper Elf.
Хотя, имхо, идея сомнительная писать/редактировать код программы, чтобы редактировать код программы.


Использование внешних шрифтов PySide2
Как я могу использовать шрифты в стилях программы на PySide2, которые не установлены на комп, а просто находятся в папке с проектом в виде файла? Например Roboto.ttf

Например, так:
app = QtGui.QApplication(sys.argv)
QtGui.QFontDatabase.addApplicationFont('путь/к/шрифту')


Разбиение строки с помощью регулярных выражений (Python)
Есть строка:

4 spami42e3 nani3e

Мне надо её разбить так, чтобы получилось

 spam 42 nan 3(между элементами-пробел)

Конечно, вместо
spam,
nan и т. д. Могут стоять другие слова, большей или меньшей длины. Кол-во слов может быть больше или меньше. То же касается и чисел. Т. е.:

10 mmmmmmasdwi432123432390e30 mamamsdsdlfokcmvndksolmcsqwerli40e

Я думаю, нужно разбить строку по любому числу и пробелу после него. Затем разбить то ,что осталось по
i<любое число>
e, при этом число не трогать (перед ним поставить пробел).
Как это сделать с использованием рег. выражений?

#Открыл файл с содержанием -       l4:spami42ee
#                                  l3:nani3ee

with open ('b.txt', 'r') as file:
    A=[]
    A=file.readlines() #Считал все строки в список
    l = [line.rstrip() for line in A] # Удалил \n
    for i in range(len(l)):
        l[i]=l[i][1:len(l[i])-1]# Сделал срез, чтобы в начале убрать l,
                                #в конце e
    a=''
    for i in range(len(l)):
        a+=l[i]                  #конкатенация
    a=a.replace(':',' ')         #замена
'''Добился spami42enani3e, как разбить вот эту строку, по i<любое число>e.
При этом i и e удалить, а число между ними оставить(перед числом пробел)
'''
Q=a.split(' ')
    for i in range(len(Q)):
        if (Q[i].startswith('0') or Q[i].startswith('2') or
            Q[i].startswith('3') or Q[i].startswith('4') or
            Q[i].startswith('5') or Q[i].startswith('6') or
            Q[i].startswith('7') or Q[i].startswith('8') or
            Q[i].startswith('9')):
            Q[i]=Q[i][1:len(Q[i])]
        if (Q[i].endswith('0') or Q[i].endswith('2') or
            Q[i].endswith('3') or Q[i].endswith('4') or
            Q[i].endswith('5') or Q[i].endswith('6') or
            Q[i].endswith('7') or Q[i].endswith('8') or
            Q[i].endswith('9')):
            Q[i]=Q[i][0:len(Q[i])-1]
    D=''
    for i in range(len(Q)):
        D+=Q[i]

'''Спасибо,получилось'''
pattern = re.compile(r"(?<=\d)(?=[a-zA-Z])|(?=\d)(?<=[a-zA-Z])")
result = re.sub(pattern, " ", D)
print('Стало',result)
W=result.split(' ')
for i in range(len(W)):
    if W[i].endswith('i'):
        W[i]=W[i][0:len(W[i])-1]
print(W)
for i in range(len(W)):
    if W[i].startswith('e'):
        W[i]=W[i][1:len(W[i])]
print(W)
'''ИТОГ'''
with open ('b.txt', 'r') as file:
A=[]
A=file.readlines()
l = [line.rstrip() for line in A]
for i in range(len(l)):
    l[i]=l[i][1:len(l[i])-1]
a=''
for i in range(len(l)):
    a+=l[i]
a=a.replace(':',' ')
Q=a.split(' ')
for i in range(len(Q)):
    if (Q[i].startswith('0') or Q[i].startswith('2') or
        Q[i].startswith('3') or Q[i].startswith('4') or
        Q[i].startswith('5') or Q[i].startswith('6') or
        Q[i].startswith('7') or Q[i].startswith('8') or
        Q[i].startswith('9')):
        Q[i]=Q[i][1:len(Q[i])]
    if (Q[i].endswith('0') or Q[i].endswith('2') or
        Q[i].endswith('3') or Q[i].endswith('4') or
        Q[i].endswith('5') or Q[i].endswith('6') or
        Q[i].endswith('7') or Q[i].endswith('8') or
        Q[i].endswith('9')):
        Q[i]=Q[i][0:len(Q[i])-1]
D=''
for i in range(len(Q)):
    D+=Q[i]
pattern = re.compile(r"(?<=\d)(?=[a-zA-Z])|(?=\d)(?<=[a-zA-Z])")
result = re.sub(pattern, " ", D)
W=result.split(' ')
for i in range(len(W)):
    if W[i].endswith('i'):
        W[i]=W[i][0:len(W[i])-1]
for i in range(len(W)):
    if W[i].startswith('e'):
        W[i]=W[i][1:len(W[i])]
P=''
for i in W:
    if i=='':
        continue
    else:
        P+=i+', '
print('['+P[0:len(P)-2]+']')

<code>
import re

pattern = re.compile(r"(?<=\d)(?=[a-zA-Z])|(?=\d)(?<=[a-zA-Z])")
input = "4 spami42e3 nani3e"
result = re.sub(pattern, " ", input)

print(result)
</code>
Ищем промежутки между буквой и цифрой или цифрой и буквой и заменяем их на пробел


почему выдаёт ошибку sqlite3.OperationalError: no such table
простая программа на Python

    import sqlite3

con = sqlite3.connect("notes.db")
cur = con.cursor()
result = cur.execute("""SELECT date,
                                heading FROM main""").fetchall()
print(result)

но выдаёт ошибку
sqlite3.OperationalError: no such table хотя бд лежит вместе с программой

Если дословно перевести вывод ошибки, то в ней сказано что "нет такой таблицы".
Проверьте название таблицы, может быть проблема все же в этом.


помогите исправить данный код!
задание: Напишите функцию first, которая будет принимать вообще все что угодно и возвращать свой первый аргумент. Если все её аргументы именованные, то пускай она возвращает тот у которого самое маленькое имя. Если ей не передано ничего, то пускай она возвращает None.

first(0.0123) == 0.0123
first(1, 0.0123, 0) == 1
first(a = "Hi!") == "Hi!"
first(1, 2, 3, ["a"], b = "honey") == 1
first() is None

наш код:

def first(*args, **kwargs):
    if len(args) == 0:
        return min(len(kwargs))
    elif len(args) == 0 and len(kwargs)==0:
        return None
    elif len(args) and len(kwargs):
        newlist = [args, kwargs]
        return newlist[0]

Пример:

def first(*args, **kwargs):
    if args:
        return args[0]
    elif kwargs:
        return kwargs[min(kwargs, key=len)]

def main():
    result = first()
    print(result)

if __name__ == '__main__':
    main()

Тесты:

print(first(1, 2, 3))                               # 1
print(first(abc='Hello!', de='World!', f='Spam!'))  # Spam!
print(first(1, 2, 3, f='Spam!'))                    # 1
print(first())                                      # None


tuple index out of range как исправить?
Задание:
Напишите функцию
concat, которая будет принимать произвольное число строк и объединять их в одну через разделитель (sep). Если разделитель не задан, то она будет объединять их через пробел.
Код:

def concat(*string):
    if string[-2] == '=':
        sep = string[-1]
        return sep.join(string)
    return ' '.join(string)

Странный код:

Непонятные операции с
if string[-2] == '=':
Отсутствие разделителя в параметре самой функции

Можно проще:

def concat(*string, sep=' '):
    return sep.join(string)

Тест:

>>> concat('a', 'b', 'c')
'a b c'

>>> concat('a', 'b', 'c', sep='=')
'a=b=c'

>>> items = ('a', 'b', 'c')
>>> concat(*items)
'a b c'


Построение (не сортировка) списка на основе предложенного правила
Есть список ранее отобранных ребер графа:
    my_root = [(4, 5), (1, 2), (2, 3), (7, 8]
Есть новый кандидат на добавление в root:
    new_item = (3, 4)
Необходимо построить максимальную цепочку, используя new_item в качестве базового. Должно получиться:

my_root =[(1, 2), (2, 3), (3, 4), (4, 5)]

Для решения я использовал код:

path = [new_item]

for _ in range(len(my_root)):
    left_item = path[0]
    right_item = path[-1]
    path.append(next(filter(lambda x: right_item[1] == x[0], my_root)))
    path.insert(0, next(filter(lambda x: left_item[0] == x[1], my_root)))

Ошибка возникает, когда filter(lambda x: right_item[1] == x[0], my_root) ничего не возвращает.
Как лучше решить эту задачу в стиле python?

Оператор next вторым параметром принимает значение, которое он вернёт вместо StopIteration. Можно записать в список некоторое пустое значение (None, None) не являющееся ребром. После чего удалить из пути все такие рёбра.
<code>
my_root = [(4, 5), (1, 2), (2, 3), (7, 8)]

stop_item = (None, None)
new_item = (3, 4)
path = [new_item]

for _ in range(len(my_root)):
    left_item = path[0]
    right_item = path[-1]
    path.append(next(filter(lambda x: right_item[1] == x[0], my_root), stop_item))
    path.insert(0, next(filter(lambda x: left_item[0] == x[1], my_root), stop_item))

while stop_item in path:
    path.pop(path.index(stop_item))
print(path)
</code>
Но это далеко не самое производительное решение поставленной задачи само по себе. Не стоит использовать цикл for там где не все его итерации являются значимыми.


Как добавить элемент в QScrollArea
Есть программа, в которой я пытаюсь добавить элемент в QScrollArea
<code>
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel,
QLineEdit, QLCDNumber, QScrollArea

class Prog(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.label = QLabel(self)
        self.label.setText("text")

        self.scrollArea = QScrollArea()
        self.scrollArea.setWidget(self.label)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Prog()
    win.show()
    sys.exit(app.exec())
</code>
Но в результате выполнения получаю пустое окно. Как правильно добавлять элементы в QScrollArea?

Сноска из документации:

If the scroll area is visible when the widget is added, you must show() it explicitly.

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

self.scrollArea.show()

Также используйте

self.scrollArea.setWidgetResizable(True)

для изменяемости размера вашего виджета.
Также уберите

win.show()

иначе у вас откроется два окна.
Если вашей задачей является только вывод текста, используйте QTextEdit


Определить букву, после удаления которой, слово станет палиндромом, если такой буквы нет - вывести 0
Нужно Определить букву, после удаления которой, слово станет палиндромом, если такой буквы нет - вывести 0
Вот что написал :
<code>
from collections import deque

word = input('Enter a word\n')

def palindrome(word):
    dq = deque(word)
    while len(dq) > 1 :
        if dq.popleft() != dq.pop() :
            return dq.popleft().index
        if dq.pop() != dq.popleft() :
            return dq.pop().index
        else :
            return 0
print(palindrome(word), '\n')
</code>
Попробовал сделать через index, но в каждом случае он выводит 0

Вот пример. Идея следующая: мы смотрим с двух сторон. Нашли пару не совпадающих символов. Проверим будет ли она палиндромом если убрать правый или левый символ.
<code>
def reverse(s):
    return s[::-1]

def isPalindrome(s):
    rev = reverse(s)
    if (s == rev):
        return True
    return False

def RemOneCharPal(str):
    low = 0
    high = len(str) - 1
    while (low < high):
        if (str[low] == str[high]):
            low += 1
            high -= 1
        else:
            if (isPalindrome(str[low+1:high+1])):
                return str[low]
            if (isPalindrome(str[low:high])):
                return str[high]
            return 0
    return 0
</code>


Консольная пирамида [закрыт]

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

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

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

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

Как сделать вертикальную пирамиду из * которой можно задать значение(N) которого она будет достигать в центре.
Припустим N=4
и выходит (без точек)
*
**
***.
****.
***.
**
*

Пример:

def main():
    n = int(input())  # 4

    r = list(range(1, n + 1)) + list(range(n - 1, 0, -1))
    for i in r:
        print('*' * i)

if __name__ == '__main__':
    main()

stdout:

*
**
***
****
***
**
*


bs4 парсинг определенных строк из таблицы HTML
прошу помощи, вот из таблицы такого вида:

    <h1>Modems</h1>

<a href="..">zurück</a>
<br />
<br />

<table class="main">
    <tr>
        <th>ModemId</th>
        <th>Type</th>
        <th>Current state</th>
        <th>Last Status</th>
        <th>Send CMD</th>
        <th>Current Library</th>
        <th>CMD History</th>
        <th>REPLY History</th>
        <th>CSV/PDF Report</th>
        <th>Sensor Data Export</th>
    </tr>

    <tr>
        <td>Modem RU001</td>
        <td>SIGN</td>
        <td style="background: #F23353">OFFLINE</td>
        <td><a href="status.jsp?id=RU001">status</a></td>

        <td><a href="cmd.jsp?id=RU001">cmd</a></td>

        <td><a href="library.jsp?id=RU001">library</a></td>

        <td><a href="cmd_hist.jsp?id=RU001">cmd history</a></td>

        <td><a href="reply_hist.jsp?id=RU001">reply history</a></td>

        <td><a href="report_pdf.jsp?id=RU001">report</a></td>
        <td>

        </td>
    </tr>

    <tr>
        <td>Modem RU002</td>
        <td>SIGN</td>
        <td style="background: #F23353">OFFLINE</td>
        <td><a href="status.jsp?id=RU002">status</a></td>

        <td><a href="cmd.jsp?id=RU002">cmd</a></td>

        <td><a href="library.jsp?id=RU002">library</a></td>

        <td><a href="cmd_hist.jsp?id=RU002">cmd history</a></td>

        <td><a href="reply_hist.jsp?id=RU002">reply history</a></td>

        <td><a href="report_pdf.jsp?id=RU002">report</a></td>
        <td>

        </td>
    </tr>

    <tr>
        <td>Modem RU00n</td>
        <td>SIGN</td>
        <td style="background: #F23353">OFFLINE</td>
        <td><a href="status.jsp?id=RU00n">status</a></td>

        <td><a href="cmd.jsp?id=RU00n">cmd</a></td>

        <td><a href="library.jsp?id=RU00n">library</a></td>

        <td><a href="cmd_hist.jsp?id=RU00n">cmd history</a></td>

        <td><a href="reply_hist.jsp?id=RU00n">reply history</a></td>

        <td><a href="report_pdf.jsp?id=RU00n">report</a></td>
        <td>

        </td>
    </tr>

Мне необходим список словарей вида: [{'id' : 'RU001', 'status': 'OFFLINE'}]. Я пока смог сделать с помощью итераций вида:

reqOnline = requests.get(url_online)
onlSoup = BeautifulSoup(reqOnline.content, 'lxml')
getOnline = onlSoup.find_all('td')
tuplOnline = []
for i in getOnline:
    if 'Modem' in i.text:
        tempId = (i.text.split(' ')[1])
    elif 'ONLINE' in i.text:
        status = 'ONLINE'
        dictOnl = {'id': tempId,
                   'status': status}
    elif 'OFFLINE' in i.text:
        status = 'OFFLINE'
        dictOnl = {'id': tempId,
                   'status': status}
        tuplOnline.append(dictOnl)

Ну сами понимаете громозкость данного кода. Есть ли у bs4 или у других инструментов python что то более лаконичное и более адекватное?

Пример:

from bs4 import BeautifulSoup

def parse(html):
    soup = BeautifulSoup(html, 'lxml')
    result = []

    trs = soup.find_all('tr')[1:]
    for tr in trs:
        tds = tr.find_all('td')

        name = tds[0].getText()
        status = tds[2].getText()
        result.append({
            'id': name,
            'status': status,
        })

    return result

def main():
    with open('index.html') as f:
        html = f.read()

    result = parse(html)
    print(result)

if __name__ == '__main__':
    main()

stdout:

[{'id': 'Modem RU001', 'status': 'OFFLINE'}, {'id': 'Modem RU002', 'status': 'OFFLINE'}, {'id': 'Modem RU00n', 'status': 'OFFLINE'}]


Сортировка Django по количеству комментариев
У меня есть две модели:

class Post(models.Model):
    text = models.TextField("Text", blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    date = models.DateTimeField("Date", auto_now_add=True)
    image = models.ImageField("Image", upload_to="post_img", blank=True, null=True)
    likes = models.ManyToManyField(User, blank=True, related_name="post_like")

class PostComment(models.Model):
    post = models.ForeignKey("Post", on_delete=models.PROTECT, related_name="comments")  # Связь
    author = models.ForeignKey(User, related_name="comment", on_delete=models.CASCADE)
    text = models.CharField("Text", max_length=1300)
    date = models.DateTimeField(auto_now_add=True)

Далее мне требуется сортировать посты по количеству комментариев
Вопрос как это сделать через ListView
Начал делать вот так, но не могу понять как взять именно количество комментариев

class PostMostCommented(ListView):
    model = Post
    template_name = 'post_list.html'
    context_object_name = 'posts'
    queryset = Post.objects.all().order_by('?????')

В django orm нельзя использовать в запросе количество объектов связанной модели, предварительно не аннотировав к запросу. Поэтому был введен специальный объект Count:

from django.db.models import Count

В вашем случае его можно применить так:

queryset = Post.objects.all().annotate(cnt=Count('comments').order_by('cnt')


python поиск значений в списке из диапазона
Требуется способ поиска значений из заданного диапазона.
Сколько, к примеру, в списке значений от 0 до 30 включительно.
Требуется функционал схожий с list.count, но не с поиском по конкретному значению, а с диапазоном.
<code>
list = [0, 1, 2, 3, 4, 5, 10, 20 ,30, 40, 50, 60, 100]
</code>

Можно не создавать временных списков, а воспользоваться генераторами

sum(map(lambda x: 2<x<30, list))
# 5

или

sum(2<x<30 for x in list)


Перевести код из Python в Java (C++) [закрыт]

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

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

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

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

Есть код на питоне, который нужно перевести в Java (или C++). Т.к. не владею синтаксисом питона, прошу помощи у постояльцев:

def insertion_binary(data):
for i in range(1, len(data) - 1):
    key = data[i]
    lo, hi = 0, i - 1
    while lo < hi:
        mid = lo + (hi - lo) // 2
        if key < data[mid]:
            hi = mid
        else:
            lo = mid + 1
    for j in range(i, lo + 1, -1):
        data[j] = data[j - 1]
    data[lo] = key
return data

Начал делать, вот что получилось:

public int[] insertion_binary(int[] data){
for (int i = 1 ; i < data.length ; i++){
    int key = data[i];
    int lo = 0;
    int hi = i - 1;

Ваш метод будет выглядеть так.
<code>
public int[] insertion_binary(int[] data){
    for (int i = 1 ; i < data.length ; i++){
        int key = data[i];
        int lo = 0;
        int hi = i - 1;

        while(lo < hi){
            int mid = lo + (hi - lo);
            if (key < data[mid]){
                hi = mid;
            } else {
                lo = mid + 1;
            }
        }

        for (int j = i ; j != lo + 1 ; j--){
            data[j] = data[j - 1];
        }

        data[lo] = key;
    }

    return data;
}
</code>


Экземпляры класса как переменные метода другого класса
Пример конечно совершенно абстрактный, но, например, у меня есть 2 класса, в которых содержатся атрибуты, над которыми мне нужно совершить какие-то действия. В классе С я вызываю в методе экземпляры класса как параметры метода и таким образом я вызывают нужные атрибуты

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

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

class C():
    def __init__(self, ex_a, ex_b):
        self.ex_a = ex_a
        self.ex_b = ex_b
        self.d = self.dist()

    def dist(self):
        return self.ex_a.x + self.ex_b.y

Можно ли так оформлять метод
C.dist()? Или нужно наследовать классы A и B, и как осуществить это наследование в этом случае?
P.S. Без статических методов и функций, потому что может в дальнейшем потребуется использовать атрибут
A.x1
P.S.S Ошибка ли определять атрибуты класса так или нужно как в C++ определять атрибут как
self.__X? Я так и не разобрался с приватностью в python

Пример слишком абстрактный, чтобы сказать что-то конкретное. Выглядит примерно как:

У меня есть какая-то вещь, которую мне нужно отремонтировать. Можно ли использовать отвертку? Или нужно использовать молоток? Если молоток, то как правильно его использовать?

Вы просите подсказать, как что-то сделать, не говоря о том, что именно пытаетесь сделать.

Наследование - не панацея, это своего рода инструмент. Его нужно использовать тогда, когда этого требует предметная область.
Например, класс А будет кошкой, класс B - собакой, класс C - корзиной (внутри которой и кошка, и собака), для которой нужно вычислить общий вес. И наследовать корзину от кошки и собаки для вычисления их общего веса методом класса корзины крайне неверно. Да и вообще, множественного наследования лучше избегать, т.к. с ним связаны определенные проблемы.

Можно ли так оформлять метод C.dist()?

Вполне, а почему нет? Единственное, было бы неплохо сделать через свойства класса.

Ошибка ли определять атрибуты класса так, или нужно как в C++ определять атрибут как
self.__X? Я так и не разобрался с приватностью в python.

По поводу приватности есть хорошее объяснение. Там же есть и про свойства.


Почему не работает конструктор по умолчанию Python
Не могу понять причину почему не работает конструктор и выдает сообщение: "non-default argument follows default argument"
Мой код
<code>
class Microwave:
"""Микроволновка просто"""

def __init__(self,time=0,power=0,make,model,year):
    self.time =time
    self.power = power
    self.make = make
    self.model = model
    self.year = year
</code>

Смотрите:

make, model, year -- это позиционные аргументы

time=0, power=0 -- именованные аргументы

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

class Microwave:
    """Микроволновка просто"""

    def __init__(self, make, model, year, time=0, power=0):
        self.time =time
        self.power = power
        self.make = make
        self.model = model
        self.year = year

Именованные хороши тем, что порядок их заполнения в конструкторе не определен, т.е. можно так:

Microwave(make, model, year)

Microwave(make, model, year, time=0)

Microwave(make, model, year, power=0)

Microwave(make, model, year, time=0, power=0)

Microwave(make, model, year, power=0, time=0)


Как удалить в файле строку которую выберет человек?
Есть файл my_name.txt . Он содержит несколько записей имен. Хочу написать программу которая удаляет запись с именем студента которого я напишет человек.
Я написал код но он не удаляет имени с файла. Если что я только учусь
Пример в текстовом файле my_name:
Максим
Вова
Игорь
<code>
def main():

    a = input('Кого удалить?: ')
    infile = open('my_name.txt', 'r')
    descr = infile.readline()
    while descr != '':
        descr = descr.rstrip('\n')
        if descr == a:
            infile.rstrip(a)
            print('Файл удален')
        descr = infile.readline()

    infile.close()

main()
</code>

Будет работать при условии, что каждое имя записано с новой строки.
<code>
removeName = input('name: ')
namesList  = []

with open('file.txt') as f:     # открыть файл для чтения
    textList = f.readlines()    # прочитать по строкам

for i in textList:
    namesList.append(i.replace('\n','')) # убрать переводы строк из списка

if removeName in namesList:
    num = namesList.index(removeName)   # найти положение удаляемого имени
    namesList.pop(num)                  # удалить имя из списка

    with open('file.txt', 'w') as f:    # открыть файл для записи ('w')
        namesText = ''
        for i in namesList:
            namesText += i + '\n'       # добавить переводы строк
        f.write(namesText)              # переписать файл
else:
    print('there is no such name')
</code>


Сравнение вложенных списков
У меня есть два вложенных списка длинной 45, к примеру вот таких:

a = [['a','d','c','f'], ['w','r','t','c'], ['w','r','t','y'], ['r','t','t']]
b = [['q','w','e'], ['r','t','z'], ['t','y','t'], ['t','t','y']]

Но только вложены не по 4 элемента, а 45. Нужно создать список
c, в котором будут посчитаны количество совпадение элементов в списке
а с элементами в списке
b.
В итоге хочу получить вот такой список:

с = [[0], [2], [2], [2]]


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

Ввод: '5555aa54c  '
Вывод: {'c': 1, '5': 4, 'a': 2, ' ': 2}

Функция выглядит вот так:

def maxDict(str):
    count = 1
    md = {str[-1] : 1}
    n = len(str)
    for i in range(n-1):
        if str[i] == str[i + 1]:
            count += 1
            md[str[i]] = max(md.get(str[i], 0), count)
        else:
            count = 1
            md[str[i+1]] = md.get(str[i+1], 1)
    return md

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

for i in range(1, n):
    if str[i - 1] == str[i]:

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

Пример с использованием itertools.groupby:

from itertools import groupby

text = '5555aa54c  '
items = dict(sorted((k, len(list(v))) for k, v in groupby(text)))
print(items)
# {' ': 2, '4': 1, '5': 4, 'a': 2, 'c': 1}

Как это работает:

Выражение с
(k, len(list(v))) for k, v in groupby(text) вернет список кортежей, где первым элементом будет символ, а вторым его количество. Тут
v вернет генератор, но т.к. генератор не знает сколько у него элементов нужно его преобразовать в список через
list, а уже у списка можно запросить количество через
len.

[('5', 4), ('a', 2), ('5', 1), ('4', 1), ('c', 1), (' ', 2)]

Функция
sorted упорядочит элементы с одинаковым символом по их количеству. Без сортировки третий шаг неправильно заполнит словарь, например для символа
'5' (
('5', 4),
('5', 1)) в словарь попадет значение
1, т.к. предыдущее значение 4 будет затерто

[(' ', 2), ('4', 1), ('5', 1), ('5', 4), ('a', 2), ('c', 1)]

Самое приятное -- составление словаря по списку из элементов-пар

{' ': 2, '4': 1, '5': 4, 'a': 2, 'c': 1}


Как прервать выполнение программы после выполнения условия
Нужно прервать выполнение программы после выполнения условия if
<code>
a = int(input("Введите первое число" + '\n'))
if a > 2000000000 :
    print("Число слишком велико")
b = int(input("Введите второе число" + '\n'))
if a > 2000000000 :
    print("Число слишком велико")

evensum = 0
notevensum = 0

for number in range(a, b + 1):
    if number % 2 == 0 :
        evensum += number
    if number % 2 != 0 :
        notevensum +=number

print("Разность суммы четных и суммы нечетных чисел: ", evensum - notevensum)
</code>

Стандартный способ завершения программы в Python:

import sys
sys.exit()

или функция
quit()

import sys

a = int(input("Введите первое число" + '\n'))
if a > 2000000000 :
    print("Число слишком велико")
#    sys.exit()
# или так
    quit()

b = int(input("Введите второе число" + '\n'))
#if a > 2000000000 :
if b > 2000000000 :                                # b  !!!!!!!!!!!!!!!!
    print("Число слишком велико")
    sys.exit()

evensum = 0
notevensum = 0

for number in range(a, b + 1):
    if number % 2 == 0 :
        evensum += number
    if number % 2 != 0 :
        notevensum +=number

print("Разность суммы четных и суммы нечетных чисел: ", evensum - notevensum)


DataFrame: поиск индексов всех нулевых элементов
Я решаю задачу TSP (Travel Salesman Problem). В алгоритме предусмотрен цикл по обработке данных матрицы - поиск всех нулеых элементов и последовательная оценка каждого из этих элементов для принятия решения. Отсюда и взялся цикл. Для поиска вектора всех нулевых элементов я использую метод
<code>
result = np.where(df == 0)  # Найти все нулевые элементы - Numpy.
v_null = zip(result[0], result[1])  # Вектор, содержащий координаты нулевых элементов
</code>
Есть ли подобный метод в DataFrame, который выдает вектор индексов всех найденных по какому-то условию элементов?

Есть, например:

In [85]: df = pd.DataFrame(np.random.randint(0,5,size=(5, 5)), columns=list("abcde"))

In [86]: df
Out[86]:
   a  b  c  d  e
0  2  3  2  3  1
1  4  3  3  1  4
2  4  2  2  2  3
3  0  4  3  2  3
4  4  2  0  0  0

In [87]: df[df.eq(0)].stack().reset_index()
Out[87]:
   level_0 level_1    0
0        3       a  0.0
1        4       c  0.0
2        4       d  0.0
3        4       e  0.0

Столбцы
level_0 и
level_1 - содержат индексы нулевых элементов.


Как реализовать переход в новый день в данной задачке?
Данная программа принимает 3 значения H, A, B , где H - время в часовом поясе человека, A - В каком часовом поясе живет человек, B - В каком часовом поясе живет другой человек.
Нужно, чтобы при выводе время другого человека выводилось число от 0 до 23. В проверках и вычислениях программа сначала узнает часовой пояс UTC + 0, а далее время у другого человека, нужно сделать переход в новый день.
<code>
    print("Введите время в часовом поясе человека")
    H = int(input())
    print("В каком часовом поясе живет человек")
    A = int(input())
    print("В каком часовом поясе живет другой человек")
    B = int(input())

    if A > 0 and B < 0 :
        answer = H - A + B
    if A < 0 and B < 0 :
        answer = H + A - B
    if A < 0 and B > 0 :
        answer = H - A + B
    if A > 0 and B > 0 :
        answer = H - A + B

    print(answer)
</code>

h = int(input("Введите время в часовом поясе человека\n"))
a = int(input("В каком часовом поясе живет человек\n"))
b = int(input("В каком часовом поясе живет другой человек\n"))

c = b - a
h += c

if h > 23:
    h -= 24
if h < 0:
    h += 24

print(h)


Кратчайший путь в графе с дополнительными условиями
Задача:
Автомобилист хочет проехать от города u до города v, по стране с количеством городов n. Известны длины дорог между всеми городами, дороги двухсторонние. Автомобиль имеет ограниченный запас топлива k, в начале пути бак полностью заполнен. Восполнять запас топлива до максимального k он может в некоторых городах по дороге. Нужно посчитать сколько минимум нужно будет сделать заправок по дороге чтобы попасть из города u в город v.
Формат входных данных
Первая строка содержит пять целых чисел:
k — сколько километров может проехать машина без дозаправок,
n — количество городов,
m — количество дорог,
u — номер города начала дороги, и
v — номер города, куда нужно доехать
(1 ≤ k ≤ 500, 2 ≤ n ≤ 10 000, 0 ≤ m ≤ 10 000, 1 ≤ u,v, ≤ n, u ≠ v).
В следующих m строках задаются дороги. В
i-й из этих строк записаны три числа
p_i, q_i, r_i —
номера двух городов, которые соединяет очередная двухсторонняя дорога, и её длина.
(1 ≤ p_i, q_i ≤ n, 1≤ r_i ≤ 10^9)
Следующая строка содержит целое число
l — количество заправок
(0 ≤ l ≤ n). Наконец, последняя строка содержит
l чисел
a_1, a_2, . . . , a_i — номера городов с заправками в порядке возрастания
(1 ≤ a_1 < a_2 < ... < a_l ≤ n).
Формат выходных данных
Выведите
-1, если невозможно доехать от города с номером
u до города с
номером
v, или минимальное количество заправок, если это возможно.
Примеры:
input #1:

3 3 3 1 3
1 2 3
1 3 4
2 3 3
2
2 3

output #1:

1

input #2:

3 3 3 1 3
1 2 2
1 3 4
2 3 2
0

output #2:

-1

input #3:

3 3 3 1 3
1 2 2
1 3 4
2 3 1
0

output #3:

0

Ограничение по времени: 2 секунды;
Ограничение по памяти: 512 мегабайт
Моё решение:

k,n,m,u,v = [int(i) for i in input().split()]

adj = {}
for j in range(m):
    p,q,r = [int(i) for i in input().split()]
    if p-1 in adj:
        adj[p-1].append([q-1,r])
    else:
        adj[p-1] = [[q-1,r]]
    if q-1 in adj:
        adj[q-1].append([p-1,r])
    else:
        adj[q-1] = [[p-1,r]]

l = int(input())

refills = [False] * n
if not l is 0:
    for i in input().split():
        refills[int(i)-1] = True

count = [0] * n
tank = [None] * n
level = [-1] * n

def bfs(s):
    global level,charging,k
    level[s] = 0
    queue = [s]
    tank[s] = k
    while queue:
        v = queue.pop(0)

        for w_ in adj[v]:
            w = w_[0]; r = w_[1];
            if tank[w] is None:
                tank[w] = k
            if level[w] is -1 and r<=tank[v]:

                level[w] = r+level[v]
                if refills[w]:
                    tank[w] = k
                    count[w]+=1
                else:
                    tank[w] -=r
                queue.append(w)
bfs(u-1)
if level[v-1] is -1:
    print(-1)
else:
    print(count[v-1])

Я использую поиск в ширину с дополнительными условиями, алгоритм достаточно прост. Но моё решение выдаёт ошибки на некоторых тестах (входные данные на которых происходит ошибка я не знаю).
Подскажите, пожалуйста, что не так в алгоритме. Либо посоветуйте иной способ решения.

Задача на самом деле достаточно простая. Давайте посмотрим на ограничения. 10к вершин. 500км запаса хода максимум (!!). Кстати можно сразу убирать дороги длиннее k, всё равно проехать не сможем.
А теперь самый интересный момент - из 1 вершины
{i} сделаем k вершин
{(i,d)} которые будут показывать количество заправок на маршруте от старта к
i, при этом в пункте
i  осталось
d км топлива.
Оценим сложность. 10к * 500 = 5кк. По памяти это около 20 мегабайт. По времени. 5кк вершин. Количество ребёр в сумме пусть тоже будет 5кк. Алгоритм комбинированного обхода (или как его правильно)
O( (N+M) ) ~ 10kk вполне успевает. Идея алгоритма - идём без заправок пока можем, но складываем отдельно места где можно заправится. Потом эти места обрабатываем в порядке очереди.
Ну как бы и всё. Дальше дело техники сделать переход. Из
i->j  переход возможен только из вершин где топлива достаточно (обычный цикл от длины до k) без увеличения ответа. И с увелечением ответа на 1 в k - длину.
Ответ - минимум по всем "размноженным" последним вершинам.
Реализацию проще делать через хранение массива [0,k] в каждой обычной вершине.
Код пока не пишу. Если возникнут вопросы по реализации - помогу.


Как преобразовать datetime в aware datetime?
Получаю такую дату:
2019-10-11 12:33:42, она содержит тип
datetime.datetime.
Как мне её преобразовать в
aware datetime?
Почитав документацию ничего такого не нашел. Только такой вариант:
datetime.now(timezone.utc)
Пробовал сделать так, чтобы перевести в
aware datetime, но это не работает.

aware_datetime = datetime(date_parsed, timezone.utc)

В переменной
date_parsed хранится такая дата:
2019-10-11 12:33:42
Как можно это сделать?

Аналогичный вопрос на англоязычной версии SO...
Примеры:

from datetime import datetime as DT
from datetime import timezone

dt = DT.strptime("2019-10-11 12:33:42", "%Y-%m-%d %H:%M:%S")
dt_aware = dt.replace(tzinfo=timezone.utc)
print(dt)
print(dt_aware)

In [32]: print(dt)
2019-10-11 12:33:42

In [33]: print(dt_aware)
2019-10-11 12:33:42+00:00

Также можно воспользоваться модулем pytz:

import pytz

dt_aware = pytz.utc.localize(dt)
print(dt_aware)

In [37]: print(dt_aware)
2019-10-11 12:33:42+00:00

In [38]: dt_aware
Out[38]: datetime.datetime(2019, 10, 11, 12, 33, 42, tzinfo=<UTC>)


Не получается обработать исключения
Требуется вывести дату. Года не должны быть внутри 1900 и 2050. И обязательно ООП.
На вход даётся в форме dd.mm.yyyy:
30.11.2019
На выходе:
day: 30
month: 11
year: 2019
<code>
import datetime

class Data_:

    def _init_(self, date_):
        self.date_ = date_

    def read_D(self, s):
        self.date_ = datetime.datetime.strptime(s, '%d.%m.%Y')
        if 1900 > int(self.date_.year) > 2050:
            raise print('Error year')
        return self.date_

    def show_D(self):
        print ('day: {0}\nmonth: {1}\nyear: {2}'.format(self.date_.day, self.date_.month, self.date_.year))

s = input()
d = Data_()

# try:
#     d.read_D(s)
#     d.show_D()
# except 1900 > d.year > 2050:
#     raise print('Error year')

d.read_D(s)
d.show_D()
</code>
Не удаётся обработать исключения, пробовал и внутри класса, и вне класса (закомментированый скрипт).

if not 1900 < 2 < 2050:
    try:
        raise Exception('An exception flew by!')
    except Exception:
        print('Error year!')

# Error year!

if not 1900 < 3000 < 2050:
    try:
        raise Exception('An exception flew by!')
    except Exception:
        print('Error year!')

# Error year!

if not 1900 < 2019 < 2050:
    try:
        raise Exception('An exception flew by!')
    except Exception:
        print('Error year!')


Как сгенерировать список дата+время в каком-либо диапазоне с заданным шагом?
Как сгенерировать список дата+время в каком-либо диапазоне с заданным шагом?
Например, мне нужно, чтобы скрипт автоматически вывел куда-нибудь (да хоть в текстовый файл) все возможные варианты дата:время (например
MM/DD/YYYY:hh:mm:ss), которые присутствуют в интервале
10/25/2015:00:00:05 - 10/25/2015:23:59:58 с шагом, например 33 секунды.
В моем видении, вывод должен быть таким:

10/25/2015:00:00:05
10/25/2015:00:00:39
...
10/25/2015:14:27:28
...
10/25/2015:21:49:18

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

datetime.datetime -- для хранение времени
datetime.timedelta -- для увеличения времени на указанное значение времени
strptime -- для разбора объекта datetime.datetime по шаблону
strftime -- для получения строки с датой из объекта datetime.datetime по шаблону

Пример:
<code>
import datetime as DT

date_fmt = '%m/%d/%Y:%H:%M:%S'
step = DT.timedelta(seconds=33)
start_date = DT.datetime.strptime('10/25/2015:00:00:05', date_fmt)
last_date = DT.datetime.strptime('10/25/2015:23:59:58', date_fmt)

while start_date <= last_date:
    print(start_date, '|', start_date.strftime(date_fmt))
    start_date += step

# 2015-10-25 00:00:05 | 10/25/2015:00:00:05
# 2015-10-25 00:00:38 | 10/25/2015:00:00:38
# 2015-10-25 00:01:11 | 10/25/2015:00:01:11
# 2015-10-25 00:01:44 | 10/25/2015:00:01:44
# 2015-10-25 00:02:17 | 10/25/2015:00:02:17
# ...
</code>


DataFrame: выделить столбец/строку для поиска в нем min() [закрыт]

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

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

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

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

Дана матрица:

GIVEN_MATRIX = [[0., 10., 25., 25., 10.],
                [1., 0., 10., 15., 2.],
                [8., 9., 0., 20., 10.],
                [14., 10., 24., 0., 15.],
                [10., 8., 25., 27., 0.]]

df = pd.DataFrame(matrix)

Как в цикле выделять столбец и строку для поиска в нем минимального значения?
Можно ли для этого использовать переменную цикла?
Вариант:

di = df.iloc[i].min(axis=1)

не работает.

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

In [17]: df = pd.DataFrame(matrix, columns=list("abcde"), index=[f"row{i}" for i in range(1, 6)])

In [18]: df
Out[18]:
         a     b     c     d     e
row1   0.0  10.0  25.0  25.0  10.0
row2   1.0   0.0  10.0  15.0   2.0
row3   8.0   9.0   0.0  20.0  10.0
row4  14.0  10.0  24.0   0.0  15.0
row5  10.0   8.0  25.0  27.0   0.0

NOTE: если не исключать диагональные элементы то и для строк и для столбцов минимумами будут являться диагональные элементы.

Решение: сначала заполним главную диагональ бесконечно большим значением:

In [19]: np.fill_diagonal(df.values, np.inf)

In [20]: df
Out[20]:
         a     b     c     d     e
row1   inf  10.0  25.0  25.0  10.0
row2   1.0   inf  10.0  15.0   2.0
row3   8.0   9.0   inf  20.0  10.0
row4  14.0  10.0  24.0   inf  15.0
row5  10.0   8.0  25.0  27.0   inf

теперь можно использовать метод DataFrame.min() для нахождения минимумов столбцов:

In [23]: df.min(axis=0)
Out[23]:
a     1.0
b     8.0
c    10.0
d    15.0
e     2.0
dtype: float64

параметр
axis имеет значение
0 по умолчанию, поэтому его можно не указывать:

In [24]: df.min()
Out[24]:
a     1.0
b     8.0
c    10.0
d    15.0
e     2.0
dtype: float64

или для минимумов строк:

In [25]: df.min(axis=1)
Out[25]:
row1    10.0
row2     1.0
row3     8.0
row4    10.0
row5     8.0
dtype: float64


Что здесь делает декоратор?
Я сейчас смотрю описание и примеры контекстного менеджера "with" (он мне относительно понятен), но я не понимаю, что в этом коде делает декоратор? Без него все бы прекрасно работало.
p.s. еще я не понимаю, зачем здесь yield, если с return код будет так же работать.
<code>
from contextlib import contextmanager

@contextmanager
def file_open(path):
    try:
        f_obj = open(path, 'w')
        yield f_obj
    except OSError:
        print("We had an error!")
    finally:
        print('Closing file')
        f_obj.close()

if __name__ == '__main__':
    with file_open('test.txt') as fobj:
    fobj.write('Testing context managers')
</code>

У вас в самом деле код заработал, когда вы запустили его без декоратора и с return вместо yield? Это очень странно.
Чтобы объект мог работать контекстным менеджером, он должен иметь два специальных метода
__enter__ и
__exit__. Декоратор
@contextmanager их и создаёт.
При этом
@contextmanager должен быть применён к функции-генератору, т.к. ему нужно дёрнуть задекорированную функцию два раза - при открытии и при закрытии контекста, и эти два вызова должны выполнить разную логику, сохранив внутреннее состояние между вызовами. Обычная функция c
return так не умеет, только функция-генератор с
yield.