4

Становление (!возможно) будущего питониста. (день 23)

Становление (!возможно) будущего питониста. (день 23) IT, Разработка, Python, Программирование, Самообразование, Backend

Продолжается моя эпопея с изучением питона. Что имеем на данный момент:

На обучение выделяю 3-4 часа в сутки, 5 дней в неделю, с двумя днями вообще ничего не делания (смотрю сериалы)


Прочитана A Byte of Python. Галопом по Европам, но базу дает.

Ознакомился с работой со строками, переменными, списками, словарями, кортежами. Тут же условные операторы, циклы, исключения, работа с файлами. Затронуто ООП в виде функций и классов. Коснулся генераторов, но пока не понял, зачем они нужны. Буду позже разбираться подробнее.


Библиотеки (тысячи их). Ознакомился с некоторыми стандартными. Для своего мини проекта еще освоил немного bs4 и requests. Накидал себе список. Буду изучать по 1-2 новой в день.

Уже могу выполнять задания уровня beginner на сodewars и checkio. Написал несколько простых скриптовых приложений; сделал телеграмм бота, который дописывает в мою колоду Anki, расположенную в облаке, новые слова. Все новые английские слова, обнаруженные в процессе изучения, идут в карточки.


Очень люблю смотреть видосики на youtube. Чтоб это было с пользой, разбавляю обучение каналом Олега Молчанова (очень понятные уроки для начинающих) и Moscow Python (Podcast'ы и выступления с конференций).


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


На очереди алгоритмы. Много встречал в сети холиваров на тему нужны ли они. Для себя решил что нужны. Написать код довольно легко, когда уже придумана логика работы программы. Но вот написать программу без логики и той же теории чисел, зная лишь синтаксис языка, думаю, не очень реально. Конечно, всякие сортировки, возможно, в реальных проектах мне не пригодятся, но знать их не помешает. На youtube нашел  лекции по алгоритмам и структурам данных от Тимофея Хирьянова. Крутой дядька. Параллельно с ними буду читать Грокаем Алгоритмы Бхаргавой, практикуясь на проекте Эйлера.


Пожелайте мне терпения. Буду рад советам.

Дубликаты не найдены

+3
Иллюстрация к комментарию
+1
Мне понравилось (!возможно). Ну, чисто синтаксически.
0

Практически подобным путём двигаюсь. Пиши ещё

0

А зачем эту хню писать, сначала стань программистом, расскажи как ты при этом преуспел, а потом уже пиши. А то:  "я учусь ковыряться в носу, день 20, научился залезать на  2 мм дальше..." - зачем это все, если нет достигнутого результата. Для справки: результат это то, что ты получил благодаря этим навыкам, а не сами навыки.

раскрыть ветку 1
+1

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

Мы можем сэкономить ТСу время и замотивировать его минусами

0

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

0

Чет смысла в посте ноль. От себя могу посоветовать для изучения алгоритмов почитать исходники популярных программ. Мне в свое время помогло.

Похожие посты
92

Встроенные типы данных (их назначение, методы и стандартное поведение) - Строки (часть 1)

Один из самых недооценённых начинающими питонистами встроенных типов данных - строки. Как недавно признался один из студентов: "Когда я встречаю строки - сразу иду гуглить". И это странно, ведь работа с текстом неизбежна.


Откуда текст может возникать? Откуда угодно. Текст может генерироваться при помощи вашего кода налету, приходить извне через input() или откуда-то из интернета. Кроме этого, вы можете (и будете) писать его самостоятельно. Во всех этих случаях вам нужно уметь его обрабатывать либо для дальнейшего использования в коде, либо для вывода на экран, либо для каких-то иных целей.


За работу с текстом в пайтоне отвечают строки. Напомню, что строки - это неизменяемые последовательности, которые поддерживают индексацию и срезы. Пайтон воспринимает текст в качестве текста только в том случае, когда текст заключён (или, если угодно, обёрнут) в литералы строк - кавычки или апострофы.


Все нижеприведённые примеры являются строками в понимании питона:

s = 'text' # одинарные апострофы
s = "text" # одинарные двойные кавычки
s = '''text''' # тройные апострофы
s = """text""" # тройные двойные кавычки

Строкой является любой символ (или последовательность символов), заключённый в литералы строк, в т.ч. пробелы, цифры, знаки препинания.

# Это всё строки
s = '' # пустая строка (без символов между литералами) - тоже строка
s = " " # это строка из одного пробела
s = 'мама мыла раму'
s = "1234" # это не число, это строка
s = " Привет, мир! "

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


В чём разница одинарных и тройных литералов? Стандартно для объявления строк в коде мы используем одинарные кавычки или апострофы. И чаще всего такие строки являются короткими.


Тройные вариации используются в основном для написания документационных аннотаций к модулям, классам и функциям. Иначе это называется docstring или докстринг, и о них мы поговорим, когда дойдём до функций. А пока что нужно иметь в виду, что такой тип объявления строки технически доступен в рамках кода как такового для создания длинных строк.

Что значит короткая и длинная строка? Для ответа на этот вопрос вспомним PEP8: длина строки кода не должна превышать 80 символов. Пока строка текста не превышает этот предел - она считается короткой. Как только текст требует переноса - строка становится длинной.


Экранирование

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

>>> s = "text" # одинарные двойные кавычки
>>> s
'text' # в выводе - одинарные апострофы

Нам с вами совершенно не важно, какие литералы отобразятся в принте. Единственное, что нас интересует - это то, что заключено внутри этих литералов. Но такое поведение сохраняется до определенной ситуации.


Сейчас внимательно следите за порядком слов "кавычки" и "апострофы". Если внутри самой строки должны содержаться апострофы или кавычки, то сама строка должна обрамляться соответственно кавычками или апострофами:

>>> "A.Dumas - D'Artagnan et les trois mousquetaires"
"A.Dumas - D'Artagnan et les trois mousquetaires"
>>> 'Ледокол "Ленин"'
'Ледокол "Ленин"'

Т.е. питон самостоятельно меняет вид обрамляющих литералов в зависимости от того, что находится внутри строки. А что если внутри строки должны быть и кавычки, и апострофы одновременно? Тут можно пойти двумя путями:

1. использовать тройные кавычки или апострофы (при чём без разницы, что вы из них выберете),

>>> """O'Reilly published D.Beazley's book "Python Cookbook" in 2013"""
'O\'Reilly published D.Beazley\'s book "Python Cookbook" in 2013'

2. использовать экранирование специальным символом обратного слэша - \.

>>> 'O\'Reilly published D.Beazley\'s "Python Cookbook" in 2013'
'O\'Reilly published D.Beazley\'s "Python Cookbook" in 2013'
>>> "O'Reilly published D.Beazley's \"Python Cookbook\" in 2013"
'O\'Reilly published D.Beazley\'s "Python Cookbook" in 2013'

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


В экранировании также нуждаются специальные символы, при использовании которых в поведении строк происходят те или иные изменения. За полным списком таких символов и за примерами использования я вас пошлю вот сюда. Здесь же я опишу только те, которые чаще всего используются на деле (некоторые примеры я позаимствовал оттуда же).


Однако, прежде чем продолжить, хочу сделать ремарку для тех, кто родился в эпоху мобильных телефонов: некоторая терминология в статье, куда я вас отправил, относится к эре печатных машинок. Если вы не знаете, что такое звонок, каретка и как её переводить - "Ok, Google! Устройство печатной машинки".


Итак,

\ - если после символа \ сразу нажать Enter, то это переведёт каретку на новую строку:

>>> s = 'Это будет очень\
... , очень-очень\
... , ну прям оооооочень\
... длинная строка'
>>>
>>> s
'Это будет очень, очень-очень, ну прям оооооочень длинная строка'

\\ - экранирование символа обратного слеша (полезно при работе с файловой системой винды):

>>> s = 'D:\\мои документы\\книги\\Лутц.pdf'
>>> s
'D:\\мои документы\\книги\\Лутц.pdf'

\n - перевод каретки (новая строка):

>>> s = "Мама мыла раму\nМила раму мыла"
>>> print(s) # только функция print понимает, что делать со спецсимволами
Мама мыла раму
Мила раму мыла
>>> s # в этом случае просто выводится содержимое переменной
'Мама мыла раму\nМила раму мыла'

\t - горизонтальный отступ слева от начала строки (горизонтальная табуляция (да, есть и вертикальная)):

>>> s = '0\t1\t\t2\t\t\t3'
>>> print(s)
0 1 2 3
>>> '0 1 2 3'
'0\t1\t\t2\t\t\t3'

Achtung! Achtung! Приятные новости: в длинных строках всё это не нужно! =)

>>> s = """Эта очень длинная строка
... сама переносится, сама табулируется
... сама экранируется \."""
>>> print(s)
Эта очень длинная строка
сама переносится, сама табулируется
сама экранируется \.
>>> s
'Эта очень длинная строка\nсама переносится, сама\tтабулируется\nсама экранируется \\.'
>>> s = """Но если вдруг вам будет очень нужно прописать здесь что-то вроде '\n', то вам нужно воспользоваться экранированием, чтобы \\n не выполнялся"""
>>> print(s)
Но если вдруг вам будет очень нужно прописать здесь что-то вроде '
', то вам нужно воспользоваться экранированием, чтобы \n не выполнялся

Функция print

Тут надо бы вспомнить про функцию print. Как я уже говорил, это функция всеядная и может переварить много чего. Помимо того, что она всеядная, она ещё и достаточно хитрая. Напишите в консоли вот такую команду :

>>> help(print)

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

Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.

Лаконично, просто и понятно. Вот её сигнатура:

def print(self, *args, sep=' ', end='\n', file=None):

Она говорит нам о том, что:

*args - функция всеядная, т.е. ожидает любых аргументов в любом количестве,

sep=' ' - при выводе нескольких аргументов для их отделения друг от друга по умолчанию используется пробел,

end='\n' - любой вывод по умолчанию заканчивается переводом каретки на новую строку,

file=None - по умолчанию вывод производится на экран (если в этот параметр передать имя конкретного файла, то информация запишется (будет выведена) в такой файл).


Собственно, что это вдруг я её вспомнил? Посмотрите ещё раз внимательно. В числе её параметров присутствуют такие вещи как sep=' ' и end='\n'. Оба этих параметра принимают любые строковые символы, в том числе экранируемые. Зачем это нужно знать? Затем, чтобы иметь возможность оформлять вывод по своему желанию.

>>> a = "Мама"
>>> b = "мыла"
>>> c = "раму"
>>> print(a, b, c) # стандартный принт трёх переменных
Мама мыла раму
>>> print(a, b, c, sep='\t') # делаем разделителем табуляцию
Мама мыла раму
>>> print(a, b, c, sep='\t', end='\n\n') # добавляем лишнюю пустую строку по окончанию вывода
Мама мыла раму
>>> print(a, b, c, sep='42')
Мама42мыла42раму
>>> print(a, b, c, sep='42', end='THE END')
Мама42мыла42рамуTHE END

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

Но проще и лучше отформатировать строку заранее, чем пытаться подстроить под неё принт.


Префиксы

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

u (U) - строка символов юникода (если вы не используете Python2, то можете смело о нём забыть),
r (R) - сырая строка;
b (B) - строка байтов;
f (F) - форматированная строка,
fr (rf, fR, rF, Rf, Fr, FR, RF) - сырая форматированная строка
br (rb, rB, bR, Br, Rb, BR, RB) - сырая байтовая строка.

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


Префиксы указываются до литералов без пробелов, например:

>>> s = r'\a\n'
>>> s
'\\a\\n'

Сырые строки

Сырые строки - это строки, в которых действие экранируемых символов подавляется. Проще говоря - в этих строках всё выходит на принт в первозданном виде.

Повторю пример:

>>> s = '\a\nМама' # обычная строка
>>> print(s)
# в этом месте сработал символ переноса строки "\n"
Мама
>>> s = r'\a\nМама' # сырая строка
>>> print(s)
\\a\\nМама

Сырые строки можно использовать как минимум в трёх случаях:

- в регулярных выражениях,

- для хранения файловых путей Windows, поскольку в них содержатся обратные слэши;

- для хранения сложных математических формул в разметке LATEX.


Байтовые строки

Байтовыми строками являются строки, отражающие двоичную структуру любых данных, в том числе текста, картинок, музыки, видео и т.д. При работе с текстом такие строки возникают при кодировании строки методом encode():

>>> s = 'Mama'.encode()
>>> print(s)
b'Mama'
>>> s = "Мама"
>>> s = s.encode()
>>> print(s)
b'\xd0\x9c\xd0\xb0\xd0\xbc\xd0\xb0'

Если к вам вдруг прилетела байтовая строка, то чаще всего её можно привести в человеческий вид при помощи обратного метода decode():

>>> s = b'\xd0\x9c\xd0\xb0\xd0\xbc\xd0\xb0'
>>> s = s.decode()
>>> print(s)
Мама

Форматированные строки

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

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

Логично предположить, что для таких целей есть некий шаблон, который выводит на печать заранее посчитанную общую стоимость покупок. В шаблоне есть заготовленная стандартная фраза "Общая стоимость покупок - ". А что дальше? Кассир же не будет каждый раз писать туда новую сумму для каждого нового покупателя. Значения должны автоматически в неё подставляться - для этого и существуют форматированные строки.

В версии Python 3.6. наконец появилась замечательная альтернатива старому методу форматирования строк str.format() - префикс f (или в обиходе - f-строки), который делает эту процедуру приятной и лёгкой до невозможности. Но вы должны это увидеть и оценить.

Итак, до версии 3.6 нужно было делать примерно так:

# представим, что общая сумма как-то посчиталась раньше и содержится в переменной total_sum
>>> total_sum = 1000
>>> final_sum_template = 'Общая стоимость покупок - {} руб.'
>>> s = final_sum_template.format(total_sum)
>>> print(s)
Общая стоимость покупок - 1000 руб.

То есть, под значение из total_sum в шаблоне заготовлено отдельное место в виде {}. Для вставки в это место требуемого значения нужно вызвать метод .format(), куда передать переменную или непосредственно само значение - и только тогда строка будет полностью сформирована. В данном примере это выглядит не так жутко. Но представьте ситуацию, когда у вас есть куча значений, которые должны лечь в одну строку. Чтобы не потеряться, в шаблоне нужно было делать именованные аргументы, чтобы потом их можно было вызывать в .format() и передавать туда значения. Например:

>>> name = "Вася"
>>> surname = "Пупкин"
>>> age = 18
>>> template = 'Это {a}. Его фамилия {b}. Вчера ему исполнилось {c} лет.'
>>> s = template.format(a=name, b=surname, c=age)
>>> print(s)
Это Вася. Его фамилия Пупкин. Вчера ему исполнилось 18 лет.

И всё это длинно, долго, муторно... А вот всё то же самое, только в f-строке:

>>> name = "Вася"
>>> surname = "Пупкин"
>>> age = 18
>>> s = f'Это {name}. Его фамилия {surname}. Вчера ему исполнилось {age} лет.'
>>> print(s)
Это Вася. Его фамилия Пупкин. Вчера ему исполнилось 18 лет.

Как минимум, у нас минус одна строка кода - это уже классно. Нет, конечно же, можно метод .format() сразу вызывать у template, но тогда мы рискуем получить очень длинную строку кода. Вдруг предложение в шаблоне уже занимает 80 символов (кстати, в "старом" шаблоне их уже 70)? Но дело даже не в этом. Я надеюсь, вы смогли оценить то, насколько процесс формирования текста упростился в этом месте. По сути это уже готовое предложение без лишней головной боли. Здесь уже нет никаких именованных заготовок, ожидающих передачу аргументов. Здесь заготовки, в которых уже стоят нужные аргументы. Кроме того, f-строки работают заметно быстрее старого метода.


Если вам мало и я вас не убедил, то почитайте вот эту статью. Если же я вас убедил, то у вас мог возникнуть вопрос: "зачем тогда вот это вот всё про устаревший метод?" Дело в том, что его пока ещё не вывели из использования. Кроме того, некоторые библиотеки, особенно те, которые написаны задолго до версии Python 3.6. и до сих пор находятся в строю, упорно не переписываются под использование f-строк. При работе с ними возникает прямая необходимость прибегать к старому методу. Поэтому для интересующихся - ссылка на старый добрый str.format()


To be continued...


-----

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


Да, и тег моё - потому что всё написано моими руками, а не тупо понакопировано с других сайтов.


P.S. Большое спасибо всем моим подписчикам за поддержку и активность! Без вас я, возможно, не решился бы продолжать.


Ссылки на предыдущие посты:

1. Предлагаю помощь в освоении Питона

2. ПЕРВОЕ ЗНАКОМСТВО С PYTHON

3. Встроенные типы данных (их назначение, методы и стандартное поведение) - Введение

4. Встроенные типы данных (их назначение, методы и стандартное поведение) - Числа

Показать полностью
70

Ответ Seegurd в «Про perl и годовой баланс» 

Пара историй из моей практики:

1. Обратилась как-то ко мне одна первокурсница удалённой формы обучения помочь с экзаменом по информатике. Ну как помочь - задачки простые на бейсике и, когда я начал ей объяснять как просто это делается, она лишь заморгала глазками. Я всё понял и вскоре сбросил ей все решения.

Первая сессия. Каждому студенту предоставлялся диск с программами для курсовых и экзаменов в форме тестов, результаты которых нужно было высылать в ВУЗ.

Программы явно написаны на дельфи, информация в запароленных парадоксовских БД.

Далее дело техники - взломал пароль, расписал поля и оформил всё это в приложении на билдере. Дальше всё-таки рутина - копируешь вопрос из программы-экзаменатора, переходишь в ЖУК (так назвал свою прогу), жмёшь кнопку "Сделать зашибись" и прожимаешь полученный ответ в тесте.

Позже ВУЗовские умники перенесли всё это в онлайн, но базы остались старые ;)


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

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

75

Как стать грамотным разработчиком встраиваемых систем?

Доброго времени суток, в начале этого года я написал пост как жить чуть больше чем на МРОТ и тут же настал коронавирус. Через некоторое время меня сократили, и чет стало вообще грустно. Не знал куда податься, хотел попробовать себя в web разработчиках, но обстоятельства сложились так, что я  стал делать несложные проекты на ардуино, а теперь и на esp32, благо я понимаю в схемотехнике и моделировании, но был полным нулем в программировании (да и сейчас не далеко ушел). Но мне понравилось это направление и в будущем хочу стать серьезным разработчиком, не только на атмегах, esp и stm, но вообще на любых микроконтроллерных системах. И вот тут я опять столкнулся с отсутствием информации, в универе нас этому не учили и я понимаю, что могу не осознавать, что какие то вещи надо учить уже сейчас, например FreeRTOS, работа с аппаратной частью микроконтроллеров, взаимодействие программно с ними, высшая математика вдруг нужна оказалась и углубиться в нее надо. Просто поверхностное знание C++ и Phyton  не позволит что то серьезное создавать. Сам С++ это тоже не просто синтаксис, я знаю что в нем есть очень мощные инструменты, которыми те же ардуинщики не пользуются. Время у меня есть, минимум год, есть база, есть желание и заказы в этом направлении, очень простые, но на хлеб хватит. Хочу делать серьезные и крутые штуки. Может подскажите подходящие книги, может зарубежные каналы или даже курсы, если надо летом в Москву поеду. А вот поступать 3й раз в вуз точно не хочу, это бесполезно.

Просто прошу совета. Без рейтинга.

Жаль что только в 33 пришло осознание чем хочу заниматься.

P.S. Кстати в университете успел пообщаться с системами National Instruments, но было это лет 10 назад.

Как стать грамотным разработчиком встраиваемых систем? Без рейтинга, IT, Программирование, Встраиваемые системы, Arduino
9292

Ответ на пост «Про perl и годовой баланс» 

Ответ на пост «Про perl и годовой баланс» IT, Бухгалтерия, Отношения, Vba, Макрос, Программирование, Ответ на пост

Как сисадмин задумал на бухгалтерше жениться.


Я со своей будущей супругой тогда работал в одной конторе и в одном кабинете. Она бухгалтер, я - сисадмин. Мы только начали как-то общаться и слегка проявлять симпатию. Однажды пили чай вместе, болтали, и она рассказала, что уже неделю делает какую-то нудятину а-ля сведение нескольких огромных таблиц в Excel.


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


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


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

Ну и короче моих знаний VBA и макросов Excel хватило на то, чтобы через пару дней я презентовал ей первый вариант "программы", где достаточно было положить все файлы в одну папку, обозвать нужными именами и нажать кнопочку "Сделать красиво" на форме - и спустя пару минут был готов итоговый файл, удовлетворяющий искомому результату. Список появился, нужные строчки в исходных файлах выделялись цветом, чтобы их можно было легко найти.


Девушка была в восторге, еще бы, потратить две минуты времени на то, что она раньше делала неделю!

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

Мораль: знание даже основ программирования может пригодиться вам в совершенно непредсказуемых обстоятельствах. Или нет.

Показать полностью
12149

Про perl и годовой баланс

Работал я в банке, в ~2007 году. По приходу в этот банк - закупил новый сервер, поставил в туда новый опердень, поднял DC, протянул и настроил сеть, закупил и настроил новые машины для операционистов, всё завёл, всё работает. Ну, такой банк, да. Да, не было сети у многих. Но речь не об том.

Дело идёт к концу года. Я уже сижу и просто мониторю машины, бэкапы. Чегототам программирую от нечего делать.

Замечаю что главбух (Г) уже неделю задерживается чуть ли не до ночи. Интересуюсь что случилось.

Г:- Да вот, годовой баланс свожу

Я:- Ну так опердень же умеет. Давайте найду как

Г:- Да опердень то умеет но проблема в другом. Во первых, в опердне только часть транзакций, с того времени как внедрили. Во вторых, есть старый опердень и там ещё часть транзакций за исключением тех, которые туда не попали из-за аварий и от тех транзакций осталось только платёжки.

Я:- Так, и что вы делаете?

Г:- Ну вот у меня есть старый опердень, есть новый, есть текстовые файлики с платёжками. Вот это всё в эксель переношу и считаю.

Я:- Понял. Могу помочь. Рассказывайте что в итоге должно быть и как считать.

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

Взял я в руки perl и пошёл говнокодить. Сначала разобрался с новым оперднем. Делал в него запрос, в БД, вытаскивал данные в нужном формате. Во вторых, старый опердень. БД - dbf. Тоже относительно просто откопал оттуда нужное. В третьих - файлики текстовые. Где-то cp866, гдето 1251... Конечно же регекспы! Провозился чуть дольше но и это осилил. Время от времени ходил к главбуху, показывал промежуточное и выяснял правильно ли иду. На третий день уже она начала мне помогать. Про двойную книгу рассказала, местами помогла найти ошибки в логике расчётов. В общем, недели две или три вот так вот мы с ней в команде работали и таки родили результат. Довольная была как не знаю даже кто. Говорила что сама бы провозилась месяца два минимум.

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

149

ПЕРВОЕ ЗНАКОМСТВО С PYTHON

Общие понятия

Python (в русском языке распространено название пито́н или па́йтон) — кроссплатформенный высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода.


Эту фразу видели все, кто хоть раз в жизни открывал статью про Python на Википедии. Вроде бы всё просто и ясно, но как-то не очень. Уже здесь встречаются непонятные термины: кроссплатформенный, высокоуровневый… Дать ёмкое и понятное определение чему бы то ни было – это великое искусство. Поэтому, я думаю, стоит пояснить всё вышесказанное простыми словами. А простыми словами это выглядит примерно так: Пайтон – это язык программирования, который можно использовать на любой известной стандартной операционной системе (Windows, MacOs, Linux) и при помощи которого можно написать практически любую программу (от «Привет, мир!» до новой операционной системы или нового языка программирования). Звучит заманчиво, не так ли?


Пайтон был придуман в 1991 году голландцем Гвидо ван Россумом, также известным как «великодушный пожизненный диктатор». Именно он по сей день принимает окончательные решения о том, как именно будет развиваться язык. Кстати, последняя версия питона (3.9.0) вышла буквально на днях – 05.10.2020. Её главная особенность для новичков, на мой взгляд, в том, что для её установки требуется минимум Windows 10 (на семёрку она не инсталлируется). Всё, чему будут посвящены мои статьи, гарантированно будет актуальным для версий 3.6.0-3.9.0. Версии питона 2.Х здесь рассматриваться не будут, т.к. для разработки новых приложений они уже не используется, а те, кто всё ещё стоически поддерживает приложения, написанные на них, вряд ли будут всё это читать.



Объектно-ссылочная модель

В своих интервью Гвидо подчёркивал, что никогда не видел Python в качестве языка сугубо функционального программирования. С самого начала питон позиционировался как язык объектно-ориентированного программирования (ООП), однако, он на нём можно писать в абсолютно любой парадигме - структурное, обобщенное, объектно-ориентированное, функциональное и аспектно-ориентированное программирование. Не буду заострять внимание на том, что означает каждый из них. Если интересно - это легко гуглится. Что же касается ООП, то пайтон спроектирован таким образом, что абсолютно всё, что в нём есть, т.е. все типы данных, функции, методы, классы, переменные – всё это является объектами, то есть некоторыми сущностями, обладающими определённым состоянием и поведением, имеющими определённые свойства (атрибуты) и операции или действия над ними (методы). Что это означает на практике, мы увидим уже достаточно скоро, а пока что просто примите это и уверуйте, что это именно так.


Переменных (в привычном понимании – «контейнеров») в питоне не существует. Когда в коде встречается нечто вроде «а = 5», серьёзные бородатые программисты в свитерах вам скажут, что «а» - это переменная, в которую записано значение «целое число пять». В случае с питоном это утверждение правда и неправда одновременно. В питоне «целое число пять» – это самостоятельный неизменяемый объект, который лежит где-то в оперативной памяти вашего компьютера. Например, выполним в консоли интерпретатора следующую команду

>>> id(5)
1609562080

Этой командой мы узнаём адрес той ячейки памяти, где у нас лежит число 5 – это ячейка 1609562080 (у вас может быть другое значение – это неважно).

Следом выполним ещё пару команд:

>>> a = 5
>>> id(a)
1609562080

Оказывается, у переменной «а» тот же адрес, что и у самой пятёрки. Но ведь если в питоне всё является объектом, то переменная – это контейнер, а значит тоже объект, то у неё должен быть свой адрес? Ответ – нет. В питоне нет переменных-контейнеров. Вместо этого в питоне есть ссылки на объекты. В данном случае «а» - это ссылка на число 5. Как это ещё проверить? Очень просто. Выполним ещё одну команду

>>> b = 5
>>> id(b)
1609562080

То же самое?! Да, именно так. Переменная «b» ссылается всё на ту же самую пятёрку. Последняя проверка этой теории:

>>> a is b
True

Переменная «а» - это то же самое, что и переменная «b», и любая другая «переменная», которая будет ссылаться на пятёрку, какое бы имя вы ей не придумали.


Возникает вопрос: а что же тогда такое знак «=» в данном случае? В питоне знак «=» не знак равенства, а оператор присваивания. Равенство в питоне выражается через оператор «==», который используется исключительно в булевой логике, т.е. для сравнения значений и/или содержимого разных объектов.


Итак, вывод: в питоне переменных нет, знак «=» не приравнивает значение к переменной и не записывает значение в переменную, а присваивает какому-либо объекту именную ссылку для удобства обращения.



Динамическая типизация

Динамическая или как принято в питонической среде - «утиная типизация». Это очень простая концепция: «Если что-то выглядит как утка, плавает как утка и крякает как утка, то это наверняка и есть утка».


Существуют языки со статической и динамической типизацией данных. Статическая типизация – это когда мы до того, как записать в нашу переменную «а» пятёрку, сначала должны создать эту самую переменную и объявить, что в эту переменную мы будем складывать только целые числа. Никакой другой тип данных, в том числе дробные числа, в эту переменную после этого положить уже не получится.


Прелесть и одновременно боль питона состоит в том, что в нём в одну и ту же «переменную» можно положить что угодно. А если вспомнить слова из предыдущего блока, то надо понимать, что «переменные» тут вообще ни при чём, так как это всего лишь ссылки, а вот сами объекты могут свободно менять своё состояние из одного в другое на лету. Например, было у нас целое число 5. Не хотим мы его в виде целого числа, мы хотим строку. Пожалуйста, без проблем:

>>> a = 5
>>> type(a)
<class 'int'>
>>> a = str(a)
>>> type(a)
<class 'str'>
>>> a
'5'

Вот и всё, теперь переменная «а» ссылается уже не на целочисленный объект 5, а на строковый объект 5. Для наглядности я сразу запросил тип каждого из объектов, и оснований не верить результатам лично у меня нет: вначале пятёрка – это число, в конце – строка. Об этом говорит не только type(a), но и само значение, которое раньше было голой пятёркой, а теперь обрамлено кавычками.


Подобным образом тип любого объекта можно менять очень быстро в зависимости от нужд разработчика, и в этом прелесть. Почему это одновременно и боль? Потому что динамическая типизация к огромному сожалению отбирает большое количество ресурсов, что сказывается на производительности и быстродействии. Да, это какие-то там микросекунды, но они очень важны. Кроме того, неопытные разработчики очень любят использовать эту прелесть без особой нужды, что, во-первых, отъедает ресурсы, а во-вторых, даёт подчас внезапные неожиданные результаты. Например, вы бы хотели ожидать на выходе работы программы целое число, а получаете строку. Казалось бы, чего проще – ну переделай её обратно в число и живи счастливо? Но согласитесь, что это как минимум неудобно, когда вам нужно неожиданный результат потом как-то обрабатывать и приводить к нужному типу. Это дополнительный код, а значит дополнительное время на его написание, на его работу и на его поддержку. А время – деньги.



Стиль кодирования. PEP8

У каждого языка программирования, как и любого другого языка, есть свои законы, которым он подчинён. Если русском языке мы пишем названия месяцев со строчной буквы (9 мая, 8 марта), то в английском, например, месяцы всегда пишутся с прописной (January, 4th of July). Питон также имеет свою семантику, грамматику и свой синтаксис. Основным сводом законов, определяющих требования к красивому и качественному стилю кодирования определены в документе, который называется Python Enhancement Protocol 8 или PEP8. Основные правила на самом деле достаточно просты, но почему-то на каждом новом курсе я встречаю людей, упорно их игнорирующих.


Давайте начнём с того, что Python – язык международный. Это вам не 1С, на котором пишут в буквальном смысле по-русски. В питоне всё по-английски. Всё и всегда. Мне попадались 2 уникума, которые упорно именовали переменные по-русски. Объясняли они это тем, что «так понятнее». Нет, если вы не знаете английского, то вам, возможно, будет понятнее. Но нужно учитывать, что IT – это англоязычная среда, все программы, и 90% документации написаны именно на английском, и, в конце концов, ваш код могут читать (а большинство времени будет потрачено именно на его чтение, причём не только вами) люди, не знающие русского. Ну или давайте наоборот: вам прислали на проверку кусок кода, где половина на хинди или суахили. Как вам такое? Возьмите себя в руки и если вы не знаете или плохо знаете английский – начните его учить с нуля. Не брезгуйте онлайн-переводчиками и словарями для выбора имён переменных и функций – это не стыдно.


Вообще, раз уж зашла об этом речь, то надо сказать, что есть отдельная книга, которая посвящена рефакторингу кода. Название переменной должно отражать то, что в ней лежит (или в нашем случае – на что она ссылается). Название функции должно чётко отражать то, что она делает. Многие и то и дело пишут примерно так:

>>> a = 5
>>> b = "mama"
>>> for i in b:
... print(i * a)
...
mmmmm
aaaaa
mmmmm
aaaaa

Казалось бы, всё работает – что ещё нужно? Да, работает. Даже если бы переменные были названы по-русски или по-китайски, то же бы работало, так как питону глубоко всё равно, какой алфавит вы используете для обозначения ссылок - он всё это перерабатывает в байтовые представления символов юникода. Кошмар же заключается в том, что не соблюдено главное правило питониста: код должен быть читаемым. Читаемым человеком, его глазами. Возможно, сейчас это будет сложно, но попробуйте представить, что между объявлением переменных и циклом for не ноль строк, как сейчас, а 100-150-200. Да, это утрированный пример, но всё-таки. Никто через 100, да даже через 50 строк не вспомнит, что такое переменные «a» и «b». Ну какие-то там переменные, но что в них лежит, на что они ссылаются? Может это число и строка? А может это строка и число? А может это и не строка и не число? Надо лезть выше, искать их, разбираться. Опять всё сводится к бесполезной трате времени.


Не проще ли было сразу назвать эти переменные по-человечески (в прямом смысле)? Давайте попробуем:

>>> number = 5
>>> string = "mama"
>>> for i in string:
... print(i * number)
...
mmmmm
aaaaa
mmmmm
aaaaa

Выхлоп не изменился, но мозгу становится понятнее, глазу приятнее. Осталось разобраться с «i».

В строке «for i in string» «i» является ничем иным как временной переменной. Её тоже нужно уметь красиво и понятно назвать. Как показывает моя собственная практика, иногда хорошее, грамотное название переменной снимает у студентов возникшие вопросы по дальнейшим действиям. Они внезапно начинают понимать, что делали не так и что нужно на самом деле делать и куда двигаться. Так давайте уже её переделаем и пойдём дальше:

>>> number = 5
>>> string = "mama"
>>> for letter in string:
... print(letter * number)
...
mmmmm
aaaaa
mmmmm
aaaaa

Именно это и описано в PEP8 – как писать качественный код, отвечающий требованиям и стилю Python, или как принято говорить – pythonic style или pythonic way. Многие из нас, кто ещё в школе пытался учиться программированию, помнят такой язык, как Basic или QBasic. Потом он перерос в VBA и до сих пор (к сожалению…) используется для написания макросов в офисных программах Microsoft. И в связи с этим у многих из нас при изучении питона всплывает Basic style – стиль кодирования на Basic. Pythonic style ушёл намного дальше. Читаемость кода за счёт простоты синтаксиса повысилась в разы. Вот для наглядности пример.

Задача: получите из входного потока число и напечатайте сумму его цифр.

Как бы эту задачу решило большинство в «Basic style»:

>>> number = input()
>>> summa = 0
>>> for dig in number:
… if dig in '0123456789':
…  summa = summa + int(dig)
>>> print(summa)

Как это решается в «Pythonic style»:

>>> print(sum(int(x) for x in input() if x.isdigit()))

Возможно, вам сейчас ничего не понятно из того, что тут написано, но вам стоит оценить хотя бы то, сколько сил и времени сэкономлено за счёт сокращения количества строк. «Достаточно одной таблетки» (с). В данном случае – одной строки, а результат одинаковый.


Давайте тезисно определим основные правила синтаксиса:

- используя питон, мы пишем на английском языке;

- все названия переменных, функций, классов должны как можно полнее отражать их суть и содержание;

- названия переменных и функций принято писать в нижнем регистре, разделяя слова подчёркиванием (snake_case):

# ПРАВИЛЬНО
my_number = 42
def my_function():
#НЕ правильно
MyNumber = 42
Mynumber = 42
MYNUMBER = 42
mynumber = 42
МоЙнОмЕр = 42
def MyFunction():
def Myfunction():
def MYFUNCTION():
def myfunction():

- названия классов принято писать в CamelCase – слова пишутся с заглавной буквы без разделителей между словами:

# ПРАВИЛЬНО
class MySuperPuperClass:

#НЕ правильно
все остальные варианты

- для названия переменных, функций и классов нельзя использовать зарезервированные слова (слова, которые зашиты в питоне в качестве операторов, имен встроенных функций, классов и их атрибутов и методов);

- конец строки является концом инструкции (никакие специальные знаки не требуются);

- вложенные инструкции объединяются в блоки по величине отступов. 1 отступ = 4 пробела;

- вложенные инструкции в Python записываются в соответствии с одним и тем же шаблоном: основная инструкция завершается двоеточием, вслед за которым располагается вложенный блок кода с отступом в 4 пробела под строкой основной инструкции.

if a == 1:
print('mama' * 3)  # 4 пробела после двоеточия

- в случае, если длина инструкции превышает 80 знаков, допустимо записывать одну инструкцию в нескольких строках. Достаточно ее заключить в пару круглых, квадратных или фигурных скобок:

if (a == 1 and b == 2 and
c == 3 and d == 4):  # продолжение инструкции выравнивается по открывающей скобке
print('mama' * 3)  # 4 пробела после двоеточия

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

>>> if x > y: print(x)

- технически возможно записать несколько инструкций в одной строке, разделяя их точкой с запятой (но такой способ не приветствуется, т.к. не соответствует стилю кодирования PEP8):

>>> a = 1; b = 2; print(a, b)

Это основные вещи, которые нужно выучить. Благо, что мы живём в 21 веке и рабочие среды уже давно умеют анализировать наш код на соответствие стилю, а также полно разнообразных сторонних линтеров. Поэтому, если вы переживаете, что вы не осилите этот момент – ваша IDE вам подскажет, где что поправить, и в большинстве случаев – сама же и поправит. Если она этого самостоятельно делать не умеет, то можно воспользоваться сторонними линтерами.

Что будет, если на всё это забить и писать как бог на душу положит? Да ничего. Просто вас проклянут до десятого колена те, кто будет это читать, а в остальном ничего.



Дзен питона

Также у питона есть свой собственный сборник мантр, который также призван формировать хороший стиль у разработчиков. Выполним в консоли команду:

>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Перевод на русский конечно же существует:


Дзен Пайтон (составлен Тимом Питерсом)
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один — и, желательно, только один — очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец (это такая шутливая отсылка к Гвидо).
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имён — отличная вещь! Давайте будем делать их больше!

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



«Hello, world!»

Пришло время написать первую программу. Хотя на самом деле это не так. Свою первую программу все те, кто скачал и поставил себе пайтон, уже написали. С точки зрения программирования рабочей программой называется та программа, которая запускается и не выдаёт ошибок. Так что с этой точки зрения пустой код – это вполне рабочая программа. Вы можете в этом сами убедиться, создав пустой файлик с расширением .py и запустив его через вашу IDE. Физически ваша «программа» ничего не выдаст, но интерпретатор вам скажет «Process finished with exit code 0», что означает, что код был запущен и завершен без ошибок, а значит он вполне рабочий.


Под первой программой стандартно понимается программа, выводящая на экран сообщение «Hello, world!» - то есть нам нужно просто вывести текст на экран. Для вывода на экран существует встроенная функция «print». Для вызова функции нам необходимо добавить к её названию круглые скобки: print().


Можно написать в консоли print(), нажать Enter – программа отработает без ошибок, но ничего напечатано не будет. И это нормально, ведь мы не сказали функции, что именно ей нужно напечатать. Пока что мы просто заставили её сработать вхолостую, что она и сделала.

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


Текст в питоне – это тип данных «строка» (подробнее о них мы поговорим в следующий раз, и поверьте, там есть о чём). Строки должны быть заключены в кавычки.


Hello, world! – это не строка.

"Hello, world!" – а вот это уже строка.


Значит именно так мы и должны передать её в функцию print.


Итак,

>>> print("Hello, world!")
Hello, world!

Отлично, мы сделали это! Но, можно ещё интереснее. Например, можно записать строку в переменную, передать в функцию эту переменную и распечатается та же строка:

>>> hello = "Hello, world!"
>>> print(hello)
Hello, world!

Мне надоело здороваться со всем миром, я хочу разнообразия. Для этого я хочу сам говорить программе, с кем поздороваться. Для этого я вызову функцию ввода с клавиатуры «input».

>>> hello = "Hello, "
>>> name = input() # с клавиатуры вводим любое слово, например, Петя
>>> print(hello, name, "!")
Hello,  Петя !
>>> print("Hello, " + name + "!")
Hello, Петя!

На сегодня это всё, спасибо за внимание!


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

Да, и тег моё - потому что всё написано моими руками, а не тупо понакопировано с других сайтов.


P.S. Большое спасибо всем моим подписчикам за поддержку и активность! Без вас я, возможно, не решился бы продолжать.


Ссылки на предыдущие посты:

1. Предлагаю помощь в освоении Питона

Показать полностью
1569

Предлагаю помощь в освоении Питона

Всем привет!

На фоне пандемии у населения резко возрос интерес к изучению каких-либо языков программирования с целью «уйти в ай-ти». Стать программистом – желание похвальное, но стать хорошим и востребованным программистом на деле оказывается не так просто, как вам обещает реклама. За 6-12 месяцев от нуля до сениор-разработчика вырасти невозможно. За это время в лучшем случае можно более-менее уверенно освоить один язык программирования, менее уверенно пару фреймворков к нему и пописывать какие-то мелкие программки для решения собственных нужд. Нет, есть конечно же уникумы, но их единицы на тысячи.


Я являюсь помощником менторов на одном из известных порталов онлайн-обучения. На каком именно – неважно, ибо, во-первых, я не хочу, чтобы меня обвиняли в рекламе, во-вторых, они все по большому счёту одинаковые, разница лишь в шильдике и ценнике за этот шильдик. Так вот, глядя на то, как новичков, которые ещё вчера были бухгалтерами, строителями, водителями (выберите нужное или вставьте своё), без оглядки гонят по готовой программе, мне становится немного жутко. Жутко от того, что наивных людей как минимум ввели в заблуждение относительно простоты получения квалификации, т.е. набора знаний, дающих право на работу в сфере IT. Им обещают, что через полгода они смогут творить чудеса своими руками не выходя из дома. Да, местами, действительно, это возможно, но лишь местами. При этом, программы обучения могут быть сырыми и необкатанными, лекции - сбивчивыми, лекторы – пустословными. Я не хочу сказать, что так везде, но местами так случается. Форма подачи материала играет очень важную роль в любом процессе обучения, особенно, если это обучение с нуля.


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

- материала много, и всё за один вебинар рассказать не удаётся (ограниченная подача информации),

- материал подаётся бессистемно и сбивчиво (неопытность лектора как преподавателя),

- в плане обучения нет нужных реперных точек, которые могли бы якорить теорию в переложении на практику (непродуманность плана обучения),

- а также многое другое.


Сразу хочется предупредить восклицание «да это просто студенты тупые». Отнюдь. Когда человек сам платит деньги за обучение – он обычно знает, чего хочет и зачем ему это нужно. То есть он готов и хочет учиться, но не может воспринять материал, вследствие чего в его голове возникает каша из бессистемных знаний. И всё это уже на базовом уровне, то есть именно там, где всё нужно не просто забить к себе в голову, а разложить по полкам и знать где и что лежит, чтобы в нужный момент это взять, даже если вас подняли посреди ночи. Дело не в зубрёжке. Дело в понимании. Если нет понимания процесса, то нет и возможности этот процесс реализовать.


Глядя на мучения новичков, я собрался с мыслями и решил написать серию статей, посвящённых основам программирования на одном из самых ныне популярных языке программирования Python. Python стал резко занимать лидирующие позиции в рейтингах популярности благодаря именно вам, дорогие мои новички. Именно вы, желающие «легко запрыгнуть в IT», выбираете Python в качестве своего первого языка программирования, чем задираете его рейтинги. И это прекрасно, потому что Python прекрасен сам по себе. Он лаконичен, понятен, относительно прост, гибок - тем самым удобен для изучения и для обучения. Мои статьи будут касаться самых базовых вещей. Я постараюсь как можно подробнее и понятнее разобрать все основные моменты, с которых начинается “pythonic way”, а также типичные ошибки, с которыми сталкиваются новички.


Не ждите, что я вам скажу что-то принципиально новое. Всё, что я буду излагать, можно было бы легко найти в другом месте. Есть куча сайтов с бесплатным контентом и даже бесплатными курсами. Всё это легко гуглится. Я сам их использовал в своё время, да и сейчас иногда проще что-то быстро нагуглить, чем читать специальную литературу или официальную документацию. В то же время, могу сказать, что лично мне некоторых вещей очень не хватало на старте изучения Python. Прежде всего, не хватало объяснения под другим углом, с другими примерами, иногда очень хотелось повышенной многословности вместо сухих фраз или просто брошенных кусков кода («читай – там всё написано»).


Я рассчитываю, что эти статьи вам помогут начать писать свои собственные программы «для дома, для семьи». Мы не будем лезть в такие дебри, как например, асинхронность. Мы также не будем рассматривать такие библиотеки как NumPy, matplotlib. Только необходимый минимум, только база, никакого хардкора. Но мы будем это делать обстоятельно и поступательно, связывая одно с другим и обрастая нужной информацией углубляться дальше. В каждой теме будут присутствовать примеры в виде рабочих и понятных кусков кода (никаких бессмысленных foo-bar).


В первом приближении план таков:

1. Первое знакомство с Python:
1.1. Общие понятия.
1.2. Объектно-ссылочная модель.
1.3. Стиль кодирования. PEP8
1.4. Дзен питона
1.5. Hello world
2. Встроенные типы данных (их назначение, методы и стандартное поведение):
2.1. Изменяемые и неизменяемые типы данных. Коллекции, последовательности.
2.2. Числа
2.2.1. Целые
2.2.2. Десятичные
2.3. Строки
2.3.1. Обычные
2.3.2. Сырые
2.3.3. Форматирование строк
2.4. Списки
2.5. Кортежи
2.6. Множества
2.7. Словари
2.8. CSV, JSON, XML, YAML (обзорно без углубления)
3. Булева логика
4. Ветвления:
4.1. Общая теория ветвлений
4.2. Проверки объектов
5. Циклы WHILE и FOR
6. Функции:
6.1. Обычные функции и их аргументы
6.2. Анонимные lambda функции
6.3. Рекурсия и стек вызовов
6.4. Встроенные функции
6.5. RETURN – что это и зачем он нужен, если есть PRINT
7. Генераторы (первое приближение)
7.1. Инструкция YIELD
7.2. Генераторные выражения
7.3. Генераторы списков, множеств, словарей (они же – списковые, множественные, словарные включения, они же - list, set, dict comprehensions)
8. Работа с файлами
9. Многофайловые программы:
9.1. Модули
9.2. Пакеты
9.3. Инструкция if __name__ = = __main__
10. Объектно-ориентированное программирование (ООП)
10.1. … (детальный план в разработке)
11. Тестирование кода
11.1. … (детальный план в разработке, одно точно – это будет про PyTest)
12. … (можете подкинуть идей, если хотите)


План неокончательный ни по составу, ни по компоновке, но общий скелет и путь именно такой.

Надеюсь, что всё это поможет всем, кто ищет помощи, но не может её по каким-то причинам найти.


Ещё раз повторюсь: я не являюсь истиной в последней инстанции и не претендую на то, чтобы понравиться всем. Кому-то зайдёт, кому-то нет – это нормально, т.к. обучение – это всегда очень индивидуально, потому что субъективно.

Всё это, конечно же, дублируется в отдельном канале в телеге.
Да, и тег моё - потому что всё написано моими руками, а не тупо понакопировано с других сайтов.

Показать полностью
90

Робот на Уно Совместимой платформе

Робот на Уно Совместимой платформе Робототехника, Arduino, Робот, Программирование, Разработка, Своими руками, Свежее, Электроника, Видео, Длиннопост

Всем привет! Не пинайте сильно, это мой первый пост на пикабу. Сегодня речь пойдет об очень интересном проекте. Как то раз мне понадобилось сделать простое устройство, чтоб научить детей программированию. Всё то, что имеется в сети либо дорого, либо не удовлетворяет мои запросы. Хотелось сделать что то простое и компактное, но в то же время функциональное. Назвал робота muBot! Так как это был первый мой серьезный проект - решил делать платы в Китае.

Заказал из Китая 5 штук.

Коротко  шо по чём (основная плата):

- МК - Atmega328p-au

- Драйвер моторов MX1508

- Датчик черной линии сделан на микросхеме LM393

- Заряд АКБ сделан на ТР4056.

- Юсб - ЮАРТ сделан на CH340G

- 2 двигателя N20 100об./мин.

- разъем USB-B.

- li-pol аккумулятор 3,7в ( в моём случае старая батарея от iphone 4s)


Схемы все по даташитам, как по мне - самое верное решение!


Кроме того сделал шилд (который ещё в дороге) где есть место под OLED дисплей  128х32, барометр BMP180, сонар НС-SR04, 2 фоторезистора с компаратором LM393, 3 адресных светодиода, термометр LM35, стабилизатор 3,3в, ИК-приемник пульта ДУ, место под макетирование и несколько свободных пинов под свои нужды. Неплохо как по мне.


Устройство получилось компактным 100х130х60мм.


Спустя месяц ожиданий платы пришли, можно паять!

Робот на Уно Совместимой платформе Робототехника, Arduino, Робот, Программирование, Разработка, Своими руками, Свежее, Электроника, Видео, Длиннопост

Около 2 часов спустя белый кругляшек стал похож на что то - напоминающее плату с колёсиками! На 3д принтере напечатал упоры, чтобы плату не  клонило со стороны в сторону.

Робот на Уно Совместимой платформе Робототехника, Arduino, Робот, Программирование, Разработка, Своими руками, Свежее, Электроника, Видео, Длиннопост

Осталось дело за малым - прошивка. Дабы упростить задачу, решил залить бутлоудер от Ардуино Уно, так как это самая ходовая плата, и при работе с ней проблем не возникает. После загрузки загрузчик (прям игра слов какая то!) надо установить драйвер СH340 и программировать из под Ардуино ИДЕ ка обычную Ардуино Уно.


Осталось дождаться плат шилда, и завершить сие чудо полностью,  А пока на этом всё! Всем удачи и хорошего настроения!

Робот на Уно Совместимой платформе Робототехника, Arduino, Робот, Программирование, Разработка, Своими руками, Свежее, Электроника, Видео, Длиннопост
Показать полностью 3 1
33

Основные магические методы в python

Пора в python изучить magic и создать классы с магическими методами. С вводной частью вы можете ознакомиться ЗДЕСЬ.

В прошлом посте мы разобрались с методами __new__ и __init__.

Далее разберемся с методом __del__.

__del__ - метод, который срабатывает при удалении объекта.
Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост

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

Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост
Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост

Также есть базовые методы, такие как ==, !=, >= и т.д.

__eq__(self, other) - Определяет поведение оператора равенства, ==.
__ne__(self, other) - Определяет поведение оператора неравенства, !=.
__lt__(self, other) - Определяет поведение оператора меньше, <.
__gt__(self, other) - Определяет поведение оператора больше, >.
__le__(self, other) - Определяет поведение оператора меньше или равно, <=.
__ge__(self, other) - Определяет поведение оператора больше или равно, >=.

Напишем класс Number, который будет принимать число и напишем два метода __eq__ и __gt__ для сравнения.

Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост
Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост

В Python есть унарные операторы.

__pos__(self) - Определяет поведение для унарного плюса (+some_object)
__neg__(self) - Определяет поведение для отрицания(-some_object)
__abs__(self) - Определяет поведение для встроенной функции abs().
__invert__(self) - Определяет поведение для инвертирования оператором ~. Для объяснения что он делает смотри статью в Википедии о бинарных операторах.
__round__(self, n) - Определяет поведение для встроенной функции round(). n это число знаков после запятой, до которого округлить.
__floor__(self) - Определяет поведение для math.floor(), то есть, округления до ближайшего меньшего целого.
__ceil__(self) - Определяет поведение для math.ceil(), то есть, округления до ближайшего большего целого.
__trunc__(self) - Определяет поведение для math.trunc(), то есть, обрезания до целого.
Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост
Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост
Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост

Также есть обычные арифметические операторы, +, - ит

__add__(self, other) - Сложение.
__sub__(self, other) - Вычитание.
__mul__(self, other) - Умножение.
__floordiv__(self, other) - Целочисленное деление, оператор //.
__div__(self, other) - Деление, оператор /.
__truediv__(self, other) - Правильное деление. Заметьте, что это работает только когда используется from __future__ import division.
__mod__(self, other) - Остаток от деления, оператор %.
__divmod__(self, other) - Определяет поведение для встроенной функции divmod().
__pow__ - Возведение в степень, оператор **.
__lshift__(self, other) - Двоичный сдвиг влево, оператор <<.
__rshift__(self, other) - Двоичный сдвиг вправо, оператор >>.
__and__(self, other) - Двоичное И, оператор &.
__or__(self, other) - Двоичное ИЛИ, оператор |.
__xor__(self, other) - Двоичный xor, оператор ^.

Операторы сложение, вычитание и деление будут выглядеть примерно так:

Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост

Есть также деление, умножение, сложение и т.д. с присваиванием.

__iadd__(self, other) - Сложение с присваиванием.
__isub__(self, other) - Вычитание с присваиванием.
__imul__(self, other) - Умножение с присваиванием.
__ifloordiv__(self, other) - Целочисленное деление с присваиванием, оператор //=.
__idiv__(self, other) - Деление с присваиванием, оператор /=.
__itruediv__(self, other) - Правильное деление с присваиванием. Заметьте, что работает только если используется from __future__ import division.
__imod_(self, other) - Остаток от деления с присваиванием, оператор %=.
__ipow__ - Возведение в степерь с присваиванием, оператор **=.
__ilshift__(self, other) - Двоичный сдвиг влево с присваиванием, оператор <<=.
__irshift__(self, other) - Двоичный сдвиг вправо с присваиванием, оператор >>=.
__iand__(self, other) - Двоичное И с присваиванием, оператор &=.
__ior__(self, other) - Двоичное ИЛИ с присваиванием, оператор |=.
__ixor__(self, other) - Двоичный xor с присваиванием, оператор ^=.
Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост

Можно написать класс Point, принимающий имя точки, координаты по x  и y, и  при обращение к нему выводит информацию о себе, также пару методов, которые показывали бы координаты точек.

Основные магические методы в python Python, Метод, Программирование, IT, Питон, Длиннопост
Весь код, написанный с вами будет ЗДЕСЬ.
Показать полностью 8
2130

2 года разработки - AIWM Hexapod

Два года разработки с 0, вот прям с чистого чертежа в КОМПАС 3Д. Всю электронику, прошивку, программу управления, механику, математику и дизайн - всё сам и всё с нуля. Наконец-то я сделал это - проект достиг версии 1.00. Не буду голословным, результат работы показан на видео. Надеюсь всем понравится :)

Вот тут можно узнать о ходе разработки подробнее. Там есть ссылки на различные этапы разработки.

https://habr.com/ru/post/493304/

36

Blueprints и C++ в Unreal Engine: плюсы и минусы

Epic Games последовательно развивает систему визуального программирования Blueprints в Unreal Engine. Она продвигается как полноценная рабочая среда, в которой любой новичок может освоиться и собрать свою игру. Но действительно ли «блюпринты» ни в чём не уступают классическому программированию?


Александр Балакшин, программист AAA-игр, внёсший значительный вклад в разработку сезонных обновлений для Tom Clancy’s Rainbow Six Siege в роли старшего инженера-разработчика и лида геймплейной команды, разбирает плюсы и минусы Blueprints и объясняет её отличия от «чистого» C++.


Автор: Александр Балакшин

Blueprints и C++ в Unreal Engine: плюсы и минусы Xyz, Программирование, Unreal Engine 4, Gamedev, Разработка, Разработчики игр, Длиннопост

Источник


Блюпринты выигрывают у C++ на начальных этапах разработки, особенно если код игры пишется с нуля. Они не требуют установки дополнительной среды, к тому же предлагают быстрые итерации. А блочный синтаксис блюпринтов понятен не только программистам, но и тем, кто знаком с аналогичными системами в программах для создания контента — например, художникам.


Но если рассматривать разработку игры в целом, в долгосрочной перспективе, то классический подход к программированию показывает свои преимущества. Даже сами Epic Games заостряют внимание на том, что блюпринты — это не код, а данные, поэтому и относиться к ним нужно соответственно. Например, некоторая общая логика всё равно должна выноситься в код.

Blueprints и C++ в Unreal Engine: плюсы и минусы Xyz, Программирование, Unreal Engine 4, Gamedev, Разработка, Разработчики игр, Длиннопост

Источник


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


Наконец, блюпринты бьют по производительности, так как компилируются в байт-код, который работает на встроенной в движок виртуальной машине. Да, их можно нативизировать, — то есть преобразовать Blueprint-логику в файлы C++, но даже разработчики из Epic рекомендуют этим не злоупотреблять.


Да и с точки зрения GOMS-анализа нажатие на клавишу клавиатуры оказывается быстрее, чем перемещение мышки. Это ни в коем случае не отменяет удобство визуального редактора, но, по моему опыту, с автодополнениями и прочими синтаксическими функциями современных IDE писать код удобнее и быстрее, чем создавать граф в блюпринтах. Хотя полезные сочетания клавиш и шорткаты в Unreal Engine тоже облегчают жизнь.

Blueprints и C++ в Unreal Engine: плюсы и минусы Xyz, Программирование, Unreal Engine 4, Gamedev, Разработка, Разработчики игр, Длиннопост

Источник


Я считаю, что если программисту нужно работать с Tick-функциями, или он использует какую-то сложную математику и пространственные запросы (например, LineTrace), всё это лучше вынести в С++. Отчасти из-за всех перечисленных особенностей Epic Games раздумывают над созданием отдельного скриптового языка для реализации игровой логики в Unreal Engine.


Тем не менее, блюпринты — достаточно мощный инструмент, который в Unreal Engine 4 используется не только для построения игровой логики, но и для работы с анимацией и системой эффектов Niagara. Поэтому каждая студия должна сама найти подходящий баланс между Blueprints и С++. Например, технические дизайнеры Riot Games использовали блюпринты в Valorant только для создания способностей игроков.

Blueprints и C++ в Unreal Engine: плюсы и минусы Xyz, Программирование, Unreal Engine 4, Gamedev, Разработка, Разработчики игр, Длиннопост

Valorant


Сами Epic Games рекомендуют использовать блюпринты, когда в проекте очень много ссылок на контент, а его логика работает в первую очередь на визуальную составляющую. Также они пригодятся в создании прототипов, прямолинейной или редко используемой логики, которая не является частью основной архитектуры. Всё, что не получит преимуществ в С++ с точки зрения производительности, масштабируемости и стабильности, тоже может быть создано в Blueprints.


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


Словом, с любыми важными переменными, перечислениями и типами данных C++ работает лучше. Но и работа в Blueprints не отменяет классический подход, а только органично дополняет его в необходимых случаях. Так что разработчикам от визуального программирования никуда не деться.

Показать полностью 3
1250

Когда потомки увидят твой говнокод

Когда потомки увидят твой говнокод Картинки, Юмор, Программирование, Разработка, Github, IT юмор

Перевод:
"Загрязнение Арктики - это серьезная проблема"
Я, после того как мой говнокод поместили в арктическое хранилище

Компания GitHub рассказала в своем блоге, что 8 июля 2020 года архив открытых исходных кодов сервиса был успешно размещен в арктическом хранилище Arctic World Archive на острове Шпицберген.

Чтобы заархивировать и перевести на физических носителях весь GitHub понадобилось более пяти месяцев кропотливой работы. 2 февраля 2020 года специалисты компании сделали копию всего открытого исходного кода, хранившегося на сервисе — это вклад работы более 37 миллионов пользователей, который включает около 100 миллионов активных публичных репозиториев.

Ссылка на новость - https://habr.com/ru/news/t/511402/

62

Гарвардский курс 'CS50: Введение в Computer Science' на русском 2020

Обещания, данные подписчикам, надо выполнять, так что добро пожаловать в курс 'Введение в Информационные Технологии' от Гарварда.

Гарвардский курс 'CS50: Введение в Computer Science' на русском 2020 Программирование, IT, Курс, Самообразование, Гарвард, Edx, Длиннопост, Cs50

В 2012 году один из самых знаменитых вузов мира - Массачусетский Технологический Институт, тот самый MIT, который "закончил" Gordon Freeman из Half-Life, представил миру платформу MITx, которая позволяла любому, имеющему доступ к интернет и владеющему английским языком, получать образование высочайшего уровня и не платить при этом ни копейки - оплата требовалась только при желании получить сертификат о прохождении курса.

С течением времени, к MIT присоединилось множество других вузов, включая знаменитые Стэнфорд, Сорбонну и Университет Беркли, и проект был переименован в edX edx.org

Гарвардский курс 'CS50: Введение в Computer Science' на русском 2020 Программирование, IT, Курс, Самообразование, Гарвард, Edx, Длиннопост, Cs50

На сегодняшний день edX предлагает более 2500 тысяч курсов, в проекте участвует около 140 вузов планеты, а количество студентов перевалило за 25 миллионов.

При всех достоинствах этой шикарной платформы (а я прошел там несколько курсов и могу судить), для русско-говорящей аудитории один факт перевешивал все: русскоязычных курсов почти не было, они начали появляться лишь недавно, правда, сразу от МИФИ и ЛИТМО.

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

Гарвардский курс 'CS50: Введение в Computer Science' на русском 2020 Программирование, IT, Курс, Самообразование, Гарвард, Edx, Длиннопост, Cs50

Оригинал курса: https://www.edx.org/course/cs50s-introduction-to-computer-sc...


Этот курс уже переводили на русский язык, и перевод доступен в записи, однако это версия от 2015 года: несколько устаревшая, да и получить помощь по ней будет затруднительно (если этот выпуск кто-то еще поддерживает, дайте мне знать)

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

Первая неделя: тут, начинаем в эту субботу в пять часов по Москве

Задать вопросы и обсудить: можно в комментах, можно тут

Гарвардский курс 'CS50: Введение в Computer Science' на русском 2020 Программирование, IT, Курс, Самообразование, Гарвард, Edx, Длиннопост, Cs50

Длительность курса: 12 недель
Нагрузка: 6-18 часов в неделю
Стоимость: бесплатно
Авторство: HarvardX
Предмет: Введение в Информационные Технологии
Перевод: Канал "Перейти в Айти"
Уровень: Для Начинающих

Тег для подписки/отписки: cs50

Показать полностью 2
364

Python | Для изучающих программирование. Часть 1

Приветствую, прошлый пост сохранили более 70 раз, это очень круто.

Также, спасибо, подписчикам, вас почти 10, цифра весьма скромная, но две недели назад я вообще не думал, что на меня кто то будет подписан, мотивирует.

Еще я завел канал в телеге - https://t.me/tobeprog , там будет о самих методах обучения и обзоры на материалы. Здесь же, будет еженедельный дайджест.


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


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


Что не так с планами изучения программирования. Что значит программировать, и почему многие не понимают этот процесс

Научиться программировать


1. Самые основы: Автоматизация рутинных задач с помощью Python, Свейгарт + миллион туториалов


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


Сама книга породила огромную волну материалов по "автоматизации" на python. Если вбить на ютубе "python automation", то темы роликов будут от работы в Excel до знакомств в Tinder.


Это может показаться смешным, но когда код сам играет в динозаврика в Google Chrome(это одно из популярных видео), новичок ощущает какую то "крутость" возможных программ. Этот, чисто психологический момент на ранних этапах весьма мотивирует.


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


2. После основ:


https://stepik.org/course/512 - очень хороший курс по питону, для тех кто прошел основы. Стоит посмотреть хотя бы начало - там небольшой ввод в само устройство языка, стек вызовов, пространство имен, области видимости и прочее.


https://stepik.org/course/4519 курс в котором учат гуглить, искать на StackOverflow, читать документацию и юзать библиотеки. Это тот самый подход, о котором не особо пишут в книжках, однако, это именно про такую - трушную практику.


На этом этапе, встанет вопрос со сложными проектами. Я уже писал про build-your-own-x - репозиторий с кучей туториалов сложных проектов - Для изучающих программирование. Часть 0. Где найти идеи и реализации сложных проектов


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


3. Когда пора на собес:


https://www.youtube.com/watch?v=5V7XG1mGiHc - курс по python от Computer Science Center.

После него, уже можно топать на собеседование(на самом деле, далеко не каждый джун сможет пройти этот курс), потому что более глубокого курса, по крайней мере в ру сегменте, я не видел.


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


Есть более новая запись курса, но эта - 2015 года, мне нравится больше.

Показать полностью
41

Что находится между идеей и кодом? Обзор 14 диаграмм UML

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

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


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


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


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


Для тех, кому лень читать и кто предпочитает смотреть и слушать: https://youtu.be/0I9aIP5gKCg


Основные цели дизайна UML:

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

Обеспечить механизмы расширяемости и специализации для расширения основных понятий.

Быть независимым от конкретных языков программирования и процессов разработки.

Обеспечить формальную основу для понимания языка моделирования.

Поощрять рост рынка объектно-ориентированных инструментов.

Поддержка высокоуровневых концепций разработки, таких как совместная работа, структуры, шаблоны и компоненты.

Интегрировать лучшие практики.


Диаграммы UML подразделяют на два типа - это структурные диаграммы и диаграммы поведения.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

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


Диаграммы поведения показывают динамическое поведение объектов в системе, которое можно описать, как серию изменений в системе с течением времени.


Теперь пару слов о каждой из них


Диаграмма классов

https://youtu.be/sVVJp5a41o4


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


Три наиболее важных типа отношений в диаграммах классов (на самом деле их больше), это:

-- Ассоциация, которая представляет отношения между экземплярами типов, к примеру, человек работает на компанию, у компании есть несколько офисов.

-- Наследование, которое имеет непосредственное соответствие наследованию в Объектно-Ориентированном дизайне.

-- Агрегация, которая представляет из себя форму композиции объектов в объектно-ориентированном дизайне.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма компонентов

https://youtu.be/OiVyha3sf_I


На языке унифицированного моделирования диаграмма компонентов показывает, как компоненты соединяются вместе для формирования более крупных компонентов или программных систем.


Она иллюстрирует архитектуры компонентов программного обеспечения и зависимости между ними.

Эти программные компоненты включают в себя компоненты времени выполнения, исполняемые компоненты, а также компоненты исходного кода.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма развертывания

https://youtu.be/Yz8phtJoP7I


Диаграмма развертывания помогает моделировать физический аспект объектно-ориентированной программной системы. Это структурная схема, которая показывает архитектуру системы, как развертывание (дистрибуции) программных артефактов.

Артефакты представляют собой конкретные элементы в физическом мире, которые являются результатом процесса разработки.


Диаграмма моделирует конфигурацию времени выполнения в статическом представлении и визуализирует распределение артефактов в приложении.

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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма объектов

https://youtu.be/tVW5oHNfAvc


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

Тем не менее, диаграмма объекта представляет собой экземпляр в конкретный момент, который имеет конкретный характер.Использование диаграмм объектов довольно ограничено, а именно - чтобы показать примеры структуры данных.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма пакетов

https://youtu.be/237BWanM4Ak


Диаграмма пакетов - это структурная схема UML, которая показывает пакеты и зависимости между ними.

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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма составной структуры

https://youtu.be/nsuJcMNaKeE


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


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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма профилей

https://youtu.be/qBws7AfvDL8


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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма прецедентов

https://youtu.be/BdAcxboG5No


Диаграмма прецедентов описывает функциональные требования системы с точки зрения прецедентов. По сути дела, это модель предполагаемой функциональности системы (прецедентов) и ее среды (актеров).

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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма деятельности

https://youtu.be/Z8PHBsNXAgc


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

Они описывают поток управления целевой системой, такой как исследование сложных бизнес-правил и операций, а также описание прецедентов и бизнес-процессов.

В UML диаграммы деятельности предназначены для моделирования как вычислительных, так и организационных процессов.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма состояний

https://youtu.be/ojCcUvGfpi8


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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма последовательности

https://youtu.be/ycg3njrkk1c


Диаграмма последовательности моделирует взаимодействие объектов на основе временной последовательности. Она показывает, как одни объекты взаимодействуют с другими в конкретном прецеденте.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма Коммуникации

https://youtu.be/KVLJj9xOq0E


Как и диаграмма последовательности, диаграмма коммуникации также используется для моделирования динамического поведения прецедента. Если сравнивать с Диаграммой последовательности, Диаграмма коммуникации больше сфокусирована на показе взаимодействия объектов, а не временной последовательности. На самом деле, диаграмма коммуникации и диаграмма последовательности семантически эквивалентны и могут перетекать одна в другую.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Диаграмма обзора взаимодействия

https://youtu.be/E0OJG8ojEAg


Диаграмма обзора взаимодействий фокусируется на обзоре потока управления взаимодействиями. Это вариант Диаграммы деятельности, где узлами являются взаимодействия или события взаимодействия. Диаграмма обзора взаимодействий описывает взаимодействия, в которых сообщения и линии жизни скрыты. Мы можем связать «реальные» диаграммы и добиться высокой степени навигации между диаграммами внутри диаграммы обзора взаимодействия.

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Временная диаграмма

https://youtu.be/NKTyDQUkLoM


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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма
Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

Зачем в UML столько диаграмм?


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

Что находится между идеей и кодом? Обзор 14 диаграмм UML IT, Длиннопост, Софт, Программирование, Программа, Программист, Разработка, Диаграмма

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

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

Напротив, технический писатель интересуется поведением системы в целом и должен понимать, как функционирует продукт.

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



Аве!

Показать полностью 17
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: