Для цикла в Python, но с шагом n

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

Теперь я хочу попробовать применить этот процесс, считая только один из каждых 10 пикселей. Как мне это сделать? Как установить шаг моего цикла for! = 1 (значение по умолчанию)?


person Harlan    schedule 27.07.2020    source источник
comment
Попробуйте использовать PIL - stackoverflow.com/a/138260/13213725   -  person astroanax    schedule 27.07.2020
comment
Как выражаются пиксели? Если вы можете получить их по индексу и знаете полную длину, вы можете использовать range(0, some_len, 10) для индексации по 10 с и, возможно, в среднем 0–9 пикселей для каждого интервала.   -  person tdelaney    schedule 27.07.2020


Ответы (3)


Фактически, range() принимает 3 позиционных аргумента, и 2 из них установлены по умолчанию как 0 и 1. Аргументы: start = с какого числа начинать, stop = с какого числа останавливаться и step = на какое число увеличивать счет каждый раз. По умолчанию start равно 0, а step равно 1. И когда вы пишете range(number), вы назначаете стоп своему номеру. Итак, если мне нужны каждые 10 чисел, я просто пишу:

range(0, 100, 10)
person Michael Adams    schedule 27.07.2020

Для этого вы можете использовать форму с тремя аргументами range:

for i in range(0, width, 10):
    for j in range(0, height, 10):
        ...

Хотя всего лишь выборка 1% пикселей, скорее всего, даст довольно плохие результаты. Вы можете улучшить его, например, сделав каждый выходной символ зависимым от среднего значения каждого блока 10x10 пикселей.

person Jasmijn    schedule 27.07.2020
comment
я опоздал на 1 минуту ... - person Michael Adams; 27.07.2020

Другое решение очевидно

for mul in range(width//10):
   do_thing(mul*10)
person tripleee    schedule 27.07.2020
comment
зачем делить на 10, если все равно при использовании умножаем еще раз на 10? - person Michael Adams; 27.07.2020
comment
Типичная причина, по которой это нужно, например, разделить целое число на дроби; вы не можете сделать range(0,1,0.1), но можете сделать range(10) и разделить на 10. - person tripleee; 27.07.2020