Цикл for в Python

Введение

В Python нет традиционного для многих языков программирования цикла for вместо него обычно используется цикл for … in, который соответствует циклам вида for-each, например в PHP это foreach а в JavaScript это forEach

Пример

Рассмотрим файл for_loop.py

for i in range(1, 4): print(i)

python for_loop.py

1
2
3

Обратите внимание, что выведены были только i от 1 до 3. 4 Python не вывел.

Читать однострочные скрипты неудобно. Обычно каждое действие стараются записать на отдельной строке.

for i in range(1, 4): print(i)

python for_loop.py

1
2
3

Если написать код без хотя бы одного пробела перед print

for i in range(1,4): print(i)

то работать код не будет. Получится ошибка

File "/home/andrei/python/for_loop.py", line 2 print(i) ^ IndentationError: expected an indented block

IndentationError это подвид SyntaxError чтобы избежать её нужно поставить перед print(i) пробел

Применение к разным типам данных

Циклом for in можно пройтись не только по range, но по любому итерируемому объекту : по списку , строке , кортежу , словарю , множеству

numbers = [1, 2, 3, 5, 7] for n in numbers: print(n)

1 2 3 5 7

letters = "abcde" for l in letters: print(l)

a b c d e

pairs = {"x": 11, "y": 22, "z": 33} for p in pairs: print(p) for key, value in pairs.items(): print(key, value)

x y z x 11 y 22 z 33

uniques = {"a", "b", "b", "c", "c", "c"} for u in uniques: print(u)

b a c

coordinates = (4, 6, 8) for c in coordinates: print(c)

4 6 8

for _ in

Пример с _

retries = 3 retries_ = abs(int(retries)) for _ in range(retries_ + 1): print(_)

1
2
3
4

range()

for i in range(0, 4): print(i)

0 1 2 3

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

r = (1, 3) for i in range(r[0], r[1] + 1): print(i)

0 1 2 3

Если нужно использовать сложный range, например с разрывами - может помочь генератор списков

ranges = [(0, 2), (14, 17), (20, 20)] digits = [d for r in ranges for d in range(r[0], r[1] + 1)] print(digits)

[0, 1, 2, 14, 15, 16, 17, 20]

Это может пригодится, например, для генерации каких-то определённых символов функцией chr() (Python 3) или unichr() (Python 2)

try: get_char = unichr except NameError: get_char = chr ranges = [ (0x0021, 0x0021), (0x0023, 0x0026), (0x00A1, 0x00AC) ] symbols = [get_char(s) for r in ranges for s in range(r[0], r[1] + 1)] print(symbols)

['!', '#', '$', '%', '&', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬']

Сложение range

В Python 2 можно было явно складывать range и range потому что range() возвращал список

# Python 2 r = range(0, 3) + range(7, 9) print(r)

[0, 1, 2, 7, 8]

В Python 3 будет ошибка, потому что range() возвращает итерируемый объект класса range

Traceback (most recent call last): File "range_plus_range.py", line 1, in <module> r = range(0, 3) + range(7, 9) TypeError: unsupported operand type(s) for +: 'range' and 'range'

print(range(0, 3)) print(type(range(0, 3))) print(type(iter(range(0,3))))

range(0, 3) <class 'range'> <class 'range_iterator'>

r = iter(range(0, 3)) print(next(r)) print(next(r)) print(next(r))

0 1 2

Автор статьи: Андрей Олегович

Изображение баннера