Содержание статьи
Языки становятся популярными по разным причинам, иногда просто из-за отсутствия других решений для определенной ниши. Успех Python, на мой взгляд, вполне заслужен — его легко изучать, приятно использовать, и на нем можно начать писать полезные программы довольно скоро.
В чем секрет его успеха? У него простой в изучении, логичный и лаконичный синтаксис. Многие языки полны сюрпризов вроде легендарного print reverse "foo"
, который вопреки ожиданиям выводит строку foo (правильный вариант: print scalar reverse "foo"
).
В Python смысл выражений почти всегда очевиден, а все ошибки сопровождаются исключениями, из которых легко понять, что пошло не так. Например, если мы попытаемся записать в массив по несуществующему индексу, то сразу получим ошибку с исчерпывающим описанием проблемы.
>>> arr = [1,2]
>>> arr[5] = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
Например, в Ruby или Lua аналогичный код приведет массив к виду [1, 2, nil, nil, nil, 3]
. И, если это не то, чего ты ожидал, то заметить и исправить ошибку может быть непросто.
При выборе языка для нового проекта нужно учитывать не только свойства самого языка, но и его экосистему: библиотеки, инструменты разработки, да и сообщество пользователей. С этим у Python все отлично. Его поддерживают многие популярные IDE, а некоторые среды даже разработаны специально для него, как PyCharm. Есть множество инструментов анализа и отладки, например, py-spy — профайлер, которым можно подключиться к работающей программе и в реальном времени смотреть, какие функции выполняются и сколько времени занимают.
Число библиотек для самых разных целей тоже огромно. Некоторые из них стали настолько популярны, как TensorFlow, pandas, или NumPy, что люди используют Python для машинного обучения и анализа данных специально, чтобы ими воспользоваться. В DevOps не менее популярны Ansible и Saltstack.
В сочетании с неплохой производительностью, это позволяет применять Python как для коротких скриптов и разовых задач, так и для больших приложений. Как и любой другой язык, Python не универсален и не всегда является лучшим выбором для конкретной задачи, но он покрывает достаточно большой класс задач и требований к производительности, чтобы для многих проектов быть основным или единственным языков. При недостатке производительности подмножество Python можно компилировать в машинный код с помощью Cython, или переписать на другом языке и взаимодействовать с ним через FFI.
Самое главное: с помощью нужных библиотек, решать многие задачи просто. Даже для начинающего разработчика Python быстро станет помощником в повседневных задачах. Именно поэтому его часто выбирают для изучения в качестве первого языка, и существует множество курсов, где с этим помогают — например, в онлайн школе SkillFactory.
INFO
Школа SkillFactory — спонсор этой публикации. Со SkillFactory ты можешь пройти курс «Python для веб-разработки» и освоить полный стек технологий для создания сайтов, приложений и сервисов. Для студентов предусмотрена помощь наставника; в процессе обучения студент формирует портфолио, которое потом сможет показать работодателю.
Чтобы продемонстрировать мощь Python, я выбрал ряд библиотек, которые не требуют сложной установки зависимостей или наборов данных, и позволяют сделать что-то полезное всего за несколько строк кода.
Виртуальные окружения
Для разработки и тестирования пользователи Python часто применяют виртуальные окружения (virtual environments). В Python 2.x их поддержка была реализована опциональным модулем, но в Python3 уже есть встроенная поддержка, так что для их установки ничего делать не нужно.
Каждое окружение живет в своем каталоге, поэтому устанавливать в него модули можно от имени обычного пользователя. Если ты необратимо сломал свое окружение, можно просто удалить каталог и пересоздать его. Не менее полезно бывает создать чистое окружение чтобы убедиться, что твоя библиотека или приложение чисто устанавливается из исходников и работает.
Создать и активировать виртуальное окружение очень просто. На UNIX-подобных системах это делается так:
$ python3 -m venv test-env
$ source ./test-env/bin/activate
Выйти из окружения можно командой deactivate
.
Чтобы не засорять рабочую систему лишними модулями, все примеры лучше пробовать именно в виртуальном окружении.
Замена скриптов на shell
Скрипты на Bourne shell — классика системного администрирования и автоматизации, но как язык программирования, шелл так и остался в семидесятых. Его собственные средства отладки и обработки ошибок примитивны, к тому же, если ты хочешь сделать скрипт кроссплатформенным, нужно тщательно избегать «башизмов» и всего, что не входит в стандарт POSIX. Инструменты вроде ShellCheck могут с этим помочь, но можно пойти и другим путем — не использовать Shell вовсе.
В стандартной библиотеке Python уже есть ряд модулей, которые сделают за тебя половину работы. К примеру, скопировать файл с помощью функции из модуля shutil можно в одну строку.
$ touch myfile
$ python3
>>>import shutil
>>>shutil.copy('myfile', 'myfile.bak')
>>>exit()
Там же присутствуют chown
, rmtree
и функции для упаковки файлов в архивы, кроме того, у функций есть опция follow_symlinks
.
Выполнить команду и получить ее код завершения и вывод ничуть не сложнее.
>>> import subprocess
>>> subprocess.run(["ls -l /dev/null"], shell=True, capture_output=True)
CompletedProcess(args=['ls -l /dev/null'], returncode=0, stdout=b'crw-rw-rw-. 1 root root 1, 3 Feb 9 01:36 /dev/null\n', stderr=b'')
Иногда бывает сложно обойтись без передачи пользовательского ввода внешней команде. Это открывает простор для уязвимостей типа shell injection и требует внимания к деталям. К счастью, в стандартной библиотеке уже есть функция, которая добавит кавычки и экранирует опасные символы.
>>>import shlex
>>> shlex.quote("myfile; rm -rf ~")
"'myfile; rm -rf ~'"
Разбор веб-страниц
Разбор веб-страниц (scraping) нужен для многих целей: от борьбы с сервисами, которые не предоставляют API, до создания поисковых систем.
Для демонстрации мы извлечем заголовки новостей с главной страницы журнала. C помощью библиотеки requests и парсера HTML BeautifulSoup мы можем сделать это всего в несколько строк.
Установим библиотеки: pip3 install requests beautifulsoup4
. Теперь откроем xakep.ru в отладчике браузера и увидим, что заголовки новостей находятся в тэгах <h3 class="entry-title">
, но не напрямую, а во вложенных <a>
и <span>
. К счастью для нас, BeautifulSoup поддерживает селекторы CSS3, а в ее стандарте tag1 tag2
как раз означает «<tag2>
вложенный в <tag1>
. То есть, наш селектор для заголовков новостей будет h3.entry-title a span
.
import requests
from bs4 import BeautifulSoup
response = requests.get("https://xakep.ru")
page = response.text
soup = BeautifulSoup(page, 'html.parser')
headings = map(lambda e: e.text, soup.select("h3.entry-title a span"))
for h in headings:
print(h)
Сохрани в файл вроде xakep-headings.py
и выполни python3 xakep-headings.py
или просто скопируй в интерпретатор, и ты увидешь все свежие новости.
Веб-приложения
На Python есть большие фреймворки MVC, такие как весьма популярный Django. Но есть и легковесные библиотеки, с которыми можно за пару строк кода превратить любую функцию в веб-сервис.
Один из самых популярных микрофреймворков — Flask. Для демонстрации напишем сервис, который в ответ на запрос /add/x/y
выдает сумму чисел x и y.
Установим Flask командой pip3 install flask
и сохраним вот этот код в файл myapp.py
:
from flask import Flask, escape, request
app = Flask(__name__)
@app.route('/add/<int:x>/<int:y>')
def show_post(x, y):
return str(x + y)
Теперь можно запустить его командой env FLASK_APP=myapp.py flask run
.
$ curl http://localhost:5000/add/3/2
5
Если тебе не понравился Flask, можно вместо него посмотреть на Bottle — он ничуть не сложнее в использовании.
Обработка естественного языка
Обработка естественного языка традиционно считается сложной и специализированной задачей. Библиотеки для этой цели весьма развиты, но не слишком просты в использовании.
Однако, модуль TextBlob предоставляет простой интерфейс к библиотеке NLTK. Перед использованием нам нужно поставить саму библиотеку и скачать наборы данных для нее:
$ pip3 install textblob
$ python3
>>> import nltk
>>> nltk.download('punkt')
>>> nltk.download('brown')
Теперь попробуем написать функцию, которая возвращает существительное во множественном числе.
from textblob import TextBlob
def pluralize(word, count):
if count == 1:
return word
else:
blob = TextBlob(word)
return blob.words[0].pluralize()
print(pluralize('mouse', 1))
print(pluralize('mouse', 9))
Скопируй это все в интерпретатор и попробуй в действии.
Так же просто разбить текст на предложения:
>>> text = TextBlob("Python is a cool language. I like using it.")
>>> text.sentences
[Sentence("Python is a cool language."), Sentence("I like using it.")]
В TextBlob есть много других возможностей, например, разбор на члены предложения — очень пригодится, если хочешь написать текстовый квест или чат-бота.
Заключение
Это всего несколько примеров, но репозиторий пакетов PyPI огромен и каждый найдет там что-то для себя. Когда ты только изучаешь язык, нет ничего плохого в том, чтобы написать свое решение давно решенной задачи. Но вот если тебе нужно быстрое решение насущной задачи вроде работы с каким-нибудь форматом файла или взаимодействия с сервисом, не забудь поискать в репозитории — скорее всего оно там уже есть.