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

+128

У нас так было в 00х - установил винду на комп бугхалтерше и ты уже колдун 100500 уровня.

раскрыть ветку 40
+52
На самом деле в 00х поставить винду было ой как не просто... Даже, приходилось плясать с бубном и молится Биллу Гейтсу
раскрыть ветку 38
+69

Да ладно почти всегда с первого раза получалось. За редкими исключениями.

раскрыть ветку 22
+4
Хз, я бывало ставил по паре раз в день
раскрыть ветку 4
+4

Не просто, если пешком под стол ходил и до клавиатуры не дотягивался? ))

+1

О какой винде речь? Установка XP не особо отличалась от того, что есть сейчас, кроме текстового интерфейса в начале процесса.

раскрыть ветку 6
0
Было время 98 Винду по 3 раза за день переустанавливал на один комп )
0
Видимо только у тупых такое было.
+1
Опытный колдун Владимир.
Изгоняю злых духов, и не опытных колдунов.
+26

print(f"Hello,  {input()}"), ребят, киньте фото с динозаврами, я уверен, что они где-то рядом с вами должны быть.

раскрыть ветку 10
+4

этой картинке 4 года, сегодня просто на реддите вылезла в programming humor

раскрыть ветку 2
+9
Иллюстрация к комментарию
+1
Это и 4 года назад уже древностью было
0

Не надо пихать выражения в ф-строки

0

Тогда уже

name = input()

print(f"Hello, {name}")

-5
Этот ваш код даже в debian 9 не запустится (который ещё много где в продакшене работает), так как работает только с версии Python 3.6. Так что о каких динозаврах речь?
раскрыть ветку 4
+1

О динозаврах которые юзают второй питон которому земля пухом

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

Не используй debian/поставь кастомный питон

раскрыть ветку 1
ещё комментарии
+10
Так в VBA ваще магия: msgbox "Hello " & application.username , работает и без ввода данных 0_0
раскрыть ветку 2
+10

Ага, получается только "Hello Пользователь Windows"

Не все меняют имя пользователя в настройках Excel

+1

В питоне тоже так можно сделать. Но что делать, если надо выдать приветствие совершенно рандомному телу?

+1

Моя первая программа на питоне была примерно такой

раскрыть ветку 8
0
А последняя?
раскрыть ветку 7
+7

Пока ещё не написана

раскрыть ветку 6
+3
@StarsBelow,
Прикол в том что такое машинное обучение,AI, нейронные сети и другое - что сейчас популярно. На самом деле не всё так просто. Но это это утрирование, почему и шутка.
1, 1000,10000 не суть важно. Просто что награда за это.
раскрыть ветку 13
+6

Хорошая шутка, жаль что ее пришлось объяснять

раскрыть ветку 1
+2
Норм. Для некотрых это "магия".
+4

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

раскрыть ветку 5
+8
Какие пруфы к выдуманой картинке? Это шутка.
Связь не прямая есно. А больше для тех кто разбирался в этой области. Ну и тема для холисрача :)
ещё комментарии
+1
Этот коммент тоже написан искусственным интеллектом?)
раскрыть ветку 4
+1
Огромное количество программистов в математике плохо разбираются, а ты ещё и знание русского языка требуешь?
-2
Скажи чего нибудь по искусственно интелектуально
раскрыть ветку 2
+1

Я бы заплатил за бота, который разводит девушек на секс

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

for(int a=1; a>0; a++){

if(isDala("дай")) break;

}

раскрыть ветку 1
+2
isDala.then( свадьбаПоЗалёту(kinderArr) )
0

и сам с ней им и занимается)

0
Привет, python 3.X
0

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

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

-2

Пайтон? Я не специалист по пайтону, но разве это нельзя было уместить в одну строчку?)

раскрыть ветку 28
+9

print("Hello, kozhannyi meshok")

раскрыть ветку 1
0
Kozhannyi ubliudok mat' tvou
+6

Любую программу можно уместить в одну строчку. Но зачем?

раскрыть ветку 14
+3

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

раскрыть ветку 3
-2

Не на питоне. Там же переносы играют роль скобок.

-7

Затем что програмисты обленились в край и простейшие проги собирают из библиотек и прога получается размером с гигабайт хотя могла бы быть меньше килобайта.

раскрыть ветку 8
ещё комментарии
+1

Всё что угодно можно уместить в одну строчку, но это не значит, что так нужно делать ;)

+1

print('Hello' + input())

раскрыть ветку 5
+4

print('Hello ' + input())

раскрыть ветку 3
+2

Нет переменной name, которая объясняет шутку.

0

Можно, но не нужно

-1
Скорее инглиш с темой ИДЕ
раскрыть ветку 2
+3

Вообще, это именно Python, самый популярный язык для ml.

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

1к долларов - и в чем прикол?

раскрыть ветку 6
+22

Программа перед приветствием просит ввести имя. Потом приветствует по имени. Это все, что она делает.


ЗЫ: если внимательно присмотреться к чеку, то все не так однозначно. 1,0(00)$=1$

раскрыть ветку 5
+31

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

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

one thousand это таки косарь

и не оч понятно, откуда эта цитата и индусы

раскрыть ветку 2
-14

Это про товарищей из Сколково.

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

приплетаю рашку...

ещё комментарии
-3

Мда, если это машинное обучение, то черт возьми, я так тоже могу)))

-2

После этого ещё надо закодировать в самописный base64, к примеру. И никаких ssl, только йод!

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

Встроенные типы данных (их назначение, методы и стандартное поведение) - Строки (часть 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. Встроенные типы данных (их назначение, методы и стандартное поведение) - Числа

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

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

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

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

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

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

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

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

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

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


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


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


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


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

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


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

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

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

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

ПЕРВОЕ ЗНАКОМСТВО С 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. Предлагаю помощь в освоении Питона

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

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

Всем привет!

На фоне пандемии у населения резко возрос интерес к изучению каких-либо языков программирования с целью «уйти в ай-ти». Стать программистом – желание похвальное, но стать хорошим и востребованным программистом на деле оказывается не так просто, как вам обещает реклама. За 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. … (можете подкинуть идей, если хотите)


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

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


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

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

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

Ответ на пост «Возможно ли стать программистом после 30? Продолжение» 

Моя история будет не о IT, а о сфере моушн-дизайна да и вообще о CG.


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


Предисловие.

На заре начало 2018 года, мне 28 лет, коротаю серые будни на работе в компании одного из сотовых операторов, в которой я работал уже 3 года. Я не могу сказать, что мне не нравилась компания, а наоборот, мне нравилось в ней все, от корпоративной культуры до ее политики в плане работы, отношения к клиентам да и к работягам которые там трудились. Корпоративы, командировки в другие города и тренинги мотивировали там работать, но я хотел продолжать карьеру в другом отделе (я работал в продажах, и мне это жутко надоело, да и мотивации продавать было все меньше и меньше). Я ни раз говорил руководству что хочу перевестись, но то не было свободных вакансий в штате, то "сейчас не время, ген. директор сменился и т.п.". Ожидание заветного момента когда у меня будет шанс что то изменить меня совсем измотало до состояния, когда просто не хочу просыпаться и идти на работу. Тогда я и начал задумывать о том, что пора самому что то поменять. Начались долгие поиски себя и чего я хочу вообще. Сомнения сжирали мозг по частям "а смогу ли я?", "а хочу ли я?", "а надо ли мне все это?" и все возможные вопросы такого характера не вылезали у меня из головы.


Поиск пути.

Перебирал я разные варианты, первая мысль в голове была пойти в IT. По изучав эту сферу не много, а именно front-end понял что мне не очень то и нравится сидеть и писать код, да и как то сложно все (дада, сдался сразу же) решил что это не мое. Сидя вечером дома листая ютубчик я наткнулся на интервью одного дизайнера, где он рассказывал о начале своей карьеры и о том как вообще в нее пошел. Меня эта история до глубины души задела, ведь наши истории были так похожи, решили бросить работу в 28 лет и уйти в неизведанный мир моушн-дизайна. И я поймал себя на мысли, что я тоже смогу, да и мне нравилось делать видео и графику , будучи студентом и злостным задротом игры Lineage 2 в которой я любил делать мувики, поэтому эта сфера мне была близка.

Я твердо решил начать изучать видео-дизайн. И начал свой путь с After Effects (в дальнейшем - АЕ).


Пещера, в которую ты боишься войти, хранит сокровища, которые ты ищешь.

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

Было тяжело совмещать работу и изучать что то новое. Приходя домой в 21-22 часа весь уставший и порой без настроения просто не хватало сил сидеть и учиться чему то новому.

И мной было принято волевое решение уволиться сейчас с работы и закрыться дома для самообучения. Меня конечно же все отговаривали, от родителей до друзей и коллег, мол ты что, совсем что ли головой ударился. Но меня это не остановило, я ушел с работы и ближайшие месяцы сидел учил АЕ (к слову я не проходил ни одного полноценного курса по АЕ, а просто что то делал по туторам на ютубе, а потом и сам уже начал что то придумывать и пытаться сделать). Целью у меня было делать работы на стоки.

Я не хотел быть фрилансером, не хотел идти работать в офис, я хотел работать просто сам на себя. И моим выбором стали видео стоки, где я мог продавать свои работы (шаблоны).

Спустя наверно месяц, у меня что то начало получаться.


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

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

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


Кризис.

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


После отдыха я возобновил работу, начал учить новые программы (Cinema 4D) , ставил для себя более сложные задачи и цели. Но прежде всего я изменил свой распорядок дня, я начал более серьезно относится к работе, сделал себе расписание. Я решил отказаться от вольного распорядка, которого я придерживался ранее. Решил заняться самоконтролем.

Это принесло свои плоды и морально стало как то проще работать.


Сейчас

И вот уже прошло два с половиной года, я стал заниматься тем, что хочу, и можно сказать мое хобби переросло в работу. Я работаю на удаленке в компании, так же занимаюсь стоками, но совсем не много. Набрал 30 киллограм веса (да, когда работа и дом находятся в одной комнате - тяжело контролировать все), завтра уже иду в спорт.зал и может выложу результаты - до удаленки - после удаленки - после зала :D

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

Так же не много преподаю (для друзей, которые тоже решили поменять сферу деятельности)


В данный момент изучаю Maya и хочу пойти по пути гейм-дева и анимации персонажей.


Извиняюсь за сумбурный рассказ. Буду рад написать более подробное продолжение если мой рассказ Вам понравится.

С радостью отвечу на вопросы.

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

Возможно ли стать программистом после 30? Продолжение

Первая часть, написанная годом ранее, тут: Возможно ли стать программистом после 30 лет? Поделюсь своей историей

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

Я не могу однозначно определить, насколько всё плохо (или хорошо), и всё время метаюсь между двух крайностей. Если говорить грубо и радикально, то полноценным программистом я себя не могу назвать даже при большом желании - я верстальщик-скриптоложец с синдромом самозванца и симптомами вечного джуна. Да, порой перепадают интересные задачи моего уровня, но 80-90% моей работы - это верстка страничек, простейшие анимации, вордпресс. Мне несколько раз пытались доверить что-то посложнее, но я ощущал себя собакой, в которую тыкают учебником по квантовой механике, и возвращался к html/css. Уровень заработной платы сейчас такой же, как на последней манагерской работе (с учетом инфляции даже ниже). Есть проблемы со здоровьем: тревожное расстройство, невроз, больная поясница, постоянная апатия и вялость. Случаются приступы перегорания. Каждый день трясусь по выдуманным или почти выдуманным поводам из серии "А вдруг меня завтра уволят" и т.п. Стал гораздо меньше гулять и заниматься спортом, почти весь день провожу перед монитором или уткнувшись лицом в подушку.

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

Вернемся в осень 2019 года, к моей первой работе на номинальной должности "программиста PHP". Поначалу было действительно интересно, каждый день было что-то новое, мозги всегда были в тонусе, но в определенный момент всё превратилось в рутину и однообразные задачи: клепаешь всякие там формы регистрации, копируешь-вставляешь древние куски кода и т.п. И всё это происходило в малопопулярной CMS, опыт работы в которой никому и даром не нужен. Со скуки даже начал по собственной воле писать разнообразные пошаговые инструкции для будущих падаванов - кстати, это мне сильно сберегло время и нервы, когда я передавал дела перед увольнением. Новую работу я в то время активно не искал, но каких-то серьезных перспектив в конторе не видел и резюме на всякий случай обновлял. А что, а вдруг (с). Предложений было достаточно много, но 99% из них либо были из разряда "требуется синьор-помидор" (то есть HR явно что-то путали), либо я лажал с подливой на собеседованиях. Хотя лажал уже далеко не так сильно, как в начале своего пути, конечно.

И вот, приходит очередное письмо с предложением работы разработчиком PHP - я открываю список требований по вакансии (миддл+ с опытом 3-5 лет и огромным стеком непонятных аббревиатур), улыбаюсь и вежливо отвечаю, что мой уровень и близко этому не соответствует. Спустя день получаю ответ "мы дадим возможность прокачать свои компетенции, поэтому можете попробовать пройти собеседования, если интересно". Попытка не пытка, давайте, компания показалась интересной и перспективной в плане моего развития и финансового благополучия. Скайп-собеседований было целых три и растянулись они на неделю - мне свойственно принижать свои заслуги и заниматься самобичеванием, но в данном случае скажу, что я очень горжусь тем, что успешно прошел их все и получил предложение о работе. Пусть это и не привело к каким-то там успешным успехам в жизни. По крайней мере пока.

Первое собеседование было полностью на английском (обычном разговорном, не техническом) языке. В компании это так же важно, как и навыки программирования, так как русскоязычных клиентов минимум, в основном все забугорные. С английским у меня, к счастью, всё в порядке, спасибо 10 годам в школе, самостоятельным поездкам по миру и фильмам с субтитрами. Второе собеседование, ключевое, было уже техническое и на русском - к нему я готовился, как к решающему экзамену, перелопатил 100500 возможных вопросов и ответов. То, что понимаю, повторил. То, что не понимаю, тупо вызубрил. Собеседование было назначено на рабочее время и мне пришлось выйти на улицу, в мороз (на дворе был уже декабрь). В одной руке телефон, в другой - шпаргалка со списком самых популярных вопросов-ответов, мандраж, дрожащий одновременно от страха и холода голос. Разговаривали мы около 40 минут, не меньше - я правильно ответил на 90% вопросов, после чего получил достаточно забавную, но приятную обратку "позиционирует себя как джун, но по факту крепкий миддл". Угу, крепкий миддл, уверенно рассказывающий про ООП, но без единого проекта с использованием ООП :)
Третье собеседование было уже с одним из директоров, стандартная проверка на адекватность, ничего примечательного. После этого попросили дать телефоны бывших работодателей (всё серьезно), чтобы собрать с них рекомендации - благо, я ни с кем отношения не порчу и проблем с этим тоже не возникло, все откликнулись. Хотя позвонили всего одному из них, этого оказалось достаточно. Оффер в кармане, ура.

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

В свой первый рабочий день на новом месте (самый конец 2019 года), я спросил у HR - неужели на рынке не было более достойных кандидатов? Почему я? С удивлением узнал, что спецов много, но вот именно программистов PHP с хорошим знанием английского найти очень сложно. Так что решили понизить планку и взять человека "на вырост", причем под конкретный проект одного из крупнейший клиентов, который вот-вот запустится. Что касается офиса и обстановки - мне было даже неловко что ли, везде новая техника, огромные столы, куча пространства... Круто! Сейчас как начну хацкерить!.. Прошло четыре часа, я настроил окружение, познакомился с ребятами, сижу, улыбаюсь, поглаживаю своё ЧСВ и тут мне прилетает первая задача с пометкой "изян". Ну, типа, на часик тебе для раскачки, что-то там подкрутить на Laravel (фреймворк на PHP). Пока я вдуплял, что от меня хотят, мне несколько раз написала манагерша этого проекта с конкретными наездами "Когда будет сделано?" и "В чем проблема, почему так долго?". Меня, конечно, бомбануло. Закралась мысль, что возникло какое-то недоразумение и на работу взяли вовсе не того человека, которого должны были. С этой мыслью я пошел к директору и честно сказал "Я джун, никогда этого не скрывал и пришел к вам на прокачку. Я не могу по щелчку пальца выполнить эту задачу". Директор успокоил, сказал не переживать - типа, про твой опыт я в курсе, а задачу как сделаешь, так сделаешь. Не кипишуй, мол, раскачивайся.

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

Возможно ли стать программистом после 30? Продолжение Web-Программирование, IT, Программирование, Длиннопост

Других задач в первую рабочую неделю у меня не было и никто меня не трогал. Потом был Новый год, новогодние праздники и снова в бой со свежими силами. Пару дней относительная тишина (занимался самообразованием) и затем прилетает вопрос "Привет, а ты знаешь Symfony?". Это такой фреймворк PHP, если кто не слышал. Я слышал, но никаких преимуществ мне это знание не давало :) Ответил, что никогда не работал. Следом приходит "Придется поработать". Братан, а ты когда-нибудь управлял космическим кораблем? Нет, не управлял. Ну придется поуправлять.

Меня направили в помощь какому-то синьорному синьору, работающему на удаленке над проектом на этом самом Симфони. Толку от меня было, как... Ну вы поняли. Человек был очень занят и вся его вводная заключалась в 2-3 предложениях типа: "тут скачай, это разверни, то самое подключи". На мои скромные "но я не понимаю", он лишь посетовал на нехватку времени что-то мне объяснять. Сам так сам, ок. Одним глазом смотрю обучающие видео по Симфони, вторым пытаюсь понять, что от меня требуется, а в перерывах плачу в туалете. С проекта меня сняли через несколько дней, так ничего путного от меня и не добившись. И тут, словно луч света в темном царстве, наконец-то объявился тот самый клиент, из-за которого меня изначально и взяли на работу.

Пара ознакомительных скайп-конференций на английском, куча вводных, и вот я уже при деле, в своей тарелке. Задача для большинства прочитающих этот пост разработчиков покажется элементарной: развернуть сайт на вордпрессе, сверстать странички, настроить админку. Ну и разбавить все js-анимашками. Только вот с вордпрессом я был "на вы", страничек было очень много, а мои познания в js ограничивались романтическими отношениями с jquery. Дорогу осилит идущий. Взял себя в руки и начал жестить...

Я понимал, что текущий проект - это мой единственный шанс остаться на работе и надо выложиться по-максимуму. Свободного времени не было вообще, вся моя жизнь на несколько месяцев превратилась в цепочку работа-сон-работа. Что касается немногочисленного программирования, то PHP становилось все меньше и меньше, но вот задачи по JS плодились как из рога изобилия. Явные дыры в знаниях компенсировал упорством и смекалкой. Какие-то задачи делал на таких костылях, что у тимлида (будь он на проекте) кровь из глаз бы полилась так обильно, как в "Сиянии" у Кубрика. Со временем, конечно, пришлось переписывать многие куски по-человечески. Ах да, испытательный срок я в итоге прошел без проблем и мне даже подняли зарплату. Самое главное в бизнесе - это довольный клиент, а скоростью и качеством моей работы он был полностью удовлетворен и давал хорошую обратку.

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

К лету задачи по основному проекту внезапно кончились, а моя ангуляровская стажерско-падаванская работа явно не окупала даже десятую часть от моей зарплаты, поэтому меня начали пытаться привлекать к другим сайтам. Данный период я называю "шашлыком из фиаско" - буквально за пару недель я из состояния уверенности в себе вновь вернулся к панике и депресснякам. Что ни проект, то какая-то засада вселенского масштаба: сначала какой-то мертвый PHP-фреймворк, о котором я в первый раз в жизни услышал, потом какая-та Годзилла на Laravel, однажды даже на полном серьезе предлагали проект на Python. Везде не было такого понятия как "команда", то есть за уши тащить никто не будет, всё должен делать сам и разбираться во всё должен самостоятельно. Как правило, удавалось убедить манагеров, что это плохая идея и клиенту может очень сильно не понравится, что на его проект ставят полный нолик без палочки. Закончилась эта эпопея насильным подключением меня к индийскому проекту на jquery... Не хочется прослыть мерзким расистом, но английский заказчика я вообще не понимал. Это было что угодно, но не английский. А проект можно было развернуть только под виндой, какой-то там хитрый софт используется, который с линуксом не дружит :) Ну знаете, это ведь так чудесно, когда на заре погружения в мир IT тебя постоянно тыкали в использование винды, а потом на работе заставляют эту самую винду устанавливать. Бомбануло знатно. Я набрался смелости и позвонил директору, объяснил ситуацию. Сказал, что даже готов поработать пару месяцев за копейки, только поставьте в нормальный проект, чтобы дураком не помереть и чему-то научиться. Спасибо шефу, что успокоил и вошел в моё положение. С индусами работать не пришлось. И на этом полоса неудач и унижений закончилась.

Спустя время возобновилась работа по основному проекту (как же я тогда был счастлив!) + меня начали подключать к другому ангуляровскому приложению. Да, в основном я там тоже верстаю и особо логику не трогал, но это уже не стажерские задачки а-ля "измени текст", а верстка полноценных и достаточно объемных компонентов. Работа на одном из двух проектов была и есть всегда, часто даже приходится оставаться сверхурочно (за отдельную плату, конечно, это еще один несомненный плюс белых компаний). Так что в этом плане всё стабилизировалось - никто меня больше не мучает и не обижает :)

"Чего же тебе еще надо, собака?"

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

Что касается профессионального развития в свободное время, то я, посоветовавшись с более опытными коллегами, решил сброситься до заводских настроек и изучить основы JS с нуля, как положено. Никакие курсы рекламировать не собираюсь, скажу лишь одно: все, кто на серьезных щах обещает "золотые горы спустя месяц" и тем более "выучить JS за три дня на практике", - это инфоцыгане. Это полная хрень и туда стоит соваться разве что по фану, ради развлекаловки, или для поверхностного знакомства с большой темой. Хорошие проработанные и полноценные курсы - это от полугода, не меньше. И, самое главное, это должны быть курсы с поддержкой наставника-ментора, а то будете как слепой котенок в жестоких каменных джунглях. Учеба дается несладко, пару раз даже думал бросить, но это было бы слишком просто.

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

Всем желаю успехов.

Спасибо за внимание.

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

Нейронные сети. Обратное распространение ошибки

Привет, Лига образования!

Мы продолжаем переводить легендарный курс по нейросетям от 3blue1brown.


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

Благодарим за создание выпуска:

Переводчика – lenablur;

Редактора – Михаила Коротеева;

Диктора – Никифора Стасова;

Монтажера – Олега Жданова


И бонус в комментариях, английский!

79

Нейронные сети. Градиентный спуск: как учатся нейронные сети

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

Мы подготовили долгожданное продолжение лекций по нейросетям. Градиентный спуск: как учатся нейронные сети.


https://www.youtube.com/watch?time_continue=1&amp;v=f9oDe4Yq...


Благодарим за участие в выпуске:

Переводчика – lenablur;

Редакторов – Дмитрия Титова, Михаила Коротеева, Дмитрия Мирошниченко;

Корректора – Дмитрия Мирошниченко;

Дикторов – Никифора Стасова, Дарью Яговкину;

Монтажера – Олега Жданова.

692

Программа обучения Data science для самостоятельного изучения

Я решил собрать некоторые материалы в одном месте для всех тех, кто хочет войти в науку о данных.
Некоторые курсы я считаю обязательными (их я выделил жирным), некоторые желательными для более глубокого понимания области. Я считаю, что прохождение «жирных» курсов позволит вам приобрести некое понимание о data science, пройдя же все курсы, вы сможете претендовать на начальную позицию.Этот текст - моё видение, некоторые дополнительные ссылки я приложу в конце поста. Буду рад любой конструктивной критике.


1. Основы программирования

Введение в python (обязательно):

https://stepik.org/course/67 — введение в Питон

https://stepik.org/course/512 — введение в Питон чуть более глубокое.

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


2. Основы математики и статистики

Высшая математика и теория вероятности (желательны для глубокого понимания):

https://stepik.org/course/95/promo — введение в матанализ

https://stepik.org/course/716/promo — матанализ 1

https://stepik.org/course/711/promo — матанализ 2

https://stepik.org/course/2461/promo — курс по линейной алгебре

https://stepik.org/course/3089 — теория вероятности

Подготовительный курс по R (язык программирования для работы с данными):

https://stepik.org/course/497/promo — курс по языку программирования R


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


Статистика (обязательно):

https://stepik.org/course/76

https://stepik.org/course/524

https://stepik.org/course/2152

https://stepik.org/course/326

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


Курсы по алгоритмам и технологиям (не обязательно, но желательно для понимания):

https://stepik.org/course/2614 — базы данных

https://stepik.org/course/217— алгоритмы

https://stepik.org/course/1547 — алгоритмы 2

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


3. Машинное обучение

Введение в машинное обучение и искусственный интеллект (обязательно):

https://stepik.org/course/4852 — введение в машинное обучение

https://stepik.org/course/401 — машинное обучение

https://stepik.org/course/8057 — машинное обучение

Тут без пояснений — если вы учите data science, то сам data science учить придется.


4. Специализация

Специализация (крайне желательно):

https://stepik.org/course/54098 — обработка текста

http://web.stanford.edu/class/cs224n/ — обработка текста

http://cs231n.stanford.edu/ — обработка изображений

https://stepik.org/course/50352 — компьютерное зрение

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

Полезные материалы


Полезности:

https://vk.com/mlcourse - классная группа, где собрано много полезной информации.

https://habr.com/ru/company/ods/blog/322626/ — курс по data science.

Источники:

Мой путь в data science — история успеха.

https://habr.com/ru/company/plarium/blog/505458/ — история успеха 2.

https://docs.google.com/document/d/1TbMBahh6PNz-qK5hCojfrTJj... (сравнительная таблица).

https://youtu.be/w-IdSp_mQuM — ещё один план-трек.

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

Сервис для перехода из 3D в 2D - наш, Российский...

Привет! Годами анимешники пытаются разорвать грани 2D мира. На реддите есть целый раздел посвящённый данным разработкам. Так вышло, что и я поучаствовал в схожем проекте.

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

Иногда выходит годно!

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Иногда кринжово не очень...

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Результат высылается на почту, что несколько устарело.

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

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

Оказывается, вам не нужен большой IP, чтобы оказаться вдохновителем крутого сервиса!

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

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

А ещё люди не читали инструкцию и публиковали туда всякие ~50 сантиметровые штуки. Угадайте, сколько пикабушников на 100 человек?

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Но кого остановит волна негатива? Не нас! Нужно найти проблему и решить её. (Даже, если это не так проблема)

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

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

Поэтому, после моих настойчивых замечаний было решено потратить ещё немного времени на приложение и обучить его на современном аниме!

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Как идейный вдохновитель, графику должен был добыть я... Вы пробовали найти триста тыщ аниме голов? И чтобы эти головы были 2010+ года выпуска, да в достойном разрешении... Очень легко на самом деле - гуглите "Anime-Face-Dataset".

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

В идеале, стоило накачать рисунков из Printrest, как мне и советовали, но взять готовый архив проще же. Иногда я бываю СЛИШКОМ вдохновляющим - смог "продавить" простой путь =\

Итак, эти картинки загрузили в нейросеть и как-то поставили её учиться трансформировать 3D в 2D...

К сожалению, это РЕАЛЬНО оказался набор голов и других частей тела. Там не было фонов и их программа рисовать не научилась.

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Чтобы хоть как-то сгладить сиё недоразумение, в приложение была добавлена опция для ПоискЛицоОпределение. Теперь, люди, гордо загружающие себя в полный рост имеют хоть какой-то шанс увидеть достойный результат.

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

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

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Новая сеть хуже различает цвета волос и глаз. Зато реже уходит в трип из-за теней и не путает число глаз. Это же важнее чем их цвет?

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Ну и конечно лучше работает с котиками o(≧▽≦)o

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

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

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

Сервис для перехода из 3D в 2D - наш, Российский... Аниме, Не аниме, Программирование, Разработка, Машинное обучение, Android, Личный опыт, Длиннопост

Если честно, боюсь, что промахнулся немного с сообществом, но про разработку я знаю только GameDev ._.


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


Подруга моя, просьбы мои, тупые советы мои, тег ваш...


P.S. Нет. Это нельзя использовать в реальном времени на очках виртуальной реальности.

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

Нейронные сети. Просто о сложном

Привет, Пикабу. Сегодня у нас кое-что действительно классное для Лиги образования.

Мы договорились о переводе и озвучке с автором самых крутых на Youtube видео про математику-информатику-физику.


И наша первая озвучка — видео о том, что же такое нейросети.

За это отличную озвучку мы благодарим Александра Колдаева.


Если хочешь поучаствовать в переводе или озвучке — напиши нам в вк, телеграм или facebook.

1759

Алгоритмы и с чем их едят

Сегодня без алгоритмов не работает Гугл и Яндекс, не летают самолёты и не ходят поезда. Ну а мы представляем вам перевод первой лекции из курса MIT «Введение в алгоритмы». В этой лекции на примере алгоритма поиска локального минимума профессор Девадас рассказывает про сложность и эффективность алгоритмов.

Для вас трудились:

Переводчики: Дерсим Даваод, Дмитрий Мамайкин

Редактор: Ксения Мосеенкова

Корректор: Рита Вионнэ

Монтажёр: Олег Жданов


Если тебе интересно переводить или озвучивать лекции с английского, напиши, пожалуйста, нам.

83

Дорога в Data Science глазами новичка

Что такое Data Science?

В 21 веке информация повсюду. Вы буквально не можете жить, не оставляя вокруг себя информационный след. Зашли вы утром в ВК поставить пару лаек или купили в магазине пармезан, информация об этом сохранилась в огромных базах данных. А вдруг эта информация может быть полезна? Может быть, покупая один продукт, люди часто покупают и другой — тогда имеет смысл поставить эти полки рядом (или наоборот — в разных концах магазина). А может быть, скрытые закономерности есть в научных данных? Какие существуют наиболее эффективные алгоритмы их обработки? Можно ли, анализируя данные с фотографий или видео, научить компьютер узнавать на них объекты? Этим и многим другим может заниматься data scientist

Дорога в Data Science глазами новичка Data Science, Программирование, Машинное обучение, Искусственный интеллект, Нейронные сети, IT, Человек наук, Длиннопост

Почему появился этот пост

Мне довелось пройти Летнюю школу по анализу данных от ТГУ (Томск). На ней я надеялся получить структурированные знания с нуля о том, что такое анализ данных и машинное обучение, базовые знания для них. Коротко говоря, оказалось, что эта школа не совсем для новичков (как бы это ни позиционировалось в рекламе). Вот, что записано в моём блокноте на самой первой лекции:

Для первого дня сложно
Плюх в океан знаний
Я утонул

К концу школы структурированных знаний я так и не получил. Спикеры были очень разные и говорили на совсем разные темы. Зато какие были спикеры! Лекции нам читали (а некоторые и вели практику) люди из Яндекс, Сколтеха, IBM и томской IT-компании Rubius. Пусть я так и не узнал базовых вещей, а блокнот исписан терминами на погуглить. Зато, я увидел отличные примеры того, как можно применять анализ данных в самых разных областях: науке, индустрии и бизнесе. Базовые знания можно получить и самостоятельно, но понять, как можно их применять получается не всегда (отсюда работники Макдоналдс с красным дипломом). Школа явно показала пробелы в знаниях, которые необходимо заполнить

Об этом и данный пост. Здесь вы найдёте пошаговый план, как его видит человек, стоящий в начале этого пути. К каждой теме, которую следует изучить, будет прилагаться ссылка на курс. План рассчитан на людей без базы. Под базой я понимаю знание высшей математики и наличие навыков программирования. Для людей, обладающих этим, могу порекомендовать эту статью и специализацию по машинному обучению на Coursera. А также, буду благодарен за совет новичку. Итак, начнём!

Дорога в Data Science глазами новичка Data Science, Программирование, Машинное обучение, Искусственный интеллект, Нейронные сети, IT, Человек наук, Длиннопост

0. Математический анализ

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

Дорога в Data Science глазами новичка Data Science, Программирование, Машинное обучение, Искусственный интеллект, Нейронные сети, IT, Человек наук, Длиннопост

1. Математическая статистика

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

•Курс «Основы статистики» на Stepik — отлично подойдёт для начала. Есть также продолжения курса, будет полезно пройти и их

•Курс «Математическая статистика» на Stepik — поможет закрепить полученные знания с помощью достаточного количества практики

•Курс «Статистические методы в гуманитарных исследованиях» на Coursera — пусть вас не отталкивает название, курс подойдёт для всех. Преподаватель потрясающий, так что будет понятно даже гуманитариям. Главное преимущество этого курса — параллельно идёт обучение работе в программах STATISTICA и R

Дорога в Data Science глазами новичка Data Science, Программирование, Машинное обучение, Искусственный интеллект, Нейронные сети, IT, Человек наук, Длиннопост

2. Дискретная математика

Знание этого предмета не является обязательным, пункт можно пропустить. Но всё же, вы часто будете встречать некоторые термины как, например, графы. Для уверенного обращения с ними рекомендуется изучить эту тему. Тем же, кого интересует научная сторона Data science и разработка алгоритмов — этот пункт строго обязателен

•Курс «Основы дискретной математики» на Stepik

•Курс «Основы теории графов» на Stepik

•Курс «Дискретные структуры» на Stepik

3. Программирование на Python

Python и R будут вашими основными инструментами для работы. С R вы познакомитесь в курсе статистики, здесь же изучите второй язык

•Курс «Основы программирования на Python», Coursera

•Курс «Python: основы и применение», Stepik

4. Машинное обучение

Время переходить непосредственно к той области, которой хотите заниматься! В этом поможет классический курс от Andrew Ng (Стэнфордский университет) на Coursera. Курс на английском. Если вы его не знаете, можно поискать переводы курса, но рекомендуется начать изучать и язык

5. Получение опыта на Kaggle

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

6. Дальнейшее обучение, собеседования

Полистайте список вакансий, подумайте, чего ещё вам не хватает и торопитесь получить работу мечты!

Дорога в Data Science глазами новичка Data Science, Программирование, Машинное обучение, Искусственный интеллект, Нейронные сети, IT, Человек наук, Длиннопост

Больше постов про учёбу, IT и науку — в моём паблике ВК. Там же есть эта статья в более текстовом виде. Буду благодарен за советы и желаю всем удачи!

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

99 онлайн-курсов для инженеров и программистов

В комментариях к прошлой записи (http://pikabu.ru/story/99_besplatnyikh_onlaynkursov_kotoryie...) многие говорили о том, что нужно больше курсов по IT. Ловите! Заботливо собраны совместно со всеми, кто в этих темах разбирается лучше меня:) Делитесь своими любимыми курсами в комментариях!


Для начинающих

1. Как выиграть соревнования по программированию: секреты чемпионов https://www.edx.org/course/how-win-coding-competitions-secre... (Университет ИТМО, язык курса: английский)

2. Информатика для втузов https://openedu.ru/course/ITMOUniversity/COMTEC/ (Университет ИТМО, язык курса: русский)

3. Основы программирования https://www.edx.org/course/programming-basics-iitbombayx-cs1... (Индийский технологический институт Бомбея, язык курса: английский)

4. История, технология и безопасность Интернета https://ru.coursera.org/learn/internet-history (Мичиганский университет, язык курса: английский)

5. Информационные технологии и программирование https://pushkininstitute.ru/school/external_courses/238 (Казанский национальный исследовательский технический университет имени А. Н. Туполева, язык курса: русский)

6. Введение в программирование (C++) https://stepik.org/363 (Высшая школа экономики, Академия Яндекса, язык курса: русский)

7. Комбинаторика для начинающих https://ru.coursera.org/learn/kombinatorika-dlya-nachinayush... (Московский физико-технический институт, язык курса: русский)


Математика и логика

8. Высшая математика. Линейная алгебра и элементы топологии https://openedu.ru/course/mipt/HIGHMATH2/ (Московский физико-технический институт, язык курса: русский)

9. Высшая математика. Алгебра: введение в теорию групп https://openedu.ru/course/spbu/MATGR/ (Санкт-Петербургский государственный университет, язык курса: русский)

10. Дискретная математика https://www.coursera.org/learn/discrete-mathematics (Шанхайский университет Джао Тонг, язык курса: английский)

11. Высшая математика. Математический анализ https://openedu.ru/course/mipt/MATAN/ (Московский физико-технический институт, язык курса: русский)

12. Курс математического анализа (первый семестр) https://openedu.ru/course/msu/CALC1/ (МГУ имени М. В. Ломоносова, язык курса: русский)

13. Математический анализ. Теория функций одной переменной https://openedu.ru/course/msu/CALCSV/ (МГУ имени М. В. Ломоносова, язык курса: русский)


Разработка ПО

14. Программирование на C# https://openedu.ru/course/urfu/CSHARP/ (Уральский федеральный университет, язык курса: русский)

15. Постановка задачи на разработку ПО https://stepik.org/1128 (Mail.Ru Group, язык курса: русский)

16. Программирование для всех (начните с Python) https://ru.coursera.org/learn/python (Мичиганский университет, язык курса: английский)

17. Функциональное программирование: базовый курс https://openedu.ru/course/ITMOUniversity/FPBC/ (Университет ИТМО, язык курса: русский)

18. Программирование на языке C++ https://stepik.org/7 (Санкт‑Петербургский академический университет, язык курса: русский)

19. Функциональное программирование на языке Haskell https://stepik.org/75 (Санкт‑Петербургский академический университет, CS центр, язык курса: русский)

20. Базы данных https://openedu.ru/course/spbu/DTBS/ (Санкт-Петербургский государственный университет, язык курса: русский)


Разработка мобильных и веб-приложений

21. Программирование и разработка веб-приложений https://openedu.ru/course/ITMOUniversity/PWADEV/ (Университет ИТМО, язык курса: русский)

22. HTML, CSS и Javascript для веб-разработчиков https://ru.coursera.org/learn/html-css-javascript-for-web-de... (Университет Джона Хопкинса, язык курса: английский)

23. Веб-программирование https://openedu.ru/course/ITMOUniversity/WEBDEV/ (Университет ИТМО, язык курса: русский)

24. Основы Веб-дизайна и Программирования https://ru.coursera.org/learn/duke-programming-web (Университет Дьюка, язык курса: английский)

25. Как создать сайт за выходные (проектно-ориентированный курс) https://ru.coursera.org/learn/how-to-create-a-website (Государственный университет штата Нью-Йорк, язык курса: английский)

26. Основы адаптивного веб-сайта; Программирование с помощью HTML, CSS и JavaScript https://ru.coursera.org/learn/website-coding (Голдсмитс, язык курса: английский)

27. Java для Android https://ru.coursera.org/learn/java-for-android (Университет Вандербильта, язык курса: английский)


Алгоритмы

28. Математическая логика и теория алгоритмов https://www.lektorium.tv/mooc2/26749 (Томский государственный университет систем управления и радиоэлектроники, язык курса: русский)

29. Алгоритмы программирования и структуры данных https://openedu.ru/course/ITMOUniversity/PADS/ (Университет ИТМО, язык курса: русский)

30. Алгоритмы: теория и практика. Методы https://stepik.org/217 (Computer Science Center, язык курса: русский)

31. Алгоритмизация вычислений https://ru.coursera.org/learn/algoritmizacija-vychislenij (Высшая школа экономики, язык курса: русский)

32. Анализ алгоритмов https://ru.coursera.org/learn/analysis-of-algorithms (Принстонский университет, язык курса: английский)

33. Алгоритмы https://www.edx.org/course/algorithms-iitbombayx-cs213-3x-0 (Индийский технологический институт Бомбея, язык курса: английский)

34. Основы алгоритмов https://ru.coursera.org/learn/algorithmic-toolbox (Калифорнийский университет в Сан-Диего, Высшая школа экономики, язык курса: английский)

35. Основы структур данных https://www.edx.org/course/foundations-data-structures-iitbo... (Индийский технологический институт Бомбея, язык курса: английский)


Компьютерная безопасность и сети

36. Протоколы мобильных и конвергентных сетей https://openedu.ru/course/ITMOUniversity/NETPRO/ (Университет ИТМО, язык курса: русский)

37. Разработка безопасных приложений для Android https://www.futurelearn.com/courses/secure-android-app-devel... (Саутгемптонский университет, язык курса: английский)

38. Инфокоммуникационные протоколы https://openedu.ru/course/ITMOUniversity/PRTFDN/ (Университет ИТМО, язык курса: русский)

39. Кибербезопасность и десять сфер её применения https://ru.coursera.org/learn/cyber-security-domain (Система университетов штата Джорджия, язык курса: английский)

40. Безопасность программного обеспечения https://ru.coursera.org/learn/software-security (Мэрилендский университет в Колледж-Парке, язык курса: английский)

41. Актуальные угрозы компьютерной безопасности https://www.lektorium.tv/mooc2/26538 (Лаборатория Касперского, язык курса: русский)

42. Информационная безопасность https://ru.coursera.org/learn/information-security-data (Лондонский университет, язык курса: английский)

43. Основы кибербезопасности https://www.edx.org/course/cybersecurity-fundamentals-ritx-c... (Технологический институт Рочестер, язык курса: английский)


Дизайн и продукт

44. Геймдизайн: по ту сторону игры http://universarium.org/course/618 (WARGAMING, язык курса: русский)

45. Геймификация https://ru.coursera.org/learn/gamification (Пенсильванский университет, язык курса: английский, русские субтитры)

46. Принципы геймдизайна https://ru.coursera.org/learn/gamedesign (Университет штата Мичиган, язык курса: английский)

47. Разработка, осуществление и анализ экспериментов https://ru.coursera.org/learn/designexperiments (Калифорнийский университет в Сан-Диего, язык курса: английский)

48. История дизайна видеоигр https://www.edx.org/course/video-game-design-history-ritx-ga... (Технологический институт Рочестер, язык курса: английский)

49. Прототипирование и дизайн https://ru.coursera.org/learn/prototyping-design (Миннесотский университет, язык курса: английский)

50. Основы графического дизайна https://ru.coursera.org/learn/fundamentals-of-graphic-design (Калифорнийский институт искусств, язык курса: английский)

51. Введение в геймдизайн https://ru.coursera.org/learn/game-design (Калифорнийский институт искусств, язык курса: английский)


Машинное обучение

52. Введение в машинное обучение https://www.coursera.org/learn/vvedenie-mashinnoe-obuchenie (Высшая школа экономики, язык курса: русский)

53. Машинное обучение https://ru.coursera.org/learn/machine-learning (Стэнфордский университет, язык курса: английский)

54. Основы машинного обучения: обучение на конкретных примерах https://ru.coursera.org/learn/ml-foundations (Вашингтонский университет, язык курса: английский)

55. Нейронные сети https://stepik.org/401 (Институт биоинформатики, язык курса: русский)

56. Машинное обучение https://www.udacity.com/course/machine-learning--ud262 (Kaggel, язык курса: английский)

57. Нейронные сети для машинного обучения https://ru.coursera.org/learn/neural-networks (Торонтский университет, язык курса: английский)

58. Вычислительная нейробиология https://ru.coursera.org/learn/computational-neuroscience (Торонтский университет, язык курса: английский)

59. Анализ данных на практике https://openedu.ru/course/mipt/ANDATA/ (Московский физико-технический институт, язык курса: русский)

60. Введение в анализ данных https://www.udacity.com/course/intro-to-data-analysis--ud170 (язык курса: английский, русские субтитры)


Теория вероятности и статистика

61. Введение в теорию вероятностей https://openedu.ru/course/mipt/PROBTH/ (Московский физико-технический институт, язык курса: русский)

62. Базовая статистика https://ru.coursera.org/learn/basic-statistics (Амстердамский университет, язык курса: английский)

63. Эконометрика https://openedu.ru/course/hse/METRIX/ (Высшая школа экономики, язык курса: русский)

64. Статистический анализ https://ru.coursera.org/learn/statistical-inference Johns (Университет Джонса Хопкинса, язык курса: английский)

65. Построение выводов по данным https://ru.coursera.org/learn/stats-for-data-analysis (Московский физико-технический институт, язык курса: русский)

66. Введение в статистику https://www.udacity.com/course/intro-to-statistics--st101 (язык курса: английский)

67. Основы статистики https://stepik.org/76 (Институт биоинформатики, язык курса: русский)

68. Статистика вывода https://www.coursera.org/learn/inferential-statistics (Амстердамский университет, язык курса: английский)


Графы

69. Теория графов https://ru.coursera.org/learn/teoriya-grafov (Московский физико-технический институт, язык курса: русский)

70. Методы и алгоритмы теории графов https://openedu.ru/course/ITMOUniversity/AGRAPH/ (Университет ИТМО, язык курса: русский)

71. Веб-графы и методы работы с ними https://openedu.ru/course/mipt/WEBGRAPH/ (Московский физико-технический институт, язык курса: русский)

72. Случайные графы https://openedu.ru/course/mipt/GRAPHS1/ (Московский физико-технический институт, язык курса: русский)

73. Теория кодирования https://openedu.ru/course/mipt/TEORCOD/ (Московский физико-технический институт, язык курса: русский)

74. Алгоритмы на графах https://ru.coursera.org/learn/algorithms-on-graphs (Калифорнийский университет в Сан-Диего, Высшая школа экономики, язык курса: английский)

75. Теория графов https://openedu.ru/course/mipt/GRAPHTH/ (Московский физико-технический институт, язык курса: русский)


Робототехника

76. Управление мехатронными и робототехническими системами https://openedu.ru/course/ITMOUniversity/ROBCTR/ (Университет ИТМО, язык курса: русский)

77. Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера https://www.coursera.org/learn/roboty-arduino (Московский физико-технический институт, язык курса: русский)

78. Конструирование роботов и устройств на Arduino https://ru.coursera.org/learn/arduino (Московский физико-технический институт, язык курса: русский)

79. Линейные системы автоматического управления https://openedu.ru/course/ITMOUniversity/LINACS/ (Университет ИТМО, язык курса: русский)

80. Основы программирования роботов https://pushkininstitute.ru/school/facultative/external_cour... (Московский государственный университет приборостроения и информатики, язык курса: русский)

81. Введение в робототехнику: заставьте роботов двигаться https://www.futurelearn.com/courses/making-robots-move (Квинслендский Технологический Университет, язык курса: английский)

82. Контроль мобильных роботов https://ru.coursera.org/learn/mobile-robot (Технологический институт Джорджии, язык курса: английский)

83. Инновации в промышленности: мехатроника и робототехника https://www.coursera.org/learn/innovations-in-industry-robot... (Национальный исследовательский Томский государственный университет, язык курса: русский)


Физика и астрономия

84. Астрономия: исследуем время и пространство https://www.coursera.org/learn/astro (Аризонский университет, язык курса: английский)

85. Астрономия https://www.lektorium.tv/mooc2/26284 (Центр Педагогического Мастерства, язык курса: русский)

86. Астрофизика: от звезд до границ Вселенной https://www.coursera.org/learn/astrofizika (Санкт-Петербургский политехнический университет Петра Великого, язык курса: русский)

87. Основы астрономии https://openedu.ru/course/msu/BASTRO/ (МГУ имени М. В. Ломоносова, язык курса: русский)

88. Физика как глобальный проект https://www.coursera.org/learn/physics-global-project (Национальный исследовательский ядерный университет «МИФИ», язык курса: русский)

89. От атомов до звезд: как физика объясняет мир https://www.edx.org/course/atoms-stars-how-physics-explains-... (Национальный исследовательский ядерный университет «МИФИ», язык курса: английский, русские субтитры)

90. Звёздная астрономия https://postnauka.ru/courses/43956 (МГУ имени М.В. Ломоносова, язык курса: русский)

91. Ядерная физика https://openedu.ru/course/spbu/PHYSNU/ (Санкт-Петербургский государственный университет, язык курса: русский)

92. Элементы атомной и ядерной физики https://www.coursera.org/learn/elementy-atomnoj-i-yadernoj-f... (Национальный исследовательский ядерный университет «МИФИ», язык курса: русский)


Электроника и радиотехника

93. Современная промышленная электроника https://openedu.ru/course/spbstu/MODIEL/ (Санкт-Петербургский политехнический университет Петра Великого, язык курса: русский)

94. Введение в электронику https://www.coursera.org/learn/electronics (Технологический институт Джорджии, язык курса: английский)

95. Основы электротехники и электроники https://openedu.ru/course/urfu/ELB/ (Уральский федеральный университет, язык курса: русский)

96. Линейные электрические цепи https://openedu.ru/course/ITMOUniversity/LINCIR/ (Университет ИТМО, язык курса: русский)

97. Электронные материалы и приборы https://www.edx.org/course/electronic-materials-devices-mitx... (Массачусетский технологический институт, язык курса: английский)

98. Электрические машины https://openedu.ru/course/ITMOUniversity/ELMACH/ (Университет ИТМО, язык курса: русский)

99. Электродинамика https://openedu.ru/course/urfu/ELECD/ (Уральский федеральный университет, язык курса: русский)

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