progway — программирование, IT
2.68K subscribers
25 photos
1 video
246 links
Чат: @prog_way_chat

Разборы вопросов и задач с собеседований, мысли, полезные материалы и просто вещи, что мне интересны из мира IT

Полезности и навигация в закрепе

По всем вопросам: @denisputnov
Download Telegram
Ну, моей продуктивности и стабильности явно можно позавидовать. Неожиданно так получилось, что разработка и учеба поглотили всё мое время, так что постов и идей, соответственно, особо не было. Но, с другой стороны, я и не ставил перед собой никаких обязательств по графику в канале, так что всё нормально (оправдываю себя).

Это все таки блог, так что тут я пишу не только что-то полезное, а всё, что хочу, в том числе о своей жизни, а поделиться мне есть чем :)

Начнем с того, что на мне все ещё висит наш прошлый проект - заказанный у нас с @syth0le интернет-магазин. Много времени уделять этому проекту не получалось, так что сам по себе сайт по обговоренным условиям готов на процентов 70-80. После выпуска проекта обязательно закину ссылку сюда.

Во-вторых, я все ещё работаю над codeye, время от времени что-то подправляю. Пока большинство изменений проделаны локально, но до середины октября планируется выпуск codeye.ru в уже более доработанной оболочке, будет красиво.

Кстати, никто не отменял мою увлеченность ботами в телеге, так что я постоянно думаю о своих упавших, но ничего не делаю 🗿

Ну и самая главная новость прошедшей недели, так сказать, - это то, что мы с товарищем серьезно засели за реализацию ещё одного собственного pet-проекта. Это приложение, реализованное на Dart/Flutter и Python REST API, в сфере путешествий. Приложение поможет пользователю уточнить некоторые нюансы о поездке, спланировать маршрут, а вот остальная информация попозже. Хватит пока на этом) На разработку дедлайн в пол года, ссылочку на маркет вкину сюда, как будет готово (если будет 🌚 )

Кстати, идей для постов вроде не мало появилось, так что как минимум в ближайшую неделю поактивничаю)

Ну и конечно же спасибо за прочтение всех этих мыслей, держи жопу❤️

#blog
Pet-проекты.

Частенько я о них думаю, говорю, да и тут иногда в постах вспоминаю. Хочу объяснить почему у меня такой ажиотаж касательно всего этого.

Да кто такие эти ваши pet-проекты? Термин применим не только к программированию. Pet-проекты - проекты, которые вы реализуете для получения опыта, демонстрации своих навыков и возможностей, любые личные проекты с благотворительной целью.

Чаще всего многие программисты говорят, что pet-проекты очень сильно помогают в трудоустройстве и это утверждение не без правды. Наличие pet-проектов, особенно если они успешные, - это сильное конкурентное преимущество в ряде случаев. Я с этим согласен.

Но знаете, pet-проекты помогают ещё вот в чем - набраться опыта в реальной разработке хоть чего-то, понять свои проблемы и пробелы в знаниях и всё восполнить. Такие проекты помогают вам в некотором самоопределении, обучении и получении опыта.

Попробуйте, если не пробовали ранее. Даже телеграм-бота написать - уже что-то, пусть это и достаточно просто в большинстве случаев.

#useful
Стоит ли использовать jQuery?

Тоже много слышу об этом, постоянно кто-то спорит за и против. Есть люди, которые полностью не признают библиотеку, а есть и те, кто используют её постоянно. Я немного нейтралитет в этом плане и свежим взглядом попробую описать ситуацию.

Разобраться сходу тут сложно, давайте разберём плюсы и минусы. Начну с минусов:

1. Вес. Чистый jQuery пакет весит от 80 до 255 КБ, что очень даже не мало по меркам веба, ведь это замедляет загрузку страницы. С этим согласен.

2. Медленнее. Не совсем согласен, но озвучить обязан. Считается, что jQuery медленный и что в целом сторонние библиотеки работают медленно, но я бы не стал утверждать об этом.

Да и вроде всё. Серьёзно. Больше я как-то не слышал о минусах, если что - поправьте. А что насчёт плюсов?

1. Ускорение разработки. Очень приятный синтаксис (субъективно). Код выглядит красиво и лаконично.

2. Стандартизация и поддержка. При помощи jQuery можно реализовать кучу вещей, которые работают по разному в разных браузерах. Сегодня с совместимостью все не так круто, как хотелось бы, а jQuery работает почти везде.

3. Много из коробки. Слишком много элементов и механик доступно всего одним вызовом, а на нативе подобный функционал будет занимать гораздо больше места. Да и к чему вообще делать что-то с нуля, если просто есть готовое? Новички никогда не напишут правильный код, а опытные программисты не напишут код на столько же оптимизированным, как это сделано в jQuery.

4. Вес. Да, это и плюс. Минифицированная версия jQuery 2.1.3 (последняя массовая на момент написания поста) весит всего 85 КБ. А вы иногда такие исходники пихаете, что это последнее, что повлияет на загрузку страницы.

Ну и казалось бы, всё - идём и используем. Я все же под сомнением. Лично мое мнение - jQuery морально устарел. Я думаю, что лучше было бы использовать что-то более прогрессивное и легко поддерживаемое, типа Angular, Vue, React. Тут и из коробки возможностей больше, и поддержки от крупных компаний. Сейчас эти фреймворки в тренде, так что я бы поступил именно так. Какое-то такое мнение.

#web #useful
💯1
Библиотечка swiper.js

Чисто случайно я всё больше и больше стал заниматься JavaScript'ом, так что сегодня хочу рассказать об одной библиотечке, с которой столкнулся. Недавно встала необходимость сделать адаптивный слайдер на сайте, а изобретать велосипед не было никакого желания. Тогда я сел в ваши вот эти интернеты и увидел там swiper.js - библиотека, которая позволяет создать и тонко настроить слайдер любой сложности.

Импортировать библиотеку в проект можно с cdn:
<link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css">
<script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>

Далее быстро напишем скелет нашего слайдера:
<button class="swiper-button-next"></button>
<button class="swiper-button-prev"></button>
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide card"></div>
<div class="swiper-slide card"></div>
</div>
</div>

Тут класс div.card отвечает за одну картинку в слайдере, а button элементы - за кнопки перемотки.

Теперь напишем скрипт самого слайдера и так же подключим его. У меня он выглядит так:
const slider = document.querySelector('.swiper-container');

let mySwiper = new Swiper(slider, {
slidesPerView: 1,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
loop: true,
autoplay: {
delay: 5000,
}
})

Возможно код далёк от идеала, но мне было некогда разбираться с красивой записью. Тут вы видите стандартный шаблон из документации, который я немного настроил под себя.

Далее быстренько настраиваем CSS и слайдер полностью готов. Для меня эта библиотечка была открытием, так что я бы использовал в будущем именно её.

#web #useful
🆒1
Ещё один оператор присвоения в Python.

Думаю мало кто знает (ведь для многих людей читать спеки - грех), но в python 3.8+ появился новый оператор присвоения - Walrus operator. Я точно не знаю как перевести его на русский, но Google Translate говорит, что это "Моржовой оператор", так что не будем перечить гуру. В чём суть?

Теперь в Python есть два оператора присваивания:
# обычное присваивание
# 1. Присваивает переменной x значение 5
x = 5

# walrus operator
# 1. Присваивает переменной x значение 5
# 2. Возвращает 5
(x := 5)

Понятнее на примере:
1. Обычное присваивание:
with open(file) as f:
while True:
chunk = f.read(8192)
if not chunk:
break
chunk_processing(chunk)

2. Walrus operator:
with open(file) as f:
while chink := f.read(8192):
chunk_processing(chunk)

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

#python
Что такое DOM и основы программирования.

Кстати, крайне часто все используют такое понятие, как DOM, но некоторые до сих пор не понимают что это. Давайте кратко и своими словами:

DOM - модель элементов в виде дерева, определяющая структуру вложенности элементов, их связи между собой. Термин применим не только к HTML, кстати. Он также применяется в XML и других сферах, но начало свое берет именно из этих двух технологий.

DOM-дерево - очень классная штука. С его помощью можно наглядно представить любой каскад элементов, который вы только придумаете. Также очень легко можно отследить наследование в документе, а это часто бывает полезно.

DOM сейчас - фундаментальное понятие в программировании, которое должен знать и понимать каждый. А самое главное, что оно предельно простое.

Суть поста - учите базу. Много есть вещей, которые нужно понимать. Без знания методов списка Python лучше не лезть в Django, так же как и без знания стандартных событий JS лучше не лезть в Angular. Учитесь и будьте учимы, всех благ.

#useful #web
1
Синтаксисы SCSS/SASS, работа с препроцессорами.

Казалось бы, что тут такого, но опыт работы с препроцессорами сейчас требуется в большинстве вакансий в front-end сфере.

1. Что это такое?
Препроцессоры CSS своими словами - это надстройка над чистым CSS, предлагающая новый синтаксис и функционал, недоступный ранее. Препроцессор обрабатывает новый синтаксис, на выходе компилируя чистый CSS файл, понятный браузеру. Существует не только SASS, SCSS синтаксиса, но так же я слышал про LESS, но в целом - не важно. Суть везде одна и та же.

2. Зачем?
Препроцессоры позволяют писать код качественнее, быстрее и удобнее. Исходники становятся гораздо меньше в объёме, появляется нормальная вложенность стилей, переменные, аналоги функций, другой дополнительный функционал. Некоторые препроцессоры модифицируют ваш CSS, сделав его совместимым с другими браузерами автоматически. Собственно, от использования препроцессоров одни плюсы.

3. Как использовать?
Есть миллионы способов. Можно установить расширение в VS Code, можно использовать Webpack, Parcel или Prepros, о котором я когда-нибудь, но напишу. Найдите что-то для себя, вам точно понравится.
Ну и надеюсь это было новым для вас.

#web #useful
👍1
Что такое localstorage и как хранить пользовательские данные.

Лично для меня почему-то был открытием тот факт, что существует что-то, помимо cookies. Localstorage, как и следует из названия, - это локальное хранилище для каждого отдельного пользователя. Реализовано все максимально просто.

Имеется 4 основных метода:

// немного сократим код объявлением константы
const storage = window.localstorage

// сохраняем значение
storage.setItem("name", "Денис")

// получаем значение
let name = storage.getItem("name") // "Денис"

// удаляем значение
storage.removeItem("name")

// полностью очищаем всё хранилище
storage.clear()

При помощи localstorage можно решить ряд задач, таких как, например, сохранение параметров авторизации (сохраняем хэш в localstorage и пользователю больше не придется авторизоваться снова), реализация корзины, автозаполнение форм при перезагрузке и даже хранение каких-либо данных для браузерной игры, например. Можно придумать тысячи задач, которые позволит решить этот объект.

Что по нюансам? Их два:
1. Максимальный размер всего хранилища - 5 МБ, так что не спите туда всем, чем попало.
2. Значение для ключа - это всегда строка.

Насчёт последнего есть небольшая лазейка. На самом деле, сохранить можно все, что можно преобразовать в строку и обратно, будь то списки, объекты и другие типы данных. Просто воспользуйтесь JSON.stringify & JSON.parse.

Кстати, примерно тот же функционал имеет объект window.sessionStorage. думаю, что даже из названия ясно в чем разница 🙂

Надеюсь эта информация кому-то поможет. Спасибо за прочтение ❤️ 

#web
🆒1
Запускаем своего первого телеграм бота на Python.

Я уже как-то затрагивал ботов обзорно вот в этом посте, сегодня хочу продолжить немного более конкретно. Итак, телеграм сейчас является самой лучшей площадкой для создания ботов. Ни один другой мессенджер или соцсеть не может похвастаться таким же успехом в этом деле. Объяснить это просто:

1. У телеграма прекрасный, удобный, хорошо задокументированный API.
2. Для него уже сейчас существует огромная кодовая база, десятки библиотек на самых разных языках программирования.

Для примера я взял Python, так как этот язык наиболее распространен среди аудитории моего канала, как мне кажется. Для Python есть две неплохие библиотеки - это pyTelegramBotApi и aiogram. Я написал уже где-то ботов 15 за всё время программирования и с уверенностью могу сказать, что на моей практике это лучшие библиотеки.

Aiogram прекрасен своей асинхронностью, а следовательно эффективностью в высоконагруженным проекте, а pyTelegramBotApi - это синхронный младший брат, который, конечно, менее эффективен, но которого более чем достаточно в большинстве задач. pyTelegramBotApi максимально прост, так что в этой библиотеке разберётся любой.

Для начала зарегистрируем нового бота у @botfather. Это не сложно, не будем на этом останавливаться.

Потом установим библиотеку:
pip install pyTelegramBotApi

Далее создадим файл bot.py и напишем вот такой код:
import telebot

bot = telebot.TeleBot(токен от @BotFather)

@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.send_message(message.chat.id, "привет")

bot.polling(none_stop=True)

Далее разберем основы:
Первое, что нужно обсудить - это объект message, который в себя принимает функция send_message. Message - обычный питоновский словарь, к которому мы можем обращаться по ключам. Принт этого объекта можно посмотреть тут.

Второе, конечно же, декоратор bot.message_handler(commands=['start']). Весь его функционал заключается в том, что функция, обёрнутая декоратором, будет выполнятся на определенную команду, например. То есть мы можем оформить декоратор bot.message_handler(commands=['help', 'помощь']) и описанная ниже функция сработает при командах /help и /помощь.

Это, конечно же, не единственный декоратор, который есть в библиотеке, но его одного достаточно для простейшего бота.

Насчёт bot.send_message.
Это метод, который, как очевидно, отправляет сообщение пользователю. В приведенном выше примере мы отправляем сообщение по идентификатору message.chat.id, то есть в ответ пользователю. У этого класса есть еще много методов, например для отправки фотографии, аудио, игр или других действий.

Теперь я напишу маленького бота, на примере которого, я надеюсь, вы поймёте тему лучше.

Посмотреть код можно тут.
Взаимодействовать с ботом: @progway_test_bot

И, как всегда, спасибо за прочтение ❤️

#python #chatbot
Лучшие расширения для VS Code.

Уже достаточно давно VS Code является для меня основным редактором. И ни для кого не секрет, что вся прелесть этого редактора кода заключается в расширениях. Сегодня хочу поделиться теми, без которых я уже точно не проживу.

1. Andromeda.
Прекрасная тема, которая отлично справляется с выделением кода. Установил чуть ли не с самого начала и очень доволен. Я использую мод Andromeda Bordered. Частично оценить тему можно на прикрепленной фотографии.

2. Material Icon Theme.
Расширение, добавляющее красивые и наглядные иконки для всего, что есть в редакторе. Не более.

3. Better Comments.
Расширение выделяет цветом комментарии типа TODO, а так же добавляет свои виды комментирования.

4. Image Preview.
Добавляет миниатюры фотографий к тем строкам, где они подключается. Значительно повышает читабельность кода.

5. Project Manager.
Расширение, которое добавляет удобную панельку для переключения между проектами прямо из среды разработки.

6. Settings Sync.
Бесплатное облачное хранилище, позволяющее хранить настройки вашего VS Code в облаке и легко их восстанавливать при необходимости.

7. Prettier Formatter.
Отличный форматер для верстальщиков. Очень рекомендую.

8. Polacode.
Расширение, позволяющее создавать красивые скриншоты нажатием одной кнопки. На выходе получаем такое же изображение, что прикреплено к посту.

9. Git Graph.
Очень красивый, наглядный и функциональный графический интерфейс для вашего гит. Расширение считывает лог файл и отрисовывает его.

10. Bracket Pair Colorizer 2.
Популярное расширение, окрашивающее парные скобки в одинаковые цвета. Так же улучшает восприятие кода.

Это конечно же не все расширения, которыми я пользуюсь. Я не включал сюда какие-то специфичные расширения для одной из сфер. Тут я собрал лишь общие расширения, которые будут полезны каждому.

Спасибо за прочтение, это важно для меня.

#useful
Как передать параметры в программу Python из консоли.

Я думаю многие видели конструкции запуска файлов типа
python file.py -n ProgWay —url t.me/prog_way_blog
Такие конструкции бывают полезны, когда скрипт запускается с определенными параметрами автоматически. Как самый близкий мне пример, когда нужно реализовать автоматизированный обработчик логов. Мы получаем на сервер новый чанк информации, засовываем её в в скрипт и на выходе получаем проанализированный файлик, например.

В общем, штука полезная и знать её точно стоило бы, но как реализовать - непонятно.
Я покажу 2 способа:

Первый через встроенную библиотеку sys. Мы получаем список всех аргументов, которые у нас есть при запуске, и уже после можем по нему итерироваться, например:
import sys

for param in sys.argv:
print(param)

Тогда при запуске вот такой конструкции:
python file.py -n ProgWay —url t.me/prog_way_blog
Мы получим вывод:
file.py
-n
ProgWay
—url
t.me/prog_way_blog

С этим уже можно работать, но при большом количестве аргументов ваш код постепенно будет превращаться в нечитабельное говно с огромным количеством условных конструкций, что не есть хорошо.

Второй вариант уже куда более изящный - там я использую библиотеку argparse:
import sys 
import argparse

def getArgs():
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--name', default="ProgWay")
parser.add_argument('-u', '--url', default="t.me/prog_way_blog")
return parser.parse_args()


if __name__ == "__main__":
args = getArgs()
print(args.name)

Тогда при вводе той же строки:
python file.py -n ProgWay —url t.me/prog_way_blog
Мы получим объект, из которого по ключам можем легко достать любой аргумент.

args.name // ProgWay
args.url // t.me/prog_way_blog

Таким образом организовать получение аргументов из командной строки очень просто и эффективно. Спасибо за прочтение ❤️

#python
О сокращении операторов сравнения в Python.

По сути своей, операция сравнения в языках программирования - это бинарная операция, то есть сравнение возможно только для двух объектов. Если объект будет один, то не понятно с чем сравнивать, а если больше 2, то не понятно как. Но если нужно организовать проверку переменной на вхождение в какой-то в диапазон, то обычно это делают так:
a = 5

if (a > 1) and (a < 9):
print(a)

Но на самом деле в Python можно записать то же самое, только используя обычные правила математики:
a = 5

if 1 < a < 9:
print(a)

В JavaScript, например, при такой записи условие просто не сработает и при любом значении переменной оператор выполнится.

В Python же подобные цепочки нормально распознаются и они могут быть чуть ли не бесконечными, то есть условие
1 < a < b < c < d < e < 9
в Python считается достаточно обыденным и распознается без проблем.

Такой небольшой хак, если угодно. Казалось бы, очевидно и логично, но многие другие языки программирования такие операции не поддерживают🤔

#python
Модульность в Python.

Есть несколько видов импортов, которые вы можете использовать. Самые простые - импорты стандартных и установленных библиотек, например:
import Flask 
from random import randint

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

При работе над большим проектом ваша кодовая база очень быстро разрастается. Чтобы оформить качественную декомпозицию, оформить зоны ответственности и упростить проект в целом можно разбить проект на несколько компонентов (структура проекта на приложенной картинке и на github).

Чтобы импортировать файл из той же папки, в которой находится исполняемый файл, можно использовать уже знакомую конструкцию. Допустим, рядом есть файл config.py, куда вынесены все константы. Импортировать его можно так:
import config

Также рядом с исполняемым файлом вы можете создать папку, куда вложите config.py. Такой файл можно импортировать вот так:
from folder import utils

Из вложенной в папку папки (какое странно выражение) импортируем так:
from folder.folder2 import utils2

Также вы можете создать собственный независимый проект, чтобы переиспользовать его где-то ещё. Для этого рядом с главным файлом мы создадим папку package с файлами __init__.py и functions.py.
Содержание файла __init__.py:
from package.functions import sayHello

def init():
print('Инициализировано')

Содержание файла functions.py:
def sayHello():
print('hello')

Теперь в главном файле просто импортируем наш package, с такой структурой нам будут доступны все вложенные функции.

Тема сложнее, чем можно рассмотреть в одном моём посте, так что заинтересовавшиеся погуглят ещё, надеюсь. Мой тестовый проект доступен на github. Хранит вас бог.

#python
О переменных окружения.

Я думаю, что ни для кого не секрет, что секретные токены и данные лучше всего получать в своей программе именно из переменных окружения. Если кто не понимает почему это правильно, то объясняю:

Как можно хранить секретные ключи и переменные:
1. Просто в коде.
Заранее провальный метод, все ключи просто видно.

2. В отдельном файле.
Прекрасно, но обычный файл не так удобен, хотя во многих случаях используют даже такой вариант.

3. В переменных окружения.
Это достаточно унифицированный для всех проектов и программистов способ, а это очень ценится. Очень удобно работать и вот это вот всё.

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

1. Как установить переменную окружения?
Нагуглить ответ на этот вопрос крайне просто, если вы пользуетесь UNIX системами (linux/macos и т.д.), но как мы все знает, консоль windows отвратительна. А ещё windows используют всё же большинство, так что поговорим именно о нём.

Чтобы установить переменную окружения в windows необходимо написать следующую команду в консоли:
set VARIABLE_NAME=value

Команда же set выведет в консоль все переменные окружения.

2. Как получить уже установленную переменную окружения?
Всё проще, чем кажется. За это отвечает встроенный модуль os. Получить переменную можно так:
import os 

TOKEN = os.getenv('TOKEN')

На этом всё, это действительно так просто.

Используйте переменные среды, следите за безопасностью,ну и любите и будьте любимы.

#python #useful
Форматирование строк и что такое интерполяция.

Так, раз уж у меня такое вдохновение пописать про Python, то я не вижу смысла останавливаться. Сегодня расскажу вам про возможные варианты форматирования строк, об их различиях и так далее.

Для удобства давайте обозначим изначальные данные:
name = "Денис"
age = 19

В результате ожидаем строку: "Привет, я Денис, мне 19 лет."

Чтож, начнём с самого простого способа форматирования - это обычная конкатенация. Кто не знал, во многих языках можно складывать строки при помощи оператора "+". В таком случае нужную строку получим так:
result = "Привет, я " + name + ", мне " + age + " лет."

Второй возможный способ - процентное форматирование. Достаточно старый метод, который появился уже давно, и в нашем случае нужную строку мы получили бы так:
result = "Привет, я %s, мне %d лет." % (name, age)

Не знаю как вам, а мне такой способ ужасно не нравится. Он не наглядный, да ещё и типизация переменной просит постоянно запоминать непонятные обозначения. В общем, не рекомендую.

Третий способ - с использованием метода строки format()
Классный метод, но не наглядный, когда в строку нужно вставить, ну, например, 20 переменных. В нашем случае результат будет выглядеть так:
result = "Привет, я {}, мне {} лет.".format(name, age)

Обращу ваше внимание на то, что можно аргументы задавать не позиционно, а именовано, то есть:
result = "Привет, я {name}, мне {age} лет.".format(age=age, name=name)

Тут мы аргументы подаём не в том порядке, но всё отлично работает.

Ну и наконец самый любимый мной да и всеми, надеюсь, способ - это f-строки, или же интерполяция. Интерполяция - это подмена шаблона в строке на какую-то переменную, если своими словами. На практике это выглядит так:
result = f"Привет, я {name}, мне {age} лет."

Чем-то напоминает именованный способ из прошлого примера, но без грязной конструкции после строки. Но более того, этот метод крайне функционален, ведь внутри себя он поддерживает различные операции и вызовы функций. То есть запись типа:
result = f"Привет, я {name.upper()}, мне {_getAge(name)} лет."

Вполне нормально считается и выдаст нужный результат.

Ну хорошо, даже отлично. Но как вы думаете, какой вариант справляется эффективнее по времени? Достаточно нетривиальный вопрос, на который мы с товарищем недавно спорили больше получаса. График вы можете увидеть на прикрепленной к посту фотографии.

Спасибо за прочтение, это важно для меня ❤️
Что такое .gitkeep файл.

.gitkeep обычно пуст и этот файл нужен для сохранения файловой структуры проекта. Система git не добавляет в учёт пустые папки. Если вы хотите добавить пустую папку в структуру своего проекта, вы должны поместить туда хотя бы один файл. Он может иметь абсолютно любое имя, но .gitkeep - это неформальное соглашение между программистами об именовании подобных файлов.

#useful
Что такое ifmain конструкция в Python.

Начнём с того, что конструкция выглядит так:
if __name__ == "__main__":
do_somethink()

Здесь __name__ - это "магическая" переменная, содержащая внутри себя название файла, откуда выполняется какая-то функция или операция. Допустим, что у нас есть 2 файла: main.py и file.py.
Внутри файла file.py имеем код:
def foo():
print(f"А я {__name__}")

В файле main.py реализуем такой код:
import file

print(f"Я {__name__}")
file.foo()

Тогда получим вывод:
>>> Я __main__
>>> А я file.py

Так вот, вышеописанная конструкция проверяет является ли файл главным в стеке вызовов. Все операции, реализованные внутри условия, не выполнятся, если этот файл не будет главным.

Если в файле file.py мы так же добавим:
if __name__ == "__main__":
print("Привет из условия file.py")

То данный принт мы не увидим, потому что главным файлом в цепочке является файл main.py, а переменная __name__ у файла file.py равна "file.py".

Надеюсь, что объяснил понятно. Перепишу, если будут вопросы. В будущем планирую сделать ещё более подробный пост о магических методах, так что предлагаю вам читать меня чаще :)

#python
Тернарный оператор в Python.

Есть такая полезная штука во многих языках программирования, как тернарный оператор. Чтобы понять пользу всей этой конструкции давайте рассмотрим такую задачу:
У нас есть переменная num, в которую пользователь положит число. Если num ≥ 0, то в консоль выведем "Положительное либо ноль", а иначе выведем "Отрицательное".

Реализуем код:
num = int(input())

if num >= 0:
print("Положительное либо ноль")
else:
print("Отрицательное")

С помощью тернарного оператора имплементация решения этой же задачи выглядит так:
num = int(input())

print("Положительное либо ноль" if num >= 0 else "Отрицательное")

По моему решение выглядит очень лаконично. Более удачный тут пример - функция, возвращающая модуль числа. Обычно ее записывают вот так:
def abs(num):
if num >= 0:
return num
return -num

Но с тернарным оператором она будет выглядеть вот так:
def abs(num):
return num if num >= 0 else -num

Читабельный и красивый код, советую. Кстати, пока писал решение задачи, вспомнил про унарные операторы. Когда-нибудь тоже об этом расскажу.

Спасибо за прочтение ❤️

#python
Ещё и блог.

Кстати, совсем забыли, что на самом-то деле это не только канал про фишки питона, но и мой блог, вообще-то)
Хочу поделиться в этом посте тем что вообще в жизни происходит и как успехи с каналом и обучением.

Начну с того, что за последние несколько недель мы успели закончить и сдать сайт, который у нас с @syth0le заказывали. Прошу заметить, что это был по сути наш учебный проект и заказчик знал об этом. Так что если кто-то найдёт ошибки в коде, а они есть, ну сори. Делали как могли.

Могу сказать, что этот сайт - это колоссальный опыт. Я полностью построил вёрстку и фронт и даже когда я сам смотрю на некоторые части проекта - мне до истерики смешно, на сколько это плохо. Но из этого проекта мы очень много извлекли.

Во-вторых, канал. Для меня это что-то сакральное, наверное, потому что мне просто нравится помогать и делиться мыслями, это интересно. Мало того, что я надеюсь кому-то помочь, так ещё и вся эта писанина дополнительно обучает меня. Я заново прохожу материал, повторяю и изучаю. Это круто.

Если вынести последние несколько недель в чеклист, то:
• Купил курс Владилена на 120 уроков по нативному js
• Изучаю vue.js вот по этой книге, рекомендую
• Изучаю Flutter и на данный момент в работе над тем тревел проектом, о котором писал ранее.
• К лету планирую собрать команду из 6-8 человек и написать крутое веб/мобильное приложение, но об этом лучше расскажу как-нибудь отдельно
• Хейчу PHP просто потому что
• Продвигаю канал рекламкой
• Пытаюсь завести привычку писать посты на неделю вперед или что-то типа того. Посты уже полностью готовы до 31.10.20
• Стараюсь не забывать о друзьях и себе
• А, ну ещё я добавил свои стикеры, хаха. Без лишних слов, они прекрасны.

Как-то так вышло. Даже душевно вроде.

А ещё просьба. У меня постепенно иссякают идеи для постов, так как уже которую неделю я стараюсь выпускать что-то ежедневно. Писать мне нравится, так что всех неравнодушных я прошу отписаться мне в ЛС, на рассмотрение принимаются любые идеи.

#blog
Цикл for для списков и словарей.

Я думаю многие знают стандартный способ запуска цикла for для Python через встроенную функцию range(). Записывается он вот так:
for i in range(10):
print(i)


Но на самом деле в Python существует намного больше способов итерирования. Сегодня рассмотрим некоторые из них. Для работы нам понадобятся некоторые переменные, которые можно посмотреть тут.

Чтож, предлагаю начать со списков. Для итерирования я предлагаю вам использовать оператор in. Тогда запись будет выглядеть вот так:
for value in object: 
somethink()


На конкретном примере:
for id_ in subscribersIdList:
print(id_)


Я использую переменную id_ с нижним подчёркиванием после только для того, чтобы избежать совпадения с зарезервированным именем в Python, функцией id().

Если мы будем рассматривать словари, то всё уже гораздо интереснее. Запишем такой вариант:
for key in dict:
somethink()


Тогда на примере:
for city in temperature:
print(f"In {city}: {temperature[city]}°C")


Как вы можете заметить, это очень удобно, но обращаться к словарю temperature по ключу не очень удобно. Чтобы упростить работу придётся познакомиться со встроенным методом списка items(). Он возвращает нам список кортежей формата (key, value). Подробнее смотреть сноску.

Применяя этот метод получаем типовую структуру:
for key, value in dict.items():
somethink()


На примере это будет выглядеть так:
for city, temp in temperature.items():
print(f"In {city}: {temp}°C")


Есть ещё несколько удобных способов, но я предлагаю пока что остановиться на этом, а другое разобрать в следующих постах. Декомпозируем, так сказать, очень хорошая привычка. И шизе привет, кстати. Кто понял, тот понял.

#python