Учебное руководство для Python - я должен использовать 2.x или 3.0? [закрытый]

1126] Должен признать, что template все еще кажутся мне чёрной магией. Я успешно использовал специализации шаблона в различных ситуациях (если у меня не было лучшей идеи), но никогда не использовал аргументы шаблона. Итак, я попытался ...

Когда я попробовал coliru (компилятор g++ (GCC) 8.1.0), я начал с -std=c++11 и вскоре получил несколько ужасных ошибок. К счастью, был также совет перейти к -std=c++17. Я сделал, и вещи становятся намного лучше сразу. Я грубо вспомнил, что аргументы шаблона не очень хорошо поддерживаются в C ++ 11. Короткий взгляд на cppreference подтвердил мою правоту:

Параметр шаблона шаблона

template < список параметров> имя типа (C ++ 17) | имя класса (необязательно) (1)
шаблон < список параметров> имя типа (C ++ 17) | имя класса (необязательно) = default (2)
шаблон < список параметров> имя типа (C ++ 17) | class ... name (необязательно) (3) (начиная с C ++ 11)

1) Параметр шаблона шаблона с необязательным именем.
2) Параметр шаблона шаблона с необязательным именем и значением по умолчанию.
3) Пакет параметров шаблона шаблона с необязательным именем.

blockquote>

После разъяснения я взял часть кода кода OPs и добавил частичную специализацию для template, где я

  • оставил первый параметр
  • специализированный. второй параметр с std::stack.

На самом деле, это не сильно отличается от того, как специализируются шаблоны с аргументами типа или значения.

cppreference есть статья для этой частичной специализации шаблона , но при использовании этого термина в качестве ключевого слова для поиска должно быть много обращений к книгам и учебным пособиям. (Я помню книгу, в которой я когда-то учил шаблоны C ++, упомянул об этом также - конечно.)

Итак, вот мой небольшой пример, чтобы продемонстрировать это:

#include 
#include 
#include 

template typename U>
class ContainerT {
  private:
    U _container;
  public:
    ContainerT(): _container() { }
    ~ContainerT() = default;
    ContainerT(const ContainerT&) = default;
    ContainerT& operator=(const ContainerT&) = default;

    bool empty() const { return _container.empty(); }
    void push(const T &data) { _container.push_back(data); }
    T pop()
    {
      const T data = _container.back();
      _container.pop_back();
      return data;
    }
};

template
class ContainerT {
  private:
    std::stack _container;
  public:
    ContainerT(): _container() { }
    ~ContainerT() = default;
    ContainerT(const ContainerT&) = default;
    ContainerT& operator=(const ContainerT&) = default;

    bool empty() const { return _container.empty(); }
    void push(const T &data) { _container.push(data); }
    T pop()
    {
      const T data = _container.top();
      _container.pop();
      return data;
    }
};

#define DEBUG(...) std::cout << #__VA_ARGS__ << ";\n"; __VA_ARGS__ 

int main()
{
  // for std::vector
  DEBUG(ContainerT vec);
  DEBUG(vec.push(1); vec.push(2); vec.push(3));
  DEBUG(while (!vec.empty()) std::cout << vec.pop() << '\n');
  // for std::stack
  DEBUG(ContainerT stk);
  DEBUG(stk.push(1); stk.push(2); stk.push(3));
  DEBUG(while (!stk.empty()) std::cout << stk.pop() << '\n');
  // done
  return 0;
}

Очевидно, что [1110 ] создан для ContainerT. В противном случае метод push() не может быть скомпилирован.

Для ContainerT вместо этого используется специализация. (Опять же, в противном случае метод push() не может быть скомпилирован.)

Вывод:

ContainerT vec;
vec.push(1); vec.push(2); vec.push(3);
while (!vec.empty()) std::cout << vec.pop() << '\n';
3
2
1
ContainerT stk;
stk.push(1); stk.push(2); stk.push(3);
while (!stk.empty()) std::cout << stk.pop() << '\n';
3
2
1

Live Demo на колиру kbd>

8
задан Brad Gilbert 16 October 2008 в 23:35
поделиться

6 ответов

Запустите с 2.x. Большинство существующих библиотек будет идти 2.x в течение долгого времени. В прошлом году сам Guido сказал, что это будут "два года", пока Вы не должны были учиться 3.0; существует все еще другой оставленный год. Лично, я думаю, что это будет длиннее. Написание кода людей на 2.x может изучить, как использовать 2to3 инструмент и имеет код, который работает над обеими версиями. Существует № 3to2, таким образом, код, написанный для python 3, значительно менее ценен.

Это не говоря уже о том, насколько неутешительный это будет для Ваших студентов, чтобы узнать, что python 3 не установлен на их компьютере Linux ("/usr/bin/python"будет Python 2.x в течение следующих 5 лет, по крайней мере), что нет никакого django для python 3, никакого wxwindows для python 3, никакого GTK для python 3, нет Скрученного для python 3, никакого PIL для python 3... реальная сила Python всегда была в ее обширном наборе библиотек, и существует очень немного библиотек для python 3 прямо сейчас.

Если Ваше учебное руководство правильно написано, необходимо легко смочь обновить его к python 2.6, 2.7, и в конечном счете python 3.

14
ответ дан 5 December 2019 в 05:46
поделиться

Van Rossum (создатель Python) объясняет, что, "при запуске совершенно новой вещи необходимо использовать 3.0". Таким образом, большинство людей, надеющихся начинать, должно даже ЗАПУСТИТЬ с 3,0. Это будет полезно тем более, что существуют, вероятно, очень немногие там теперь.

статья

11
ответ дан 5 December 2019 в 05:46
поделиться

Изучите Python 3.0, как заразный предполагает.

Python 2.x не очень отличается, кажется, существует много FUD о довольно незначительных различиях между ними. Несомненно, различия являются достаточно большими, что большинство программ должно будет быть изменено, но почти все модификации просты (как изменение print оператор к print функция).

На самом деле Python 2.6 может дополнительно активировать все новые синтаксические опции Python 3.0. Это - очень хорошо продуманный процесс перехода.

2
ответ дан 5 December 2019 в 05:46
поделиться

Это зависит от Вашей аудитории. Если бы это - широкая аудитория, и Вы планируете оставить отправляемым в течение долгого времени, я предложил бы ожидать и идти с 3,0. С другой стороны, если это для проекта или группы, это будет выполнением работы в ближайшем будущем, Python 2, вероятно, имеют больше смысла.

0
ответ дан 5 December 2019 в 05:46
поделиться

Различия являются достаточно небольшими, что это действительно не будет иметь значение очень.

0
ответ дан 5 December 2019 в 05:46
поделиться

Python 2.x отсутствовал достаточно долго уже для создания довольно многих учебных руководств, но 3k имеет намного меньше доступных ресурсов. Некоторый вводный материал уровня 3k, вероятно, видел бы использование более общего назначения. Таким образом, если Вы не адаптируете это в соответствии с определенным sub доменом, который испытывает недостаток в любых ресурсах Python, 3k имел бы большее применение.

2
ответ дан 5 December 2019 в 05:46
поделиться
Другие вопросы по тегам:

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