Skip to content

Commit d607d88

Browse files
committed
Merge branch 'python_basics_enhancements'
2 parents 25bf2f1 + d778e49 commit d607d88

9 files changed

Lines changed: 200 additions & 1 deletion

File tree

0_tutorial/14_google.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
Правильно искать информацию в сети – важно. Подберёшь неправильный запрос – не найдёшь нужной ссылки.
2+
Иногда приходится делать много попыток, чтобы найти то, что надо. Тратишь полчаса на поиск решения проблемы,
3+
а какой-нибудь Вася найдёт то же, но за один запрос.
4+
5+
В итоге правильное использование поиска не только позволяет экономить время, но и не чувствовать себя идиотом.
6+
7+
8+
> Это же чёртов поиск, написал запрос – увидел результат. Чего сложного?
9+
10+
Сложно написать запрос правильно. Оказывается, Гугл умеет много вещей, которые очень помогают искать информацию.
11+
Их надо знать и использовать.
12+
13+
Вот где о них можно узнать:
14+
15+
- [Мини-курс Power Searching With Google](https://coursebuilder.withgoogle.com/sample/course) (en). Да, у Гугла есть
16+
онлайн-курс про то, как пользоваться Гуглом (даже два курса). Видео-лекции, домашние задания. Всё серьёзно.
17+
Очень рекомендую: он короткий и очень подробный.
18+
- [Google Tips & Tricks](https://www.google.com/intl/en_us/insidesearch/tipstricks/all.html) (en).
19+
- [Как правильно искать в Google](https://habrahabr.ru/sandbox/46956/).
20+
- [Google без секретов (операторы Гугла в практических примерах)](http://it2b.ru/blog/arhiv/761.html).

0_tutorial/8_cli.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Консоль – основной способ взаимодействия разработчика с системой. С ней надо уметь взаимодействовать
2+
не хуже, чем с графическим интерфейсом.
3+
4+
А вот ресурсы, на которых есть план минимум и больше:
5+
6+
- [ШПАРГАЛКА. Команды Unix - Linux](http://forum.ubuntu.ru/index.php?topic=14535.15). Неожиданно полезная тема на форуме Убунту.
7+
- [Цикл статей на linuxrussia](http://www.linuxrussia.com/2013/08/terminal-linux-1.html).
8+
- [Unix shell: абсолютно первые шаги](https://habrahabr.ru/post/267825/).
9+
- [Туториал от университета Суррей](http://www.ee.surrey.ac.uk/Teaching/Unix/index.html) (en).
10+
- [Туториал от Райана](http://ryanstutorials.net/linuxtutorial/) (en). Есть [шпаргалка](http://ryanstutorials.net/linuxtutorial/cheatsheet.php).
11+
12+
Обрати внимание, что есть shell scripting – прямо в консоли можно городить циклы, условия и вообще писать вполне себе программы.
13+
Лучше обойти это стороной прямо сейчас: это довольно специфичный навык, которые не каждому пригождается.
14+
15+
Мне в своё время очень помогла книга ["Linux. Необходимый код и команды. Карманный справочник"](https://www.ozon.ru/context/detail/id/3178480/).
16+
Она компактная, подробная и понятная. Рекомендую.

0_tutorial/9_git.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33

44
Следующий шаг – [туториал на githowto.com](https://githowto.com/ru), он на русском и куда длиннее.
55

6-
Гитхаб – это что-то типа Фейсбука для программистов. Код вместо постов, баги вместо котиков. Идиллия.
6+
Гитхаб – это что-то типа Фейсбука для программистов. Код вместо постов, баги вместо котиков. Идиллия.
7+
Чтобы познакомиться с ним ближе, рекомендую выполнить их [Hello World](https://guides.github.com/activities/hello-world/).
8+
После можно пройти [остальные руководства от Гитхаба](https://guides.github.com/), это очень полезные навыки для разработчика.

1_python_basics/18_comments.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
Комментарии – способ прокомментировать код на ходу, на той же строке.
66

7+
:::python
78
price = Column(BigInteger) # рубли * 100
89

910

@@ -13,6 +14,7 @@
1314
Она нужна для документирования всей функции: описания входящих параметров, результата, логики, крайних случаев.
1415
Заключается в тройные двойные кавычки. Вот так:
1516

17+
:::python
1618
def tensorsolve(a, b, axes=None):
1719
"""
1820
Solve the tensor equation ``a x = b`` for x.
@@ -40,17 +42,20 @@
4042
В таком случае комментарий не несёт дополнительной информации, а просто переводит соседний код
4143
с Питона на русский/английский. Пример:
4244

45+
:::python
4346
# загружаем данные из файла data.json
4447
with open('users.json', 'r') as handler:
4548
data = json.load(handler)
4649

4750
Вот как можно исправить:
4851

52+
:::python
4953
with open('users.json', 'r') as handler:
5054
data = json.load(handler)
5155

5256
А так – ещё лучше:
5357

58+
:::python
5459
data = load_all_users_from_file()
5560

5661

@@ -59,6 +64,7 @@
5964
Другая частая ошибка: не менять комментарии при изменении кода. В примере выше мы загружали данные из файла.
6065
Через месяц взялись за голову и поселили данные в базе данных. Код стал таким:
6166

67+
:::python
6268
# загружаем данные из файла data.json
6369
data = db_session.query(User).all()
6470

@@ -71,6 +77,7 @@
7177
В таком состоянии всё поведение кажется понятным, поэтому разработчик может оставить комментарий самому себе.
7278
Проблема в том, что когда он переключится на другую задачу и забудет про детали, комментарий может взорвать мозг:
7379

80+
:::python
7481
inv(strain_tensor) - rigidity.T # правый случай
7582

7683
Правый, правда? Ну, теперь всё понятно.
@@ -94,3 +101,11 @@
94101
или `FIXME: учитывать часовой пояс`.
95102

96103
Прежде чем написать комментарий, попробуй поселить его в коде, указав параметр или дав подходящее название переменной.
104+
105+
106+
## Что изучать
107+
108+
- [Доклад Григория Петрова про комментирование исходников](https://www.youtube.com/watch?v=-SRUctRR_4s). Обязателен к просмотру.
109+
- [PEP 257](https://www.python.org/dev/peps/pep-0257/). ПЕП про докстринги.
110+
- [doctest](https://docs.python.org/3.5/library/doctest.html). Документация к модулю про доктесты.
111+
- [What is the best comment in source code you have ever encountered?](http://stackoverflow.com/questions/184618/). Шутить в коде не стоит, а вот посмеяться с чужих шуток можно. Это ж не нам поддерживать.

1_python_basics/2_base_types.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
Числа – и в Африке числа. С ними можно производить арифметические действия. Всё просто:
99

10+
:::python
1011
2 + 2 # 4
1112
3 + 2.5 # 5.5
1213
6 / 2 # 3
@@ -19,6 +20,7 @@
1920

2021
Помимо чисел в Питоне есть строки с богатым набором встроенных функций. С ними просто и удобно работать:
2122

23+
:::python
2224
'hello' # строковая константа
2325
"hello" # тип кавычек не имеет значения
2426
hello[1] # 'e'
@@ -27,6 +29,7 @@
2729

2830
У них много встроенных функций:
2931

32+
:::python
3033
'hello '.strip() # 'hello'
3134
'hello world'.upper() # 'HELLO WORLD'
3235
len('hello') # 5
@@ -43,6 +46,7 @@
4346
Элементы могут быть разных типов, даже другими списками. Выглядит он так:
4447

4548

49+
:::python
4650
[1, 2, 3] # в квадратных скобках, элементы через запятую
4751
digits = [4, 5, 6] # переменная, в которой живёт список
4852
digits[0] # 4 (нумерация с нуля)
@@ -52,6 +56,7 @@
5256
Из списка надо часто получить подсписок: несколько первых элементов, последних, что-то из середины.
5357
Это называется срезами и позволяет делать много чего. Вот самые простые срезы:
5458

59+
:::python
5560
squares = [1, 4, 9, 16, 25, 36, 49]
5661
squares[1:3] # [4, 9] (элементы со второго по третий)
5762
squares[:4] # [1, 4, 9, 16] (элементы с начала до четвёртого)
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` должен быть настоящий код.

1_python_basics/4_types.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
Ещё строки можно форматировать, причём несколькими способами. Вот один из них:
3030

31+
:::python
3132
name = 'Пётр'
3233
height = 1.865
3334
print('Привет, %s! Твой рост – %.2f м.' % (name, height))
@@ -52,6 +53,7 @@
5253
Часто бывает надо взять исходный список и сформировать из него новый, применив к каждому элементу исходного
5354
какое-то преобразование и как-то отфильтровав. Например, так:
5455

56+
:::python
5557
values = [1, 2, 3, 4, 5]
5658
new_values = []
5759
for value in values:
@@ -62,6 +64,7 @@
6264

6365
Эта операция настолько частая, что для неё есть отдельная конструкция – list comprehension. Выглядит она так:
6466

67+
:::python
6568
values = [1, 2, 3, 4, 5]
6669
new_values = [value ** 2 for value in values if value % 2]
6770

@@ -72,12 +75,14 @@
7275

7376
Словарь – это отображение одних элементов в другие. Первые называют ключами, вторые – значениями.
7477

78+
:::python
7579
user_info = {'name': 'Иван', 'level': 2}
7680
print(user_info['name']) # Иван
7781

7882

7983
Из словаря можно удалять, менять и добавлять в него элементы:
8084

85+
:::python
8186
user_info = {'name': 'Иван', 'level': 2}
8287
user_info['middle_name'] = 'Иванович'
8388
user_info['name'] = 'Грирогий'
@@ -90,15 +95,29 @@
9095
Ещё у словарей есть несколько важных методов: `keys`, `values` и `items`. Первый возвращает список только ключей,
9196
второй – список только значений, третий – список пар из ключей и значений. Удобно при итерации по словарю:
9297

98+
:::python
9399
user_info = {'name': 'Иван', 'level': 2}
94100
for key, value in user_info.items():
95101
print '%s: %s' % (key, value)
96102
# name: Иван
97103
# level: 2
98104

99105

106+
### Множества
107+
108+
Множество – это математическое множество. В нём все элементы уникальные, можно считать пересечение,
109+
проверять на вхождение и выполнять другие операции с множествами.
110+
111+
Один из частых случаев применения множеств – удаление дублей из списка:
112+
113+
:::python
114+
l = [1, 2, 1, 3, 2]
115+
print(list(set(l))) # [1, 2, 3]
116+
117+
100118
### Кортежи
101119

102120
Кортеж выглядит как список, но не совсем. Это скорее структура из C++.
103121
Отличаются от списков тем, что его элементы гетерогенные и тем, что он умеет упаковываться и распаковываться.
104122
Подробнее, например, [в документации](https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences).
123+

1_python_basics/5_modules.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,14 @@
132132
Важнее всего знать, как Питон выбирает файлы для импорта. Сначала он ищет подходящие файлы в рабочей директории,
133133
рядом с `bars.py`. Если не находит, то проходит по папкам в `sys.path` и ищет нужный файл.
134134

135+
Иногда бывает так, что нужный модуль находится вне тех папок, которые обходит Питон. Один из вариантов побороть это
136+
– вручную добавить нужный путь в `sys.path` (это список). Но это на крайний случай, обычно есть более красивые способы.
137+
Например, упаковать код в модуль и установить его с помощью pip. Так что тсс, я вам ничего не говорил.
138+
135139
В памяти все загруженные модули хранятся в `sys.modules`. Иногда встречаются случаи, когда файла нет, а модуль есть.
136140
Это не сложно устроить:
137141

142+
:::python
138143
# mod.py
139144
import sys
140145
from types import ModuleType

0 commit comments

Comments
 (0)