Python Lounge: работа и стажировки для программистов
Open in Telegram
Здесь можно найти интересующую вас работу и стажировки для программистов, а так же полезные статьи про Python. Размещение вакансии только - @perezvonyubot Ссылка на канал: @python_lounge Мы входим в сеть promopoisk.com Реклама: @adtgassetsbot
Show more4 245
Subscribers
No data24 hours
-157 days
-6530 days
Posts Archive
Пишем простой сайт на Python.
Часть 4: Публикация в сети Интернет
В самом начале мы работали с локальном сервером.
Теперь узнаем, как его разместить в интернете.
Мы будем искать виртуальный сервер под наши нужды.
Погнали с нами читать в Яндекс.Дзен, мы уже создали там свой канал.
Так, кто тут у нас только что проснулся?
Расскажу-ка я вам, с чего начинать обучение Python.
Синтаксис
В первую очередь:
- операции с целыми и вещественными числами;
- типы данных;
- переменные, ветвления, стандартный ввод/вывод;
- логические операции, операции сравнения;
- условия: if, else, elif;
- блоки, отступы;
- строки и символы;
- циклы while, for;
- операторы break, continue;
- установка и подключение модулей;
- списки;
- функции;
- словари;
- интерпретатор: установка, запуск скрипта;
- файловый ввод/вывод.
IDE и редакторы кода
Писать в IDLE или Python Shell удобно только простой код, но для проектов лучше найти интегрированную среду разработки (IDE) или редактор кода.
IDE включает в себя редактор с подсветкой синтаксиса и автодополнением, инструменты сборки, выполнения и отладки и другие функции.
В большинстве редакторов есть подсветка синтаксиса и форматирование, выполнение и отладка кода.
Как правило, этот инструмент работает быстрее IDE, но имеет меньше функций.
Среди самых популярных платформ — PyCharm, Wing IDE, Komodo и другие. Больше вариантов — в нашем обзоре.
Git
С распределенной системой управления версиями (Git) нужно познакомиться в начале обучения.
Среди основных навыков — создание и перемещение файлов в каталогах, инициализация Git-репозитория и создание коммитов, а также настройка репозиториев в GitHub.
Обработка 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("HTTPCOOKIE"))
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".
Х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.
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.В первой части мы научились писать 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.Доброе утро, питонисты 🙃
Сегодняшний день я планирую начать с полезных советов для программиста, которые я и сам использую.
Настройте ваши подписки
Обычный человек потребляет в почте, соцсетях, Telegram множество контента.
Не тратьте время на ерунду и бесцельный сёрфинг!
Выпилите из ленты котиков и прочую милоту, оставьте только полезное.
Так, обыденно просматривая новости в различных каналах, вы сможете попутно учиться.
Кейсы, новости отрасли, советы разработчиков чаще будут у вас перед глазами.
Используйте для обучения сервисы
Кому-то нравится читать, а кому-то — смотреть видео.
Есть сервисы с игровыми механиками.
На мой взгляд, лучше всего для тренировки навыков программирования подходит CodeFights: если я вижу, что кто-то сделал код быстрее или интереснее, у меня азарт просыпается.
Ещё есть сервис CodeCombat, мобильные приложения: Code School, CodeHS, Free Code Camp и так далее.
P.S не расслабляйтесь, сегодня вас ждёт 2 часть создании сайтов, а именно - обработка форм.
Пишем простой сайт на 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.Закрытый чат канала Python Lounge (ограничение участия (бесплатно, но нужно пройти отбор), но зато только отборный контент и самые крутые кодеры)
Тут появились на рынке ребята, которые меняют индустрию обучения программированию и математики в России
Если вы преподавтаель по математике или программированию - напишите @PolinaDS
Если вы хотите работать в компании (сейчас набирают штат разработчиков - работа удаленно по всему миру) - напишите @Lyubov_Kokhanchuk
За трудоустройство от вас обещают видеоуроки по одному из курсов или модное Худи с большим капюшоном от Progy https://progyschool.ru/skidkinewyear2020
И отличная новость! Готовим посты и начинаем вас радовать контентом уже с 10 января - осталось подождать немного. Зато будет много контента, много на английском, видео. Ну и мы запускаем закрытый чат, как туда попасть расскажем в ближайшие дни!
Есть заказ. Сейчас поймем насколько интересно 1-2 раза в неделю делать подборки заказов и постить их, например в четверг или пятницу
Разница между генераторными выражениями и генераторами коллекций
Сначала предлагаю сравнить следующие две строчки кода:
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
Но вот возникает вопрос, а что использовать то? Здесь всё тоже достаточно просто.
Если вам нужен результат в виде списка прямо сейчас для дальнейшего выполнения программы, то используйте генераторные выражения. А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.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. Кстати, оцените новый логотип ;)Логические 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 – когда все верны.
На мой взгляд, эти две функции заслуживают отдельного внимания всего лишь из-за их простоты в использовании.Перестановки (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Почему именно Python?
В современном обществе программировать на хотя бы базовом уровне должен уже каждому. Однако практически каждый новичок теряется при выборе языка программирования, когда сталкивается с таким разнообразием. В статье мы постарались объяснить наш выбор.
Читать 5 минут
Моржовый оператор – примеры
В предыдущем посте мы обсудили синтаксис нового оператора присваивания. В личные сообщения я получил большое количество просьб продолжить, поэтому в этом посте мы рассмотрим частные случаи, когда морж в коде выглядит солидно.
Но для начала стоит отметить ещё один важный момент – моржовый оператор не создаёт новую область видимости:
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Моржовый оператор (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)}')
В первом случае появляется лишняя строка кода, в которой объявляется ненужная переменная. Во втором случае дважды вызвана одна и та же функция, а это потеря в производительности.
Если вам понравился моржовый оператор, то дайте мне фидбек – я сделаю отдельный пост с конкретными примерами.Буквально недавно вышел Python 3.8, делать обзор его новых фишек на канал?
