Цикл for в Python
Введение | |
Пример | |
for in по разным типам объектов | |
for _ in | |
range() | |
Похожие статьи |
Введение
В 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
Python | |
Циклы | |
continue | |
Collections |