Нумерация print Python
Недавно работаю с Python, вопрос наверное глупый. У меня есть функция, которая во время работы вывод в консоль print("..."). Мне нужно, чтобы каждый новый print нумеровался. То есть print ("[1]...").
Ответы (3 шт):
Автор решения: Jack_oS
→ Ссылка
Встроенная функция enumerate() - то, что вам нужно!
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
Для вашего принта:
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
for i, m in enumerate(months, 1): # начитать нумерацию с 1
print(f'{i}: {m}')
Вывод:
1: January
2: February
3: March
4: April
5: May
6: June
7: July
8: August
9: September
10: October
11: November
12: December
Автор решения: Stanislav Volodarskiy
→ Ссылка
Написать универсальное решение не так просто. Вместо функции print создадим функцию eprint (enumeration print), которая самостоятельно вставляет номер в начале каждой печати. Получается сложная конструкция с замыканиями, итераторами и передачей параметров с помощью *args, **kwargs:
import itertools
def make_eprint():
c = itertools.count(start=1)
def eprint(*args, **kwargs):
kwargs_copy = dict(kwargs)
kwargs_copy.update(end=' ', flush=False)
print(f'[{next(c)}]', **kwargs_copy)
print(*args, **kwargs)
return eprint
eprint = make_eprint()
eprint('Hello, world!')
eprint(1, 2, 3, sep='-')
eprint(1, 2, 3, sep='-', end='\n\n')
eprint(1, 2, 3, end=' ')
eprint(1, 2, 3)
Результат:
[1] Hello, world!
[2] 1-2-3
[3] 1-2-3
[4] 1 2 3 [5] 1 2 3
В последней строке виден дефект, который не устраняется просто.
Автор решения: TigerTV.ru
→ Ссылка
Вариант с декоратором:
def super_print(f):
m = [0]
foo = print
def helper(x):
m[0] = f(m[0])
foo(f'[{m[0]}]: {x}')
return helper
@super_print
def print(n):
return n+1
print("Monday")
print("Tuesday")
print("Wednesday")
Вывод:
[1]: Monday
[2]: Tuesday
[3]: Wednesday