#deeppython #otus
Все мы рано или поздно сталкиваемся с необходимостью сохранить какую-то информацию, да так чтобы намертво, чтобы внуки потом еще прочитать смогли. Ежели еще нужно делать хитрые выборки по сохраненному, то обычно мы приходим к использованию реляционных СУБД. Чаще все, если посмотреть рейтинги популярности, это MySQL. Что может быть проще? Качаем последний MySQL и запускаем.
И вот уже где-то в коде устанавливается соединение с БД, выполняется простой запрос:
import MySQLdb
….
cursor.execute("UPDATE User SET likes=likes+1 WHERE Id=%s", (user_id,))
Кажется, все хорошо. Даже если тут же сделать SELECT, то можно убедиться, что у пользователя увеличилось число like’ов. Но есть нюанс, если тот же SELECT сделать из консольного клиента, то пользователь как будто и не обновлялся. А если посмотреть SHOW PROCESSLIST, то видно, что запрос в состоянии “Waiting for table metadata lock”.
А все штука в настройках по умолчанию, о которых часто забывают. В частности, в MySQL последних версий по умолчанию движок таблицы InnoDB, транзакционный, все дела. А питонячьем MySQLdb с версии 1.2.0 опция autocommit выставлена в False. Что же получается? Получается, что все ваши запросы в таком случае выполняются в рамках одной транзакции и не видны другим транзакциям до явного вызова commit (или rollback). Плюс, лочатся метаданные используемой таблицы, что отображается в processlist’е.
Что делать? Можно явно вызывать conn.commit() в конце транзакции, а можно сразу после установления соединения выставить conn.autocommit(True), тогда каждый запрос будет завершаться коммитом прозрачно для вас. Ну и конечно, нужно внимательно читать документацию и changelog’и.
Решение показалось очевидным? Тогда, возможно, вы хорошо знаете Python. Проверьте свои знания на вступительном тестировании: http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=pythonpost14/06
Все мы рано или поздно сталкиваемся с необходимостью сохранить какую-то информацию, да так чтобы намертво, чтобы внуки потом еще прочитать смогли. Ежели еще нужно делать хитрые выборки по сохраненному, то обычно мы приходим к использованию реляционных СУБД. Чаще все, если посмотреть рейтинги популярности, это MySQL. Что может быть проще? Качаем последний MySQL и запускаем.
И вот уже где-то в коде устанавливается соединение с БД, выполняется простой запрос:
import MySQLdb
….
cursor.execute("UPDATE User SET likes=likes+1 WHERE Id=%s", (user_id,))
Кажется, все хорошо. Даже если тут же сделать SELECT, то можно убедиться, что у пользователя увеличилось число like’ов. Но есть нюанс, если тот же SELECT сделать из консольного клиента, то пользователь как будто и не обновлялся. А если посмотреть SHOW PROCESSLIST, то видно, что запрос в состоянии “Waiting for table metadata lock”.
А все штука в настройках по умолчанию, о которых часто забывают. В частности, в MySQL последних версий по умолчанию движок таблицы InnoDB, транзакционный, все дела. А питонячьем MySQLdb с версии 1.2.0 опция autocommit выставлена в False. Что же получается? Получается, что все ваши запросы в таком случае выполняются в рамках одной транзакции и не видны другим транзакциям до явного вызова commit (или rollback). Плюс, лочатся метаданные используемой таблицы, что отображается в processlist’е.
Что делать? Можно явно вызывать conn.commit() в конце транзакции, а можно сразу после установления соединения выставить conn.autocommit(True), тогда каждый запрос будет завершаться коммитом прозрачно для вас. Ну и конечно, нужно внимательно читать документацию и changelog’и.
Решение показалось очевидным? Тогда, возможно, вы хорошо знаете Python. Проверьте свои знания на вступительном тестировании: http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=pythonpost14/06
У нас суперская новость! Нашим новым партнером стала компания Avito. Avito будут рады пригласить на собеседования наших лучших по итогам обучения студентов по курсам Python, мобильной разработки и QA (не мнее трех человек с каждого курса)
#deeppython #otus
Допустим, есть следующая иерархия классов:
class X(object): pass
class Y(object): pass
class A(X, Y): pass
class B(Y, X): pass
И в ней, вообще говоря, ничего криминального нет. Но если вы захотите отнаследоваться от A и B, то вас ждет разочарование. Выражение:
class C(A, B): pass
выдаст весьма интересную ошибку. В чем же дело?
Всему причиный алгоритм MRO (method resolution order), который используется в Python с версии 2.3. Он актуален только для new-style классов (наследуются от object), для classic классы никаких ошибок не будет в данном случае.
Под MRO некого класса C понимается его линеаризация - список предков класса, включая сам класс, отсортированный в порядке “удаленности”. Так, линеаризацией класса B из примера выше будет [B, Y, X, object]. MRO, таким образом например, определяет как, в случае множественного наследования, будет осуществляться поиск вызванного метода в данной иерархии классов.
Для конструирования линеаризации класса в Python используется C3 linearization алгоритм. Сам алгоритм разрабатывался в свое время для языка Dylan, но с тех пор был принят в Python и еще, например, в Perl 6. Линеаризацией данного класса называется слияние линеаризацией его родителей. Финальный список формируется так: сначала добавляется данный класс, потом рассматривается первый класс из линеаризации первого родителя, если он не встречаются в других списка, то добавляется в финальный и так далее, если участвует, то переходим к рассмотрению следующего родителя. Как мы видели, не все классы поддаются линеаризации данным алгоритмом.
Для classic классов MRO реализуется через поиску в глубину, слева-направо.
Кстати, эту тему мы решили осветить не просто так. Теперь у вас будет больше шансов пройти вступительное тестирование на курс Python: http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=deeppython
Допустим, есть следующая иерархия классов:
class X(object): pass
class Y(object): pass
class A(X, Y): pass
class B(Y, X): pass
И в ней, вообще говоря, ничего криминального нет. Но если вы захотите отнаследоваться от A и B, то вас ждет разочарование. Выражение:
class C(A, B): pass
выдаст весьма интересную ошибку. В чем же дело?
Всему причиный алгоритм MRO (method resolution order), который используется в Python с версии 2.3. Он актуален только для new-style классов (наследуются от object), для classic классы никаких ошибок не будет в данном случае.
Под MRO некого класса C понимается его линеаризация - список предков класса, включая сам класс, отсортированный в порядке “удаленности”. Так, линеаризацией класса B из примера выше будет [B, Y, X, object]. MRO, таким образом например, определяет как, в случае множественного наследования, будет осуществляться поиск вызванного метода в данной иерархии классов.
Для конструирования линеаризации класса в Python используется C3 linearization алгоритм. Сам алгоритм разрабатывался в свое время для языка Dylan, но с тех пор был принят в Python и еще, например, в Perl 6. Линеаризацией данного класса называется слияние линеаризацией его родителей. Финальный список формируется так: сначала добавляется данный класс, потом рассматривается первый класс из линеаризации первого родителя, если он не встречаются в других списка, то добавляется в финальный и так далее, если участвует, то переходим к рассмотрению следующего родителя. Как мы видели, не все классы поддаются линеаризации данным алгоритмом.
Для classic классов MRO реализуется через поиску в глубину, слева-направо.
Кстати, эту тему мы решили осветить не просто так. Теперь у вас будет больше шансов пройти вступительное тестирование на курс Python: http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=deeppython
#deeppython #otus
Чаще всего микрооптимизации производительности только ухудшают качество кода,
его становится сложнее читать. Но их полезно знать и разбираться, потому что сам процесс исследования позволяет глубже понять язык. Вот например, что быстрее: {} или dict()? Ну или, [] или list()?
На поставленный вопрос легко ответить, воспользовавшись timeit. [] и {} в несколько раз быстрее их оппонентов. Более интересный вопрос: почему?
В данном случае ответить нам поможет модуль dis:
>>> dis.dis(compile('[]', '', 'eval'))
1 0 BUILD_LIST 0
3 RETURN_VALUE
>>> dis.dis(compile('list()', '', 'eval'))
1 0 LOAD_NAME 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
Как можно видеть, в случае [] Python сразу создает байткод инструкцию построения списка, потому что [], как и {}, являются токенами языка, которые, грубо говоря, сразу можно интерпретировать. list() и dict() же представляют из себя вызов функции, для которого нужно сначала отрезолвить их имя (поискать в globals и builtin), создать новый фрейм на стеке. Поиска в глобальной namespace’е еще можно избежать, сохранив имя в локально, т.е. Сделав, например, _list = list, но от CALL_FUNCTION избавиться не выйдет никак.
А хорошо ли ты знаешь Python? Проверь! http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=deeppython19.06
Чаще всего микрооптимизации производительности только ухудшают качество кода,
его становится сложнее читать. Но их полезно знать и разбираться, потому что сам процесс исследования позволяет глубже понять язык. Вот например, что быстрее: {} или dict()? Ну или, [] или list()?
На поставленный вопрос легко ответить, воспользовавшись timeit. [] и {} в несколько раз быстрее их оппонентов. Более интересный вопрос: почему?
В данном случае ответить нам поможет модуль dis:
>>> dis.dis(compile('[]', '', 'eval'))
1 0 BUILD_LIST 0
3 RETURN_VALUE
>>> dis.dis(compile('list()', '', 'eval'))
1 0 LOAD_NAME 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
Как можно видеть, в случае [] Python сразу создает байткод инструкцию построения списка, потому что [], как и {}, являются токенами языка, которые, грубо говоря, сразу можно интерпретировать. list() и dict() же представляют из себя вызов функции, для которого нужно сначала отрезолвить их имя (поискать в globals и builtin), создать новый фрейм на стеке. Поиска в глобальной namespace’е еще можно избежать, сохранив имя в локально, т.е. Сделав, например, _list = list, но от CALL_FUNCTION избавиться не выйдет никак.
А хорошо ли ты знаешь Python? Проверь! http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=deeppython19.06
Доброе утро! ✌ У нас хорошие новости - наших Java выпускников ждут на собеседование еще в одной компании. Нашим партнером стал Ланит.
Присоединяйтесь!
Присоединяйтесь!
Сегодня мы с удивлением обнаружили, что до старта новой группы по Python осталось всего 2 недели! (вот как заработались 😱)
А это значит, что совсем скоро наши новые студенты окунутся в многогранный мир Python и будут не только полезно, но и весело проводить время с преподавателем курса (уж мы-то знаем, что Станислав Ступников заскучать не даст).
А еще перед стартом новой группы мы проведем два дня открытых дверей, где не только ответим на все вопросы, но и (уже можно сказать по-традиции) разыграем бесплатные места в Python-группе.
Для участие в розыгрыше необходимо успешное прохождение вступительного теста. Проходите тест и регистрируйтесь на День открытых дверей:
http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=deadlinedod
А это значит, что совсем скоро наши новые студенты окунутся в многогранный мир Python и будут не только полезно, но и весело проводить время с преподавателем курса (уж мы-то знаем, что Станислав Ступников заскучать не даст).
А еще перед стартом новой группы мы проведем два дня открытых дверей, где не только ответим на все вопросы, но и (уже можно сказать по-традиции) разыграем бесплатные места в Python-группе.
Для участие в розыгрыше необходимо успешное прохождение вступительного теста. Проходите тест и регистрируйтесь на День открытых дверей:
http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=deadlinedod
#deeppython #otus
ООП в Python - это вам не Java. Никаких вам фабрик абстрактных классов, интерфейсов и вот этого всего. Есть, конечно, ABC и очумелые ручки, но это совсем другая история. Но классы и наследование есть, конечно. Не смотря на это, нет строгого разделения на public/private/protected. На фоне этой правды жизни возникло соглашение о том, что одно нижнее подчеркивание (_) перед именем означает пометку “только для внутреннего пользования” и даже в случае from M import * такие имена не будут импортироваться. Но это все же лишь соглашение, и если очень хочется, то ничто особо не мешает получить, например, доступ к полю, начинающемуся с нижнего подчеркивания.
Самое близкое, в некотором смысле, к private полю в Python можно получить, написав не одно, а два нижних подчеркивания перед именем. При попытке прямого доступа в таком случается получается ошибка, например:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: CachedResponse instance has no attribute ‘__intermediate_result’
Но даже такой механизм обеспечения приватности не особо сильнее предыдущего, так как на самом деле, значение поля из примера выше можно получить, обратившись к атрибуту _CachedResponse__intermediate_result. Это так называемый name mangling. Но, в основном, он все же предназначен для избежания инцидентов с одинаковыми именами полей в дочерних классах и тому подобным.
Хорошо ли ты знаешь Python? Проверь! http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=deeppython22/06
ООП в Python - это вам не Java. Никаких вам фабрик абстрактных классов, интерфейсов и вот этого всего. Есть, конечно, ABC и очумелые ручки, но это совсем другая история. Но классы и наследование есть, конечно. Не смотря на это, нет строгого разделения на public/private/protected. На фоне этой правды жизни возникло соглашение о том, что одно нижнее подчеркивание (_) перед именем означает пометку “только для внутреннего пользования” и даже в случае from M import * такие имена не будут импортироваться. Но это все же лишь соглашение, и если очень хочется, то ничто особо не мешает получить, например, доступ к полю, начинающемуся с нижнего подчеркивания.
Самое близкое, в некотором смысле, к private полю в Python можно получить, написав не одно, а два нижних подчеркивания перед именем. При попытке прямого доступа в таком случается получается ошибка, например:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: CachedResponse instance has no attribute ‘__intermediate_result’
Но даже такой механизм обеспечения приватности не особо сильнее предыдущего, так как на самом деле, значение поля из примера выше можно получить, обратившись к атрибуту _CachedResponse__intermediate_result. Это так называемый name mangling. Но, в основном, он все же предназначен для избежания инцидентов с одинаковыми именами полей в дочерних классах и тому подобным.
Хорошо ли ты знаешь Python? Проверь! http://otus.ru/lessons?course=3?utm_source=telegram&utm_medium=internal&utm_campaign=deeppython22/06
Сегодня мы расскажем о насущных задачках - как написать лотерейную машину для розыгрыша бесплатных мест на курсе. От программиста программистам :)
https://m.habrahabr.ru/company/otus/blog/331478/
https://m.habrahabr.ru/company/otus/blog/331478/
m.habrahabr.ru
Как провести розыгрыш призов среди Java программистов
Давно ли вы участвовали в лотерее или розыгрыше? Приходилось ли вам самим их устраивать? Даже если ответы: никогда и нет, уверен, что вы знаете что это такое.
С радостью приглашаем на Дни открытых дверей по курсу Python 30 июня и 5 июля в 20:00!
Из любой удобной точки мира - приходите к нам - формат проведения онлайн.
Познакомимся с преподавателем курса Станиславом Ступниковым - программистом Mail.ru с более чем 6-ти летним стажем промышленной разработки, в том числе для крупных государственных заказчиков и более 4-х лет преподавания студентам МГТУ им. Баумана.
По сложившейся традиции расскажем почему OTUS больше чем просто образовательный проект и какие возможности получат наши студенты после прохождения обучения. Расскажем о преимуществах программы курса, практических занятиях и профессиональном сообществе разработчиков. Расскажем о карьерных перспективах студентов и возможностях, предложенных компаниями - партнерами. Ответим на все интересующие вопросы, поделимся новостями, просто приятно и с пользой проведем время. Конечно, это еще не всё!
Успешно прошедших вступительный тест на Дне открытых дверей ждет уникальная возможность!
Спешите проверить свои знания Python и регистрируйтесь на День открытых дверей http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=post26.06&utm_content=main&utm_term=dod
Из любой удобной точки мира - приходите к нам - формат проведения онлайн.
Познакомимся с преподавателем курса Станиславом Ступниковым - программистом Mail.ru с более чем 6-ти летним стажем промышленной разработки, в том числе для крупных государственных заказчиков и более 4-х лет преподавания студентам МГТУ им. Баумана.
По сложившейся традиции расскажем почему OTUS больше чем просто образовательный проект и какие возможности получат наши студенты после прохождения обучения. Расскажем о преимуществах программы курса, практических занятиях и профессиональном сообществе разработчиков. Расскажем о карьерных перспективах студентов и возможностях, предложенных компаниями - партнерами. Ответим на все интересующие вопросы, поделимся новостями, просто приятно и с пользой проведем время. Конечно, это еще не всё!
Успешно прошедших вступительный тест на Дне открытых дверей ждет уникальная возможность!
Спешите проверить свои знания Python и регистрируйтесь на День открытых дверей http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=post26.06&utm_content=main&utm_term=dod
Otus
Ближайшие мероприятия | OTUS
Ближайшие мероприятия в Otus
Всем известно, что Python - интерпретируемый язык программирования!
Но это не совсем точно, конечно. Чтобы употреблять такие слова нужно говорить о какой-то конкретной имплементации языка.
Всем извстно, что CPython (самая распространенная имплементация) интерпретируемый!
Но это не совсем точно, конечно. Можно сказать, что CPython полукомпилируемый, потому что исходный код компилируется в байткод, который потом исполнется вирутальной машиной (тоже CPython в данном случае). Традиционно же, когда мы говорим о компиляции, то имеем в виду преобразование высокоуровневого языка в конкретный машинный код.
У этой (полу)компиляции в Python есть свои особенности. Исходный код можно скомпилировать в байткод с разными флагами оптимизации: -О, -ОО. В результате у вас появятся *.pyo файлики с байткодом. При этом, в первом случае у вас будут "выключены" assert'ы, а во втором - еще "вырежутся" docstring'и. Оптимизации не особо крутые, чего уж тут говорить, если только в asserta'ах не было какой-то сложной логики.
Как это знание может пригодится? Например, если код разворачивается на CentOS с помощью rpm пакетов, то во время сборки пакета неявно запускается brp-python-bytecompile скрипт, который компилирует Python файлы в *.pyc и *.pyo. Поэтому не стоит потом удивляться, что assert'ы в коде не срабатывают.
Но это не совсем точно, конечно. Чтобы употреблять такие слова нужно говорить о какой-то конкретной имплементации языка.
Всем извстно, что CPython (самая распространенная имплементация) интерпретируемый!
Но это не совсем точно, конечно. Можно сказать, что CPython полукомпилируемый, потому что исходный код компилируется в байткод, который потом исполнется вирутальной машиной (тоже CPython в данном случае). Традиционно же, когда мы говорим о компиляции, то имеем в виду преобразование высокоуровневого языка в конкретный машинный код.
У этой (полу)компиляции в Python есть свои особенности. Исходный код можно скомпилировать в байткод с разными флагами оптимизации: -О, -ОО. В результате у вас появятся *.pyo файлики с байткодом. При этом, в первом случае у вас будут "выключены" assert'ы, а во втором - еще "вырежутся" docstring'и. Оптимизации не особо крутые, чего уж тут говорить, если только в asserta'ах не было какой-то сложной логики.
Как это знание может пригодится? Например, если код разворачивается на CentOS с помощью rpm пакетов, то во время сборки пакета неявно запускается brp-python-bytecompile скрипт, который компилирует Python файлы в *.pyc и *.pyo. Поэтому не стоит потом удивляться, что assert'ы в коде не срабатывают.
Зададимся сегодня провокационным вопросом: что такое сервер? Есть разработчики сервера, есть серверные приложения, есть курсы по серверной разработке. А сам предмет разработки это что? Понятие слишком обширное и интуитивно понятное всем кто с ним сталкивался.
И всетаки, если попробовать дать определение серверу, то должно получиться что-то такое: сервер - это система программ, которая отвечает на запросы. То есть, нет сервера без запросов и ответов. Клиенты посылают серверу запросы, сервер что-то в себе читает, вычисляет или меняет и возвращает клиентам ответы.
Может ли сервер посылать запросы клиенту? В общем случае, может. Нотификация пользователя о событиях на сервере неотъемлемая часть, например, любого игрового сервера. Пользователь должен своевременно узнать о том, что ему в голову пришло… копье противника. И отрисовать красиво это событие. Сервер должен сам уведомить клиента о событии, не дожидаясь запроса от клиента.
Теперь рассмотрим веб сервер. Что это такое? Очевидно это сервер, в определении которое мы уже дали выше. Но что значит приставка “веб”?
К счастью для нас, это понятие уже не такое абстрактное как сервер и у него есть определение на wikipedia. Веб сервер, это сервер который обрабатывает запросы по протоколу HTTP. Ответы, очевидно, тоже отправляет по этому же протоколу.
Если вы пишите клиент-серверное приложение в котором клиент это браузер, а сервер это… веб сервер. То протокол общения между ними определен. Может ли веб сервер уведомить клиента о событии? Нет. Протокол не позволяет это сделать. Веб сервер может только отвечать на запросы. Нет запросов, нет ответов.
Как же быть разработчику браузерных игр? Без уведомления клиента динамические игры невозможны. Обмануть протокол? Да, это можно сделать. Можно продолжать использовать HTTP, но “подписать” клиент на события на сервере. Названия подходов и технологий здесь: ajax, long polling или websockets. WebSockets, правда, уже не HTTP, но это предмет уже следующей заметки.
И всетаки, если попробовать дать определение серверу, то должно получиться что-то такое: сервер - это система программ, которая отвечает на запросы. То есть, нет сервера без запросов и ответов. Клиенты посылают серверу запросы, сервер что-то в себе читает, вычисляет или меняет и возвращает клиентам ответы.
Может ли сервер посылать запросы клиенту? В общем случае, может. Нотификация пользователя о событиях на сервере неотъемлемая часть, например, любого игрового сервера. Пользователь должен своевременно узнать о том, что ему в голову пришло… копье противника. И отрисовать красиво это событие. Сервер должен сам уведомить клиента о событии, не дожидаясь запроса от клиента.
Теперь рассмотрим веб сервер. Что это такое? Очевидно это сервер, в определении которое мы уже дали выше. Но что значит приставка “веб”?
К счастью для нас, это понятие уже не такое абстрактное как сервер и у него есть определение на wikipedia. Веб сервер, это сервер который обрабатывает запросы по протоколу HTTP. Ответы, очевидно, тоже отправляет по этому же протоколу.
Если вы пишите клиент-серверное приложение в котором клиент это браузер, а сервер это… веб сервер. То протокол общения между ними определен. Может ли веб сервер уведомить клиента о событии? Нет. Протокол не позволяет это сделать. Веб сервер может только отвечать на запросы. Нет запросов, нет ответов.
Как же быть разработчику браузерных игр? Без уведомления клиента динамические игры невозможны. Обмануть протокол? Да, это можно сделать. Можно продолжать использовать HTTP, но “подписать” клиент на события на сервере. Названия подходов и технологий здесь: ajax, long polling или websockets. WebSockets, правда, уже не HTTP, но это предмет уже следующей заметки.
Сегодня подготовили для вас отличную шпаргалку по работе с базами данных Excel с помощью Python. https://habrahabr.ru/company/otus/blog/331746/
Хабр
Использование Python и Excel для обработки и анализа данных. Часть 1: импорт данных и настройка среды
Если Вы только начинаете свой путь знакомства с возможностями Python, ваши познания еще имеют начальный уровень — этот материал для Вас. В статье мы опишем, как...
Кажется, наш канал превращается в канал для суперских новостей :)
У нас появился бомбически классный набор стикеров для Telegram OTUS Coding Owl. Мы уверены, что этот набор просто не может оставить равнодушным причастных к миру IT!
https://news.1rj.ru/str/addstickers/OTUScodingOwl
У нас появился бомбически классный набор стикеров для Telegram OTUS Coding Owl. Мы уверены, что этот набор просто не может оставить равнодушным причастных к миру IT!
https://news.1rj.ru/str/addstickers/OTUScodingOwl
Вышла вторая часть статьи про использование Python и Excel в анализе данных:
https://habrahabr.ru/company/otus/blog/331998/
https://habrahabr.ru/company/otus/blog/331998/
Habr
Использование Python и Excel для обработки и анализа данных. Часть 2: библиотеки для работы с данными
Первая часть статьи была опубликована тут . Как читать и редактировать Excel файлы при помощи openpyxl ПЕРЕВОД Оригинал статьи — www.datacamp.com/community/tutorials/python-excel-tutorial Автор —...
Над Москвой и территорией Центрального федерального округа сегодня пройдет грозовой фронт небывалой силы, говорят нас ждет всемирный потоп!!! Так что этот вечер лучше провести дома и с пользой для себя.
Сегодня в 20:00 по московскому времени начинаем День открытых дверей по курсу Разработчик Python. Самое время пройти вступительное тестирование, зарегистрироваться и принять участие в розыгрыше бесплатных мест на курсе!
Присоединяйтесь! http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=post30.06&utm_content=main&utm_term=dod
Сегодня в 20:00 по московскому времени начинаем День открытых дверей по курсу Разработчик Python. Самое время пройти вступительное тестирование, зарегистрироваться и принять участие в розыгрыше бесплатных мест на курсе!
Присоединяйтесь! http://otus.ru/dod?utm_source=telegram&utm_medium=internal&utm_campaign=post30.06&utm_content=main&utm_term=dod
До дня открытых дверей по курсу Python осталось меньше часа! Присоединяйтесь к нам!https://www.youtube.com/channel/UCetgtvy93o3i3CvyGXKFU3g/live
YouTube
OTUS IT Онлайн - образование
OTUS – масштабный образовательный IT-портал. 4955473489
Наш канал предлагает более 5000+ вебинаров по программированию, разработке, аналитике, машинному обучению и менеджменту — бесплатно получайте актуальные знания, которые точно понадобятся в 2025 году.…
Наш канал предлагает более 5000+ вебинаров по программированию, разработке, аналитике, машинному обучению и менеджменту — бесплатно получайте актуальные знания, которые точно понадобятся в 2025 году.…
Сегодня на первом Дне открытых дверей определились победители розыгрыша бесплатных мест на курсе серьезного изучения Python.
Победителями розыгрыша стали: Алексей Демидов и Василий Островский.
Поздравляем!
Как это было можно посмотреть тут: https://www.youtube.com/watch?v=LdSnU5YahkE
Победителями розыгрыша стали: Алексей Демидов и Василий Островский.
Поздравляем!
Как это было можно посмотреть тут: https://www.youtube.com/watch?v=LdSnU5YahkE
YouTube
День открытых дверей в OTUS
Расскажем о проекте OTUS, поговорим о курсе обучения Python, перспективах для выпускников и учебном процессе. Ответим на все вопросы и разыграем бесплатные м...
#deeppython #otus
Все мы знаем и любим генераторы в Python. По сути, генератор - это итератор, который можно использовать в цикле, как обычно, но генератор дополнительно содержит внутри ключевое слово yield. После каждого yield генератор временно прекращает исполнение и возвращает управление, при следующем вызове стартуя с того места, где закончил в прошлый раз, при этом сохраняя состояние и значения переменных между вызовами. Но, черт побери, как он это делает?
Объект генератор, помимо всего прочего, содержит в себе указатель на текущий execution frame, который в свою очередь содержит стек вызова для данного генератора. Во время вызова next(gen_object) вызывается PyEval_EvalFrame для текущего execution frame’а. Это одна из самых главных функций интерпретатора, внутри, она, в том числе, знает про ключевое слово yield
TARGET(YIELD_VALUE) {
retval = POP();
f->f_stacktop = stack_pointer;
why = WHY_YIELD;
goto fast_yield;
}
В данном случае возвращается значение, а текущий фрейм сохраняется (f->f_stacktop = stack_pointer), так что после следующего next’а можно продолжить там, где остановились, ведь PyEval_EvalFrame будет вызван на том же фрейме, что и раньше, с тем же стеком и состоянием. В обычных функциях f_stacktop приравнивается к NULL.
Все мы знаем и любим генераторы в Python. По сути, генератор - это итератор, который можно использовать в цикле, как обычно, но генератор дополнительно содержит внутри ключевое слово yield. После каждого yield генератор временно прекращает исполнение и возвращает управление, при следующем вызове стартуя с того места, где закончил в прошлый раз, при этом сохраняя состояние и значения переменных между вызовами. Но, черт побери, как он это делает?
Объект генератор, помимо всего прочего, содержит в себе указатель на текущий execution frame, который в свою очередь содержит стек вызова для данного генератора. Во время вызова next(gen_object) вызывается PyEval_EvalFrame для текущего execution frame’а. Это одна из самых главных функций интерпретатора, внутри, она, в том числе, знает про ключевое слово yield
TARGET(YIELD_VALUE) {
retval = POP();
f->f_stacktop = stack_pointer;
why = WHY_YIELD;
goto fast_yield;
}
В данном случае возвращается значение, а текущий фрейм сохраняется (f->f_stacktop = stack_pointer), так что после следующего next’а можно продолжить там, где остановились, ведь PyEval_EvalFrame будет вызван на том же фрейме, что и раньше, с тем же стеком и состоянием. В обычных функциях f_stacktop приравнивается к NULL.
О том как это было.... Как провести розыгрыш среди программистов Python - ловите статью! Открываем карты до второго розыгрыша, который состоится 5 июля в 20:00! https://habrahabr.ru/company/otus/blog/332180/
Habr
Как искать людей в числе Пи и при чем тут Python
Коллеги, привет! Недавно передо мной встала задача розыграть бесплатные места на нашем курсе по Python разработке. Вообще говоря, разыграть пару бесплатных мест...
17 библиотек для Python на любой вкус
Язык программирования Python популярен среди разработчиков не только за удобный синтаксис, но и благодаря большому количеству библиотек, которые решают широкий спектр задач. В данной статье мы рассмотрим лишь небольшой пласт наиболее популярных библиотек, предназначенных для обработки данных, моделирования, для работы с вебом и сервисами, для настройки искусственного интеллекта, создания 2D-игр и анимации.
Работы с числами и данными
NumPy
Библиотека для создания матриц и массивов и выполнения над ними основных математических операций: сложение, вычитание, деление, вычитание, вычисление определителя, разбиение и т.д. Можно рассматривать, как конкурента MATLAB.
Установка:
Для Windows переходим https://sourceforge.net/projects/numpy/files/NumPy/1.9.2/, скачиваем и запускаем EXE-файл для вашей версии Python.
Для Linux установить пакет python3-numpy (цифра - версия Python) из данного репозитория https://sourceforge.net/projects/numpy/files/NumPy/ при помощи piphttps://pip.pypa.io/en/latest/installing/ , введя:
sudo pip3 install python3-numpy
или для Windows:
pip3 install numpy
Pandas
Построенная на базе NumPy библиотека предназначена для выполнения более высокоуровневых операций над массивами и матрицами. Как следствие - код чуть проще и понятнее.
Установка:
Разработчики предлагают ставить не отдельный пакет, а сразу весь дистрибутив Anaconda. https://docs.continuum.io/anaconda/install Пройдя по данной ссылке, вы найдете требуемые инсталляторы и подробные указания по установке для Windows, MacOS и Linux. В частном случае, при помощи pip установить пакет Pandas:
pip install pandas
(использование sudo pip может привести к ошибкам)
И не забудьте установить NumPy.
SciPy
Комплексная библиотека для проведения инженерных расчётов: поиск минимума и максимума функций, обработка сигналов и изображений, решение дифференциальных уравнений и использование специальных математических функций.
Установка:
Аналогичным образом из дистрибутива Anaconda https://docs.continuum.io/anaconda/install или при помощи pip:
pip install --user numpy scipy matplotlib ipython jupiter pandas sympy nose
Как видите, помимо SciPy разработчики рекомендуют установить полный пакет для обработки данных.
Визуализация
Matplotlib
http://matplotlib.org Мощная графическая библиотека, часто используемая в связке с представленными SciPy и NumPy. Поддерживает 2D и 3D графику, наиболее популярные форматы изображений и 8 типов диаграмм.
Установка:
Здесь также разработчики рекомендуют воспользоваться одним из трёх дистрибутивов: Anaconda https://docs.continuum.io/anaconda/install , miniconda https://conda.io/docs/install/quick.html или Canopy https://www.enthought.com/downloads/ . Для использования pip ввести:
pip install matplotlib
Bokeh
Основной задачей данной библиотеки является визуализация данных для дальнейшего отображения в вебе. Поддерживает выгрузку данных в виде потоков и в реальном времени. Работа с данной библиотекой сильно отличается от Matplotlib - она проще, а функциональность ниже.
Установка:
Аналогична предыдущим при помощи Anaconda или pip. Минимальный пакет в последнем случае следующий:
pip install numpy jinja2 six requests pyyaml dateutil bokeh
Plotly
https://plot.ly Адаптированный под дальнейшее отображение графиков в интернете инструмент, специализирующийся на контурных графиках и 3D-чертежах.
Установка:
Разработчики не оставляют иного выхода, кроме как воспользоваться pip:
pip install plotly
Seaborn
http://seaborn.pydata.org Это своеобразная обёртка над Matplotlib, которая обеспечивает высокоуровневый интерфейс для рисования привлекательных статистических графиков. Библиотека обеспечивает более простой API и более элегантную визуализацию, чем Matplotlib.
Установка:
Используя pip ввести::
pip install seaborn
Искусственный интеллект
SciKit-Learn
http://scikit-learn.org/stable/ Одна из самых популярных библиотек для реализации алгоритмов машинного обучения. Перед применением потребуется подключение библиотек из первого раздела
для обработки входных данных.
Установка:
Традиционн
Язык программирования Python популярен среди разработчиков не только за удобный синтаксис, но и благодаря большому количеству библиотек, которые решают широкий спектр задач. В данной статье мы рассмотрим лишь небольшой пласт наиболее популярных библиотек, предназначенных для обработки данных, моделирования, для работы с вебом и сервисами, для настройки искусственного интеллекта, создания 2D-игр и анимации.
Работы с числами и данными
NumPy
Библиотека для создания матриц и массивов и выполнения над ними основных математических операций: сложение, вычитание, деление, вычитание, вычисление определителя, разбиение и т.д. Можно рассматривать, как конкурента MATLAB.
Установка:
Для Windows переходим https://sourceforge.net/projects/numpy/files/NumPy/1.9.2/, скачиваем и запускаем EXE-файл для вашей версии Python.
Для Linux установить пакет python3-numpy (цифра - версия Python) из данного репозитория https://sourceforge.net/projects/numpy/files/NumPy/ при помощи piphttps://pip.pypa.io/en/latest/installing/ , введя:
sudo pip3 install python3-numpy
или для Windows:
pip3 install numpy
Pandas
Построенная на базе NumPy библиотека предназначена для выполнения более высокоуровневых операций над массивами и матрицами. Как следствие - код чуть проще и понятнее.
Установка:
Разработчики предлагают ставить не отдельный пакет, а сразу весь дистрибутив Anaconda. https://docs.continuum.io/anaconda/install Пройдя по данной ссылке, вы найдете требуемые инсталляторы и подробные указания по установке для Windows, MacOS и Linux. В частном случае, при помощи pip установить пакет Pandas:
pip install pandas
(использование sudo pip может привести к ошибкам)
И не забудьте установить NumPy.
SciPy
Комплексная библиотека для проведения инженерных расчётов: поиск минимума и максимума функций, обработка сигналов и изображений, решение дифференциальных уравнений и использование специальных математических функций.
Установка:
Аналогичным образом из дистрибутива Anaconda https://docs.continuum.io/anaconda/install или при помощи pip:
pip install --user numpy scipy matplotlib ipython jupiter pandas sympy nose
Как видите, помимо SciPy разработчики рекомендуют установить полный пакет для обработки данных.
Визуализация
Matplotlib
http://matplotlib.org Мощная графическая библиотека, часто используемая в связке с представленными SciPy и NumPy. Поддерживает 2D и 3D графику, наиболее популярные форматы изображений и 8 типов диаграмм.
Установка:
Здесь также разработчики рекомендуют воспользоваться одним из трёх дистрибутивов: Anaconda https://docs.continuum.io/anaconda/install , miniconda https://conda.io/docs/install/quick.html или Canopy https://www.enthought.com/downloads/ . Для использования pip ввести:
pip install matplotlib
Bokeh
Основной задачей данной библиотеки является визуализация данных для дальнейшего отображения в вебе. Поддерживает выгрузку данных в виде потоков и в реальном времени. Работа с данной библиотекой сильно отличается от Matplotlib - она проще, а функциональность ниже.
Установка:
Аналогична предыдущим при помощи Anaconda или pip. Минимальный пакет в последнем случае следующий:
pip install numpy jinja2 six requests pyyaml dateutil bokeh
Plotly
https://plot.ly Адаптированный под дальнейшее отображение графиков в интернете инструмент, специализирующийся на контурных графиках и 3D-чертежах.
Установка:
Разработчики не оставляют иного выхода, кроме как воспользоваться pip:
pip install plotly
Seaborn
http://seaborn.pydata.org Это своеобразная обёртка над Matplotlib, которая обеспечивает высокоуровневый интерфейс для рисования привлекательных статистических графиков. Библиотека обеспечивает более простой API и более элегантную визуализацию, чем Matplotlib.
Установка:
Используя pip ввести::
pip install seaborn
Искусственный интеллект
SciKit-Learn
http://scikit-learn.org/stable/ Одна из самых популярных библиотек для реализации алгоритмов машинного обучения. Перед применением потребуется подключение библиотек из первого раздела
для обработки входных данных.
Установка:
Традиционн
sourceforge.net
Numerical Python - Browse /NumPy/1.9.2 at SourceForge.net
A package for scientific computing with Python