Skip to content

Commit 16e25d0

Browse files
committed
Merge branch 'master' into python_basics_enhancements
2 parents 407568c + 8008bf8 commit 16e25d0

8 files changed

Lines changed: 183 additions & 18 deletions

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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,11 @@
9494
или `FIXME: учитывать часовой пояс`.
9595

9696
Прежде чем написать комментарий, попробуй поселить его в коде, указав параметр или дав подходящее название переменной.
97+
98+
99+
## Что изучать
100+
101+
- [Доклад Григория Петрова про комментирование исходников](https://www.youtube.com/watch?v=-SRUctRR_4s). Обязателен к просмотру.
102+
- [PEP 257](https://www.python.org/dev/peps/pep-0257/). ПЕП про докстринги.
103+
- [doctest](https://docs.python.org/3.5/library/doctest.html). Документация к модулю про доктесты.
104+
- [What is the best comment in source code you have ever encountered?](http://stackoverflow.com/questions/184618/). Шутить в коде не стоит, а вот посмеяться с чужих шуток можно. Это ж не нам поддерживать.
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: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
###Числа
1+
### Числа
22

33
В самом Питоне есть целые, вещественные, и комплексные числа. В стандартной библиотеке есть ещё рациональные и
44
фиксированной точности.
@@ -19,7 +19,7 @@
1919
короткая и понятная.
2020

2121

22-
###Строки
22+
### Строки
2323

2424
Со строками в третьем Питоне всё просто: они Юникодные.
2525

@@ -42,7 +42,7 @@
4242
много места.
4343

4444

45-
###Списки
45+
### Списки
4646

4747
Всё необходимое для начала работы со списками, есть в разделе ["Основные типы данных"](http://devman.org/encyclopedia/python_basics/python_basics_base_types/).
4848

@@ -68,7 +68,7 @@
6868
Это та же конструкция, что и в предыдущем примере, просто записанная очень компактно: посредине тот же цикл,
6969
слева – что добавлять в новый список, а справа - фильтр. Фильтр может быть необязательным, кстати.
7070

71-
###Словари
71+
### Словари
7272

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

@@ -106,3 +106,9 @@
106106
:::python
107107
l = [1, 2, 1, 3, 2]
108108
print(list(set(l))) # [1, 2, 3]
109+
110+
### Кортежи
111+
112+
Кортеж выглядит как список, но не совсем. Это скорее структура из C++.
113+
Отличаются от списков тем, что его элементы гетерогенные и тем, что он умеет упаковываться и распаковываться.
114+
Подробнее, например, [в документации](https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences).

1_python_basics/5_modules.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
###Что это такое
1+
### Что это такое
2+
23
Модуль – кусок кода, который можно использовать в другом коде. В самом простом случае это файл.
34
В любом проекте функциональность разбивается на куски, каждый кусок селится в свой модуль.
45

@@ -7,7 +8,8 @@
78
ещё десяток других модулей: Питон сам всё разрулит.
89

910

10-
###Как этим пользоваться
11+
### Как этим пользоваться
12+
1113
Имя модуля совпадает с именем файла и должно быть нормальным именем переменной в Питоне: например, не содержать
1214
знаков минуса.
1315

@@ -46,7 +48,7 @@
4648
Есть ещё вариант `from data_loaders import *`, но он вне закона. Забудьте о нём.
4749

4850

49-
###Запуск модуля как скрипта
51+
### Запуск модуля как скрипта
5052

5153
Когда Питон видит `import data_loaders`, он находит файл `data_loaders.py` и выполняет его. Реально выполняет:
5254
если в нём есть код, он будет выполнен. Даже если это не просто объявления функций, а их вызов. Представим,
@@ -92,7 +94,7 @@
9294
значение `__main__` ([доки](https://docs.python.org/3/library/__main__.html)). Хитро, а?
9395

9496

95-
###Подводные камни
97+
### Подводные камни
9698

9799
Главный подводный камень – рекурсивный импорт. Это если мы импортируем `data_loaders` из `bars`, а для `data_loaders`
98100
нужен `bars`. Вот так:
@@ -125,7 +127,10 @@
125127
максимально независимые общие функции, которые используются в других файлах. Не наоборот.
126128

127129

128-
###Как работает под капотом
130+
### Как работает под капотом
131+
132+
Важнее всего знать, как Питон выбирает файлы для импорта. Сначала он ищет подходящие файлы в рабочей директории,
133+
рядом с `bars.py`. Если не находит, то проходит по папкам в `sys.path` и ищет нужный файл.
129134

130135
Иногда бывает так, что нужный модуль находится вне тех папок, которые обходит Питон. Один из вариантов побороть это
131136
– вручную добавить нужный путь в `sys.path` (это список). Но это на крайний случай, обычно есть более красивые способы.

1_python_basics/6_tips_and_tricks.md

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Тут – разные мелочи, на которых обычно спотыкаются новички в Питоне. Шагай свободно.
22

33

4-
###Итерируй сразу по коллекции, а не по индексам
4+
### Итерируй сразу по коллекции, а не по индексам
55

66
Раньше в C++ итерация по коллекции проходила так:
77

@@ -34,7 +34,8 @@
3434
Делай правильно и не делай неправильно.
3535

3636

37-
###Используй None
37+
### Используй None
38+
3839
Часто нужно предусмотреть какой-нибудь хреновый случай – нет файла с данными, не работает интернет,
3940
не хватает места на диске, пользователь ввёл неверные данные.
4041

@@ -54,7 +55,8 @@
5455
Не `if latitude == None` и не `if latitude`. Это важно.
5556

5657

57-
###Меньше вложенности
58+
### Меньше вложенности
59+
5860
Загрузим json из файла:
5961

6062
def load_json_data(filepath):
@@ -93,7 +95,8 @@
9395

9496
Теперь стало проще: меньше вложенности, просто читать. Меньше багов.
9597

96-
###Используй превращение типов в bool
98+
### Используй превращение типов в bool
99+
97100
Часто в коде приходится проверять переменные на нулевые значения.
98101
Например, пустой список:
99102

@@ -128,7 +131,8 @@
128131
Это облегчает код и не вредит читаемости.
129132

130133

131-
###Знай стандартную библиотеку
134+
### Знай стандартную библиотеку
135+
132136
Стандартная библиотека Питона огромная, в ней куча всего полезного.
133137
Стоит глянуть [на содержание](https://docs.python.org/3/library/), чтобы оценить масштаб.
134138

@@ -142,7 +146,8 @@
142146
и знать, где смотреть, если они понадобятся.
143147

144148

145-
###Понятные названия у всего
149+
### Понятные названия у всего
150+
146151
Названия должны однозначно говорить о том, зачем нужна сущность: переменная, функция или что-то ещё.
147152

148153
Переменные – это сущности, а их названия – это существительные (`user.level`) или их свойства (`user.is_admin`).
@@ -158,9 +163,12 @@
158163
- **на английском**: никаких `kniga` или `polsovatel`. Брр.
159164
- **уникальными**: в Питоне есть [встроенные функции](https://docs.python.org/3.5/library/functions.html),
160165
называть переменные их именами нельзя: тогда функция станет недоступна. Среди них есть file, dict, all, str.
166+
- **грамотными**: не поленись открыть переводчик и гугл, чтобы подобрать правильный перевод. Неправильный перевод
167+
создаёт ощущение неряшливости, а может и смыслу навредить – тогда о читаемости не может быть и речи.
168+
161169

170+
### Больше функций
162171

163-
###Больше функций
164172
Функции нужны, чтобы сделать код понятным и реиспользуемым.
165173

166174
Понятным – это когда с первого взгляда понятно, что он делает:
@@ -189,7 +197,8 @@
189197
из скрипта. `send_notifications_to_slack` ничего не знает о том, что `messages` к ней приехали от Фейсбука, для
190198
неё это просто сообщения, которые надо отправить пользователю `user`.
191199

192-
###Думай о пользователе
200+
### Думай о пользователе
201+
193202
Код нужен для того, чтобы им пользовались. Его цель – сделать пользователю удобно.
194203

195204
То, что задачи учебные и едва ли кто-то будет всерьёз ими пользоваться – не важно. Любой код должен быть удобен

0 commit comments

Comments
 (0)