Найти:

- Взлом
- Приватность
- Трюки
- Кодинг
- Админ
- Geek
- Обучение
- Магазин

- Windows
- Linux
- Android
- Железо
- Мессенджеры
- Утечки
- Коронавирус
- Все выпуски «Хакера»

### Содержание статьи

- Виртуальные окружения
- Замена скриптов на shell
- Разбор веб-страниц
- Веб-приложения
- Обработка естественного языка
- Заключение

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

← Ранее Ультразвуковая атака позволяет контролировать голосовых помощников
Далее → Операторы шифровальщика Nemty будут публиковать украденные у жертв данные
2 комментария к записи Пять простых примеров, которые сподвигнут тебя изучить Python

#### Последние взломы

### HTB EarlyAccess. Эксплуатируем веб-уязвимости и мисконфиги Docker

### HTB Horizontall. Захватываем веб-сервер через уязвимости в Strapi и Laravel

### Препарируем P-Code. Как реверсить старый софт на Visual Basic

### HTB Anubis. Захватываем домен через сертификаты Active Directory

#### Компьютерные трюки

### Анатомия терминала. Осваиваем текстуальную графику

### Змей-стражник. Сигнализация для велосипеда из старого смартфона на Android

### M1 для хакера. Тестируем Homebrew, виртуалки, Docker и Node на новой архитектуре Apple

### Отключить всё! Ускоряем работу Windows 11 на старом железе

#### Свежие новости

- 12 часов назад

  ### Неизвестная хак-группа годами атаковала авиационный и транспортный секторы

- 13 часов назад

  ### Конференция ZeroNights 2022 состоится 23 июня 2022 года

- 14 часов назад

  ### Участник Team Xecuter получил 40 месяцев тюрьмы

- 15 часов назад

  ### Google выпустила срочное исправление для 0-day уязвимости в Chrome

- 1 день назад

  ### Накануне Супербоула клуб «Сан-Франциско Форти Найнерс» подвергся атаке шифровальщика

Вопросы по материалам и подписке: support@glc.ru
Отдел рекламы и спецпроектов: yakovleva.a@glc.ru
Контент 18+
Сайт защищен Qrator —
самой забойной защитой от DDoS в мире
Подписка для физлиц
Подписка для юрлиц
Реклама на «Хакере»
Контакты
Posting....
wpDiscuz