Генератор программы что это такое

ГЕНЕРАТОР ПРИКЛАДНЫХ ПРОГРАММ

Генератор прикладных программ — программная система, предназначенная для синтеза новых программ из унифицированных модулей и программ, разработанных пользователем.

[Грицык В.И., Космин В.В. Термины и понятия (словарь): Транспорт. Строительство. Экономика. Менеджмент.

Маркетинг. Системотехника. Информатика. — М.: УМК МПС России, 2000]

Смотреть что такое ГЕНЕРАТОР ПРИКЛАДНЫХ ПРОГРАММ в других словарях:

ГЕНЕРАТОР ПРИКЛАДНЫХ ПРОГРАММ

Генератор прикладных программ Генератор прикладных программ — программа: — входящая в состав системы управления базами данных; и — предназначенная д. смотреть

Источник: slovar-avt.slovaronline.com

№30 Генераторы / для начинающих

В этой статье вы научитесь создавать и использовать функции и выражения генераторов в Python. Также узнаете, зачем и когда их стоит использовать в программах. Будут рассмотрены основные отличия от итераторов и обычных функций.

Что такое инверторный генератор? Принцип работы и функции инверторного бензогенератора.

Отдельное внимание будет уделено инструкции yield . Она является частью генератора и заменяет ключевое слово return . Когда программа доходит до yield , то функция переходит в состояние ожидания и продолжает работу с того же места при повторном вызове.

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

Генератор предоставляет способ создания итераторов, решая следующую распространенную проблему.

Создание итератора в Python — достаточно громоздкая операция. Для этого нужно написать класс и реализовать методы __iter__() и __next__() . После этого требуется настроить внутренние состояния и вызывать исключение StopIteration , когда больше нечего возвращать.

Как создать генератор в Python?

Генератор — это альтернативный и более простой способ возвращать итераторы. Процедура создания не отличается от объявления обычной функции.

Есть два простых способа создания генераторов в Python.

Функция генератора

Генератор создается по принципу обычной функции.

Отличие заключается в том, что вместо return используется инструкция yield . Она уведомляет интерпретатор Python о том, что это генератор, и возвращает итератор.

Синтаксис функции генератора:

Источник: pythonru.com

Генераторы приложений в современных СУБД. Создание меню. Визуальное программирование. Средства документирования проекта.

Программа, которая может создать другую программу в соответствии с требованиями пользователя. Генераторы приложений имеют два основных преимущества: экономия времени и отсутствие требования обязательного наличия навыков программирования. Генераторы приложений имеют два основных недостатка. Во-первых, их возможности часто ограниченны.

Программа — генератор звуковых частот

Во-вторых, создаваемый ими код менее эффективен, чем код, разработанный хорошим программистом. Генераторы приложений часто используются при разработке голосовых программ. Одно из основных преимуществ генераторов приложений состоит в том, что они могут генерировать код на основе разработанных пользователем экранных форм и меню.

Форма или меню создается при помощи пользовательского интерфейса, работать с которым так же просто, как и с системой подготовки текстов. Затем генератор приложений переводит нарисованный пользователем экран в код программы на языке Си. Опытный программист может впоследствии оптимизировать полученный код.

На сегодняшний день известно более двух десятков серверных СУБД, однако наиболее популярными, исходя из числа продаж и инсталляций, следует признать Oracle, Microsoft SQL Server, Informix, Sybase, DB2.

Средства документирования

Для создания документации в процессе разработки ИС используются разнообразные средства формирования отчетов, а также компоненты издательских систем. Обычно средства документирования встроены в конкретные CASE-средства. Исключением являются некоторые пакеты, предоставляющие дополнительный сервис при документировании. Из них наиболее активно используется SoDA (Software Document Аutomation).

Продукт SoDA предназначен для автоматизации разработки проектной документации на всех фазах ЖЦ ПО. Он позволяет автоматически извлекать разнообразную информацию, получаемую на разных стадиях разработки проекта, и включать ее в выходные документы. При этом контролируется соответствие документации проекту, взаимосвязь документов, обеспечивается их своевременное обновление. Результирующая документация автоматически формируется из множества источников, число которых не ограничено.

SoDA не зависит от применяемых инструментальных средств. Связь с приложениями осуществляется через стандартный программный интерфейс API. Переход на новые инструментальные средства не влечет за собой дополнительных затрат по документированию проекта.

SoDA содержит набор шаблонов документов, определяемых стандартом на программное обеспечение DOD 2167A. На их основе можно без специального программирования создавать новые формы документов, определяемые пользователями.

Пакет включает в себя графический редактор для подготовки шаблонов документов. Он позволяет задавать необходимый стиль, фон, шрифт, определять расположение заголовков, резервировать места, где будет размещаться извлекаемая из разнообразных источников информация. Изменения автоматически вносятся только в те части документации, на которые они повлияли в программе. Это сокращает время подготовки документации за счет отказа от перегенерации всей документации

34. Технология доступа к БД из языков высокого уровня на примере VB или VBA. Технология DAO. Технология ADO. Подключение библиотек объектов доступа к данным.

DAO — механизм доступа к локальным базам данных, RDO — механизм доступа к удаленным базам данных. Они известны давно, но со временем (с развитием вычислительных систем) необходимость в создании единого механизма, который обеспечил бы единый подход при работе с БД различных классов увеличивалась. Результат — новая технология ADO, которая сегодня является частью архитектуры Microsoft Universal Data Access (MUDA).

Основой MUDA является OLE DB — низкоуровневый программный COM-интерфейс доступа к данным, который представляет собой развитие идеологии ODBC. Однако если ODBC предназначен для работы с реляционными базами данных (Access, DBF, SQL и др.), то OLE DB предлагает единообразный метод доступа к данным, хранящимся в разных источниках информации, в том числе и в нереляционных БД (например, в папках систем электронной почты или простых файлах), обеспечивая при этом поддержку работы с наборами данных и иерархическими наборами записей, неподключенными постоянно к сети.

Читайте также:
Что за программа аризона

Поставщиками таких данных (OLE DB Provider) могут быть любые источники (в том числе приложения), написанные в соответствии со спецификациями OLE DB. Так, доступ к базам данных ODBC выполняется с помощью OLE DB Provider for ODBC.

ADO представляет собой прикладной объектный интерфейс более высокого уровня, который упрощает доступ к средствам OLE DB разработчикам, использующим языки высокого уровня. В 1998 году Microsoft выпустила модернизированный вариант ADO 2.0, который был впервые включен в состав Visual Studio 6.0 и его автономных средств, в том числе VB 6.0.

ADO 2.0 представляет собой набор объектов. VB-разработчик может работать напрямую или с помощью специальных средств, включенных в пакет. В первую очередь это новые элементы управления, функционирующие на основе OLE DB: ADO Data (является примерным аналогом уже известных элементов управления Data и Remote Data), DataGrid (DBGrid), DataList (DBList) и DataCombo (DBCombo).

Кроме того, VB 6.0 включает два новых инструмента работы с базами данных на основе OLE DB: конструктор Data Environment для установления связи с базами данных и создания отчетов, а также окно Data View для просмотра баз данных. Следует также отметить, что VBпрограммист может создавать собственные поставщики данных OLE DB с помощью модуля классов.

Для использования ADO в VB-приложении нужно установить ссылку к библиотеке Microsoft ActiveX Data Objects Library 2.0 с помощью команды Project|References.

Очевидно, что доступ к данным является важнейшим требованием при разработке современных бизнес-приложений. Технология ODBC обеспечивает доступ к реляционным базам данных и это первый шаг на пути решения этой проблемы.

Однако, когда разработчики хотят включить в свои проекты нереляционные источники данных или работать в средах, подобных Интернет, они сталкиваются с дилеммой — либо разрабатывать собственные парадигмы доступа к данным, либо работать на уровне API, что несовместимо с новыми средами. ActiveX объекты доступа к данным (ADO) решают эту дилемму и обеспечивают единую модель, которая работает со всеми источниками данных в различных средах. Таким образом ADO обеспечивает последовательный, высокопроизводительный доступ к данным, с которыми вы можете создавать клиентские программы для работы с БД или бизнес-объекты среднего уровня, использующие приложения, инструментарий, язык или, даже, Интернет-браузер. ADO — это единый интерфейс доступа к данным, который вам необходим для создания одно- и многоуровневых приложений архитектуры клиент/сервер и Web-ориентированных информационных систем.

Технология ADO была впервые применена в Microsoft Internet Information Server как интерфейс доступа к БД. Использование ADO позволяет минимизировать сетевой трафик в ключевых Internet-сценариях и уменьшить количество промежуточных уровней между клиентским приложением и источником данных.

ADO легко использовать, так как он применяет привычную систему вызовов — интерфейс Автоматизации OLE, доступный сегодня в большинстве средств разработки приложений. Из-за легкости применения и изучения популярность ADO будет расти и в итоге ADO вытеснит технологии RDO и DAO, которые в настоящее время применяются очень широко. Технология ADO во многом подобна RDO и DAO, например, она использует те же соглашения языка. ADO также поддерживает аналогичную семантику и поэтому может быть легко освоена разработчиками ПО.

ADO является интерфейсом программного уровня к OLE DB, новейшей и мощнейшей (сильно сказано) парадигме доступа к данным от MS. OLE DB обеспечивает высокопроизводительный доступ ко многим источникам данных. ADO и OLE DB вместе представляют собой основу стратегии Универсального доступа к данным (Universal Data Access). OLE DB дает возможность универсального доступа ко многим данным и представляет разработчикам возможность сделать это достаточно легко. Так как ADO находится на вершине OLE DB, то применение ADO имеет все преимущества Универсального доступа к данным, которое обеспечивает OLE DB.

Источник: infopedia.su

Генераторы Python. Их создание и использование

Генераторы Python

Приходилось ли вам когда-либо работать с настолько большим набором данных, что он переполнял память вашего компьютера? Или быть может у вас была сложная функция, для которой нужно было бы сохранять внутреннее состояние при вызове? А если при этом функция была слишком маленькой, чтобы оправдать создание собственного класса? Во всех этих случаях вам придут на помощь генераторы Python и ключевое слово yield.

Прочитав эту статью, вы узнаете:

  • Что собой представляют генераторы Python и как их использовать
  • Как задавать функции и выражения создающие генераторы
  • Как работает в Python ключевое слово yield

Если вы являетесь Питонистом начального или среднего уровня и вы заинтересованы в том, чтобы научиться работать с большими наборами данных в питоновском стиле, то скорее всего это руководство для вас.

По ссылке ниже вы можете скачать копию файла с данными, используемыми в этом руководстве.

Использование Генераторов

Функции генераторов (их описание можно почитать в PEP 255) представляют собой особый вид функций, которые возвращают «ленивый итератор». И хотя содержимое этих объектов вы можете перебирать также как и списки, но при этом, в отличие от списков, ленивые итераторы не хранят свое содержимое в памяти. Чтобы составить общее представление об итераторах в Python взгляните на статью Python “for” Loops (Definite Iteration).

Теперь, когда вы имеете примерное представление о том, чем является генератор, у вас наверняка появилось желание увидеть как он работает. Давайте рассмотри два примера. В первом вы увидите общий принцип работы генераторов. В последующих у вас будет возможность изучить работу генераторов более подробно.

Читайте также:
Del что это за программа

Пример 1: Чтение больших файлов

Списки Python

Работа с потоками данных и большими файлами, такими например как CSV, являются наиболее распространенными вариантами использования генераторов. Давайте возьмем CSV файл (CSV является стандартным форматом для обмена данными, колонки в нем разделяются при помощи запятых). Предположим, что вы хотите посчитать количество имеющихся в нем рядов. Код ниже предлагает один из путей для, того, чтобы осуществить это:

csv_gen = csv_reader(«some_csv.txt») row_count = 0 for row in csv_gen: row_count += 1 print(f»Row count is «)

Глядя на этот пример, вы можете предположить что csv_gen является списком. Для того чтобы заполнить этот список, csv_reader() открывает файл и загружает его содержимое в csv_gen . Затем программа перебирает список, увеличивая значение row_count для каждого следующего ряда.

Это вполне приемлемое решение, но будет ли этот подход работать, если файл окажется слишком большим? А что если файл окажется больше чем вся доступная память, которая есть в нашем распоряжении? Для того чтобы ответить на этот вопрос, давайте предположим, что csv_reder() будет открывать файл и считывать его в массив.

def csv_reader(file_name): file = open(file_name) result = file.read().split(«n») return result

Эта функция открывает данный файл и использует file.read() вместе со .split() для того, чтобы добавить каждый ряд данных как отдельный элемент списка. Если бы вы использовали эту версию cvs_reader() в блоке кода с подсчетом (вы его увидите далее), тогда бы вы увидели следующее сообщение:

Traceback (most recent call last): File «ex1_naive.py», line 22, in main() File «ex1_naive.py», line 13, in main csv_gen = csv_reader(«file.txt») File «ex1_naive.py», line 6, in csv_reader result = file.read().split(«n») MemoryError

В этом случае open() возвращает объект генератора, который вы можете «лениво» (не обсчитывая заранее) перебирать ряд за рядом. Тем не менее, file.read().split() загружает все данные в память сразу, вызывая ошибку памяти (MemoryError).

До того как это произойдет, вы можете заметить, что ваш компьютер замедлился. Возможно вам потребуется даже вручную остановить программу. Но что нам делать, если мы хотим этого избежать?

Генераторы Python

Давайте взглянем на новое определение функции csv_reader() :

def csv_reader(file_name): for row in open(file_name, «r»): yield row

В этой версии вы открываете файл и проходите его содержимое, возвращая ряд за рядом. Этот код выводит следующий результат без каких-либо ошибок:

Row count is 64186394

Почему так получилось? Да потому что вы по сути превратили функцию csv_reader() в генератор. Эта версия кода открывает файл, проходит по строкам и извлекает для чтения лишь отдельный ряд, вместо того, чтобы возвращать весь файл целиком.

Также вы можете определить выражение создающее генератор, которое очень похоже по синтаксису на выражение создающее список. В таком виде вы можете использовать генератор без вызова функции:

csv_gen = (row for row in open(file_name))

Такой способ создания генератора csv_gen является более лаконичным.

Более подробно о yield мы расскажем позже, а пока запомните основные отличия между использованием ключевых слов yield и return:

  • Использование yield приведет к созданию генератора.
  • Использование return приведет к возврату только первой строки файла.

Пример 2: Создание бесконечной последовательности

Давайте теперь в качестве другого примера рассмотрим генератор бесконечной последовательности. В Python для того, чтобы получить конечную последовательность мы обычно вызываем функцию range() . Затем мы передаем ее значение как аргумент в функцию list() :

a = range(5) list(a) [0, 1, 2, 3, 4]

Создание же бесконечной последовательности стопроцентно потребует от нас использования генератора. Причина проста — ограниченность памяти нашего компьютера.

def infinite_sequence(): num = 0 while True: yield num num += 1

Этот блок кода не велик и хорошо смотрится. Сперва, мы задаем переменную num и создаем бесконечный цикл. Затем мы немедленно извлекаем num с помощью yield в ее исходном состоянии (это во многом повторяет то, что делает range()) . После этого мы увеличиваем num на 1.

Если вы попробуете запустить этот код в теле цикла for, то увидите, что на самом деле он бесконечный:

for i in infinite_sequence(): print(i, end=» «) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [. ] 6157818 6157819 6157820 6157821 6157822 6157823 6157824 6157825 6157826 6157827 6157828 6157829 6157830 6157831 6157832 6157833 6157834 6157835 6157836 6157837 6157838 6157839 6157840 6157841 6157842 KeyboardInterrupt Traceback (most recent call last): File «», line 2, in

Эта программа будет исполняться, до тех пор, пока вы ее вручную не остановите.

Вместо использования Loop, вы также можете использовать на генераторе функцию next() . Это окажется особенно удобным при тестировании работы генератора в консоли:

gen = infinite_sequence() next(gen) 0 next(gen) 1 next(gen) 2 next(gen) 3

Здесь у нас показан генератор, под названием gen , который мы можем вручную перебирать с помощью вызова функции next() . Это работает как отличная проверка. Она позволяет нам убедиться что генератор выдает результат, который мы от него ожидаем.

Примечание: Когда мы используем next() , Python вызывает метод .__next__() , для функции, которая передается в качестве аргумента. При этом существуют специальные возможности, но разговор о них находится за рамками данной статьи. Если вам интересно, попробуйте поменять аргументы, которые передаются в next() и посмотрите на результат.

Пример 3: Нахождение палиндромов

Вы можете использовать бесконечные последовательности множеством различных способов. Одним из них, который мы отметим особенно, является создание детектора палиндромов. Детектор палиндромов выявляет все последовательности букв и цифр, которые являются палиндромами. Это слова или числа, которые читаются одинаково вперед и назад, как «121» например. Сперва давайте зададим наш числовой детектор палиндромов:

def is_palindrome(num): # Skip single-digit inputs if num // 10 == 0: return False temp = num reversed_num = 0 while temp != 0: reversed_num = (reversed_num * 10) + (temp % 10) temp = temp // 10 if num == reversed_num: return num else: return False

Читайте также:
Sound forge pro что это за программа и нужна ли она

Не особо беспокойтесь о понимании вычислений, лежащих в основе данного кода. Просто заметьте, что функция принимает введенное число, переворачивает его, и сравнивает с оригиналом. Теперь вы можете использовать генератор бесконечной последовательности для получения бегущего списка со всеми числовыми палиндромами:

for i in infinite_sequence(): pal = is_palindrome(i) if pal: print(pal) 11 22 33 [. ] 99799 99899 99999 100001 101101 102201 KeyboardInterrupt Traceback (most recent call last): File «», line 2, in File «», line 5, in is_palindrome

В консоли выводятся только те номера, которые читаются одинаково и вперед и назад.

Примечание: на практике вам вряд ли придется писать свой собственный бесконечный генератор последовательностей, по той простой причине, что есть уже очень эффективный генератор itertools.count() из модуля itertools.

Теперь, когда вы познакомились с простым примером использования генератора бесконечной последовательности, давайте рассмотрим более детально работу этого генератора.

Понимание работы генератора Python

К этому моменту вы уже познакомились с двумя основными способами создания генераторов: с помощью функции и с помощью выражения. У вас также должно было сформироваться интуитивное представление о том, как работает генератор. Давайте теперь уделим некоторое время тому, чтобы сделать наши знания более четкими.

Функции генераторов выглядят и действуют как обычные функции, но с одной определяющей особенностью. А именно, функция генератора используют ключевое слово yield вместо return . Давайте вспомним функцию генератора, которую мы написали ранее:

def infinite_sequence(): num = 0 while True: yield num num += 1

Это похоже на типичное определение функции, за исключением yield и кода, который следует за ним. Ключевое слово yield применяется там, где значение нужно отправить обратно вызывающей стороне. Но в отличие от return , выхода из функции в данном случае не происходит. Вместо этого, при возврате состояние функции запоминается.

Более того, когда next() вызывается для объекта-генератора (явно или неявно в цикле for), ранее полученная переменная num увеличивается, а затем возвращается снова. Поскольку функции генератора похожи на другие функции и действуют подобным образом, вы можете предположить, что выражения создающие генераторы очень похожи на другие выражениях в Python создающие объекты.

Примечание. Если вы хотите больше узнать о генераторах списков, множеств и словарей в Python, можете прочитать статью Эффективное использование генераторов списков (англ).

Создание генератора с помощью выражения

Как и выражения создающие списки, выражения создающие генераторы позволяют быстро получить объект генератора с помощью всего одной строчки кода. Использоваться они могут в тех же случаях, что и выражения создающие списки, но при этом у них есть одно дополнительное преимущество. Их можно создавать не удерживая весь объект в памяти перед итерацией. Если перефразировать, вы не будете расходовать память при использовании генератора.

Давайте для примера возьмем возведение в квадрат некоторых чисел:

nums_squared_lc = [num**2 for num in range(5)] nums_squared_gc = (num**2 for num in range(5))
nums_squared_lc [0, 1, 4, 9, 16] nums_squared_gc at 0x107fbbc78>

Это подтверждает тот факт, что с помощью круглых скобок вы создали объект генератора, а также то, что он отличается от списка.

Профилирование эффективности генератора

Ранее мы узнали, что использование генераторов является отличным способом оптимизации памяти. И хотя генератор бесконечной последовательности является наиболее ярким примером этой оптимизации, давайте рассмотрим еще один пример с возведением числа в квадрат и проверим размер полученных объектов.

Вы можете сделать это с помощью вызова функции sys.getsizeof () :

import sys nums_squared_lc = [i * 2 for i in range(10000)] sys.getsizeof(nums_squared_lc) 87624 nums_squared_gc = (i ** 2 for i in range(10000)) print(sys.getsizeof(nums_squared_gc)) 120

В этом случае размер списка, полученного с помощью выражения составляет 87 624 байта, а размер генератора — только 120. То есть, список занимает памяти в 700 раз больше, чем генератор! Однако нужно помнить одну вещь.

Если размер списка меньше доступной памяти на работающей машине, тогда обработка его будет занимать меньше времени, чем аналогичная обработка генератора. Чтобы удостовериться в этом, давайте просуммируем результаты приведенных выше выражений. Вы можете использовать для анализа функцию cProfile.run () :

import cProfile cProfile.run(‘sum([i * 2 for i in range(10000)])’) 5 function calls in 0.001 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.001 0.001 0.001 0.001 :1() 1 0.000 0.000 0.001 0.001 :1() 1 0.000 0.000 0.001 0.001 1 0.000 0.000 0.000 0.000 1 0.000 0.000 0.000 0.000 cProfile.run(‘sum((i * 2 for i in range(10000)))’) 10005 function calls in 0.003 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 10001 0.002 0.000 0.002 0.000 :1() 1 0.000 0.000 0.003 0.003 :1() 1 0.000 0.000 0.003 0.003 1 0.001 0.001 0.003 0.003 1 0.000 0.000 0.000 0.000

Здесь вы можете видеть, что суммирование всех значений, содержащихся в списке заняло около трети времени аналогичного суммирования с помощью генератора. Поэтому если скорость является для вас проблемой, а память — нет, то список, возможно, окажется лучшим инструментом для работы.

Примечание. Эти измерения действительны не только для генераторов, созданных с помощью выражений. Они абсолютно идентичны и для генераторов, созданных с помощью функции. Ведь, как мы уже говорили выше, эти генераторы эквивалентны.

Запомните, что выражения создающие списки возвращают списки, в то время как выражения генераторов возвращают генераторы. Генераторы работают одинаково, независимо от того, построены они на основе функции или выражения. Использование выражения позволяет вам задать простые генераторы одной строкой и также предполагает yield в конце каждой итерации. Ключевое слово yield , безусловно, является основой, на которой основывается вся функциональность генераторов. В следующих статьях мы углубимся в его работу.

Источник: pythonist.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru