Как составить цикл в питоне

Часто в программах требуется выполнять одни и те же действия многократно. Допустим, нам нужно написать программу проверки пароля для входа в систему (следует учесть, что это всего лишь пример и в настоящих системах пользователь авторизуется по логину и паролю, а сам пароль не хранится в открытом виде).

Пользователь вводит пароль, а система разрешит вход, если пароль верный, а если нет — попросит ввести его снова. Для реализации программы недостаточно использовать только условный оператор, так как он позволит провести проверку только один раз. На помощь нам приходит цикл — он позволяет выполнять код многократно:

saved_pwd = "right_password"
pwd = input("Введите пароль для входа: ")
while pwd != saved_pwd:
    pwd = input("Введите пароль для входа: ")
print("Пароль верный. Вход разрешён.")

В программе применяется цикл while, в котором используется условие для проверки продолжения цикла. Другими словами, пока выполняется условие, цикл продолжает работать. Условие необходимо для того, чтобы цикл не был бесконечным. Тело цикла — это код, который будет выполняться многократно. Синтаксис языка Python требует, чтобы тело цикла записывалось с отступом в четыре пробела (использование табуляций крайне не рекомендуется).

Каждый повтор, или шаг, цикла называется итерацией. Как только условие продолжения нарушено, цикл останавливается и программа продолжает работу со следующей за циклом строчки.

В предыдущем примере мы можем вообще обойтись без переменной pwd, так как она используется только в проверке условия продолжения цикла:

saved_pwd = "right_password"
while input("Введите пароль для входа: ") != saved_pwd:
    pass
print("Пароль верный. Вход разрешён.")

Обратите внимание, что внутри тела цикла была использована пустая инструкция pass.

Она ничего не делает в программе и нужна для соответствия кода синтаксису языка, так как тело цикла не может быть пустым (иначе будет синтаксическая ошибка и программа не будет работать).

В Python версии 3.8 появился моржовый оператор (walrus operator). Он записывается как := и позволяет одновременно вычислить выражение, присвоить результат переменной и вернуть это значение, например в условие.

Давайте напишем программу, которая будет здороваться со всеми людьми, чьи имена введёт пользователь. Сигнал для остановки — ввод строки «СТОП»:

name = input("Введите имя: ")
while name != "СТОП":
    print(f"Привет, {name}!")
    name = input("Введите имя: ")
print("Программа завершена.")

А теперь перепишем эту программу с использованием моржового оператора:

while (name := input("Введите имя: ")) != "СТОП":
    print(f"Привет, {name}!")
print("Программа завершена.")

Благодаря моржовому оператору из программы были убраны строки, в которых считывалось имя первый раз до цикла, а также в теле цикла. Теперь имя считывается только непосредственно на этапе проверки, выполняется ли условие продолжения цикла.

Итак, цикл while обычно применяется в тех случаях, когда заранее не известно, сколько итераций будет выполнено, но известно условие, при котором цикл продолжает работу.

Если количество итераций заранее известно, то предпочтительнее использовать цикл for. Он применяется совместно с итерируемой переменной. Очень часто ей дают имя i и используют в теле цикла, а её значение изменяется на каждой итерации в соответствии с диапазоном, заданным функцией range().

Функция range() может принимать от одного до трёх целочисленных аргументов:

  • range(n) — возвращает диапазон целых чисел от 0 до n — 1. Например, range(4) вернёт диапазон целых чисел: 0, 1, 2, 3;
  • range(k, n) — возвращает диапазон целых чисел от k до n — 1. Например, range(1, 5) вернёт диапазон целых чисел: 1, 2, 3, 4;
  • range(k, n, s) — возвращает диапазон целых чисел от k до n — 1 с шагом s. Например, range(1, 10, 2) вернёт диапазон целых чисел: 1, 3, 5, 7, 9.

Выведем на экран n целых чисел начиная с 0 (n вводится пользователем):

n = int(input("Введите количество чисел: "))
for i in range(n):
    print(i)

Результат работы программы:

Введите количество чисел: 5
0
1
2
3
4

Выведем на экран целые числа в диапазоне от k до n — 1 (k, n вводятся пользователем):

k = int(input("Введите начало диапазона: "))
n = int(input("Введите конец (без включения) диапазона: "))
for i in range(k, n):
    print(i)

Результат работы программы:

Введите начало диапазона: 2
Введите конец (без включения) диапазона: 5
2
3
4

Выведем на экран целые чётные числа в диапазоне от 0 до n (n вводится пользователем):

n = int(input("Введите конец диапазона: "))
for i in range(0, n + 1, 2):
    print(i)

Результат работы программы:

Введите конец диапазона: 5
0
2
4

Используя в функции range() отрицательный шаг, можно запустить цикл в обратном порядке:

n = int(input("Введите количество чисел: "))
for i in range(n, -1, -1):
    print(i)

Результат работы программы:

Введите количество чисел: 5
5
4
3
2
1
0

Обратите внимание: изменение значения итерируемой переменной внутри тела цикла не имеет смысла, так как будет перезаписано на следующей итерации очередным значением из диапазона функции range(). Например, следующий код по-прежнему выведет числа от 0 до n — 1, несмотря на изменение значения итерируемой переменной в теле цикла:

n = int(input("Введите n: "))
for i in range(n):
    print(i)
    i = 100

Результат работы программы:

Введите n: 5
0
1
2
3
4

Выполнение программ, написанных на любом языке программирования, по умолчанию является последовательным. Иногда нам может понадобиться изменить выполнение программы. Выполнение определенного кода может потребоваться повторить несколько раз.

Для этого в языках программирования предусмотрены различные типы циклов, которые способны повторять определенный код несколько раз. Чтобы понять принцип работы оператора цикла, рассмотрим следующую схему.

Циклы в python

Циклы упрощают сложные задачи до простых. Он позволяет нам изменить поток программы таким образом, что вместо того, чтобы писать один и тот же код снова и снова, мы можем повторять его конечное число раз. Например, если нам нужно вывести первые 10 натуральных чисел, то вместо того, чтобы использовать оператор print 10 раз, мы можем вывести их внутри цикла, который выполняется до 10 итераций.

Преимущества циклов

В Python преимущества циклов, как и в других язвках программирования, заключаются в следующем:

  1. Это обеспечивает возможность повторного использования кода.
  2. Используя циклы, нам не нужно писать один и тот же код снова и снова.
  3. С помощью циклов мы можем перебирать элементы структур данных (массивов или связанных списков).

В Python существуют следующие операторы циклов.

Оператор цикла Описание
for Цикл for используется в том случае, когда необходимо выполнить некоторую часть кода до тех пор, пока не будет выполнено заданное условие. Цикл for также называют циклом c предусловием. Лучше использовать цикл for, если количество итераций известно заранее.
while Цикл while используется в сценарии, когда мы не знаем заранее количество итераций. Блок операторов в цикле while выполняется до тех пор, пока не будет выполнено условие, указанное в цикле while. Его также называют циклом с предварительной проверкой условия.
do-while Цикл do-while продолжается до тех пор, пока не будет выполнено заданное условие. Его также называют циклом с пстусловием. Он используется, когда необходимо выполнить цикл хотя бы один раз.

Цикл for в Python

Цикл for в Python используется для многократного повторения операторов или части программы. Он часто используется для обхода структур данных, таких как список, кортеж или словарь.

Синтаксис цикла for в python приведен ниже.

for iterating_var in sequence:    
    statement(s)    

Цикл for в Python

Цикл For с использованием последовательности

Пример 1: Итерация строки с помощью цикла for

str = "Python"  
for i in str:  
    print(i)  

Вывод:

P
y
t
h
o
n

Пример 2: Программа для печати таблицы заданного числа.

list = [1,2,3,4,5,6,7,8,9,10]  
n = 5  
for i in list:  
    c = n*i  
    print(c)  

Вывод:

5
10
15
20
25
30
35
40
45
50s

Пример 3: Программа для печати суммы заданного списка.

list = [10,30,23,43,65,12]  
sum = 0  
for i in list:  
    sum = sum+i  
print("The sum is:",sum)  

Вывод:

The sum is: 183

Цикл For с использованием функции range()

Функция range()

Функция range() используется для генерации последовательности чисел. Если мы передадим range(10), она сгенерирует числа от 0 до 9. Синтаксис функции range() приведен ниже.

range(start,stop,step size)  
  • Start означает начало итерации.
  • Stop означает, что цикл будет повторяться до stop-1. range(1,5) будет генерировать числа от 1 до 4 итераций. Это необязательный параметр.
  • Размер шага используется для пропуска определенных чисел в итерации. Его использование необязательно. По умолчанию размер шага равен 1. Это необязательно.

Рассмотрим следующие примеры:

Пример 1: Программа для печати чисел по порядку.

for i in range(10):  
    print(i,end = ' ')  

Вывод:

0 1 2 3 4 5 6 7 8 9 

Пример 2: Программа для печати таблицы заданного числа.

n = int(input("Enter the number "))  
for i in range(1,11):  
    c = n*i  
    print(n,"*",i,"=",c)  

Вывод:

Enter the number 10
10 * 1 = 10
10 * 2 = 20
10 * 3 = 30
10 * 4 = 40
10 * 5 = 50
10 * 6 = 60
10 * 7 = 70
10 * 8 = 80
10 * 9 = 90
10 * 10 = 100

Пример 3: Программа для печати четного числа с использованием размера шага в range().

n = int(input("Enter the number "))  
for i in range(2,n,2):  
    print(i)  

Вывод:

Enter the number 20
2
4
6
8
10
12
14
16
18

Мы также можем использовать функцию range() с последовательностью чисел. Функция len() сочетается с функцией range(), которая выполняет итерацию по последовательности с использованием индексации. Рассмотрим следующий пример.

list = ['Peter','Joseph','Ricky','Devansh']  
for i in range(len(list)):  
    print("Hello",list[i])  

Вывод:

Hello Peter
Hello Joseph
Hello Ricky
Hello Devansh

Вложенный цикл for в python

Python позволяет нам вложить любое количество циклов for внутрь цикла for. Внутренний цикл выполняется n раз за каждую итерацию внешнего цикла. Синтаксис приведен ниже.

for iterating_var1 in sequence:  #outer loop  
    for iterating_var2 in sequence:  #inner loop  
        #block of statements     
#Other statements    

Пример 1: Вложенный цикл for

# User input for number of rows  
rows = int(input("Enter the rows:"))  
# Outer loop will print number of rows  
for i in range(0,rows+1):  
# Inner loop will print number of Astrisk  
    for j in range(i):  
        print("*",end = '')  
    print()  

Вывод:

Enter the rows:5
*
**
***
****
*****

Пример 2: Программа для печати пирамиды чисел.

rows = int(input("Enter the rows"))  
for i in range(0,rows+1):  
    for j in range(i):  
        print(i,end = '')  
    print()  

Вывод:

1
22
333
4444
55555

Использование оператора else в цикле for

В отличие от других языков, таких как C, C++ или Java, Python позволяет нам использовать оператор else с циклом for, который может быть выполнен только тогда, когда все итерации исчерпаны. Здесь мы должны заметить, что если цикл содержит какой-либо оператор break, то оператор else не будет выполнен.

Пример 1

for i in range(0,5):    
    print(i)    
else:  
    print("for loop completely exhausted, since there is no break.")  

Вывод:

0
1
2
3
4
for loop completely exhausted, since there is no break.

Цикл for полностью исчерпал себя, так как нет прерывания.

Пример 2

for i in range(0,5):    
    print(i)    
    break;    
else:print("for loop is exhausted");    
print("The loop is broken due to break statement...came out of the loop")  

В приведенном выше примере цикл прерван из-за оператора break, поэтому оператор else не будет выполнен. Будет выполнен оператор, находящийся непосредственно рядом с блоком else.

Вывод:

0

Цикл был прерван, благодаря оператору break.

Цикл while в Python

Цикл while позволяет выполнять часть кода до тех пор, пока заданное условие не станет ложным. Он также известен как цикл с предварительной проверкой условия.

Его можно рассматривать как повторяющийся оператор if. Когда мы не знаем количество итераций, цикл while является наиболее эффективным.

Синтаксис приведен ниже.

while expression:    
    statements    

Здесь утверждения могут быть одним утверждением или группой утверждений. Выражение должно быть любым допустимым выражением Python, приводящим к true или false. Истиной является любое ненулевое значение, а ложью — 0.

Цикл while в Python

Операторы управления циклом

Мы можем изменить обычную последовательность выполнения цикла while с помощью оператора управления циклом. Когда выполнение цикла while завершается, все автоматические объекты, определенные в этой области видимости, уничтожаются. Python предлагает следующие управляющие операторы для использования в цикле while.

1. Оператор continue — Когда встречается оператор continue, управление переходит в начало цикла. Давайте разберем следующий пример.

# prints all letters except 'a' and 't'   
i = 0  
str1 = 'javatpoint'  
  
while i < len(str1):   
    if str1[i] == 'a' or str1[i] == 't':   
        i += 1  
        continue  
    print('Current Letter :', a[i])   
    i += 1  

Вывод:

Current Letter : j
Current Letter : v
Current Letter : p
Current Letter : o
Current Letter : i
Current Letter : n

2. Оператор break — Когда встречается оператор break, он выводит управление из цикла.

Пример:

# The control transfer is transfered  
# when break statement soon it sees t  
i = 0  
str1 = 'javatpoint'  
  
while i < len(str1):   
    if str1[i] == 't':   
        i += 1  
        break  
    print('Current Letter :', str1[i])   
    i += 1  

Вывод:

Current Letter : j
Current Letter : a
Current Letter : v
Current Letter : a

3. Оператор pass — Оператор pass используется для объявления пустого цикла. Он также используется для определения пустого класса, функции и оператора управления. Давайте разберем следующий пример.

# An empty loop   
str1 = 'javatpoint'  
i = 0  
  
while i < len(str1):   
    i += 1  
    pass  
print('Value of i :', i)  

Вывод

Value of i : 10

Пример 1: Программа для печати от 1 до 10 с использованием цикла while

i=1  
#The while loop will iterate until condition becomes false.  
While(i<=10):    
    print(i)   
    i=i+1   

Вывод

1
2
3
4
5
6
7
8
9
10

Пример 2: Программа для печати таблицы заданных чисел.

i=1    
number=0    
b=9    
number = int(input("Enter the number:"))    
while i<=10:    
    print("%d X %d = %d n"%(number,i,number*i))    
    i = i+1    

Вывод

Enter the number:10
10 X 1 = 10 

10 X 2 = 20 

10 X 3 = 30 

10 X 4 = 40 

10 X 5 = 50 

10 X 6 = 60 

10 X 7 = 70 

10 X 8 = 80 

10 X 9 = 90 

10 X 10 = 100 

Бесконечный цикл while

Если условие, заданное в цикле while, никогда не станет ложным, то цикл while никогда не завершится, и он превратится в бесконечный цикл while.

Любое ненулевое значение в цикле while указывает на всегда истинное состояние, в то время как ноль указывает на всегда ложное состояние. Такой подход полезен, если мы хотим, чтобы наша программа непрерывно выполнялась в цикле без каких-либо помех.

Пример 1

while (1):    
    print("Hi! we are inside the infinite while loop"

Вывод

Hi! we are inside the infinite while loop
Hi! we are inside the infinite while loop

Пример 2

var = 1    
while(var != 2):    
    i = int(input("Enter the number:"))    
    print("Entered value is %d"%(i))    

Вывод

Enter the number:10
Entered value is 10
Enter the number:10
Entered value is 10
Enter the number:10
Entered value is 10
Infinite time

Использование else в цикле while

Python позволяет нам также использовать оператор else с циклом while. Блок else выполняется, когда условие, заданное в операторе while, становится ложным. Как и в случае с циклом for, если цикл while прервать с помощью оператора break, то блок else не будет выполнен, а будет выполнен оператор, присутствующий после блока else. Оператор else необязателен для использования с циклом while. Рассмотрим следующий пример.

i=1   
while(i<=5):    
    print(i)    
    i=i+1    
else:  
    print("The while loop exhausted")    
i=1    
while(i<=5):    
    print(i)    
    i=i+1    
    if(i==3):    
        break   
else:  
    print("The while loop exhausted")  

Вывод

1
2

В приведенном выше коде, когда встречается оператор break, цикл while останавливает свое выполнение и пропускает оператор else.

Программа для печати чисел Фибоначчи до заданного предела

terms = int(input("Enter the terms "))  
# first two intial terms  
a = 0  
b = 1  
count = 0  
  
# check if the number of terms is Zero or negative  
if (terms <= 0):  
   print("Please enter a valid integer")  
elif (terms == 1):  
   print("Fibonacci sequence upto",limit,":")  
   print(a)  
else:  
   print("Fibonacci sequence:")  
   while (count < terms) :  
       print(a, end = ' ')  
       c = a + b  
       # updateing values  
       a = b  
       b = c  
     
    count += 1  
Enter the terms 10
Fibonacci sequence:
0 1 1 2 3 5 8 13 21 34 

Оператор прерывания в Python

Break — это ключевое слово в python, которое используется для вывода управления программой из цикла. Оператор break разрывает циклы по одному, то есть в случае вложенных циклов он сначала разрывает внутренний цикл, а затем переходит к внешним циклам. Другими словами, можно сказать, что break используется для прерывания текущего выполнения программы, и управление переходит на следующую строку после цикла.

Прерывание обычно используется в тех случаях, когда нам нужно прервать цикл при заданном условии.

Синтаксис прерывания приведен ниже.

#оператор цикла
break;   

Пример:

list =[1,2,3,4]  
count = 1;  
for i in list:  
    if i == 4:  
        print("item matched")  
        count = count + 1;  
        break  
print("found at",count,"location");  

Вывод:

item matched
found at 2 location

Пример:

str = "python"  
for i in str:  
    if i == 'o':  
        break  
    print(i);  

Вывод:

p
y
t
h

Пример: оператор break с циклом while

i = 0;  
while 1:  
    print(i," ",end=""),  
    i=i+1;  
    if i == 10:  
        break;  
print("came out of while loop");  

Вывод:

0  1  2  3  4  5  6  7  8  9  came out of while loop

Пример

n=2  
while 1:  
    i=1;  
    while i<=10:  
        print("%d X %d = %dn"%(n,i,n*i));  
        i = i+1;  
    choice = int(input("Do you want to continue printing the table, press 0 for no?"))  
    if choice == 0:  
        break;      
    n=n+1  

Вывод:

2 X 1 = 2

2 X 2 = 4

2 X 3 = 6

2 X 4 = 8

2 X 5 = 10

2 X 6 = 12

2 X 7 = 14

2 X 8 = 16

2 X 9 = 18

2 X 10 = 20

Do you want to continue printing the table, press 0 for no?1

3 X 1 = 3

3 X 2 = 6

3 X 3 = 9

3 X 4 = 12

3 X 5 = 15

3 X 6 = 18

3 X 7 = 21

3 X 8 = 24

3 X 9 = 27

3 X 10 = 30

Do you want to continue printing the table, press 0 for no?0

Оператор continue в Python

Оператор continue в Python используется для возврата управления программой в начало цикла. Оператор continue пропускает оставшиеся строки кода внутри цикла и начинает следующую итерацию. В основном он используется для определенного условия внутри цикла, чтобы мы могли пропустить определенный код для конкретного условия.

#loop statements    
continue  
#the code to be skipped     

Оператор continue в Python

Рассмотрим следующие примеры.

Пример

i = 0                     
while(i < 10):                
   i = i+1  
   if(i == 5):  
      continue  
   print(i)  

Вывод:

1
2
3
4
6
7
8
9
10

Обратите внимание на вывод приведенного выше кода, значение 5 пропущено, потому что мы предоставили условие if с помощью оператора continue в цикле while. Когда оно совпадает с заданным условием, управление передается в начало цикла while, и он пропускает значение 5 из кода.

Давайте посмотрим на другой пример:

Пример

str = "JavaTpoint"  
for i in str:  
    if(i == 'T'):  
        continue  
    print(i)  

Вывод:

J
a
v
a
p
o
i
n
t

Оператор pass в python

Оператор pass является нулевым оператором (null operation), поскольку при его выполнении ничего не происходит. Он используется в тех случаях, когда оператор синтаксически необходим, но мы не хотим использовать вместо него какой-либо исполняемый оператор.

Например, он может быть использован при переопределении метода родительского класса в подклассе, но мы не хотим давать его конкретную реализацию в подклассе.

Pass также используется в тех случаях, когда код будет записан где-то, но еще не записан в программном файле. Рассмотрим следующий пример.

list = [1,2,3,4,5]    
flag = 0    
for i in list:    
    print("Current element:",i,end=" ");    
    if i==3:    
        pass    
        print("nWe are inside pass blockn");    
        flag = 1    
    if flag==1:    
        print("nCame out of passn");    
        flag=0   

Вывод:

Current element: 1 Current element: 2 Current element: 3 
We are inside pass block


Came out of pass

Current element: 4 Current element: 5 

Python цикл Do While

В Python нет цикла do while. Но мы можем создать подобную программу.

Цикл do while используется для проверки условия после выполнения оператора. Он похож на цикл while, но выполняется хотя бы один раз.

Общий синтаксис цикла Do While (не отностится к python)

do {  
     //statement  
} while (condition);  

Пример: цикл do while в Python

i = 1  
  
while True:  
    print(i)  
    i = i + 1  
    if(i > 5):  
        break  

Вывод:

1  
2  
3  
4  
5  

New Documentation

Вероятно, вы уже знакомы с оператором if и конструкциями if-else и if-elif-else. Теперь пришел черед для изучения циклов (loops). В статье рассмотрим простейшие конструкции с циклами for и while, инструкции для их прерывания и продолжения (break и continue соответственно), а также приведем примеры использования операторов if-elif-else для создания дополнительных условий.

Python

Циклические задачи — неотъемлемая часть нашей жизни. Типичный пример: покупка продуктов по списку. Мы смотрим в список, ищем нужный продукт и кладем его в корзину, затем переходим ко второму пункту и повторяем ту же самую операцию до конца списка, после чего (выходим из программы) выбрасываем список и переходим к следующей (части кода) задаче. После выполнения последнего пункта список выбрасывается. Примерно так же работают циклы и в программировании: программа продолжит выполнять определенный кусок кода до тех пор, пока соблюдается какое-то условие, заданное для этого куска или, как говорят программисты, тела цикла.

Условия задаются при помощи специальных операторов (while или for, конструкции с которыми мы и рассмотрим), а однократное выполнение тела цикла называется итерацией. Итераций может быть сколько угодно, и они будут выполняться до тех пор, пока условие истинно. Если допустить логическую ошибку при написании кода, то итерации рискуют стать бесконечными. В таких случаях говорят о бесконечном цикле, который, впрочем, можно вызывать и намеренно.

Цикл for в языке программирования Python

Оператор for в циклическом программировании нужен для перебора известного количества значений в списке. For — один из главных помощников программиста Python, он позволит сэкономить кучу времени благодаря тому, что вам не придется много раз перепечатывать однотипный код. Но довольно теории, давайте напишем код, чтобы было понятнее, что делает for:

word = "timeweb"
for letter in word:
    print (letter)

Получаем такой результат:

t
i
m
e
w
e
b

То есть программа перебирает все элементы, в данном случае символы, составляющие строку, и выдает их в виде последовательности. Но это могут быть и элементы списка (список создается при помощи символов [ ], а его элементы перечисляются через запятую. Давайте для примера возьмем тот самый список продуктов и выведем его на экран:

products = ['молоко', 'хлеб', 'яйца', 'колбаса', 'сахар', 'мука']
for element in products:
    print (element)

молоко
хлеб
яйца
колбаса
сахар
мука

Теперь несколько замечаний для новичков по приведенным выше примерам кода:

  • Не забывайте про отступы, которые нужно делать для инструкций в теле цикла после главных строк с операторами for и while.
  • Кавычки для корректного обозначения строк и элементов можно ставить как одинарные, так и двойные (для наглядности привели оба типа), но на практике лучше пользоваться каким-то одним вариантом, чтобы не ухудшать читаемость кода.
  • Для обозначения счетчиков программисты обычно используют переменные i и j, но никто не запрещает маркировать их иначе. В данных примерах для наглядности мы намеренно обозначили счетчики как letter и element, чтобы было понятно, какие именно значения они перебирают.

Цикл while в Python 3

Функция оператора while иная, и проще всего ее понять, переведя слово while на русский: «до тех пор, пока». Это значит, что до тех пор, пока условие, вводимое while, истинное, тело цикла продолжит выполняться, при этом количество итераций заранее не известно (в отличие от циклов с оператором for). Пример:

number = 1
while number < 10:
    print (number)
    number += 2
print ('Следующее значение больше 10, поэтому счет прервался.')

Вот результат выполнения кода:

1
3
5
7
9
Следующее значение больше 10, поэтому счет прервался.

Одна из особенностей Python в том, что этот язык максимально наглядный, и какую работу выполняет код, часто понятно без подробных пояснений. В данном случае код можно расшифровать так: мы присвоили переменной number значение 1 и создали условие — до тех пор пока значение меньше 10, тело цикла будет выполняться. В теле создали две инструкции, одну видимую (выводить на экран очередное значение), а другая прибавляет к значению переменной указанное число и перезаписывает это значение. Для наглядности можно было бы переписать эту строку так:

number = number + 2

Записи x = x + 2 и x += 2 равнозначны (Python в некоторых случаях допускает использовать разный код для выполнения одних и тех же действий).

Как только условие, введенное оператором while, перестает быть истинным (number становится больше 10), тело цикла перестает выполняться, и программа переходит к заключительной строке (заметьте, что она расположена на другом уровне, поэтому не имеет отступа), а на экран выводится сообщение:

Следующее значение больше 10, поэтому счет прервался.

Использование конструкций if-elif-else с операторами цикла

Теперь рассмотрим более сложные и функциональные примеры конструкций с while, которые создаются с использованием операторов if, elif и else. Чтобы лучше понимать код с ними, удобно переводить их так:

  • if — «если»;
  • elif — «а если»;
  • else — «в противном случае».

Приведем наглядный пример:

x = 0
while x < 10:
    if x == 0:
        print (x, "Выполняется условие оператора if")
        x += 1
    elif x <= 5:
        print (x, "Выполняется условие первого оператора elif")
        x += 1
    elif x > 5 and x < 9:
        print (x, "Выполняется условие второго оператора elif")
       x += 1
    else:
        print (x, "Выполняется условие оператора else")
        x += 1
print ("Вот и посчитали.")

Вот что получилось:

0 Выполняется условие оператора if
1 Выполняется условие первого оператора elif

6 Выполняется условие второго оператора elif

9 Выполняется условие оператора else
Вот и посчитали.

Разбираем. После присвоения переменной x значения 0 создаем условие для цикла while, а с помощью операторов if, elif и else добавляем набор условий, при которых на экран будет выводиться определенный текст. Условие if срабатывает тогда, когда значение x равно нулю, первый elif — при x меньше или равно пяти. В случае со вторым elif мы также использовали оператор and, добавляющий дополнительное условие, чтобы пользователь увидел и текст, который выводится при выполнении условия else. Python проверяет истинность условий последовательно, поэтому, если какое-то условие выше по списку будет оставаться истинным до последней итерации, инструкции тех условий, которые расположены ниже, выполняться не будут.

Инструкции break и continue

Инструкции break и continue дают дополнительные возможности для работы с циклами. Вот что они делают:

  • break служит для прерывания цикла;
  • continue — для пропуска определенной итерации и перехода к следующей, но без завершения цикла.

Для примера работы инструкции break давайте слегка изменим код из предыдущей части и попробуем выполнить его:

x = 0
while x < 10:
    if x == 0:
        print (x, "Выполняется условие оператора if")
        x += 1
    elif x <= 5:
        print (x, "Выполняется условие первого оператора elif")
        x += 1
    elif x > 5 and x < 9:
        print (x, "Выполняется условие второго оператора elif")
        x += 1
    else:
        print (x, "Выполняется условие оператора else")
print ("Вот и посчитали.")

Мы убрали строку с инструкцией x += 1 после оператора условия else и попали в бесконечный цикл! Конечно, можно просто вернуть ее, но можно сделать и так:

x = 0
while x < 10:

    else:
        print (x, "Выполняется условие оператора else")
        break
print ("Вот и посчитали.")

Теперь после добавления команды break при выполнении условия else цикл перестанет быть бесконечным, и на экране появится последнее сообщение (Вот и посчитали).

А вот пример, как работает инструкция continue:

products = ['молоко', 'хлеб', 'яйца', 'колбаса', 'сахар', 'мука']
print ('Нужно купить:')
print ()
for element in products:
    if element == 'колбаса':
        continue
    print (element)
print ()
print ('А колбасу мы уже купили.')

Результат работы программы:

Нужно купить:
молоко
хлеб
яйца
сахар
мука

А колбасу мы уже купили.

Как видим, колбасы в списке уже нет: как только программа доходит до нее, в дело вступает команда continue, предписывающая игнорировать этот пункт. Но цикл при этом не прерывается, поэтому остальные продукты из списка тоже выводятся на экран.

Вложенные циклы в Python

Также с помощью операторов циклов можно создавать вложенные циклы в Python 3. Пример:

for i in range (1, 4):
    for j in range (1, 4):
        print (i * j, end=" ")
    print ()

Результат работы программы:

1 2 3
2 4 6
3 6 9

Вы уже наверняка догадались, что таким образом достигается последовательное перемножение чисел (за это отвечает инструкция i * j в инструкции для вложенного цикла for, а код end=» « выводит полученные значения с пробелами). Нижняя инструкция с функцией print (), относящаяся к основному циклу for (это реализовано с помощью отступов), тоже нужна для наглядности: в этом случае программа выведет полученные значения в столбик.

Также у новичков может возникнуть вопрос, почему в выводе нет строки 4 8 12? Это особенность встроенной функции range, задающей диапазон значений: последнее число она не включает, поэтому, чтобы указанная выше строчка появилась, код должен быть написан так:

for i in range (1, 5):

    for j in range (1, 4):
        print (i * j, end=" ")
    print ()

1 2 3 
2 4 6 
3 6 9 
4 8 12 

Подведем итоги

Итак, в этом небольшом уроке мы познакомились с циклами for и while, узнали, как использовать вместе с ними условные конструкции if-elif-else, а также применять инструкции break и continue. Немного практики, и вы сможете писать более сложный код, чем был представлен в наших примерах. Удачи!

Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.

Содержание:развернуть

  • Применение циклов
  • Итерации
  • Синтаксис for
  • range() и enumerate()
  • break и continue
  • else
  • Best practice
  • Цикл по списку

  • Цикл по словарю

  • Цикл по строке

  • Как сделать цикл for с шагом

  • Обратный цикл for

  • for в одну строку

Циклы являются мощнейшим инструментом, предоставляемым высокоуровневыми языками программирования. Эти управляющие конструкции позволяют многократно выполнять требуемую последовательность инструкций. Циклы в языке Python представлены двумя основными конструкциями: while и for.

Подробнее о циклах while вы можете прочитать здесь:

Применение циклов

Концепция циклов — это не просто очередная абстрактная выдумка программистов. Повторяющиеся раз за разом операции окружают нас и в реальной жизни:

🥣 добавление щепотки приправ в варящийся бульон и помешивание его до тех пор, пока пакетик специй не закончится.

🕙 следование строгому расписанию каждый будний день, пока не наступят долгожданные выходные.

🌄 даже банальная смена времён года.

— всё это циклы, и представить нормальную жизнь без них попросту невозможно.

Впрочем, то же касается и программирования. Представьте, что вам нужно последовательно напечатать числа от 1 до 9999999999. В отсутствии циклов, эту задачу пришлось бы выполнять ручками, что потребовало бы колоссального количества кода и огромных временных затрат:

print(1)
print(2)
print(3)
# ...
# 9999999995 строк
# ...
print(9999999998)
print(9999999999)

Циклы же позволяют уместить такую многокилометровую запись в изящную и простую для понимания конструкцию, состоящую всего из двух строчек:

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

Смысл её крайне прост. В основе цикла for лежат последовательности, и в примере выше это последовательность чисел от 1 до 9999999999. for поэлементно её перебирает и выполняет код, который записан в теле цикла. В частности, для решения данной задачи туда была помещена инструкция, позволяющая выводить значение элемента последовательности на экран.

Итерации

  • Итерация (Iteration) — это одно из повторений цикла (один шаг или один «виток» циклического процесса). К примеру цикл из 3-х повторений можно представить как 3 итерации.
  • Итерируемый объект (Iterable) — объект, который можно повторять. Проще говоря это объект, который умеет отдавать по одному результату за каждую итерацию.
  • Итератор (iterator) — итерируемый объект, в рамках которого реализован метод __next__, позволяющий получать следующий элемент.

👉 Чтобы выполнить итерацию, Python делает следующее:

  • Вызывает у итерируемого объекта метод iter(), тем самым получая итератор.
  • Вызывает метод next(), чтобы получить каждый элемент от итератора.
  • Когда метод next возвращает исключение StopIteration, цикл останавливается.

Схема работы цикла «for» в Python

Пример создания итерируемого объекта
Для того чтобы создать собственный класс итерируемого объекта, нужно всего лишь внутри него реализовать два метода: __iter__() и __next__():

  • внутри метода __next__ () описывается процедура возврата следующего доступного элемента;
  • метод __iter__() возвращает сам объект, что даёт возможность использовать его, например, в циклах с поэлементным перебором.

Создадим простой строковый итератор, который на каждой итерации, при получении следующего элемента (т.е. символа), приводит его к верхнему регистру:

class ToUpperCase:
def __init__(self, string_obj, position=0):
"""сохраняем строку, полученную из конструктора,
в поле string_obj и задаём начальный индекс"""
self.string_obj = string_obj
self.position = position

def __iter__(self):
""" возвращаем сам объект """
return self

def __next__(self):
""" метод возвращает следующий элемент,
но уже приведенный к верхнему регистру """
if self.position >= len(self.string_obj):
# исключение StopIteration() сообщает циклу for о завершении
raise StopIteration()
position = self.position
# инкрементируем индекс
self.position += 1
# возвращаем символ в uppercase-e
return self.string_obj[position].upper()

low_python = "python"
high_python = ToUpperCase(low_python)
for ch in high_python:
print(ch, end="")

> PYTHON

Синтаксис for

Как было замечено, цикл for python — есть средство для перебора последовательностей. С его помощью можно совершать обход строк, списков, кортежей и описанных выше итерируемых объектов.

В простейшем случае он выглядит так:

for item in collection:
# do something

Если последовательность collection состоит, скажем, из 10 элементов, for будет поочерёдно обходить их, храня значение текущего элемента в переменной item.

Принцип работы for максимально схож с таковым у циклов foreach, применяемых во многих других высокоуровневых языках.

aliceQuote = "The best way to explain it is to do it."
# с помощью цикла for посчитаем количество символов (с пробелами) в строке
# зададим счетчик
count = 0
# будем посимвольно обходить весь текст
for letter in aliceQuote:
# на каждой новой итерации:
# в переменной letter будет храниться следующий символ предложения;
# увеличиваем счетчик на 1;
count += 1

print(count)
> 39

range() и enumerate()

Вы уже наверняка запомнили, что for работает с последовательностями. В программировании очень часто приходится повторять какую-то операцию фиксированное количество раз. А где упоминается «количество чего-то», существует и последовательность, числовая.

👉 Для того чтобы выполнить какую-либо инструкцию строго определенное число раз, воспользуемся функцией range():

# скажем Миру привет целых пять раз!
for i in range(5):
print("Hello World!")

>
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

range() можно представлять, как функцию, что возвращает последовательность чисел, регулируемую количеством переданных в неё аргументов. Их может быть 1, 2 или 3:

  • range(stop);
  • range(start, stop);
  • range(start, stop, step).

Здесь start — это первый элемент последовательности (включительно), stop — последний (не включительно), а step — разность между следующим и предыдущим членами последовательности.

# 0 - начальный элемент по умолчанию
for a in range(3):
print(a)

>
0
1
2

# два аргумента
for b in range(7, 10):
print(b)

>
7
8
9

# три аргумента
for c in range(0, 13, 3):
print(c)

>
0
3
6
9
12

Подробнее о функции range тут:

👉 Чрезвычайно полезная функция enumerate() определена на множестве итерируемых объектов и служит для создания кортежей на основании каждого из элементов объекта. Кортежи строятся по принципу (индекс элемента, элемент), что бывает крайне удобно, когда помимо самих элементов требуется ещё и их индекс.

# заменим каждый пятый символ предложения, начиная с 0-го, на *
text = "Это не те дроиды, которых вы ищете"
new_text = ""
for char in enumerate(text):
if char[0] % 5 == 0:
new_text += '*'
else:
new_text += char[1]
print(new_text)

> *то н* те *роид*, ко*орых*вы и*ете

break и continue

Два похожих оператора, которые можно встретить и в других языках программирования.

  • break — прерывает цикл и выходит из него;
  • continue — прерывает текущую итерацию и переходит к следующей.

# break
for num in range(40, 51):
if num == 45:
break
print(num)

>
40
41
42
43
44

Здесь видно, как цикл, дойдя до числа 45 и вернув истину в условном выражении, прерывается и заканчивает свою работу.

# continue
for num in range(40, 51):
if num == 45:
continue
print(num)

>
40
41
42
43
44
46
47
48
49
50

В случае continue происходит похожая ситуация, только прерывается лишь одна итерация, а сам же цикл продолжается.

else

Если два предыдущих оператора можно часто встречать за пределами Python, то else, как составная часть цикла, куда более редкий зверь. Эта часть напрямую связана с оператором break и выполняется лишь тогда, когда выход из цикла был произведен НЕ через break.

group_of_students = [21, 18, 19, 21, 18]
for age in group_of_students:
if age < 18:
break
else:
print('Всё в порядке, они совершеннолетние')

> Всё в порядке, они совершеннолетние

Best practice

Цикл по списку

Перебрать list в цикле не составляет никакого труда, поскольку список — объект итерируемый:

# есть список
entities_of_warp = ["Tzeench", "Slaanesh", "Khorne", "Nurgle"]
# просто берём список, «загружаем» его в цикл и без всякой задней мысли делаем обход
for entity in entities_of_warp:
print(entity)

>
Tzeench
Slaanesh
Khorne
Nurgle

Так как элементами списков могут быть другие итерируемые объекты, то стоит упомянуть и о вложенных циклах. Цикл внутри цикла вполне обыденное явление, и хоть количество уровней вложенности не имеет пределов, злоупотреблять этим не следует. Циклы свыше второго уровня вложенности крайне тяжело воспринимаются и читаются.

strange_phonebook = [
["Alex", "Andrew", "Aya", "Azazel"],
["Barry", "Bill", "Brave", "Byanka"],
["Casey", "Chad", "Claire", "Cuddy"],
["Dana", "Ditrich", "Dmitry", "Donovan"]
]
# это список списков, где каждый подсписок состоит из строк
# следовательно можно (зачем-то) применить тройной for
# для посимвольного чтения всех имён
# и вывода их в одну строку
for letter in strange_phonebook:
for name in letter:
for character in name:
print(character, end='')

> A l e x A n d r e w A y a A z a z e l B a r ...

Цикл по словарю

Чуть более сложный пример связан с итерированием словарей. Обычно, при переборе словаря, нужно получать и ключ и значение. Для этого существует метод .items(), который создает представление в виде кортежа для каждого словарного элемента.

Цикл, в таком случае, будет выглядеть следующим образом:

# создадим словарь
top_10_largest_lakes = {
"Caspian Sea": "Saline",
"Superior": "Freshwater",
"Victoria": "Freshwater",
"Huron": "Freshwater",
}

# обойдём его в цикле for и посчитаем количество озер с солёной водой и количество озёр с пресной
salt = 0
fresh = 0
# пара "lake, water", в данном случае, есть распакованный кортеж, где lake - ключ словаря, а water - значение.
# цикл, соответственно, обходит не сам словарь, а его представление в виде пар кортежей
for lake, water in top_10_largest_lakes.items():
if water == 'Freshwater':
fresh += 1
else:
salt += 1
print("Amount of saline lakes in top10: ", salt)
print("Amount of freshwater lakes in top10: ", fresh)

> Amount of saline lakes in top10: 1
> Amount of freshwater lakes in top10: 3

Цикл по строке

Строки, по сути своей — весьма простые последовательности, состоящие из символов. Поэтому обходить их в цикле тоже совсем несложно.

word = 'Alabama'
for w in word:
print(w, end=" ")

> A l a b a m a

Как сделать цикл for с шагом

Цикл for с шагом создается при помощи уже известной нам функции range, куда, в качестве третьего по счету аргумента, нужно передать размер шага:

# выведем числа от 100 до 1000 с шагом 150
for nums in range(100, 1000, 150):
print(nums)

>
100
250
400
550
700
850

Обратный цикл for

Если вы еще не убедились в том, что range() полезна, то вот ещё пример: благодаря этой функции можно взять и обойти последовательность в обратном направлении.

# выведем числа от 40 до 50 по убыванию
# для этого установим step -1
for nums in range(50, 39, -1):
print(nums)

>
50
49
48
47
46
45
44
43
42
41
40

for в одну строку

Крутая питоновская фишка, основанная на так называемых list comprehensions или, по-русски, генераторов. Их запись, быть может, несколько сложнее для понимания, зато очевидно короче и, по некоторым данным, она работает заметно быстрее на больших массивах данных.

В общем виде генератор выглядит так:

[результирующее выражение | цикл | опциональное условие]

Приведем пример, в котором продублируем каждый символ строки inputString:

# здесь letter * 2 — результирующее выражение; for letter in inputString — цикл, а необязательное условие опущено
double_letter = [letter * 2 for letter in "Banana"]

print(double_letter)
> ['BB', 'aa', 'nn', 'aa', 'nn', 'aa']

Другой пример, но теперь уже с условием:

# создадим список, что будет состоять из четных чисел от нуля до тридцати
# здесь if x % 2 == 0 — необязательное условие
even_nums = [x for x in range(30) if x % 2 == 0]

print(even_nums)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]

Время на прочтение
4 мин

Количество просмотров 67K

Цикл for — самый базовый инструмент потока управления большинства языков программирования. Например, простой цикл for на C выглядит так:

int i;
for (i=0;i<N;i++)
{
  //do something
}

Не существует более изящного способа написания цикла for на C. В сложных случаях обычно приходится писать уродливые вложенные циклы или задавать множество вспомогательных переменных (например, как i в показанном выше коде).

К счастью, в Python всё более удобно. В этом языке есть множество хитростей, позволяющих писать более изящные циклы, которые упрощают нашу жизнь. В Python вполне можно избежать вложенных циклов и вспомогательных переменных, и мы даже можем самостоятельно настраивать цикл for.

Эта статья познакомит вас с самыми полезными трюками по написанию циклов на Python. Надеюсь, она поможет вам ощутить красоту этого языка.

Одновременно получаем значения и индексы

Частым примером использования цикла for является получение индексов и значений из списка. Когда я начинал изучать Python, то писал свой код таким образом:

for i in range(len(my_list)):
    print(i, my_list[i])

Разумеется, он работал. Но это решение не в стиле Python. Спустя несколько месяцев я узнал стандартный способ реализации в стиле Python:

for i, v in enumerate(my_list):
    print(i, v)

Как мы видим, встроенная функция enumerate упрощает нам жизнь.

Как избежать вложенных циклов с помощью функции Product

Вложенные циклы — это настоящая головная боль. Они могут снизить читаемость кода и усложнить его понимание. Например, прерывание вложенных циклов обычно реализовать не так просто. Нам нужно знать, где прерван самый внутренний цикл, второй по порядку внутренний цикл, и так далее.

К счастью, в Python существует потрясающая функция product из встроенного модуля itertools. Мы можем использовать её, чтобы не писать множество вложенных циклов.

Давайте убедимся в её полезности на простом примере:

list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a in list_a:
    for b in list_b:
        for c in list_c:
            if a + b + c == 2077:
                print(a, b, c)
# 70 2000 7

Как мы видим, нам требуется три вложенных цикла, чтобы получить из трёх списков три числа, сумма которых равна 2077. Код не очень красив.

А теперь давайте попробуем использовать функцию product.

from itertools import product

list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a, b, c in product(list_a, list_b, list_c):
    if a + b + c == 2077:
        print(a, b, c)
# 70 2000 7

Как мы видим, благодаря использованию функции product достаточно всего одного цикла.

Так как функция product генерирует прямое произведение входящих итерируемых данных, она позволяет нам во многих случаях избежать вложенных циклов.

Используем модуль Itertools для написания красивых циклов

На самом деле, функция product — это только вершина айсберга. Если вы изучите встроенный модуль Python itertools, то перед вами откроется целый новый мир. Этот набор инструментов содержит множество полезных методов, покрывающих наши потребности при работе с циклами. Их полный список можно найти в официальной документации. Давайте рассмотрим несколько примеров.

Создаём бесконечный цикл

Существует не меньше трёх способов создания бесконечного цикла:

1. При помощи функции count:

natural_num = itertools.count(1)
for n in natural_num:
    print(n)
# 1,2,3,...

2. Функцией cycle:

many_yang = itertools.cycle('Yang')
for y in many_yang:
    print(y)
# 'Y','a','n','g','Y','a','n','g',...

3. Через функцию repeat:

many_yang = itertools.repeat('Yang')
for y in many_yang:
    print(y)
# 'Yang','Yang',...

Комбинируем несколько итераторов в один

Функция chain() позволяет объединить несколько итераторов в один.

from itertools import chain

list_a = [1, 22]
list_b = [7, 20]
list_c = [3, 70]

for i in chain(list_a, list_b, list_c):
    print(i)
# 1,22,7,20,3,70

Выделяем соседние дублирующиеся элементы

Функция groupby используется для выделения соседних дублирующихся элементов в итераторе и их соединения.

from itertools import groupby

for key, group in groupby('YAaANNGGG'):
    print(key, list(group))
# Y ['Y']
# A ['A']
# a ['a']
# A ['A']
# N ['N', 'N']
# G ['G', 'G', 'G']

Как показано выше, соседние одинаковые символы соединены вместе. Более того, мы можем указать функции groupby способ определения идентичности двух элементов:

from itertools import groupby

for key, group in groupby('YAaANNGGG', lambda x: x.upper()):
    print(key, list(group))
# Y ['Y']
# A ['A', 'a', 'A']
# N ['N', 'N']
# G ['G', 'G', 'G']

Самостоятельно настраиваем цикл

Изучив представленные выше примеры, давайте задумаемся о том, почему циклы for в Python настолько гибки и изящны. Насколько я понимаю, это из-за того, что мы можем применять в итераторе цикла for функции. Во всех рассмотренных выше примерах в итераторе всего лишь используются специальные функции. Все трюки имеют одинаковый шаблон:

for x in function(iterator)

Сам встроенный модуль itertools всего лишь реализует за нас самые распространённые функции. Если мы забудем функцию или не сможем найти нужную нам, то можем просто написать её самостоятельно. Если быть более точным, то эти функции являются генераторами. Именно поэтому мы можем генерировать с их помощью бесконечные циклы.

По сути, мы можем настроить цикл for под себя, как сделали бы это с настраиваемым генератором.

Давайте рассмотрим простой пример:

def even_only(num):
    for i in num:
        if i % 2 == 0:
            yield i


my_list = [1, 9, 3, 4, 2, 5]
for n in even_only(my_list):
    print(n)
# 4
# 2

Как видно из приведённого выше примера, мы определили генератор под названием even_only. Если мы используем этот генератор в цикле for, итерация будет происходить только для чётных чисел из списка.

Разумеется, этот пример приведён только для объяснения. Существуют и другие способы выполнения тех же действий, например, использование представления списков.

my_list = [1, 9, 3, 4, 2, 5]
for n in (i for i in my_list if not i % 2):
    print(n)
# 4
# 2

Вывод

Задачу создания циклов на Python можно решать очень гибко и изящно. Чтобы писать удобные и простые циклы, мы можем использовать встроенные инструменты или даже самостоятельно определять генераторы.


На правах рекламы

Надёжный сервер в аренду, создавайте свою конфигурацию в пару кликов и начинайте работать уже через минуту. Всё будет работать без сбоев и с очень высоким uptime!

Присоединяйтесь к нашему чату в Telegram.

Понравилась статья? Поделить с друзьями:
  • Как найти через адрес фамилию
  • Как пишеться составишь
  • Как найти бога в исламе
  • Как составить европротокол при дпс
  • Как составить акт суммы ущерба