## ++Тема 4++<br>Циклы с заданным количеством повторений
(c) Яценко Р.Н., 2019-2020
---
### 1. Цикл for
----
### Цикл с параметром for
- Цикл `for`, также называемый циклом со счетчиком, в языке Python богат возможностями
- В цикле for указывается переменная и множество значений, которое будет принимать переменная
- Множество значений может быть задано списком, строкой или диапазоном (например, от 1 до 10)
----
### Синтаксис цикла for
```python
for item in list:
Тело цикла
[else:
Выражение]
```
- `item` -- параметр цикла
- `list` -- имя последовательности (например, списка) или вызов функции range()
----
### Пример 1. Цвета радуги
```python
i = 1
# заголовок цикла
for color in 'red', 'orange', 'yellow', 'green',
'cyan', 'blue', 'violet':
# тело цикла
print('#', i, ' color of rainbow is ', color, sep = '')
i += 1
```
----
<iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=i%20%3D%201%0A%23%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B0%0Afor%20color%20in%20'red',%20'orange',%20'yellow',%20'green',%20'cyan',%20'blue',%20'violet'%3A%0A%20%20%20%20%23%20%D1%82%D0%B5%D0%BB%D0%BE%20%D1%86%D0%B8%D0%BA%D0%BB%D0%B0%0A%20%20%20%20print%28'%23',%20i,%20'%20color%20of%20rainbow%20is%20',%20color,%20sep%20%3D%20''%29%0A%20%20%20%20i%20%2B%3D%201&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe>
----
### Пример 2. Список значений
```python
for i in 1, 2, 3, 'one', 'two', 'three':
print(i)
```
```
1
2
3
one
two
three
```
---
## 2. Функция range
----
### Заданное число раз
- Как правило, циклы `for` используются либо для повторения какой-либо последовательности действий заданное число раз, либо для изменения значения переменной в цикле от некоторого начального значения до некоторого конечного
- Для повторения цикла некоторое заданное число `n` раз можно использовать цикл `for` вместе с функцией `range`
----
### Пример 3. Функция range
```python
for i in range(4): # равносильно инструкции for i in 0, 1, 2, 3:
# здесь можно выполнять циклические действия
print(i)
print(i ** 2)
# цикл закончился, поскольку закончился блок с отступом
```
----
<iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=for%20i%20in%20range%284%29%3A%0A%20%20%20%20print%28i%29%0A%20%20%20%20print%28i%20**%202%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe>
----
### Диапазон значений
- Функция `range` может также принимать не один, а два параметра
- Вызов `range(a, b)` означает, что индексная переменная (счетчик) будеть принимать значения от `a` до `b - 1`:
- первый параметр функции `range` задает начальное значение счетчика
- второй параметр — первое значение, которое счетчик принимать **не будет**
----
### Пример 4. Сумма чисел от 1 до n
```python
sum = 0
n = 5
for i in range(1, n + 1):
sum += i
print(sum)
```
----
<iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=sum%20%3D%200%0An%20%3D%205%0Afor%20i%20in%20range%281,%20n%20%2B%201%29%3A%0A%20%20%20%20sum%20%2B%3D%20i%0Aprint%28sum%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe>
----
### Цикл с заданным шагом
Чтобы организовать цикл, в котором счетчик будет изменяться на заданный шаг, необходимо использовать третий параметр функции `range` -- величину изменения счетчика
```python
range(начальное значение, конечное значение + 1, шаг)
```
----
### Примеры циклов с заданным шагом
- Цикл по всем числам от 100 до 1
`range(100, 0, -1)`
- Цикл по всем нечетным числам от 1 до 99
`range(1, 100, 2)`
----
### Пример 5. Использование функции range
```python
print("Посчитаем:")
for i in range(10):
print(i, end=" ")
print("Перечисли кратные пяти:")
for i in range(0, 50, 5):
print(i, end=" ")
print("Посчитаем в обратном порядке:")
for i in range(10, 0, -1):
print(i, end=" ")
```
```
Посчитаем:
0 1 2 3 4 5 6 7 8 9
Перечисли кратные пяти:
0 5 10 15 20 25 30 35 40 45
Посчитаем в обратном порядке:
10 9 8 7 6 5 4 3 2 1
```
----
### Пример 6. Создать последовательность нечетных чисел от 1 до n, включительно, если n нечетное
```python
n = int(input('n = '))
for j in range(1, n, 2):
print(j, end=' ')
else:
if n % 2:
print(n)
```
----
<iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=n%20%3D%20int%28input%28'n%20%3D%20'%29%29%20%23%20n%20%3D%2025%0Afor%20j%20in%20range%281,%20n,%202%29%3A%0A%20%20%20%20print%28j,%20end%3D'%20'%29%0Aelse%3A%0A%20%20%20%20if%20n%20%25%202%3A%0A%20%20%20%20%20%20%20%20print%28n%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe>
---
## 3. Случайные числа
----
### Импорт модуля random
*Модули* -- это библиотеки, содержащие код, пригодный для использования в других программах. Так, модуль `random` содержит функции, связанные с генерацией случайных чисел и получением случайных результатов
В начале программы пишем
```python
import random
```
----
### Случайное число
Функция `random.randint(a, b)` возвращает случайное целое число от `a` до `b` :
```python
# случайное число от 1 до 10
x = random.randint(1, 10)
```
----
### Пример 7. Кости
```python
import random
# создаем случайные числа из диапазона 1 - 6
die1 = random.randint(1, 6)
die2 = random.randint(1, 6)
total = die1 + die2
print("При вашем броске выпало", die1, "и", die2, "очков")
print("В сумме", total)
```
----
<iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=import%20random%0A%0A%23%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%20%D0%B8%D0%B7%20%D0%B4%D0%B8%D0%B0%D0%BF%D0%B0%D0%B7%D0%BE%D0%BD%D0%B0%201%20-%206%0Adie1%20%3D%20random.randint%281,%206%29%20%0Adie2%20%3D%20random.randint%281,%206%29%20%0A%0Atotal%20%3D%20die1%20%2B%20die2%0A%0Aprint%28%22%D0%9F%D1%80%D0%B8%20%D0%B2%D0%B0%D1%88%D0%B5%D0%BC%20%D0%B1%D1%80%D0%BE%D1%81%D0%BA%D0%B5%20%D0%B2%D1%8B%D0%BF%D0%B0%D0%BB%D0%BE%22,%20die1,%20%22%D0%B8%22,%20die2,%20%22%D0%BE%D1%87%D0%BA%D0%BE%D0%B2%22%29%0Aprint%28%22%D0%92%20%D1%81%D1%83%D0%BC%D0%BC%D0%B5%22,%20total%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe>
---
## 4. Циклы for вложенные друг в друга
----
### Вложенные циклы
- Циклы for могут быть вложенными друг в друга
- Глубина вложенности может быть сколько угодно большая, но допускать этого не следует, поскольку с увеличением глубины вложенности сложность программы возрастает и она становится плохо читаема
----
### Пример 8. Таблица Пифагора
```python
for j in range(1, 11):
for k in range(1, 11):
print('%4d' % (j * k), end='')
print()
```
```
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
```
----
### Пример 9. Уравнение
Дано целое n. Вывести все тройки чисел $x$, $y$ и $z$ для которых $x^2+y^2+z^2=n$
```python
from math import sqrt
n = int(input('n = ')) # n = 99
m = int(sqrt(n)) + 1
for x in range(m):
for y in range(x, m):
for z in range(y, m):
if x * x + y * y + z * z == n:
print('%4d%4d%4d' % (x, y, z))
```
----
<iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=from%20math%20import%20sqrt%0An%20%3D%20int%28input%28'n%20%3D%20'%29%29%20%23%20n%20%3D%2099%0Am%20%3D%20int%28sqrt%28n%29%29%20%2B%201%0Afor%20x%20in%20range%28m%29%3A%0A%20%20%20%20for%20y%20in%20range%28x,%20m%29%3A%0A%20%20%20%20%20%20%20%20for%20z%20in%20range%28y,%20m%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20x%20*%20x%20%2B%20y%20*%20y%20%2B%20z%20*%20z%20%3D%3D%20n%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print%28'%254d%254d%254d'%20%25%20%28x,%20y,%20z%29%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe>
---
## Спасибо за внимание!

(c) Яценко Р.Н., 2019-2020
{"metaMigratedAt":"2023-06-15T13:20:09.193Z","metaMigratedFrom":"YAML","title":"Тема 4. Циклы с заданным количеством повторений","breaks":false,"slideOptions":"{\"allottedMinutes\":80,\"slideNumber\":\"c\",\"theme\":\"beige\",\"transition\":\"slide\",\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"93a8c43f-1b5b-4461-9101-89b183ccbc1c\",\"add\":10808,\"del\":1324}]"}