Python Lounge: работа и стажировки для программистов
4.09K subscribers
93 photos
1.17K links
Здесь можно найти интересующую вас работу и стажировки для программистов, а так же полезные статьи про Python.

Размещение вакансии только - @perezvonyubot

Ссылка на канал: @python_lounge

Мы входим в сеть promopoisk.com

Реклама: @adtgassetsbot
Download Telegram
Моржовый оператор (Walrus Operator) в Python 3.8

Новый способ присваивания выражения (:=), или оператор «морж», был самой обсуждаемой функцией, представленной в последней версии Python. Новое дополнение к языку было предложено в PEP 572. Сразу посмотрим, как это выглядит в коде:

(x:= 5)
print(x) # 5

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

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

a = (b:= 7)
print(a, b) # 7 7

Пойдем дальше и рассмотрим пример, в котором раскрывается весь потенциал моржового оператора:

# пусть a – контейнер или последовательность
if (n:= len(a)) > 10:
print(f'Слишком много элементов, а именно {n}')

То есть мы только что прямо в проверке условия объявили новую переменную n и далее использовали ее вместо того, чтобы вычислять значение заново. Для сравнения посмотрим, как мы это могли сделать раньше:

n = len(a)
if n > 10:
print(f'Слишком много элементов, а именно {n}')

# или

if len(a) > 10:
print(f'Слишком много элементов, а именно {len(a)}')

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

Если вам понравился моржовый оператор, то дайте мне фидбек – я сделаю отдельный пост с конкретными примерами.
Моржовый оператор – примеры

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

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

if (n:= len(a)) > 10:
print(f'Слишком много элементов')
print(f'Количество элементов: {n}')

Теперь к практичным примерам использования.

1. Повторно используем значение в списке:

foo = [y:= f(x), y * 2, y * 3]

# вместо

foo = [f(x), f(x) * 2, f(x) * 3]

2. Повторное использование значения из условия в генераторных выражениях:

[y for x in data if (y:=f(x))]

# вместо

result = []
for x in data:
result = f(x)
if result:
results.append(result)

3. Чтение данных из файла внутри циклов while:

while (block := f.read(256)) != '':
process(block)

# вместо

while True:
stuff()
if fail_condition:
break
Перестановки (Permutations)

itertools.permutations генерирует перестановки, возвращая итерируемый объект. Полагаю, не надо объяснять, как с их помощью вы можете сбрутить чей-то пароль?


>>> import itertools
>>> for p in itertools.permutations('ABCD'):
... print(p)

('A', 'B', 'C', 'D')
('A', 'B', 'D', 'C')
('A', 'C', 'B', 'D')
('A', 'C', 'D', 'B')
('A', 'D', 'B', 'C')
('A', 'D', 'C', 'B')
('B', 'A', 'C', 'D')
('B', 'A', 'D', 'C')
('B', 'C', 'A', 'D')
('B', 'C', 'D', 'A')
('B', 'D', 'A', 'C')
('B', 'D', 'C', 'A')
('C', 'A', 'B', 'D')
('C', 'A', 'D', 'B')
('C', 'B', 'A', 'D')
('C', 'B', 'D', 'A')
('C', 'D', 'A', 'B')
('C', 'D', 'B', 'A')
('D', 'A', 'B', 'C')
('D', 'A', 'C', 'B')
('D', 'B', 'A', 'C')
('D', 'B', 'C', 'A')
('D', 'C', 'A', 'B')
('D', 'C', 'B', ‘A’)


4! = 24
Логические any и all

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

statements = [True, True, False]

if any(statements):
print('Как минимум одно выражение истинно')
if all(statements):
print('Все выражения истинны')
if any(statements) and not all(statements):
print('Как минимум одно выражение истинно и одно не истинно')


Функция any возвращает значение True, если хотя бы одно из переданных утверждений верно, all – когда все верны.

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

Напоминаю, списки в Python – упорядоченные последовательности элементов различных типов данных. Списки можно изменять, например добавлять новые элементы.

1. list.append(x) – добавляет элемент, переданный в качестве аргумента, в конец списка. Этот метод является самым простым и распространённым в коде.

arr = [1, 2]
arr.append(3)
# [1, 2, 3]

2. list.insert(i, x) – вставляет элемент в переданную позицию. Первый аргумент означает индекс элемента, перед которым будет добавлено новое значения.

Таким образом, list.insert(0, x) вставит элемент в начало списка, а list.insert(len(list), x) эквивалентно записи list.append(x).

arr = [1, 2]
arr.insert(1, 3)
# [1, 3, 2]

3. list.extend(iterable) – расширяет список, добавляя все элементы другой коллекции.

arr = [1, 2]
arr2 = [3, 4]
arr.extend(arr2)
# [1, 2, 3, 4]

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

P. S. Кстати, оцените новый логотип ;)
Разница между генераторными выражениями и генераторами коллекций

Сначала предлагаю сравнить следующие две строчки кода:

a = [i for i in range(5)]
x = (i for i in range(5))

Единственная разница в этих двух записях – скобки; в первой строчки они квадратные, а во второй – круглые. Сообщу заранее, что значением переменной a является список, а переменная x хранит в себе генератор.

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

print(a)
print(x)

# [0, 1, 2, 3, 4]
# <generator object <genexpr> at 0x1079d4050>

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

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

for i in x:
print(i, end=' ')

# 0 1 2 3 4

Но вот возникает вопрос, а что использовать то? Здесь всё тоже достаточно просто.

Если вам нужен результат в виде списка прямо сейчас для дальнейшего выполнения программы, то используйте генераторные выражения. А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.
Есть заказ. Сейчас поймем насколько интересно 1-2 раза в неделю делать подборки заказов и постить их, например в четверг или пятницу
Anonymous Poll
55%
Да, заказы нужны (1 пост в неделю)
7%
Нет, не надо (я итак при бабле)
38%
Мне все равно, главное пилите крутой контент полезный
Закрытый чат канала Python Lounge (ограничение участия (бесплатно, но нужно пройти отбор), но зато только отборный контент и самые крутые кодеры)
Anonymous Poll
36%
Да, я бы зашел в такой
34%
Не, у меня 500 чатов, ну камон
16%
Если будут крутые кодеры, которые будут помогать - я за
15%
Реально будут менторы из  Stanford и MIT? Если да - готов пройти любой отбор
Пишем простой сайт на Python.
Часть 1/3

Сегодня разберём создание страницы при помощи CGI-скриптов.

Настройка локального сервера.
В Python уже встроен CGI сервер, поэтому его настройка не составит труда.

from http.server import HTTPServer, CGIHTTPRequestHandler server_address = ("", 8000) httpd = HTTPServer(server_address, CGIHTTPRequestHandler) httpd.serve_forever()

Теперь откройте браузер и в адресной строке наберите localhost:8000

Теперь в той папке, где мы запустили сервер, создаём папку cgi-bin (у меня она уже создана).

В этой папке создаём скрипт hello.py со следующим содержимым:

#!/usr/bin/env python3 print("Content-type: text/html") print() print("<h1>Hello world!</h1>")

Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).

Вторая строка пишет заголовок.
Он обозначает, что это будет html файл (бывает ещё css, javascript, pdf и куча других, и браузер различает их по заголовкам).

Третья строка отделяет заголовки от тела ответа.

Четвёртая печатает Hello world.

Теперь переходим на localhost:8000/cgi-bin/hello.py

И радуемся!

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

Настройте ваши подписки

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

Используйте для обучения сервисы

Кому-то нравится читать, а кому-то — смотреть видео.
Есть сервисы с игровыми механиками.
На мой взгляд, лучше всего для тренировки навыков программирования подходит CodeFights: если я вижу, что кто-то сделал код быстрее или интереснее, у меня азарт просыпается.
Ещё есть сервис CodeCombat, мобильные приложения: Code School, CodeHS, Free Code Camp и так далее.

P.S не расслабляйтесь, сегодня вас ждёт 2 часть создании сайтов, а именно - обработка форм.
В первой части мы научились писать Hello world.
Сегодня мы рассмотрим более сложную вещь - обработку данных форм.

Создадим в нашей папке файл index.html со следующим содержимым:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Обработка данных форм</title>
</head>
<body>
<form action="/cgi-bin/form.py">
<input type="text" name="TEXT_1">
<input type="text" name="TEXT_2">
<input type="submit">
</form>
</body>
</html>

А в папке cgi-bin/ - файл form.py (обработчик формы)

#!/usr/bin/env python3
import cgi

form = cgi.FieldStorage()
text1 = form.getfirst("TEXT_1", "не задано")
text2 = form.getfirst("TEXT_2", "не задано")

print("Content-type: text/html\n")
print("""<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Обработка данных форм</title>
</head>
<body>""")

print("<h1>Обработка данных форм!</h1>")
print("<p>TEXT_1: {}</p>".format(text1))
print("<p>TEXT_2: {}</p>".format(text2))

print("""</body>
</html>""")

Попробуем это в действии.
Запускаем локальный сервер, и переходим на localhost:8000:

Готово, теперь мы научились обрабатывать данные из форм.
Завтра научимся работать с Cookies.
Сегодня мы пропустим познавательную статейку и начнём разбираться с Cookies.
2/3 часть, вторая половина.

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

Отправка печенек осуществляется заголовком Set-cookie:

#!/usr/bin/env python3 print("Set-cookie: name=value; expires=Wed May 18 03:33:20 2033; path=/cgi-bin/; httponly") print("Content-type: text/html\n") print("Cookies!!!")

Например, если сохранить этот скрипт в /cgi-bin/cookie.py и зайти на localhost:8000/cgi-bin/cookie.py, то вам поставится печенька с именем name и значением value.
Срок её хранения до мая 2033 года.

Все эти параметры не являются обязательными.

Вечером попробуем обработать cookies.
Х5 проводит масштабный контест по машинному обучению, успейте зарегистрироваться!
 
RetailHero - это не одно, а сразу три соревнования и конференция 15 февраля 2020! Разыгрываются 1 600 000 ₽ призовых 💰 
 
Организаторами были подготовлены три задачи, чтобы учесть вкусы самых искушённых участников: 
 
Каким клиентам нужно отправить SMS? 
Вы не раз могли слышать про Uplift моделирование. А теперь - наконец-то можно его попробовать реализовать самим! В этой задаче необходимо подготовить список клиентов, ранжированный по эффективности коммуникации. 
https://retailhero.ai/c/uplift_modeling/ 
 
Какие товары клиент купит в следующий раз? 
Более серьезная задача, где будет еще и немного ML Engineering с условиями еще и по нагрузке на решение. Тут участникам предстоит построить рекомендательную систему и при этом сделать сервис, который выдержит нагрузку. 
https://retailhero.ai/c/recommender_syst… 
 
Как расставить товары по полкам? 
Для любителей Computer Science, алгоритмов и оптимизации, ACM-style задача. Нужно реализовать алгоритм, который сможет найти самую эффективную расстановку товаров. 
https://retailhero.ai/c/shelf_allocation… 
 
Участвовать можно хоть в одном соревновании, хоть в двух, хоть в трёх, на ваш выбор! 🙂 
Можно в команде. А можно в составах разных команд - в каждой задаче в новой команде 👍🏻 
Канал для всех задач в slack ods.ai: https://app.slack.com/client/T040HKJE3/C… 
 
Регистрация на соревнование и конференцию, подробное описание задач на странице Retail Hero: 
https://retailhero.ai/
Обработка Cookies

Теперь научимся получать cookies.
Они передаются на сервер и доступны в переменной os.environ (словарь, cookies хранятся по ключу HTTPCOOKIE).
Они передаются в виде пар ключ=значение, что не очень удобно при обработке. Для упрощения работы можно использовать модуль http.cookies.

Напишем простой скрипт (/cgi-bin/
cookie.py), проверяющий, установлена ли кука, и если нет, устанавливает:

#!/usr/bin/env python3
import os
import http.cookies

cookie = http.cookies.SimpleCookie(os.environ.get("HTTP
COOKIE"))
name = cookie.get("name")
if name is None:
print("Set-cookie: name=value")
print("Content-type: text/html\n")
print("Cookies!!!")
else:
print("Content-type: text/html\n")
print("Cookies:")
print(name.value)

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

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

На этом 2 часть заканчивается.
Завтра будем писать прототип приложения типа "Twitter".
Так, кто тут у нас только что проснулся?
Расскажу-ка я вам, с чего начинать обучение Python.

Синтаксис
В первую очередь:

- операции с целыми и вещественными числами;
- типы данных;
- переменные, ветвления, стандартный ввод/вывод;
- логические операции, операции сравнения;
- условия: if, else, elif;
- блоки, отступы;
- строки и символы;
- циклы while, for;
- операторы break, continue;
- установка и подключение модулей;
- списки;
- функции;
- словари;
- интерпретатор: установка, запуск скрипта;
- файловый ввод/вывод.

IDE и редакторы кода

Писать в IDLE или Python Shell удобно только простой код, но для проектов лучше найти интегрированную среду разработки (IDE) или редактор кода.
IDE включает в себя редактор с подсветкой синтаксиса и автодополнением, инструменты сборки, выполнения и отладки и другие функции.
В большинстве редакторов есть подсветка синтаксиса и форматирование, выполнение и отладка кода.
Как правило, этот инструмент работает быстрее IDE, но имеет меньше функций.
Среди самых популярных платформ — PyCharm, Wing IDE, Komodo и другие. Больше вариантов — в нашем обзоре.

Git

С распределенной системой управления версиями (Git) нужно познакомиться в начале обучения.
Среди основных навыков — создание и перемещение файлов в каталогах, инициализация Git-репозитория и создание коммитов, а также настройка репозиториев в GitHub.
Пишем простой сайт на Python.
Часть 4: Публикация в сети Интернет

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

Погнали с нами читать в Яндекс.Дзен, мы уже создали там свой канал.
Создаём сайт на Django: Часть 1

Я начинаю серию статей, посвященных разработке сайтов на Django.
Django — веб-фреймворк для создания сайтов, написанный на языке Python.
Мы создадим сервис, который фильтрует фриланс-проекты, которые может выполнить Python-программист, а далее показывает нам.
Python Lounge: работа и стажировки для программистов
Закрытый чат канала Python Lounge (ограничение участия (бесплатно, но нужно пройти отбор), но зато только отборный контент и самые крутые кодеры)
Помните мы проводили опрос про наш закрытый чат? Так вот мы почти все подготовили и готовы отобрать первых 50 человек для нашего чата.

Для попадания в закрытый чат канала Python Lounge вам необходимо отправить в личку @progyteam:

1. Имя или ник
2. Пришли 3 проекта, которыми ты гордишься (Ты принимал участие в создании)
3. Уровень, на который ты себя оцениваешь (Junior, Middle, Lead)
4. Что ты хочешь получить от чата? (Новые знания, новые проекты, новые знакомства по всему миру с крутыми прогерами)
5. Уровень владения английским (от 1 до 10, оцени сам)

Мы отберем 50 человек и отправим ссылку на чат в течение 3 дней!
Чат всегда будет бесплатным. Это наш принцип.

Хорошего кода!
Сегодня мы познакомимся с очень познавательной статьёй, а именно - реализация распознавания изображений в Python.

Мы попробуем создать простого питона-бота, который будет играть в Chrome Dino Game без участия пользователя. Здесь мы не используем какое-либо машинное обучение или искусственный интеллект для противодействия этой проблеме, но мы будем использовать простую обработку изображения/экрана.