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

Языки становятся популярными по разным причинам, иногда просто из-за отсутствия других решений для определенной ниши. Успех 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 огромен и каждый найдет там что-то для себя. Когда ты только изучаешь язык, нет ничего плохого в том, чтобы написать свое решение давно решенной задачи. Но вот если тебе нужно быстрое решение насущной задачи вроде работы с каким-нибудь форматом файла или взаимодействия с сервисом, не забудь поискать в репозитории — скорее всего оно там уже есть.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии