Мне нужно сделать ответ @ted (imo) более читабельным и добавить некоторые пояснения.
Приведенное в порядок решение:
# Function to print the index, if the index is evenly divisable by 1000:
def report(index):
if index % 1000 == 0:
print(index)
# The function the user wants to apply on the list elements
def process(x, index, report):
report(index) # Call of the reporting function
return 'something ' + x # ! Just an example, replace with your desired application
# !Just an example, replace with your list to iterate over
mylist = ['number ' + str(k) for k in range(5000)]
# Running a list comprehension
[process(x, index, report) for index, x in enumerate(mylist)]
Объяснение: из enumerate(mylist)
: с помощью функции enumerate
можно иметь индексы в дополнение к элементам итерируемого объекта (см. этот вопрос и ответы на него). Например
[(index, x) for index, x in enumerate(["a", "b", "c"])] #returns
[(0, 'a'), (1, 'b'), (2, 'c')]
Примечание. index
и x
не являются зарезервированными именами, это просто имена, которые я считаю удобными — [(foo, bar) for foo, bar in enumerate(["a", "b", "c"])]
дает тот же результат.
19.08.2019
global i
я бы выбралenumerate
и передалindex
function
08.06.2018for
. В моих (по общему признанию, очень ограниченных) тестах решение Алекса занимает 10 секунд, циклfor
— 13, а этот — 17. 08.06.2018print
есть операторif
. Ответ Алекса простоprint
все. Не знаю, как выглядит ваш циклfor
. 08.06.2018if index % 1000 == 0 and index > 0:
в тесте - это намного чище. :) 15.03.2019tok
report
? Функция ничего не делает с этим аргументом, поэтому его можно опустить. 19.08.2019