Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions 0_tutorial/29_english.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
Самый ад – названия переменных по-русски, транслитом. Таким людям положен Сименс М65 без русской раскладки, а не работа
программистом.

Отдельно про написание кода: вот встречаются в коде опечатки, неправильный перевод при названии переменной
или частые опечатки в документации – и всё, ощущение хорошего продукта улетучивается.

Хорошая новость в том, что никому не нужно, чтобы тебя путали с носителем языка. Достаточно базового знания грамматики,
чтобы правильно понимать смысл, и лексики, чтобы поменьше тыкать в переводчик.

Expand Down
7 changes: 7 additions & 0 deletions 1_python_basics/18_comments.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

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

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


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

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

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

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

:::python
with open('users.json', 'r') as handler:
data = json.load(handler)

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

:::python
data = load_all_users_from_file()


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

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

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

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

Правый, правда? Ну, теперь всё понятно.
Expand Down
5 changes: 5 additions & 0 deletions 1_python_basics/2_base_types.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

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

:::python
2 + 2 # 4
3 + 2.5 # 5.5
6 / 2 # 3
Expand All @@ -19,6 +20,7 @@

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

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

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

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


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

:::python
squares = [1, 4, 9, 16, 25, 36, 49]
squares[1:3] # [4, 9] (элементы со второго по третий)
squares[:4] # [1, 4, 9, 16] (элементы с начала до четвёртого)
Expand Down
18 changes: 18 additions & 0 deletions 1_python_basics/4_types.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

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

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

:::python
values = [1, 2, 3, 4, 5]
new_values = []
for value in values:
Expand All @@ -62,6 +64,7 @@

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

:::python
values = [1, 2, 3, 4, 5]
new_values = [value ** 2 for value in values if value % 2]

Expand All @@ -72,12 +75,14 @@

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

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


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

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

:::python
user_info = {'name': 'Иван', 'level': 2}
for key, value in user_info.items():
print '%s: %s' % (key, value)
Expand All @@ -102,3 +108,15 @@
Кортеж выглядит как список, но не совсем. Это скорее структура из C++.
Отличаются от списков тем, что его элементы гетерогенные и тем, что он умеет упаковываться и распаковываться.
Подробнее, например, [в документации](https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences).

### Множества

Множество – это математическое множество. В нём все элементы уникальные, можно считать пересечение,
проверять на вхождение и выполнять другие операции с множествами.

Один из частых случаев применения множеств – удаление дублей из списка:

:::python
l = [1, 2, 1, 3, 2]
print(list(set(l))) # [1, 2, 3]

5 changes: 5 additions & 0 deletions 1_python_basics/5_modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,14 @@
Важнее всего знать, как Питон выбирает файлы для импорта. Сначала он ищет подходящие файлы в рабочей директории,
рядом с `bars.py`. Если не находит, то проходит по папкам в `sys.path` и ищет нужный файл.

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

В памяти все загруженные модули хранятся в `sys.modules`. Иногда встречаются случаи, когда файла нет, а модуль есть.
Это не сложно устроить:

:::python
# mod.py
import sys
from types import ModuleType
Expand Down
18 changes: 18 additions & 0 deletions 1_python_basics/6_tips_and_tricks.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,34 @@

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

:::cpp
for(int i = 0; i < books_amount; i++) {
cout << books[i];
}

Этот же способ используется в других языках. Поэтому на Питоне хочется написать так же:

:::python
for i in len(books):
print(books[i])

Это неудобная дичь, древность и вообще. Вот как надо:

:::python
for book in books:
print(book)

Часто вместе с элементом нужен его номер. Памятуя, что можно итерировать по коллекции, хочется сделать как-то так:

:::python
i = 0
for book in books:
print(i, book)
i += 1

Это тоже неудобная дичь, древность и вообще. Для этого есть встроенная функция `enumerate`:

:::python
for book_number, book in enumerate(books):
print(book_number, book)

Expand All @@ -43,6 +48,7 @@

Для "ничего" в Питоне есть `None`. Не пустая строка и не -1, а именно `None`:

:::python
try:
latitude = float(input('Введите широту: '))
except ValueError:
Expand All @@ -59,12 +65,14 @@

Загрузим json из файла:

:::python
def load_json_data(filepath):
with open(filepath, 'r') as file_handler:
return json.load(file_handler)

Всё сломается, если передать путь до несуществующего файла. Исправим:

:::python
def load_json_data(filepath):
if os.path.exists(filepath):
with open(filepath, 'r') as file_handler:
Expand All @@ -76,6 +84,7 @@
функции смысла нет.
Избавляемся от `else`:

:::python
def load_json_data(filepath):
if os.path.exists(filepath):
with open(filepath, 'r') as file_handler:
Expand All @@ -87,6 +96,7 @@

Упростить можно так:

:::python
def load_json_data(filepath):
if not os.path.exists(filepath):
return None
Expand All @@ -100,21 +110,25 @@
Часто в коде приходится проверять переменные на нулевые значения.
Например, пустой список:

:::python
if len(users) == 0:
pass

Или пустая строка:

:::python
if user.email == '':
pass

Или ноль:

:::python
if user.level == 0:
pass

Все три примера выше – неверные. Вот их верные аналоги:

:::python
if not users:
pass

Expand Down Expand Up @@ -161,16 +175,20 @@
а во втором какой-нибудь `user` или `book`, в зависимости от того, что в списке. Длинные названия – не проблема,
у всех давно есть автокомплит.
- **на английском**: никаких `kniga` или `polsovatel`. Брр.

- **грамотными**: не поленись открыть переводчик и гугл, чтобы подобрать правильный перевод. Неправильный перевод
создаёт ощущение неряшливости, а может и смыслу навредить – тогда о читаемости не может быть и речи.

- **уникальными**: в Питоне есть [встроенные функции](https://docs.python.org/3.5/library/functions.html),
называть переменные их именами нельзя: тогда функция станет недоступна. Среди них есть file, dict, all, str.

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

Функции нужны, чтобы сделать код понятным и реиспользуемым.

Понятным – это когда с первого взгляда понятно, что он делает:

:::python
credentials = load_oauth_credentials_from_file('fb_creds.json')
fb_api = get_facebook_api(credentials)
messages = fb_api.get_unread_messages()
Expand Down
20 changes: 20 additions & 0 deletions правки Игоря/0_tutorial/14_google.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Правильно искать информацию в сети – важно. Подберёшь неправильный запрос – не найдёшь нужной ссылки.
Иногда приходится делать много попыток, чтобы найти то, что надо. Тратишь полчаса на поиск решения проблемы,
а какой-нибудь Вася найдёт то же, но за один запрос.

В итоге правильное использование поиска не только позволяет экономить время, но и не чувствовать себя идиотом.


> Это же чёртов поиск, написал запрос – увидел результат. Чего сложного?

Сложно написать запрос правильно. Оказывается, Гугл умеет много вещей, которые очень помогают искать информацию.
Их надо знать и использовать.

Вот где о них можно узнать:

- [Мини-курс Power Searching With Google](https://coursebuilder.withgoogle.com/sample/course) (en). Да, у Гугла есть
онлайн-курс про то, как пользоваться Гуглом (даже два курса). Видео-лекции, домашние задания. Всё серьёзно.
Очень рекомендую: он короткий и очень подробный.
- [Google Tips & Tricks](https://www.google.com/intl/en_us/insidesearch/tipstricks/all.html) (en).
- [Как правильно искать в Google](https://habrahabr.ru/sandbox/46956/).
- [Google без секретов (операторы Гугла в практических примерах)](http://it2b.ru/blog/arhiv/761.html).
16 changes: 16 additions & 0 deletions правки Игоря/0_tutorial/8_cli.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Консоль – основной способ взаимодействия разработчика с системой. С ней надо уметь взаимодействовать
не хуже, чем с графическим интерфейсом.

А вот ресурсы, на которых есть план минимум и больше:

- [ШПАРГАЛКА. Команды Unix - Linux](http://forum.ubuntu.ru/index.php?topic=14535.15). Неожиданно полезная тема на форуме Убунту.
- [Цикл статей на linuxrussia](http://www.linuxrussia.com/2013/08/terminal-linux-1.html).
- [Unix shell: абсолютно первые шаги](https://habrahabr.ru/post/267825/).
- [Туториал от университета Суррей](http://www.ee.surrey.ac.uk/Teaching/Unix/index.html) (en).
- [Туториал от Райана](http://ryanstutorials.net/linuxtutorial/) (en). Есть [шпаргалка](http://ryanstutorials.net/linuxtutorial/cheatsheet.php).

Обрати внимание, что есть shell scripting – прямо в консоли можно городить циклы, условия и вообще писать вполне себе программы.
Лучше обойти это стороной прямо сейчас: это довольно специфичный навык, которые не каждому пригождается.

Мне в своё время очень помогла книга ["Linux. Необходимый код и команды. Карманный справочник"](https://www.ozon.ru/context/detail/id/3178480/).
Она компактная, подробная и понятная. Рекомендую.
Loading