В чем разница между декларативным и императивным программированием? [закрыто]

import re

def get_pattern_query(pattern,starting_with=False,ending_with=False,ignore_case=False):
    start = '^' if starting_with else '.*'
    end = '$' if ending_with else '.*'
    pattern = start + re.escape(pattern) + end
    return re.compile(pattern, re.IGNORECASE) if ignore_case else re.compile(pattern)

Выключение шаблона перед компиляцией обрабатывает все символы.

468
задан nbro 7 September 2018 в 17:34
поделиться

5 ответов

Да, определенно найдите время, чтобы выучить хотя бы немного «vi» и «vim». Он очень хорошо переносится.

Вы никогда не застрянете, когда столкнетесь с клиентской системой Unix / Linux / Mac, для которой у вас нет возможностей установки. Даже в Windows (если у вас есть возможности установки) Vim бесплатен и прост в установке. (В отличие от инвестирования в обучение исключительно во что-то вроде UltraEdit, который, хотя отличный редактор может быть недоступен для вас все время ...).

Изучение vi может настроить вас на изучение других инструментов, таких как 'sed' , и регулярное выражение в целом: вещи, которые обычно можно передавать.

Кроме того, если вы хотите быть настоящим компьютерщиком, вам просто нужно знать 'vi / m', иначе вы будете выглядеть фальшивым; -)

Пройдите по коллекции. Отметьте этот элемент, если он нечетный, добавьте его в коллекцию результатов ".

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

732
ответ дан 22 November 2019 в 22:39
поделиться

Императивное программирование явно сообщает компьютеру, что и как делать, например, указание порядка и т. Д.

C #:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

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

C # - гораздо более императивный язык программирования, но некоторые функции C # более декларативны, например Linq

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

То же самое можно было бы написать императивно:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(пример из википедии Linq)

10
ответ дан 22 November 2019 в 22:39
поделиться

В информатике декларативное программирование - это парадигма программирования, которая выражает логику вычисления без описания его потока управления.

Из http://en.wikipedia.org/ wiki / Declarative_programming

в двух словах, декларативный язык проще, потому что ему не хватает сложности потока управления (циклы, операторы if и т. д.)

Хорошим сравнением является модель «кода программной части» ASP.Net. У вас есть декларативные файлы «.ASPX», а затем - обязательные файлы кода «ASPX.CS». Я часто обнаруживаю, что если я могу сделать все, что мне нужно в декларативной половине сценария, гораздо больше людей смогут следить за тем, что делается.

8
ответ дан 22 November 2019 в 22:39
поделиться

Я добавлю еще один пример, который редко всплывает при обсуждении декларативного / императивного программирования: пользовательский интерфейс!

В C # вы можете создавать пользовательский интерфейс, используя различные технологии.

Вкл. в императивном конце вы можете использовать DirectX или OpenGL, чтобы в обязательном порядке рисовать ваши кнопки, флажки и т. д. построчно (или действительно, треугольник за треугольником). Вам решать, как рисовать пользовательский интерфейс.

С декларативной стороны у вас есть WPF. Вы в основном пишете XML (да, да, технически "XAML"), и фреймворк делает всю работу за вас. Вы говорите, как выглядит пользовательский интерфейс. Система должна выяснить, как это сделать.

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

42
ответ дан 22 November 2019 в 22:39
поделиться

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

A простой пример на Python:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

Первый пример является декларативным, потому что мы не указываем никаких «деталей реализации» построения списка.

Чтобы связать пример C #, как правило, использование LINQ приводит к декларативному стилю, потому что вы не говорят , как получить то, что вы хотите; вы только говорите то, вы хотите. То же самое можно сказать и о SQL.

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

SELECT score FROM games WHERE id < 100;

, "компилятор" SQL может "оптимизировать" этот запрос, потому что он знает, что id является индексированным полем - или, возможно, оно не индексируется, и в этом случае ему все равно придется перебирать весь набор данных. Или, может быть, механизм SQL знает, что сейчас идеальное время для использования всех 8 ядер для быстрого параллельного поиска. Вы , как программист, не интересуетесь ни одним из этих условий, и вам не нужно писать код, чтобы обрабатывать таким образом какой-либо особый случай.

135
ответ дан 22 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: