Skip to content

Commit 814ac7c

Browse files
committed
Добавил статью по основным управляющим конструкциям
1 parent 15b5a7b commit 814ac7c

1 file changed

Lines changed: 99 additions & 0 deletions

File tree

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
### Коротко о главных управляющих конструкциях
2+
3+
Сейчас мы совсем реактивно пройдёмся по самым основным управляющим конструкциям. Гет реди.
4+
5+
6+
### if
7+
8+
Ну, вы все знаете условный оператор, так ведь?
9+
10+
:::python
11+
if age < 18:
12+
print('Никаких тебе сигарет. Ишь чего удумал!')
13+
else:
14+
print('Вам синий или красный?')
15+
16+
17+
Есть ещё `elif`, их можно сделать много в одном операторе. Это такой аналог `which` из других языков.
18+
19+
20+
### for
21+
22+
Цикл. Вместо сишного варианта с init, cond и loop выражениями, тут просто итерация по коллекции:
23+
24+
:::python
25+
for user in users:
26+
print user
27+
28+
Иногда надо не пройтись по списку, а выполнить одну и ту же операцию много раз. Тогда хорошо подходит функция
29+
[range](https://docs.python.org/3.5/library/functions.html#func-range). Она возвращает целые числа в заданном промежутке,
30+
поэтому в цикле её можно использовать так:
31+
32+
:::python
33+
for level_num in range(10):
34+
user.levelup() # пользователь получит десять уровней. Читер!
35+
36+
А вот `break` и `continue` делают то же, что в Паскале и Сях. `break` прерывает выполнение цикла,
37+
`continue` завершает текущую итерацию и переходит к следующей.
38+
39+
Ещё у цикла есть `else`, но про него почти никто не знает. Как он работает можно посмотреть
40+
[в официальной документации](https://docs.python.org/3.5/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops).
41+
42+
43+
### def
44+
45+
Начало объявления функции. После него идёт название,
46+
потом – аргументы функции в скобках, двоеточие и тело функции с отступом:
47+
48+
:::python
49+
def get_square(value):
50+
return value ** 2
51+
52+
То, что после `return` – это возвращаемое значение функции.
53+
54+
Функцию создали, вот как её теперь использовать:
55+
56+
:::python
57+
print(get_square(2)) # 4
58+
print(get_square(6)) # 36
59+
print(get_square('ыыы')) # всё сломается
60+
61+
А вот пример посложнее, из исходников Девмана. Получает пользователя по айди в Слаке:
62+
63+
:::python
64+
def _get_user_by_slack_id(slack_user_id):
65+
user_email = get_slack_email_for_user(slack_user_id)
66+
return User.objects.filter(email__iexact=user_email).first()
67+
68+
(вот почему емейл необходим)
69+
70+
71+
### range
72+
73+
Функция очень полезная, поэтому про неё отдельно. `range` генерирует целые числа в заданном диапазоне. Например:
74+
75+
:::python
76+
range(10) # 0..0
77+
range(5, 10) # 5..9
78+
range(5, 10, 2) # [5, 7, 9] (от пяти до девяти с шагом два)
79+
80+
Фишка этой функции заключается в том, что она не создаёт список со всеми числами.
81+
Вместо этого он вернёт объект, который будет возвращать элементы как только они нужны, по одному.
82+
Поэтому код `range(9999999999999)` не съест всю память.
83+
Этот хитрый объект (Sequence ABC, но об этом потом) можно превратить в список явно:
84+
85+
:::python
86+
list(range(9999999999999))
87+
88+
(не советую так делать)
89+
90+
91+
### pass
92+
93+
Блок, который ничего не делает:
94+
95+
:::python
96+
for i in range(20):
97+
pass # 20 раз сделать ничего. Очень полезно!
98+
99+
Часто используется в начальном коде для заданий: в финальной версии вместо `pass` должен быть настоящий код.

0 commit comments

Comments
 (0)