From 5ccebd19c81160db600183f647cd4330207d3a6b Mon Sep 17 00:00:00 2001 From: Anton Date: Mon, 22 Oct 2018 17:20:57 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0_tutorial/29_english.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/0_tutorial/29_english.md b/0_tutorial/29_english.md index 61d1446f..3a3486a1 100644 --- a/0_tutorial/29_english.md +++ b/0_tutorial/29_english.md @@ -4,6 +4,9 @@ использования открытого кода, создания открытого кода, создания багрепортов, обсуждения багрепортов, получения актуальных новостей, общения на митапах и конференциях. +Отдельно про написание кода: вот встречаются в коде опечатки, неправильный перевод при названии переменной +или частые опечатки в документации – и всё, ощущение хорошего продукта улетучивается. + Хорошая новость в том, что никому не нужно, чтобы тебя путали с носителем языка. Достаточно базового знания грамматики, чтобы правильно понимать смысл, и лексики, чтобы поменьше тыкать в переводчик. From 1d2bd725f120cee54f6a9f2f34749583fa97b954 Mon Sep 17 00:00:00 2001 From: runcken Date: Thu, 26 Jun 2025 20:27:41 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8E=20=D0=BF=D1=80=D0=BE=20?= =?UTF-8?q?cli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0_tutorial/8_cli.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 0_tutorial/8_cli.md diff --git a/0_tutorial/8_cli.md b/0_tutorial/8_cli.md new file mode 100644 index 00000000..20fd20af --- /dev/null +++ b/0_tutorial/8_cli.md @@ -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/). +Она компактная, подробная и понятная. Рекомендую. From cd47b30e552462928b8b4cd1718998ba71452ea7 Mon Sep 17 00:00:00 2001 From: runcken Date: Thu, 26 Jun 2025 20:30:28 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8E=20=D0=BF=D1=80=D0=BE=20?= =?UTF-8?q?=20Google?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0_tutorial/14_google.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 0_tutorial/14_google.md diff --git a/0_tutorial/14_google.md b/0_tutorial/14_google.md new file mode 100644 index 00000000..1e973717 --- /dev/null +++ b/0_tutorial/14_google.md @@ -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). From 972875453f0a21c28d42b9fa2e1a4fa131808c97 Mon Sep 17 00:00:00 2001 From: runcken Date: Thu, 26 Jun 2025 20:31:37 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8E=20=D0=BF=D1=80=D0=BE=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1_python_basics/3_base_constructions.md | 99 +++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 1_python_basics/3_base_constructions.md diff --git a/1_python_basics/3_base_constructions.md b/1_python_basics/3_base_constructions.md new file mode 100644 index 00000000..8b8c8641 --- /dev/null +++ b/1_python_basics/3_base_constructions.md @@ -0,0 +1,99 @@ +### Коротко о главных управляющих конструкциях + +Сейчас мы совсем реактивно пройдёмся по самым основным управляющим конструкциям. Гет реди. + + +### if + +Ну, вы все знаете условный оператор, так ведь? + + :::python + if age < 18: + print('Никаких тебе сигарет. Ишь чего удумал!') + else: + print('Вам синий или красный?') + + +Есть ещё `elif`, их можно сделать много в одном операторе. Это такой аналог `which` из других языков. + + +### for + +Цикл. Вместо сишного варианта с init, cond и loop выражениями, тут просто итерация по коллекции: + + :::python + for user in users: + print user + +Иногда надо не пройтись по списку, а выполнить одну и ту же операцию много раз. Тогда хорошо подходит функция +[range](https://docs.python.org/3.5/library/functions.html#func-range). Она возвращает целые числа в заданном промежутке, +поэтому в цикле её можно использовать так: + + :::python + for level_num in range(10): + user.levelup() # пользователь получит десять уровней. Читер! + +А вот `break` и `continue` делают то же, что в Паскале и Сях. `break` прерывает выполнение цикла, +`continue` завершает текущую итерацию и переходит к следующей. + +Ещё у цикла есть `else`, но про него почти никто не знает. Как он работает можно посмотреть +[в официальной документации](https://docs.python.org/3.5/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops). + + +### def + +Начало объявления функции. После него идёт название, +потом – аргументы функции в скобках, двоеточие и тело функции с отступом: + + :::python + def get_square(value): + return value ** 2 + +То, что после `return` – это возвращаемое значение функции. + +Функцию создали, вот как её теперь использовать: + + :::python + print(get_square(2)) # 4 + print(get_square(6)) # 36 + print(get_square('ыыы')) # всё сломается + +А вот пример посложнее, из исходников Девмана. Получает пользователя по айди в Слаке: + + :::python + def _get_user_by_slack_id(slack_user_id): + user_email = get_slack_email_for_user(slack_user_id) + return User.objects.filter(email__iexact=user_email).first() + +(вот почему емейл необходим) + + +### range + +Функция очень полезная, поэтому про неё отдельно. `range` генерирует целые числа в заданном диапазоне. Например: + + :::python + range(10) # 0..0 + range(5, 10) # 5..9 + range(5, 10, 2) # [5, 7, 9] (от пяти до девяти с шагом два) + +Фишка этой функции заключается в том, что она не создаёт список со всеми числами. +Вместо этого он вернёт объект, который будет возвращать элементы как только они нужны, по одному. +Поэтому код `range(9999999999999)` не съест всю память. +Этот хитрый объект (Sequence ABC, но об этом потом) можно превратить в список явно: + + :::python + list(range(9999999999999)) + +(не советую так делать) + + +### pass + +Блок, который ничего не делает: + + :::python + for i in range(20): + pass # 20 раз сделать ничего. Очень полезно! + +Часто используется в начальном коде для заданий: в финальной версии вместо `pass` должен быть настоящий код. From 32077b910bf7d3d0960727f70b079ecec31a6c7f Mon Sep 17 00:00:00 2001 From: runcken Date: Thu, 26 Jun 2025 20:49:14 +0300 Subject: [PATCH 5/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=B7=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0_tutorial/9_git.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/0_tutorial/9_git.md b/0_tutorial/9_git.md index c42b5d95..3907bb16 100644 --- a/0_tutorial/9_git.md +++ b/0_tutorial/9_git.md @@ -3,4 +3,6 @@ Следующий шаг – [туториал на githowto.com](https://githowto.com/ru), он на русском и куда длиннее. -Гитхаб – это что-то типа Фейсбука для программистов. Код вместо постов, баги вместо котиков. Идиллия. \ No newline at end of file +Гитхаб – это что-то типа Фейсбука для программистов. Код вместо постов, баги вместо котиков. Идиллия. +Чтобы познакомиться с ним ближе, рекомендую выполнить их [Hello World](https://guides.github.com/activities/hello-world/). +После можно пройти [остальные руководства от Гитхаба](https://guides.github.com/), это очень полезные навыки для разработчика. From 6f6ef58eb5ff0feac06ab9e322460db2d918e5ea Mon Sep 17 00:00:00 2001 From: runcken Date: Thu, 26 Jun 2025 20:52:14 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D1=8B=20=D0=BF=D0=BE=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1_python_basics/18_comments.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/1_python_basics/18_comments.md b/1_python_basics/18_comments.md index e965248d..9c99b603 100644 --- a/1_python_basics/18_comments.md +++ b/1_python_basics/18_comments.md @@ -94,3 +94,11 @@ или `FIXME: учитывать часовой пояс`. Прежде чем написать комментарий, попробуй поселить его в коде, указав параметр или дав подходящее название переменной. + + +## Что изучать + +- [Доклад Григория Петрова про комментирование исходников](https://www.youtube.com/watch?v=-SRUctRR_4s). Обязателен к просмотру. +- [PEP 257](https://www.python.org/dev/peps/pep-0257/). ПЕП про докстринги. +- [doctest](https://docs.python.org/3.5/library/doctest.html). Документация к модулю про доктесты. +- [What is the best comment in source code you have ever encountered?](http://stackoverflow.com/questions/184618/). Шутить в коде не стоит, а вот посмеяться с чужих шуток можно. Это ж не нам поддерживать. From ec33b50c2d3541329b14cc5d715183ff6362dae9 Mon Sep 17 00:00:00 2001 From: runcken Date: Thu, 26 Jun 2025 21:50:34 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=92=D0=BC=D0=B5=D1=80=D0=B4=D0=B6=D0=B8?= =?UTF-8?q?=D0=BB=20'upstream/python=5Fbasics=5Fenhancements'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1_python_basics/4_types.md | 10 ++++++++++ 1_python_basics/5_modules.md | 4 ++++ 1_python_basics/6_tips_and_tricks.md | 2 ++ 3 files changed, 16 insertions(+) diff --git a/1_python_basics/4_types.md b/1_python_basics/4_types.md index 5b4536a1..c71a3dfc 100644 --- a/1_python_basics/4_types.md +++ b/1_python_basics/4_types.md @@ -102,3 +102,13 @@ Кортеж выглядит как список, но не совсем. Это скорее структура из 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] diff --git a/1_python_basics/5_modules.md b/1_python_basics/5_modules.md index ebdd697b..3a282a52 100644 --- a/1_python_basics/5_modules.md +++ b/1_python_basics/5_modules.md @@ -132,6 +132,10 @@ Важнее всего знать, как Питон выбирает файлы для импорта. Сначала он ищет подходящие файлы в рабочей директории, рядом с `bars.py`. Если не находит, то проходит по папкам в `sys.path` и ищет нужный файл. +Иногда бывает так, что нужный модуль находится вне тех папок, которые обходит Питон. Один из вариантов побороть это + – вручную добавить нужный путь в `sys.path` (это список). Но это на крайний случай, обычно есть более красивые способы. +Например, упаковать код в модуль и установить его с помощью pip. Так что тсс, я вам ничего не говорил. + В памяти все загруженные модули хранятся в `sys.modules`. Иногда встречаются случаи, когда файла нет, а модуль есть. Это не сложно устроить: diff --git a/1_python_basics/6_tips_and_tricks.md b/1_python_basics/6_tips_and_tricks.md index 68300dd5..5ef40ae3 100644 --- a/1_python_basics/6_tips_and_tricks.md +++ b/1_python_basics/6_tips_and_tricks.md @@ -163,6 +163,8 @@ - **на английском**: никаких `kniga` или `polsovatel`. Брр. - **грамотными**: не поленись открыть переводчик и гугл, чтобы подобрать правильный перевод. Неправильный перевод создаёт ощущение неряшливости, а может и смыслу навредить – тогда о читаемости не может быть и речи. +- **уникальными**: в Питоне есть [встроенные функции](https://docs.python.org/3.5/library/functions.html), +называть переменные их именами нельзя: тогда функция станет недоступна. Среди них есть file, dict, all, str. ### Больше функций From e8eaf31fe33610b05f73e48e485675802689ac1e Mon Sep 17 00:00:00 2001 From: runcken Date: Thu, 26 Jun 2025 21:52:13 +0300 Subject: [PATCH 8/8] =?UTF-8?q?Revert=20"=D0=A7=D1=82=D0=BE=20=D1=8D=D1=82?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=B0=20"python"=20=D0=B2=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=D0=B5=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=3F=20=D0=BA=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D1=82=D1=81=D1=8F,=20=D0=BE=D0=BD=D0=B8=20=D0=BB=D0=B8=D1=88?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 78cfede6d81bd3aa87c72e85b4410218b7e370e2. --- 1_python_basics/18_comments.md | 7 +++++++ 1_python_basics/2_base_types.md | 5 +++++ 1_python_basics/4_types.md | 6 ++++++ 1_python_basics/5_modules.md | 1 + 1_python_basics/6_tips_and_tricks.md | 15 +++++++++++++++ 5 files changed, 34 insertions(+) diff --git a/1_python_basics/18_comments.md b/1_python_basics/18_comments.md index 9c99b603..81c9d20e 100644 --- a/1_python_basics/18_comments.md +++ b/1_python_basics/18_comments.md @@ -4,6 +4,7 @@ Комментарии – способ прокомментировать код на ходу, на той же строке. + :::python price = Column(BigInteger) # рубли * 100 @@ -13,6 +14,7 @@ Она нужна для документирования всей функции: описания входящих параметров, результата, логики, крайних случаев. Заключается в тройные двойные кавычки. Вот так: + :::python def tensorsolve(a, b, axes=None): """ Solve the tensor equation ``a x = b`` for x. @@ -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() @@ -59,6 +64,7 @@ Другая частая ошибка: не менять комментарии при изменении кода. В примере выше мы загружали данные из файла. Через месяц взялись за голову и поселили данные в базе данных. Код стал таким: + :::python # загружаем данные из файла data.json data = db_session.query(User).all() @@ -71,6 +77,7 @@ В таком состоянии всё поведение кажется понятным, поэтому разработчик может оставить комментарий самому себе. Проблема в том, что когда он переключится на другую задачу и забудет про детали, комментарий может взорвать мозг: + :::python inv(strain_tensor) - rigidity.T # правый случай Правый, правда? Ну, теперь всё понятно. diff --git a/1_python_basics/2_base_types.md b/1_python_basics/2_base_types.md index 5859100c..c97b8b67 100644 --- a/1_python_basics/2_base_types.md +++ b/1_python_basics/2_base_types.md @@ -7,6 +7,7 @@ Числа – и в Африке числа. С ними можно производить арифметические действия. Всё просто: + :::python 2 + 2 # 4 3 + 2.5 # 5.5 6 / 2 # 3 @@ -19,6 +20,7 @@ Помимо чисел в Питоне есть строки с богатым набором встроенных функций. С ними просто и удобно работать: + :::python 'hello' # строковая константа "hello" # тип кавычек не имеет значения hello[1] # 'e' @@ -27,6 +29,7 @@ У них много встроенных функций: + :::python 'hello '.strip() # 'hello' 'hello world'.upper() # 'HELLO WORLD' len('hello') # 5 @@ -43,6 +46,7 @@ Элементы могут быть разных типов, даже другими списками. Выглядит он так: + :::python [1, 2, 3] # в квадратных скобках, элементы через запятую digits = [4, 5, 6] # переменная, в которой живёт список digits[0] # 4 (нумерация с нуля) @@ -52,6 +56,7 @@ Из списка надо часто получить подсписок: несколько первых элементов, последних, что-то из середины. Это называется срезами и позволяет делать много чего. Вот самые простые срезы: + :::python squares = [1, 4, 9, 16, 25, 36, 49] squares[1:3] # [4, 9] (элементы со второго по третий) squares[:4] # [1, 4, 9, 16] (элементы с начала до четвёртого) diff --git a/1_python_basics/4_types.md b/1_python_basics/4_types.md index c71a3dfc..dacfcc14 100644 --- a/1_python_basics/4_types.md +++ b/1_python_basics/4_types.md @@ -28,6 +28,7 @@ Ещё строки можно форматировать, причём несколькими способами. Вот один из них: + :::python name = 'Пётр' height = 1.865 print('Привет, %s! Твой рост – %.2f м.' % (name, height)) @@ -52,6 +53,7 @@ Часто бывает надо взять исходный список и сформировать из него новый, применив к каждому элементу исходного какое-то преобразование и как-то отфильтровав. Например, так: + :::python values = [1, 2, 3, 4, 5] new_values = [] for value in values: @@ -62,6 +64,7 @@ Эта операция настолько частая, что для неё есть отдельная конструкция – list comprehension. Выглядит она так: + :::python values = [1, 2, 3, 4, 5] new_values = [value ** 2 for value in values if value % 2] @@ -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'] = 'Грирогий' @@ -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) diff --git a/1_python_basics/5_modules.md b/1_python_basics/5_modules.md index 3a282a52..45e50a03 100644 --- a/1_python_basics/5_modules.md +++ b/1_python_basics/5_modules.md @@ -139,6 +139,7 @@ В памяти все загруженные модули хранятся в `sys.modules`. Иногда встречаются случаи, когда файла нет, а модуль есть. Это не сложно устроить: + :::python # mod.py import sys from types import ModuleType diff --git a/1_python_basics/6_tips_and_tricks.md b/1_python_basics/6_tips_and_tricks.md index 5ef40ae3..5a0b981a 100644 --- a/1_python_basics/6_tips_and_tricks.md +++ b/1_python_basics/6_tips_and_tricks.md @@ -5,22 +5,26 @@ Раньше в 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) @@ -28,6 +32,7 @@ Это тоже неудобная дичь, древность и вообще. Для этого есть встроенная функция `enumerate`: + :::python for book_number, book in enumerate(books): print(book_number, book) @@ -43,6 +48,7 @@ Для "ничего" в Питоне есть `None`. Не пустая строка и не -1, а именно `None`: + :::python try: latitude = float(input('Введите широту: ')) except ValueError: @@ -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: @@ -76,6 +84,7 @@ функции смысла нет. Избавляемся от `else`: + :::python def load_json_data(filepath): if os.path.exists(filepath): with open(filepath, 'r') as file_handler: @@ -87,6 +96,7 @@ Упростить можно так: + :::python def load_json_data(filepath): if not os.path.exists(filepath): return None @@ -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 @@ -173,6 +187,7 @@ Понятным – это когда с первого взгляда понятно, что он делает: + :::python credentials = load_oauth_credentials_from_file('fb_creds.json') fb_api = get_facebook_api(credentials) messages = fb_api.get_unread_messages()