|
| 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