Python — объектно-ориентированный язык программирования высокого уровня с динамической семантикой. [1] Структуры данных высокого уровня вместе с динамической семантикой и динамичным связыванием делают ее привлекательной для быстрой разработки программ, а также как средство объединения существующих компонентов. Python поддерживает модули и пакеты модулей способствует модульности и повторному использованию кода. Интерпретатор Python и стандартные библиотеки доступны как в откомпилированной так и в исходной форме на всех основных платформах. В языке программирования Python поддерживается несколько парадигм программирования.
- 1 История
- 2 Портированность
- 3 Типы и структуры данных
- 4 Возможности
- 4.1 Интерактивный режим
- 4.2 Объектно-ориентированное программирование
- 4.3 Функциональное программирование
- 4.4 Модули и пакеты
- 4.5 Интроспекция
- 4.6 Обработка исключений
- 4.7 Итераторы
- 4.8 Генераторы
- 4.9 Управление контекстом выполнения
- 4.10 Декораторы
История
Python. Команды print() input()
Гвидо ван Россум
Разработка языка Python была начата в конце 1980-х годов [2] сотрудником голландского института CWI Гвидо ван Россумом. Для распределенной ОС Amoeba потребовался расширяемый скриптовый язык, и Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка ABC (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале 1991 года Гвидо опубликовал исходный текст в группе новостей alt.sources. [3] Язык начал свободно распространяться через Интернет, и понравился другим программистам. С самого начала Python проектировался как объектно-ориентированный язык. Python также позаимствовал многие черты таких языков, как C, C++, Modula-3 и Icon, и отдельные черты функционального программирования с Lisp.
Название языка возникла вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного сериала 70-х годов «Воздушный цирк Монти Пайтона». Впрочем, все равно название языка чаще ассоциируют именно со змеей, чем с фильмом — пиктограммы файлов в KDE или в Windows, а также эмблема на сайте python.org изображают змеиную голову.
Наличие дружественного сообщества пользователей считается наряду с дизайнерской интуицией Гвидо, одним из главных факторов успеха Python. Развитие речи происходит согласно четко регламентированными процессами создания, обсуждения, отбора и реализации документов PEP (Python Enhancement Proposal) — предложений по развитию Python. [4]
3 декабря 2008 года, [5] после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращенная Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями. На сегодня поддерживаются обе ветви развития (Python 3.2 и 2.7).
Портированность
Python портирован и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, все варианты UNIX (включая FreeBSD и GNU/Linux), Mac OS и Mac OS X, iOS и Android. [6]
По мере старения платформы ее поддержка в основной ветке языка прекращается. Например, из серии 2.6 прекращена поддержка Windows 95, Windows 98 и Windows ME. [7] Однако на этих платформах можно использовать предыдущие версии Python — теперь сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).
При этом, в отличие от многих портированных систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий. Более того, существует специальная версия Python для виртуальной машины Java — Jython, что позволяет интерпретатору выполняться на любой системе, которая поддерживает Java, при этом классы Java могут непосредственно использоваться с Python и даже быть написанными на нем. Также несколько проектов обеспечивают интеграцию с платформой Microsoft.NET, основные из которых — IronPython и Python.Net.
Типы и структуры данных
Python поддерживает динамическую типизацию, то есть, тип переменной определяется только во время исполнения. Из базовых типов следует отметить поддержку целых чисел произвольной длины и комплексных чисел . Python имеет богатую библиотеку для работы с строками, в частности, кодированными в Юникоде.
Из коллекций Python поддерживает кортежи (tuples), списки (массивы), словари (ассоциативные массивы) и, начиная с версии 2.4, множества.
Возможности
Интерактивный режим
Подобно Lisp и Prolog в режиме отладки, интерпретатор Python имеет интерактивный режим работы, при котором введенные с клавиатуры операторы сразу же выполняются, а результат выводится на экран. Этот режим интересен не только новичкам, но и опытным программистам, которые могут протестировать в интерактивном режиме любой участок кода, прежде чем использовать его в основной программе, или просто использовать как калькулятор с большим набором функций.
Объектно-ориентированное программирование
Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Python является элегантной, мощной и хорошо продуманной, но вместе с тем, достаточно специфической по сравнению с другими объектно-ориентированными языками.
Возможности и особенности:
- Классы являются одновременно объектами со всеми ниже приведенными возможностями.
- Наследование, в том числе множественное.
- Полиморфизм (все функции виртуальные).
- Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.
- Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
- Перегрузка операторов (всех, кроме is, ‘.’, ‘=’ и символьных логических).
- Свойства (имитация поля с помощью функций).
- Управление доступа к полям (эмуляция полей и методов, частичный доступ и т. д.).
- Методы для управления самыми распространенными операциями (глубокое копирования, сериализация, итерация по объекту)
- Метапрограммирования (управление созданием классов, триггеры на создание классов, и др)
- Полная интроспекция.
- Классовые и статические методы, классовые поля.
- Классы, вложенные в функции и другие классы.
Функциональное программирование
Python поддерживает парадигму функционального программирования, в частности:
- функции высших порядков;
- рекурсию;
- развитая обработка списков (списке выражения, операции над последовательностями, итераторы);
- аналог замыканий (closures);
- частичное применение функции;
- возможность реализации других средств на самом языке (например, карринг).
Модули и пакеты
Программное обеспечение на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут располагаться как в каталогах, так и в ZIP-архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python и модули расширения (extension modules), написанные на других языках программирования.
Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import . После импорта модуль представлен отдельным объектом, дающим доступ к пространству имен модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload ().
Интроспекция
Python поддерживает полную интроспекцию времени исполнения. Это означает, что для любого объекта можно получить всю информацию о его внутренней структуре.
Применение интроспекции (метапрограммирования) является важной частью того, что называют «pythonic style», и широко применяется в библиотеках и фреймворках Python, экономя время программиста.
Обработка исключений
Обработка исключений поддерживается в Python помощью операторов try, except, else, finally, raise, образующих блок обработки исключений. Совместное использование else, except и finally стало возможно только начиная с Python 2.5. Информация о текущем исключение всегда доступна через sys.exc_info (). Кроме значение исключения, Python также сохраняет состояние стека до точки возбуждения исключения — так называемый traceback.
В отличие от языков программирования, в Python использование исключение не приводит к значительным накладным расходам (а часто даже позволяет ускорить выполнение программ) и очень широко используется. Исключения согласуются с философией Python (10-й пункт «дзена Python» — «Ошибки никогда не должны игнорироваться») и является одним из средств поддержания «утиной типизации».
Иногда, вместо явной обработки исключений удобнее использовать блок with (доступен, начиная с Python 2.5).
Итераторы
Итераторы и генераторы
В программах на Python широко используются итераторы. Цикл for может работать как с последовательностью, так и с итераторами. Все коллекции, как правило, предоставляют итератор. Объекты определенного пользователем класса тоже могут быть итераторами. Модуль itertools стандартной библиотеки содержит много полезных функций для работы с итераторами.
В отличие от обычных последовательностей, все элементы которых хранятся в памяти, получения следующего элемента обеспечивает генератор — специальная функция, обращение к которой вычисляет и возвращает следующий элемент генератора.
Генераторы
Одной из интересных возможностей языка являются генераторы — функции, между вызовами сохраняют внутреннее состояние: значения локальных переменных и текущую инструкцию (см. также: супрограма). Генераторы могут использоваться как итераторы для структур данных и для ленивых вычислений.
При вызове генератора функция немедленно возвращает объект-итератор, который хранит текущую точку исполнения и состояние локальных переменных функции. При запросе следующего значения (с помощью метода next (), неявно вызывается в for цикле) генератор продолжает выполнение функции от предыдущей точки останова до следующего оператора yield или return.
В Python 2.4 появились генераторные выражения — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе нужно было бы использовать список с промежуточными результатами:
Начиная с версии 2.5, Python поддерживает полноценные спивпроцедуры: теперь в генератор можно передавать значения с помощью метода send () и возбуждать в его контексте исключения с помощью метода throw ().
Управление контекстом выполнения
В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор with и модуль contextlib.
Оператор может применяться в тех случаях, когда до и после некоторых действий обязательно должны выполняться какие-то другие действия, независимо от созданных в блоке исключений или операторов return: файлы должны быть закрыты, ресурсы освобождены, перенаправление стандартного ввода/вывода завершено, и тому подобное. Оператор облегчает чтение кода, следовательно, помогает избегать ошибок.
Декораторы
С версии 2.6 декораторы можно использовать с классами, аналогично функциям.
Система классов поддерживает множественное наследование и метапрограммирование. Любой тип, включая базовый, входит в систему классов, и при необходимости возможно наследование даже от базовых типов.
Специализированные подмножества/расширения Python
На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них:
- RPython [9] — созданная в рамках проекта PyPy значительно ограничена реализация Python без динамизма времени исполнения и некоторых других возможностей. RPython код можно компилировать во множество других языков / платформ — C, JavaScript, Lisp, .NET [10] , LLVM. На RPython написан интерпретатор PyPy.
- Pyrex [11] — ограниченная реализация Python, но чуть меньше, чем RPython. PyReX расширен возможностями статической типизации типами из языка С и позволяет свободно смешивать типизированный но не типизированной код. Предназначен для написания модулей расширений, компилируется в код на языке С.
- Cython [12] — расширенная версия Pyrex.
- pyastra [13] — компилятор Python кода в ассемблер для PIC архитектуры.
- shed-skin [14] — предназначен для компиляции неявно статически типизированного Python кода в оптимизированный код на языке С++, проект далек от завершения.
Источники
- ↑ Guido Van Rossum, Python Reference Manual, release 2.4.4, 18 October 2006.
- ↑The Making Of Python
- ↑[1]
- ↑Index Of Python Enhancement Proposals (PEPs)
- ↑Python 3.0 Release
- ↑«Python on Android»
- ↑«Port-Specific Changes: Windows» Python v2.6.1 documentation. What’s New in Python 2.6 (англ.) Python Software Foundation.
- ↑PEP318
- ↑PyPy (coding-guide)
- ↑PyPy (carbonpython)
- ↑Pyrex
- ↑Cython C-Extensions for Python
- ↑Pyastra: python assembler translator
- ↑Shed Skin — An Optimizing Python-to-C ++ Compiler
Источник: cyclowiki.org
Погружение в пучину интерпретатора Python. Ч1
От переводчика: Наверно всем интересно, что внутри у инструмента, который используешь, этот интерес овладел и мной, но главное не утопать в нём и не закопаться так что не вылезти. Найдя для себя интересный материал, я решил заботливо перевести его и представить хабросообществу (моя первая публикация, прошу ногами сильно не пинать). Тем, кому интересен как Python работает на самом деле, прошу проследовать под кат.
Последние три месяца я потратил много времени на byterun, интерпретатор питоновского байткода, написанного на питоне. Работа над этим проектом была для меня захватывающе весёлой и познавательной. Я был бы рад, если бы вы тоже его потыкали. Но прежде нам надо немного остепенится, понять как работает python, так, чтобы мы знали, что такое интерпретатор на самом деле и с чем его едят.
Я подразумеваю, что вы сейчас в том же положении, что и я три месяца назад. Вы понимаете python, но понятия не имеете как он работает.
Небольшая заметка: Я работаю с версией 2.7 в этом посте. Третья версия почти схожа со второй, есть небольшие различия в синтаксисе и наименованиях, но в целом всё тоже самое.
Как работает python?
Статья Распознаем текст на изображении двумя библиотеками с помощью Python
Уже довольно давно признанным лидером по распознаванию текста в пользовательском сегменте является Abbyy FineReader. К тому же, она не только позволяет распознавать тексты, но, также и сканировать документы с помощью сканера. Но, речь не о ней. А о том, что в области распознавания текста может предложить Python. Давайте рассмотрим две популярные библиотеки и попробуем сравнить качество распознавания.
Если честно, то узнав, как давно разрабатывалась первоначальная версия Tesseract OCR, я был удивлен. Ее разработка велась с середины 80-х по середину 90-х годов компанией Hewlett-Packard. После была благополучно забыта аж на целых 10 лет. В 2006 году была выкуплена Google, а ее исходные тексты стали открыты для разработчиков. И, дело сдвинулось с мертвой точки.
В настоящий момент существует версия 5.0, которая уже очень далеко ушла от своей библиотеки-прародительницы.
Разработка EasyOCR была представлена общественности 24 июля 2020 года. Так что, в отличие от Tesseract, эта библиотека очень молодая, но, тем не менее, подающая большие надежды. Для распознавания доступны более 40 языков, а код написан на Python с использованием фреймворка PyTorch.
Что понадобиться?
Установить easyocr. Библиотека довольно большая и в процессе установки подгружает необходимые для работы зависимости. Поэтому будьте готовы к тому, что установка займет продолжительное время. Впрочем, здесь все зависит от скорости вашего интернета и мощности компьютера. Для установки пишем в терминале:
pip install easyocr
И еще, после первого запуска она не заработает сразу же, а для начала выкачает необходимые для работы модели распознавания.
Затем установим Pillow. С его помощью мы будем открывать картинки для загрузки в tesseract.
pip install Pillow
А теперь нужно установить Tesseract OCR. Если у вас операционная система Windows, то в коде нужно будет прописывать на строчку кода больше. Установка библиотеки подробно описана
Ссылка скрыта от гостей
. При установке в Windows будьте внимательны и выберите нужные вам языки распознавания в инсталляторе. В Linux и Mac дополнительные языки скачиваются вот с
Ссылка скрыта от гостей
, после чего скачанный файл кладется в папку с tesseract.
После установки основной библиотеки нужно установить модуль для Python. Пишем в терминале:
pip install pytesseract
И наконец, когда уже все будет установлено, импортируем необходимые модули в скрипт:
import os.path import easyocr import pytesseract from PIL import Image
Если вы используете ОС Windows, вам нужно будет дополнительно прописать вот такую конструкцию:
pytesseract.pytesseract.tesseract_cmd = r»C:Program FilesTesseract-OCRtesseract.exe»
где указывается путь к исполняемому файлу.
Функция для сканирования изображения с помощью tesseract
Давайте создадим функцию для распознавания текста на изображении с помощью tesseract. Я назову ее teseract_recognition(path_img), и на входе она принимает всего лишь один параметр, это путь к файлу изображения.
def teseract_recognition(path_img): return pytesseract.image_to_string(Image.open(path_img), lang=’rus+eng’, config=r’—oem 3 —psm 6′)
Здесь, с помощью функции image_to_string распознается изображение. Оно принимает, в данном случае следующие параметры:
— Изображение для распознавания. Здесь мы сразу же открываем изображение с помощью функции Image, куда передается путь к файлу.
— Язык распознавания. В данном случае указан русский + английский. В зависимости от ваших потребностей можете установить какой-то один язык.
— Конфиг. Первый параметр, это OCR Engine Mode, режим работы «движка» для распознавания. Оставим его без изменений. А вот с psm можно поэкспериментировать. psm – это page segmentation mode, то есть режим сегментации страниц. Чуть более подробно про значения данного режима можно
Ссылка скрыта от гостей
И возвращаем распознанный текст туда, откуда он был вызван. По сути, в простейшем варианте, весь код уместился в двух строчках кода. А если убрать объявление функции, то уместиться и в одной.
Функция распознавания текста с помощью easyocr
Теперь давайте сделаем функцию, которая также будет распознавать текст, но уже с помощью другой библиотеки. Создадим функцию easyocr_recognition(path_img). Здесь на вход принимается только путь к файлу с изображением.
def easyocr_recognition(path_img): return easyocr.Reader([«ru»]).readtext(path_img, detail=0, paragraph=True, text_threshold=0.8)
Создадим объект easyocr.Reader, в который передадим список с языками для распознавания. В нашем случае это русский. Можно указать английский и многие другие. Соответственно, если вам еще нужен один язык, укажите его обозначение через запятую. Затем вызываем функцию readtext, в которую передаем следующие параметры:
— Путь к файлу с изображением;
— Детализация. По умолчанию данный параметр равен 1 и выводит на экран, помимо текста, еще и параметры отступов и прочую служебную информацию, а также порог достоверности текста, который по умолчанию равен 0.7;
— Автоматическое разбиение текста на параграфы. В противном случае текст выводиться по словам;
— Порог достоверности текста.
Как видите, здесь также в простом варианте все уложилось в две строчки.
На самом деле, это пример не особо хорошего кода )) Не делайте так. Желательно разделить функции, хотя бы для того, чтобы ваш код можно было удобно читать. И если здесь такая строка одна, то представьте, что будет, если таких строк сотни.
Функция сохранения текста в файл
Создадим функцию сохранения распознанного текста в файл. Я назвал ее save_text(text, name). На входе она принимает текст для сохранения и название для файла с текстом.
def save_text(text, name): with open(f’.txt’, ‘w’, encoding=’utf-8′) as file: file.write(text) print(f'[+] Распознанный текст сохранен в файл: «.txt»‘) main() return
Ну, а дальше сохраняется текст и выводиться сообщение об успешном завершении.
Ну и функция main().
Код функции main()
def main(): path_img = input(‘n[+] Введите путь к картинкеn — Для выхода введите xn >>> ‘) if path_img == «x»: exit(0) if not os.path.exists(path_img): print(‘[+] Картинки не существует’) user_change = input(‘n[+] Выберите библиотеку для распознавания текста:n [1] Tesseract OCRn ‘ ‘[2] EasyOCRn [3] Выходn >>> ‘) if user_change == «1»: save_text(teseract_recognition(path_img), os.path.split(path_img)[1].split(«.»)[0]) elif user_change == ‘2’: save_text(easyocr_recognition(path_img), os.path.split(path_img)[1].split(«.»)[0]) elif user_change == «3»: exit(0) else: print(‘[+] Неопознанный ввод. Повторите все сначала’) main()
Для начала запрашиваем у пользователя путь к картинке с текстом. Проверяем, существует ли файл. Думаю, что надо было бы добавить еще проверку на расширение, но в данном контексте оно излишне. И дальше предоставляем пользователю выбор, с помощью какой из библиотек он желал бы распознать текст. После чего в зависимости от выбора запускается функция, отрабатывает и распознанный текст сохраняется в файл.
Полный код скрипта распознавания текста
# pip install easyocr # pip install pytesseract # pip install Pillow import os.path import easyocr import pytesseract from PIL import Image # путь к исполняемому файлу tesseract pytesseract.pytesseract.tesseract_cmd = r»C:Program FilesTesseract-OCRtesseract.exe» # распозавание с помощью pytesseract, открытие картинки PIL.Image def teseract_recognition(path_img): return pytesseract.image_to_string(Image.open(path_img), lang=’rus+eng’, config=r’—oem 3 —psm 6′) # распознавание с помощью easyocr, параметры: отключена детализация вывода, # включены параграфы и установлена точность текста def easyocr_recognition(path_img): return easyocr.Reader([«ru»]).readtext(path_img, detail=0, paragraph=True, text_threshold=0.8) # сохранение текста в текстовый файл def save_text(text, name): with open(f’.txt’, ‘w’, encoding=’utf-8′) as file: file.write(text) print(f'[+] Распознанный текст сохранен в файл: «.txt»‘) main() return # ввод данных и выбор библиотеки для распознавания def main(): path_img = input(‘n[+] Введите путь к картинкеn — Для выхода введите xn >>> ‘) if path_img == «x»: exit(0) if not os.path.exists(path_img): print(‘[+] Картинки не существует’) user_change = input(‘n[+] Выберите библиотеку для распознавания текста:n [1] Tesseract OCRn ‘ ‘[2] EasyOCRn [3] Выходn >>> ‘) if user_change == «1»: save_text(teseract_recognition(path_img), os.path.split(path_img)[1].split(«.»)[0]) elif user_change == ‘2’: save_text(easyocr_recognition(path_img), os.path.split(path_img)[1].split(«.»)[0]) elif user_change == «3»: exit(0) else: print(‘[+] Неопознанный ввод. Повторите все сначала’) main() if __name__ == «__main__»: main()
Впечатления и выводы
Были опробованы обе библиотеки на разных русских текстах. В сводном виде они ниже на скриншоте:
Источник: codeby.net