Python

Поделись знанием:
Перейти к: навигация, поиск
Python
Класс языка:

мультипарадигмальный:
объектно-ориентированный,
рефлективный,
императивный,
функциональный,
аспектно-ориентированный,
динамический

Тип исполнения:

интерпретируемый, компилируемый в MSIL, компилируемый в байт-код Java

Расширение файлов:

.py, .pyw, .pyc, .pyo, .pyd[1]

Система типов:

сильная, динамическая

Основные реализации:

CPython, Jython, IronPython, PyPy, Stackless

Испытал влияние:

ABC, Modula-3, Lisp, Tcl, Smalltalk, C, Java, Icon

Повлиял на:

Ruby, Boo, Groovy, ECMAScript, CoffeeScript, Swift, Nim

Python[2] (МФА: [ˈpʌɪθ(ə)n]; в русском языке распространено название пито́н[3]) — высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.

Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Python организовывается в функции и классы, которые могут объединяться в модули (они в свою очередь могут быть объединены в пакеты).

Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ[4]. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные[5]. Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компиляции), LLVM и других. Проект PyPy предлагает реализацию Python на самом Python, что уменьшает затраты на изменения языка и постановку экспериментов над новыми возможностями.

Python — активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют стандарт ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.





Содержание

Философия

Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python» («Дзен Питона», или «Дзен Пайтона»)[6]. Её текст выдаётся интерпретатором Python по команде import this (работает один раз за сессию). Автором этой философии считается Тим Петерс (Tim Peters).

Текст философии:

  • Красивое лучше, чем уродливое.
  • Явное лучше, чем неявное.
  • Простое лучше, чем сложное.
  • Сложное лучше, чем запутанное.
  • Плоское лучше, чем вложенное.
  • Разреженное лучше, чем плотное.
  • Читаемость имеет значение.
  • Особые случаи не настолько особые, чтобы нарушать правила.
  • При этом практичность важнее безупречности.
  • Ошибки никогда не должны замалчиваться.
  • Если не замалчиваются явно.
  • Встретив двусмысленность, отбрось искушение угадать.
  • Должен существовать один — и, желательно, только один — очевидный способ сделать это.
  • Хотя он поначалу может быть и не очевиден, если вы не голландец[7].
  • Сейчас лучше, чем никогда.
  • Хотя никогда зачастую лучше, чем прямо сейчас.
  • Если реализацию сложно объяснить — идея плоха.
  • Если реализацию легко объяснить — идея, возможно, хороша.
  • Пространства имён — отличная штука! Будем делать их побольше!

История

Разработка языка Python была начата в конце 1980-х годов[8] сотрудником голландского института CWI Гвидо ван Россумом. Для распределённой ОС Amoeba требовался расширяемый скриптовый язык, и Гвидо начал писать Python на досуге, позаимствовав некоторые наработки для языка ABC (Гвидо участвовал в разработке этого языка, ориентированного на обучение программированию). В феврале 1991 года Гвидо опубликовал исходный текст в группе новостей alt.sources[9]. С самого начала Python проектировался как объектно-ориентированный язык.

Название языка произошло вовсе не от вида пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона». Впрочем, всё равно название языка чаще связывают именно со змеёй, нежели с передачей — пиктограммы файлов в KDE или в Microsoft Windows и даже эмблема на сайте python.org (до выхода версии 2.5) изображают змеиные головы. Важная цель разработчиков Python - создавать его забавным для использования. Это отражено в его названии, которое пришло из Монти Пайтона,[10]. Также это отражено в иногда игривом подходе к обучающим программам и справочным материалам, таким как примеры использования, которые используют понятия спама[11] и яиц[12] вместо стандартных foo и bar.[13][14]

Наличие дружелюбного, отзывчивого сообщества пользователей считается наряду с дизайнерской интуицией Гвидо одним из факторов успеха Python. Развитие языка происходит согласно чётко регламентированному процессу создания, обсуждения, отбора и реализации документов PEP (англ. Python Enhancement Proposal) — предложений по развитию Python[15].

3 декабря 2008 года[16], после длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python. На сегодня поддерживаются обе ветви развития (Python 3.x и 2.x).

Влияние других языков на Python

Появившись сравнительно поздно, Python создавался под влиянием множества языков программирования:

  • ABC — отступы для группировки операторов, высокоуровневые структуры данных (map)[17][18] (Python фактически создавался как попытка исправить ошибки, допущенные при проектировании ABC);
  • Modula-3 — пакеты, модули, использование else совместно с try и except, именованные аргументы функций (на это также повлиял Common Lisp);
  • С, C++ — некоторые синтаксические конструкции (как пишет сам Гвидо ван Россум — он использовал наиболее непротиворечивые конструкции из С, чтобы не вызвать неприязнь у С-программистов к Python[17]);
  • Smalltalk — объектно-ориентированное программирование;
  • Lisp — отдельные черты функционального программирования (lambda, map, reduce, filter и другие);
  • Fortran — срезы массивов, комплексная арифметика;
  • Miranda — списочные выражения;
  • Java — модули logging, unittest, threading (часть возможностей оригинального модуля не реализована), xml.sax стандартной библиотеки, совместное использование finally и except при обработке исключений, использование @ для декораторов;
  • Icon — генераторы.

Большая часть других возможностей Python (например, байт-компиляция исходного кода) также была реализована ранее в других языках.

Портируемость

Python портирован и работает почти на всех известных платформах — от КПК до мейнфреймов. Существуют порты под Microsoft Windows, практически все варианты UNIX (включая FreeBSD и Linux), Plan 9, Mac OS и Mac OS X, iPhone OS 2.0 и выше, Palm OS, OS/2, Amiga, HaikuOS, AS/400 и даже OS/390, Windows Mobile, Symbian и Android[19].

По мере устаревания платформы её поддержка в основной ветви языка прекращается. Например, с серии 2.6 прекращена поддержка Windows 95, Windows 98 и Windows ME[20]. Однако на этих платформах можно использовать предыдущие версии Python — на данный момент сообщество активно поддерживает версии Python начиная от 2.3 (для них выходят исправления).

При этом, в отличие от многих портируемых систем, для всех основных платформ Python имеет поддержку характерных для данной платформы технологий (например, Microsoft COM/DCOM). Более того, существует специальная версия Python для виртуальной машины Java — Jython, что позволяет интерпретатору выполняться на любой системе, поддерживающей Java, при этом классы Java могут непосредственно использоваться из Python и даже быть написанными на Python. Также несколько проектов обеспечивают интеграцию с платформой Microsoft .NET, основные из которых — IronPython и Python.Net.

Типы и структуры данных

Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» лучше говорить о «связывании значения с некоторым именем». В Python имеются встроенные типы: булевый, строка, Unicode-строка, целое число произвольной точности, число с плавающей запятой, комплексное число и некоторые другие. Из коллекций в Python встроены: список, кортеж (неизменяемый список), словарь, множество и другие[21]. Все значения являются объектами, в том числе функции, методы, модули, классы.

Добавить новый тип можно либо написав класс (class), либо определив новый тип в модуле расширения (например, написанном на языке C). Система классов поддерживает наследование (одиночное и множественное) и метапрограммирование. Возможно наследование от большинства встроенных типов и типов расширений.

Все объекты делятся на ссылочные и атомарные. К атомарным относятся int, long (в версии 3 любое число int, так как в версии 3 нет ограничения на размер), complex и некоторые другие. При присваивании атомарных объектов копируется их значение, в то время как для ссылочных копируется только указатель на объект, таким образом, обе переменные после присваивания используют одно и то же значение. Ссылочные объекты бывают изменяемые и неизменяемые. Например, строки и кортежи являются неизменяемыми, а списки, словари и многие другие объекты — изменяемыми. Кортеж в Python является, по сути, неизменяемым списком. Во многих случаях кортежи работают быстрее списков[22], поэтому если вы не планируете изменять последовательность, то лучше использовать именно их.

Синтаксис и семантика

Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Python программ легко читаем. При передаче аргументов в функции Python использует вызов по соиспользованию (call-by-sharing)[23].

Операторы

Набор операторов достаточно традиционен.

  • Условный оператор if (если). Альтернативный блок после else (иначе). Если условий и альтернатив несколько, можно использовать elif (сокр. от else if).
  • Операторы цикла while (пока) и for (для). Внутри цикла возможно применение break и continue для прерывания цикла и перехода сразу к следующей итерации, соответственно.
  • Оператор определения класса class.
  • Оператор определения функции, метода или генератора def. Внутри возможно применение return (возврат) для возврата из функции или метода, а в случае генератора — yield (давать).
  • Оператор обработки исключений try — except — else или try — finally (начиная с версии 2.5, можно использовать finally, except и else в одном блоке).
  • Оператор pass ничего не делает. Используется для пустых блоков кода.

Одной из интересных синтаксических особенностей языка является выделение блоков кода с помощью отступов (пробелов или табуляций), поэтому в Python отсутствуют операторные скобки begin/end, как в языке Паскаль, или фигурные скобки, как в Си. Такой «трюк» позволяет сократить количество строк и символов в программе и приучает к «хорошему» стилю программирования. С другой стороны, поведение и даже корректность программы может зависеть от начальных пробелов в тексте. Некоторым такое поведение может показаться неинтуитивным и неудобным.

Выражения

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

Отдельно стоит упомянуть операцию форматирования для строк (работает по аналогии с printf() из Си), которая использует тот же символ, что и взятие остатка от деления:

>>> print ("Здравствуй, %s!" % "Мир")
Здравствуй, Мир!

Python имеет удобные цепочечные сравнения. Такие условия в программах — не редкость:

1 <= a < 10 and 1 <= b < 20

Кроме того, логические операции (or и and) являются ленивыми: если для вычисления значения операции достаточно первого операнда, этот операнд и является результатом, в противном случае вычисляется второй операнд логической операции. Это основывается на свойствах алгебры логики: например, если один аргумент операции «ИЛИ» (or) является истиной, то и результат этой операции всегда является истиной. В случае, если второй операнд является сложным выражением, это позволяет сократить издержки на его вычисление. Этот факт широко использовался до версии 2.5 вместо условной конструкции:

a < b and "меньше" or "больше или равно"

Встроенные типы данных, как правило, имеют особый синтаксис для своих литералов (записанных в исходном коде констант):

# для версии меньше 3
"строка"
'строка'
"""тоже строка"""
u"Юникод-строка"
True or False  # булевы литералы
3.14  # число с плавающей запятой
0o12 + 0xA  # числа в восьмеричной и шестнадцатеричной системах счисления
1 + 2j  # комплексное число
[1, 2, "a"]  # список
(1, 2, "a")  # кортеж
{'a': 1, 'b': 'B'}  # словарь
{'a', 6, 8.8}  # множество
lambda x: x**2  # анонимная функция

# для версии 3
"строка и Юникод-строка одновременно"
'строка и Юникод-строка одновременно'
"""тоже строка и Юникод-строка одновременно"""
True or False  # булевы литералы
3.14  # число с плавающей запятой
0b1010 + 0o12 + 0xA  # числа в двоичной, восьмеричной и шестнадцатеричной системах счисления
1 + 2j  # комплексное число
[1, 2, "a"]  # список
(1, 2, "a")  # кортеж
{'a': 1, 'b': 'B'}  # словарь
{'a', 6, 8.8}  # множество
lambda x: x**2  # анонимная функция

Для списков (и других последовательностей) Python предлагает набор операций над срезами. Особенностью является индексация, которая может показаться новичку странной, но раскрывает свою согласованность по мере использования. Индексы элементов списка начинаются с нуля. Запись среза s[N:M] означает, что в срез попадают все элементы от N включительно до M не включая. В качестве иллюстрации можно посмотреть пример работы с последовательностями.

Имена

Имя (идентификатор) может начинаться с латинской буквы (В Python 3 — буквы любого алфавита в Юникоде, например кириллицы) любого регистра или подчёркивания, после чего в имени можно использовать и цифры. В качестве имени нельзя использовать ключевые слова (их список можно узнать по import keyword; print keyword.kwlist, для версии 3 import keyword; print(keyword.kwlist)) и нежелательно переопределять встроенные имена. Имена, начинающиеся с символа подчёркивания, имеют специальное значение[24].

В каждой точке программы интерпретатор имеет доступ к трём пространствам имён (то есть отображениям имён в объекты): локальному, глобальному и встроенному.

Области видимости имён могут быть вложенными друг в друга (внутри определяемой функции видны имена из окружающего блока кода). На практике с областями видимости и связыванием имён связано несколько правил «хорошего тона», о которых можно подробнее узнать из документации.

Строки документации

Python предлагает механизм документирования кода pydoc. В начало каждого модуля, класса, функции вставляется строка документации — docstring (англ.). Строки документации остаются в коде на момент времени исполнения, и в язык встроен доступ к документации[25](переменная __doc__), что используется современными IDE (например, Eclipse).

В интерактивном режиме можно получить помощь, сгенерировать гипертекстовую документацию по целому модулю или даже применить doctest (англ.) для автоматического тестирования модуля.

Директивы

Начиная с Python 2.3, для использования в тексте программы символов, не входящих в ASCII, необходимо явно указывать кодировку исходного кода в начале модуля, например:

# -*- coding: utf-8 -*-
# или
# coding: utf-8

После этого можно использовать, например, кириллицу в Unicode-литералах. Но на самом деле, даже если вы напишете:

# coding: utf

То Python «поймёт», что вы хотели сделать.

Возможности

Интерактивный режим

Подобно Лиспу и Прологу в режиме отладки, интерпретатор Python имеет интерактивный режим работы, при котором введённые с клавиатуры операторы сразу же выполняются, а результат выводится на экран (REPL). Этот режим интересен не только новичкам, но и опытным программистам, которые могут протестировать в интерактивном режиме любой участок кода, прежде чем использовать его в основной программе, или просто использовать как калькулятор с большим набором функций.

Так выглядит общение с Python в интерактивном режиме:

>>> 2 ** 100 # возведение 2 в степень 100
1267650600228229401496703205376L
>>> from math import * # импорт математических функций
>>> sin(pi * 0.5) # вычисление синуса от половины пи 
1.0
>>> help(sorted) # помощь по функции sorted
Help on built-in function sorted in module __builtin__:
sorted(...)
   sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

В интерактивном режиме доступен отладчик pdb и система помощи (вызывается по help()). Система помощи работает для модулей, классов и функций, только если те были снабжены строками документации.

Кроме встроенной, существуют и улучшенные интерактивные оболочки IPython[26] и bpython[27].

Объектно-ориентированное программирование

Дизайн языка Python построен вокруг объектно-ориентированной модели программирования. Реализация ООП в Python является элегантной, мощной и хорошо продуманной, но вместе с тем достаточно специфической по сравнению с другими объектно-ориентированными языками.

Возможности и особенности.

  1. Классы являются одновременно объектами со всеми ниже приведёнными возможностями.
  2. Наследование, в том числе множественное.
  3. Полиморфизм (все функции виртуальные).
  4. Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.
  5. Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
  6. Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).
  7. Свойства (имитация поля с помощью функций).
  8. Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
  9. Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …)
  10. Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
  11. Полная интроспекция.
  12. Классовые и статические методы, классовые поля.
  13. Классы, вложенные в функции и классы.

Функциональное программирование

Python поддерживает парадигму функционального программирования, в частности:

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

Модули и пакеты

Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модули могут располагаться как в каталогах, так и в ZIP-архивах. Модули могут быть двух типов по своему происхождению: модули, написанные на «чистом» Python, и модули расширения (extension modules), написанные на других языках программирования. Например, в стандартной библиотеке есть «чистый» модуль pickle и его аналог на Си: cPickle. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload().

Интроспекция

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

Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках и фреймворках Python, таких как PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.

Обработка исключений

Обработка исключений поддерживается в Python посредством операторов try, except, else, finally, raise, образующих блок обработки исключения. В общем случае блок выглядит следующим образом:

try:
    # Здесь код, который может вызвать исключение
    raise Exception("message")  # Exception, это один из стандартных типов исключения (всего лишь класс),
                                # может использоваться любой другой, в том числе свой
except (Тип исключения1, Тип исключения2, …) as Переменная:
    # Код в блоке выполняется, если тип исключения совпадает с одним из типов
    # (Тип исключения1, Тип исключения2, …) или является наследником одного
    # из этих типов.
    # Полученное исключение доступно в необязательной Переменной.
except (Тип исключения3, Тип исключения4, …) as Переменная:
    # Количество блоков except не ограничено
    raise  # Сгенерировать исключение "поверх" полученного; без параметров - повторно сгенерировать полученное
except:
    # Будет выполнено при любом исключении, не обработанном типизированными блоками except
else:
    # Код блока выполняется, если не было поймано исключений.
finally:
    # Будет исполнено в любом случае, возможно после соответствующего
    # блока except или else

Совместное использование 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 появились генераторные выражения — выражения, дающие в результате генератор. Генераторные выражения позволяют сэкономить память там, где иначе требовалось бы использовать список с промежуточными результатами:

>>> sum(i for i in xrange(1, 100) if i % 2 != 0)
2500

В этом примере суммируются все нечётные числа от 1 до 99.

Начиная с версии 2.5, Python поддерживает полноценные сопроцедуры: теперь в генератор можно передавать значения с помощью метода send() и возбуждать в его контексте исключения с помощью метода throw().

Управление контекстом выполнения

В Python 2.5 появились средства для управления контекстом выполнения блока кода — оператор with и модуль contextlib. См.: пример.

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

Декораторы

Начиная с версии 2.4, Python позволяет использовать т. н. декораторы[28][29] (не следует путать с одноимённым шаблоном проектирования) для поддержки существующей практики преобразования функций и методов в месте определения (декораторов может быть несколько). Для декораторов используется символ @ в строках, предшествующих определению функции или метода. Синтаксис декорирования является синтаксическим сахаром[30][31] для удобочитаемости: код

@staticmethod
def my_wonderful_method():
    return "Некоторый метод"

полностью эквивалентен

def my_wonderful_method():
    return "Некоторый метод"
my_wonderful_method = staticmethod(my_wonderful_method)

Сам декоратор является функцией, получающей в качестве первого аргумента декорируемую функцию. Для передачи дополнительных аргументов можно использовать синтаксис @декоратор(аргументы). Декораторы можно считать элементом аспектно-ориентированного программирования.

С версии 2.6 декораторы можно использовать с классами аналогично функциям.

Регулярные выражения

Формат регулярных выражений унаследован из Perl с некоторыми отличиями. Для их использования, требуется импортировать модуль re[32], являющийся частью стандартной библиотеки.

Другие возможности

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

Например, класс является объектом, а в операторе определения класса можно использовать выражения в списке родительских классов.

def get_class():
    return dict

class D(get_class()):
    pass

d = D()

Можно модифицировать многие объекты во время исполнения, например классы:

>>> class X(object): pass
…
>>> y = X()
>>> y.wrong_method()  # такого метода пока нет
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'X' object has no attribute 'wrong_method'
>>> X.wrong_method = lambda self : 'im here' # добавим его
>>> y.wrong_method() # так как доступ к методу приводит к поиску по __dict__ класса,
'im here' # то wrong_method становится доступным всем экземплярам

Библиотеки

Стандартная библиотека

Богатая стандартная библиотека является одной из привлекательных сторон Python. Здесь имеются средства для работы со многими сетевыми протоколами и форматами Интернета, например, модули для написания HTTP-серверов и клиентов, для разбора и создания почтовых сообщений, для работы с XML и т. п. Набор модулей для работы с операционной системой позволяет писать кросс-платформенные приложения. Существуют модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, сериализации данных, поддержка юнит-тестирования и др.

Модули расширения и программные интерфейсы

Помимо стандартной библиотеки существует множество библиотек, предоставляющих интерфейс ко всем системным вызовам на разных платформах; в частности, на платформе Win32 поддерживаются все вызовы Win32 API, а также COM в объёме не меньшем, чем у Visual Basic или Delphi. Количество прикладных библиотек для Python в самых разных областях без преувеличения огромно (веб, базы данных, обработка изображений, обработка текста, численные методы, приложения операционной системы и т. д.).

Для Python принята спецификация программного интерфейса к базам данных DB-API 2 и разработаны соответствующие этой спецификации пакеты для доступа к различным СУБД: Oracle, MySQL, PostgreSQL, Sybase, Firebird (Interbase), Informix, Microsoft SQL Server и SQLite. На платформе Windows доступ к БД возможен через ADO (ADOdb). Коммерческий пакет mxODBC для доступа к СУБД через ODBC для платформ Windows и UNIX разработан eGenix[33]. Для Python написано много ORM (SQLObject, SQLAlchemy, Dejavu, Django), выполнены программные каркасы для разработки веб-приложений (Django, Pylons, Pyramid).

Библиотека NumPy для работы с многомерными массивами позволяет достичь производительности научных расчётов, сравнимой со специализированными пакетами. SciPy использует NumPy и предоставляет доступ к обширному спектру математических алгоритмов (матричная алгебра — BLAS уровней 1—3, LAPACK, БПФ…). Numarray[34] специально разработан для операций с большими объёмами научных данных.

WSGI[35] — интерфейс шлюза с веб-сервером (Python Web Server Gateway Interface).

Python предоставляет простой и удобный программный интерфейс C API для написания собственных модулей на языках Си и C++. Такой инструмент как SWIG позволяет почти автоматически получать привязки для использования C/C++ библиотек в коде на Python. Возможности этого и других инструментов варьируются от автоматической генерации (C/C++/Fortran)-Python интерфейсов по специальным файлам (SWIG, pyste[36], SIP[37], pyfort[38]), до предоставления более удобных API (boost::python[39][40], CXX[41], Pyhrol[42] и др.). Инструмент стандартной библиотеки ctypes позволяет программам Python напрямую обращаться к динамическим библиотекам/DLL, написанным на Си. Существуют модули, позволяющие встраивать код на С/C++ прямо в исходные файлы Python, создавая расширения «на лету» (pyinline[43], weave[44]).

Другой подход состоит во встраивании интерпретатора Python в приложения. Python легко встраивается в программы на Java, C/C++, Ocaml. Взаимодействие Python-приложений с другими системами возможно также с помощью CORBA, XML-RPC, SOAP, COM.

С помощью проекта Cython возможна трансляция программ написанных на языках Python и Pyrex (англ.) в код на языке Си, с последующей компиляцией в машинный код. Cython используется для упрощения написания Python-библиотек, при его использовании отмечается ускорение кода и уменьшение накладных расходов.

Экспериментальный проект Shedskin предполагает создание компилятора для трансформации неявно типизированных Python программ в оптимизированный С++ код. Начиная с версии 0.22 Shedskin позволяет компилировать отдельные функции в модули расширений.

Python и подавляющее большинство библиотек к нему бесплатны и поставляются в исходных кодах. Более того, в отличие от многих открытых систем, лицензия никак не ограничивает использование Python в коммерческих разработках и не налагает никаких обязательств кроме указания авторских прав.

Одним из каналов распространения и обновления пакетов для Python является PyPI (англ. Python Package Index).

Графические библиотеки

С Python поставляется библиотека tkinter на основе Tcl/Tk для создания кроссплатформенных программ с графическим интерфейсом.

Существуют расширения, позволяющие использовать все основные библиотеки графических интерфейсов — wxPython[45], основанное на библиотеке wxWidgets, PyGTK для Gtk, PyQt и PySide для Qt и другие. Некоторые из них также предоставляют широкие возможности по работе с базами данных, графикой и сетями, используя все возможности библиотеки, на которой основаны.

Для создания игр и приложений, требующих нестандартного интерфейса, можно использовать библиотеку Pygame. Она также предоставляет обширные средства работы с мультимедиа: с её помощью можно управлять звуком и изображениями, воспроизводить видео. Предоставляемое pygame аппаратное ускорение графики OpenGL имеет более высокоуровневый интерфейс по сравнению с PyOpenGL[46], копирующей семантику С-библиотеки для OpenGL. Есть также PyOgre[47], обеспечивающая привязку к Ogre — высокоуровневой объектно-ориентированной библиотеке 3D-графики. Кроме того, существует библиотека pythonOCC[48], обеспечивающая привязку к среде 3D-моделирования и симуляции OpenCascade[49].

Для работы с растровой графикой используется библиотека Python Imaging Library.

Контроль типов и перегрузка функций

Существуют модули, позволяющие контролировать типы параметров функций на этапе исполнения, например, typecheck[50] или method signature checking decorators[51]. Необязательная декларация типов для параметров функции добавлена в Python 3, интерпретатор при этом не проверяет типы, а только добавляет соответствующую информацию к метаданным функции для последующего использования этой информации модулями расширений.[52]

Перегрузка функций реализована различными сторонними библиотеками, в том числе PEAK[53][54]. Не принятые планы по поддержке перегрузки в Python3000[55] были частично реализованы в библиотеке overloading-lib[56].

Примеры программ

В статье «Примеры программ на языке Python» собраны примеры небольших программ, демонстрирующих некоторые возможности языка Python и его стандартной библиотеки.

Профилирование и оптимизация кода

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

from timeit import Timer

tmp = "Python 3.2.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32."

def case1(): # А. инкрементальные конкатенации в цикле
    s = ""
    for i in range(10000):
        s += tmp

def case2(): # Б. через промежуточный список и метод join
    s = []
    for i in range(10000):
        s.append(tmp)
    s = "".join(s)

def case3(): # В. списковое выражение и метод join
    return "".join([tmp for i in range(10000)])

def case4(): # Г. генераторное выражение и метод join
    return "".join(tmp for i in range(10000))

for v in range(1,5):
    print (Timer("func()","from __main__ import case%s as func" % v).timeit(200))

Как и в любом языке программирования, в Python имеются свои приёмы оптимизации кода. Оптимизировать код можно исходя из различных (часто конкурирующих друг с другом) критериев (увеличение быстродействия, уменьшение объёма требуемой оперативной памяти, компактность исходного кода и т. д.). Чаще всего программы оптимизируют по времени исполнения.

Здесь есть несколько очевидных правил.

  • Не нужно оптимизировать программу, если скорость её выполнения достаточна.
  • Используемый алгоритм имеет определённую временную сложность, поэтому перед оптимизацией кода программы стоит сначала пересмотреть алгоритм.
  • Стоит использовать готовые и отлаженные функции и модули, даже если для этого нужно немного обработать данные. Например, в Python есть встроенная функция sort().
  • Профилирование поможет выяснить узкие места. Оптимизацию нужно начинать с них.

Python имеет следующие особенности и связанные с ними правила оптимизации.

  • Вызов функций является достаточно дорогостоящей операцией, поэтому внутри вложенных циклов нужно стараться избегать вызова функций или, например, переносить цикл в функции. Функция, обрабатывающая последовательность, эффективнее, чем обработка той же последовательности в цикле вызовом функции.
  • Старайтесь вынести из глубоко вложенного цикла всё, что можно вычислить во внешних циклах. Доступ к локальным переменным более быстрый, чем к глобальным, или чем доступ к полям.
  • Оптимизатор psyco может помочь ускорить работу модуля программы при условии, что модуль не использует динамических свойств языка Python.
  • В случае, если модуль проводит массированную обработку данных и оптимизация алгоритма и кода не помогает, можно переписать критические участки, скажем, на языке Си или Pyrex.

Инструмент под названием Pychecker[57] поможет проанализировать исходный код на Python и выдать рекомендации по найденным проблемам (например, неиспользуемые имена, изменение сигнатуры метода при его перегрузке и т. п.). В ходе такого статического анализа исходного кода могут быть выявлены и ошибки. Pylint[58] призван решать близкие задачи, но имеет уклон в сторону проверки стиля кода, поиска кода с запашком[59].

Сравнение с другими языками

Наиболее часто Python сравнивают с Perl и Ruby. Эти языки также являются интерпретируемыми и обладают примерно одинаковой скоростью выполнения программ. Как и Perl, Python может успешно применяться для написания скриптов (сценариев). Как и Ruby, Python является хорошо продуманной системой для ООП.

Средства функционального программирования частично позаимствованы из Scheme и Icon.

В среде коммерческих приложений скорость выполнения программ на Python часто сравнивают с Java-приложениями[60].

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

Недостатки

См. также список распространённых недоразумений при использовании языка Python[61].

Низкое быстродействие

Классический Python, как и многие другие интерпретируемые языки, не применяющие, например, JIT-компиляторы, имеют общий недостаток — сравнительно невысокую скорость выполнения программ[62]. Сохранение байт-кода (расширения .pyc и .pyo, начиная с версии 3.5 расширения .pyo больше нет) позволяет интерпретатору не тратить лишнее время на перекомпиляцию кода модулей при каждом запуске. Кроме того, существует специальная JIT-библиотека psyco[63], позволяющая ускорить выполнение программ (однако приводящая к увеличению потребления оперативной памяти). Эффективность psyco сильно зависит от архитектуры программы.

Существуют реализации языка Python, вводящие высокопроизводительные виртуальные машины (ВМ) в качестве бэк-энда компилятора. Примерами таких реализаций может служить PyPy, базирующийся на RPython; более ранней инициативой является проект Parrot. Ожидается, что использование ВМ типа LLVM приведёт к тем же результатам, что и использование аналогичных подходов для реализаций языка Java, где низкая вычислительная производительность в основном преодолена[64].

Множество программ/библиотек для интеграции с другими языками программирования (см. выше) предоставляют возможность использовать другой язык для написания критических участков.

В самой популярной реализации языка Python интерпретатор довольно велик и более требователен к ресурсам, чем в аналогичных популярных реализациях Tcl, Forth, LISP или Lua, что ограничивает его применение во встроенных системах. Тем не менее, Python нашёл применение в КПК и некоторых моделях мобильных телефонов[65].

Невозможность модификации встроенных классов

По сравнению с Ruby и некоторыми другими языками, в Python отсутствует возможность модифицировать встроенные классы, такие, как int, str, float, list и другие, что, однако, позволяет Python потреблять меньше оперативной памяти и быстрее работать. Ещё одной причиной введения такого ограничения является необходимость согласования с модулями расширения. Многие модули (в целях оптимизации быстродействия) преобразуют Python-объекты элементарных типов к соответствующим Си-типам вместо манипуляций с ними посредством Си-API. Также это избавляет от многих потенциальных ошибок при неконтролируемом динамическом переопределении встроенных типов.

Глобальная блокировка интерпретатора (GIL)

GIL (Global Interpreter Lock) — особенность, присущая CPython, Stackless и PyPy, но отсутствующая в Jython и IronPython. При своей работе основной интерпретатор Python постоянно использует большое количество потоко-небезопасных данных. В основном это словари, в которых хранятся атрибуты объектов, и обращения к внешнему коду (написанному на С и т. п.). Во избежание разрушения этих данных при совместной модификации из разных потоков, перед началом исполнения нескольких инструкций (по умолчанию 100) поток интерпретатора захватывает GIL, а по окончании освобождает. Вследствие этого, в каждый момент времени в одном процессе интерпретатора Python может исполняться только один поток кода на Python, даже если в компьютере имеется несколько процессоров или процессорных ядер (GIL также освобождается на время выполнения блокирующих операций, таких как ввод-вывод, изменения/проверка состояния синхронизирующих примитивов и других — таким образом, если один поток блокируется, другие могут исполняться). Была предпринята попытка перехода к более гранулированным синхронизациям, однако из-за частых захватов/освобождений блокировок эта реализация оказалась слишком медленной на однопоточных приложениях[66]. В ближайшем будущем переход от GIL к другим техникам не предполагается по причине того, что, по мнению автора языка Python Гвидо Россума, однопоточных программ, ускоряемых GIL, больше, чем многопоточных, которые GIL тормозит. Однако есть python-safethread[67] — CPython без GIL и с некоторыми другими изменениями (по утверждениям его авторов, на однопоточных приложениях скорость соответствует 60-65 % от скорости оригинального CPython).

Эта проблема имеет два основных варианта решения. Первый — отказ от совместного использования изменяемых данных и вызовов внешнего кода. При этом данные дублируются в потоках и необходимость обеспечения их синхронизации (если таковая нужна) лежит на программисте[68]. Этот подход ведёт к увеличению потребления оперативной памяти (однако не настолько сильно, как при использовании процессов в Windows — так как для Unix это не критично, процессы небольшие).

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

Если необходимо параллельное исполнение нескольких потоков кода на Python, то можно воспользоваться процессами, например, модулем processing[69], который имитирует семантику стандартного модуля threading, но использует процессы вместо потоков. Начиная с версии 2.6, модуль processing добавлен в стандартную библиотеку и переименован в multiprocessing. Есть множество модулей, упрощающих написание параллельных и/или распределённых приложений на Python, таких как parallelpython[70], Pypar[71], pympi[72] и других. GIL освобождается при исполнении кода большинства расширений, например, NumPy/SciPy, позволяя во время расчётов исполняться другому потоку. Другим решением может быть использование IronPython или Jython, лишённых этой особенности классического Python.

В версии 3.2 был внедрён изменённый GIL[73][74], а также присутствовали другие нововведения.

  • Переключение по таймауту, а не по количеству опкодов — в предыдущей версии GIL освобождался через каждые 100 операций. Но операция может выполняться от наносекунд, до долей секунд. В новой версии блокировка будет сниматься каждые 5 миллисекунд.
  • Уменьшение накладных расходов и увеличение эффективности в случае частых переключений — в некоторых системах (в основном в MacOS X) наблюдаются проблема с эффективностью блокировки, когда GIL уже захвачен: системные вызовы становятся дорогими. В новой версии задержки будут уменьшены.
  • Уменьшение задержек при переключении потоков благодаря введению механизма принудительного переключения потока и приоритетных запросов (когда поток выполняет приоритетный запрос, то GIL освобождается как можно быстрее).

Реализации

CPython является основной, но не единственной реализацией языка программирования Python. Существуют также другие реализации.

  • Jython — реализация Python, использующая JVM в качестве среды исполнения. Позволяет прозрачно использовать Java-библиотеки.[75]
  • PyS60[65] — реализация языка для смартфонов фирмы Nokia на платформе Series 60.
  • IronPython — Python для .NET Framework и Mono. Компилирует Python программы в MSIL, таким образом предоставляя полную интеграцию с .NET-системой[76].
  • Stackless — также написанная на Си реализация Python. Это не полноценная реализация, а патчи к CPython. Предоставляет расширенные возможности многопоточного программирования и значительно большую глубину рекурсии.
  • Python for .NET[77] — ещё одна реализация Python для .NET. В отличие от IronPython эта реализация не компилирует Python код в MSIL, а только предоставляет интерпретатор, написанный на C#. Позволяет использовать .NET-сборки из Python кода.
  • PyPy — реализация Python, написанная на Python. Позволяет легко проверять новые возможности. В PyPy кроме стандартного CPython включены возможности Stackless, Psyco, модификация AST «на лету» и многое другое. В проект интегрированы возможности анализа Python кода и трансляция в другие языки и байткоды виртуальных машин (Си, LLVM, Javascript, .NET с версии 0.9.9). Начиная с 0.9.0, возможна полностью автоматическая трансляция интерпретатора на Си, в результате чего достигается скорость, приемлемая для использования (в 2—3 раза медленнее чем CPython при отключённом JIT для версии 0.9.9). JIT находится в активной доработке.
  • python-safethread[67] — версия CPython без GIL, что позволяет одновременно исполнять Python потоки на всех доступных процессорах. Внесены также некоторые другие изменения.
  • Unladen Swallow — начатый Google проект по разработке высокоэффективного, максимально совместимого с CPython JIT-компилятора на базе LLVM. Согласно планам по развитию Python[78], планировалось перенести исходный код Unladen Swallow в CPython в версии 3.3. Но PEP-3146 был отменён в связи с отсутствием интереса к Unladen Swallow со стороны Google, основного спонсора разработки.[79]
  • tinypy[80] — минималистическая версия Python. Часть возможностей CPython не реализована.
  • Micro Python — эффективная реализация Python 3 для встроенных систем с малым объёмом оперативной памяти.[81]
  • Brython[82] — реализация языка на клиентском JavaScript, позволяющая писать браузерные скрипты на Python 3.
  • QPython[83] — Реализация python для Android. Проект все-еще на стадии тестирования, однако, на qpython уже портированы некоторые самые необходимые библиотеки. Позволяет и работать в интерактивном режиме. Существует, также, Qpython3.

Дальнейшая разработка

Python Enhancement Proposal («PEP») — это документ со стандартизированным дизайном, предоставляющий общую информацию о языке Python, включая новые предложения, описания и разъяснения возможностей языка. PEP предлагаются как основной источник для предложения новых возможностей и для разъяснения выбора того или иного дизайна для всех основных элементов языка. Выдающиеся PEP рецензируются и комментируются Гвидо ван Россумом, имеющим в проекте статус «великодушного пожизненного диктатора».

График и совместимость

Серии Python 2.x и Python 3.x в течение нескольких выпусков будут существовать параллельно, при этом серия 2.x будет использоваться для совместимости и скорее всего в неё будут включены некоторые возможности серии 3.x. PEP 3000 содержит больше информации о планируемых выпусках.

Python 3.0 обратно не совместим с предыдущей серией 2.x. Код Python 2.x скорее всего будет выдавать ошибки при исполнении в Python 3.0. Динамическая типизация Python вместе с планами изменения нескольких методов словарей делает механический перевод из Python 2.x в Python 3.0 очень сложным. Однако, утилита «2to3» уже способна сделать большинство работы по переводу кода, указывая на подозрительные его части с помощью комментариев и предупреждений. PEP 3000 рекомендует держать исходный код для серии 2.x и делать выпуски для Python 3.x с помощью «2to3». Полученный код не следует редактировать, пока программа не будет работоспособной в Python 2.x.

Возможности

Основные изменения, внесённые в версии 3.0.[84][85]

  • Синтаксическая возможность для аннотации параметров и результата функций (например, для передачи информации о типе или документирования).
  • Полный переход на unicode для строк.
  • Введение нового типа «неизменяемые байты» и типа «изменяемый буфер». Оба необходимы для представления бинарных данных.
  • Новая подсистема ввода-вывода (модуль io), имеющая отдельные представления для бинарных и текстовых данных.
  • Абстрактные классы, абстрактные методы (доступно уже в 2.6).
  • Иерархия типов для чисел.
  • Выражения для словарей и множеств {k: v for k, v in a_dict} и {el1, el2, el3} (по аналогии со списковыми выражениями).
  • Изменения print из встроенного выражения во встроенную функцию. Это позволит модулям делать изменения, подстраиваясь под разное использование функции, а также упростит код. В Python 2.6 эта возможность активируется вводом from __future__ import print_function.
  • Перемещение reduce (но не map или filter) из встроенного пространства в модуль functools (использование reduce существенно менее читабельно по сравнению с циклом).
  • Удаление некоторых устаревших возможностей, поддерживаемых в ветке 2.x для совместимости, в частности: классы старого стиля, целочисленное деление с обрезанием результата как поведение по умолчанию, строковые исключения, неявный относительный импорт, оператор exec и т. п.
  • Реорганизация стандартной библиотеки.
  • Новый синтаксис для метаклассов.
  • Изменен синтаксис присваиваний. Стало возможным, например, присваивание (a, *rest, b) = range(5). С другой стороны, формальные параметры функций вроде def foo(a, (b, c)) более недопустимы.

Специализированные подмножества/расширения Python

На основе Python было создано несколько специализированных подмножеств языка, в основном предназначенных для статической компиляции в машинный код. Некоторые из них перечислены ниже.

  • RPython[86] — созданная в рамках проекта PyPy сильно ограниченная реализация Python без динамизма времени исполнения и некоторых других возможностей. Код на RPython можно компилировать во множество других языков/платформ — C, JavaScript, Lisp, .NET[87], LLVM. На RPython написан интерпретатор PyPy.
  • Pyrex[88] — ограниченная реализация Python, но несколько меньше, чем RPython. Pyrex расширен возможностями статической типизации типами из языка С и позволяет свободно смешивать типизированный и не типизированный код. Предназначен для написания модулей расширений, компилируется в код на языке С.
  • Cython[89] — расширенная версия Pyrex.
  • Проект Shedskin — предназначен для компиляции неявно статически типизированного кода на Python в оптимизированный код на языке С++.

Применение

Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. На Python реализовано большое количество проектов, также он активно используется для создания прототипов будущих программ. Python используется во многих крупных компаниях.[90]

Python с пакетами NumPy, SciPy и MatPlotLib активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам Matlab, IDL и другим. Библиотека Astropy - популярный инструмент для астрономических расчетов.

В профессиональных программах трехмерной графики, таких как Autodesk Maya, Blender, Houdini и Nuke, Python используется для расширения стандартных возможностей программ.[91][92]

См. также

Напишите отзыв о статье "Python"

Примечания

    • .py — исходный код.
    • .pyw — исходный код для выполнения программ с графическим интерфейсом в Windows, файлы с таким расширением будут выполнены без запуска консоли.
    • .pyc — скомпилированный байт-код.
    • .pyo — оптимизированный скомпилированный байт-код.
    • .pyd — бинарный код динамических библиотек DLL (в Windows).
  1. Создатель языка Гвидо ван Россум настаивает, что название происходит не от рептилии и не от мифического существа, а от телевизионного шоу «Летающий цирк Монти Пайтона». См.: docs.python.org/faq/general#why-is-it-called-python, однако стилизованное изображение змеи давно стало неофициальным символом языка и является элементом официального логотипа.
  2. [www.xakep.ru/magazine/xa/117/088/1.asp Мария «Mifrill» Нефедова, Создатели языков программирования: Они такие разные, но кодинг их объединяет, Хакер № 09/08 (117)]
  3. [www.python.org/about/ About Python]
  4. [www.python.org/2.5/license.html Python 2.5 license]
  5. [www.python.org/peps/pep-0020.html PEP 20 — The Zen of Python]
  6. Шутливый намёк на Гвидо
  7. [www.artima.com/intv/pythonP.html The Making of Python]
  8. svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY
  9. [docs.python.org/2/faq/general.html#why-is-it-called-python General Python FAQ - Why is it called Python?].
  10. Спам
  11. Magic cookie
  12. [insidetech.monster.com/training/articles/8114-15-ways-python-is-a-powerful-force-on-the-web 15 Ways Python Is a Powerful Force on the Web].
  13. [docs.python.org/2/library/pprint.html pprint - Data pretty printer - Python Documentation].
  14. [www.python.org/dev/peps/ Index of Python Enhancement Proposals (PEPs)]
  15. [python.org/download/releases/3.0/ Python 3.0 Release]
  16. 1 2 [www.python.org/doc/essays/foreword/ Foreword for «Programming Python» (1st ed.)]
  17. [www.artima.com/intv/python2.html The Making of Python]
  18. [www.damonkohler.com/2008/12/python-on-android.html Python on Android] (англ.). www.damonkohler.com. Проверено 19 декабря 2009. [www.webcitation.org/5w4n0S15k Архивировано из первоисточника 28 января 2011].
  19. [docs.python.org/whatsnew/2.6.html#port-specific-changes-windows Port-Specific Changes: Windows] (англ.). Python v2.6.1 documentation. What’s New in Python 2.6. Python Software Foundation. Проверено 11 декабря 2008. [www.webcitation.org/5w4n1Glim Архивировано из первоисточника 28 января 2011].
  20. [docs.python.org/library/stdtypes.html Python Documentation — Built-in Types]
  21. [stackoverflow.com/questions/68630/are-tuples-more-efficient-than-lists-in-python Are tuples more efficient than lists in Python? — Stack Overflow]
  22. Fredrik Lundh. [effbot.org/zone/call-by-object.htm Call By Object] ( (англ.)). effbot.org.
  23. [docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers 2.3.2. Reserved classes of identifiers]. Python documentation (18 октября 2009). [www.webcitation.org/5w4n2As6O Архивировано из первоисточника 28 января 2011].
  24. [softwaremaniacs.org/blog/2005/12/08/django/ …целостность больших проектов на Python строится на двух вещах: тесты и doc-строка]
  25. ipython.scipy.org/
  26. [www.bpython-interpreter.org/ bpython interpreter]
  27. [www.python.org/dev/peps/pep-0318/ PEP318]
  28. [www.youtube.com/watch?v=FsAPt_9Bf3U Python Tutorial: Decorators - Dynamically Alter The Functionality Of Your Functions]
  29. [blog.jetfix.ru/post/zamykaniya-v-python-chto-eto-i-s-chem-ih-edyat Замыкания. Что это и с чем их едят?]
  30. [www.youtube.com/watch?v=4XzGHzLgyng python декораторы]
  31. [docs.python.org/3/library/re.html 6.2. re — Regular expression operations — Python 3.5.1 documentation]
  32. [egenix.com/ eGenix.com — Professional Python Software, Skills and Services]
  33. [www.stsci.edu/resources/software_hardware/numarray numarray Home Page]
  34. [www.python.org/dev/peps/pep-0333/ PEP333]
  35. [www.boost.org/libs/python/pyste/index.html Pyste Documentation]
  36. www.riverbankcomputing.co.uk/sip/
  37. pyfortran.sourceforge.net/
  38. [www.boost.org/libs/python/doc/ Boost.Python]
  39. www.drdobbs.com/building-hybrid-systems-with-boostpython/184401666 Building Hybrid Systems with Boost.Python
  40. [cxx.sourceforge.net/ PyCXX: Write Python Extensions in C]
  41. [pyhrol.ru/ Мост между C++ и Python]
  42. [pyinline.sourceforge.net/ PyInline: Mix Other Languages directly Inline with your Python]
  43. [www.scipy.org/Weave Weave]
  44. [www.wxpython.org/ wxPython]
  45. [pyopengl.sourceforge.net/ PyOpenGL — The Python OpenGL Binding]
  46. [www.ogre3d.org/wiki/index.php/PyOgre PyOgre : Ogre Wiki]
  47. [www.pythonocc.org/ pythonOCC, 3D CAD/CAE/PLM development framework for the Python programming language]
  48. [www.opencascade.org/ Open CASCADE Technology, 3D modeling & numerical simulation]
  49. [oakwinter.com/code/typecheck/ Typechecking module for Python]
  50. [aspn.activestate.com/ASPN/Cookbook/Python/Recipe/426123 Method signature checking decorators " Python recipes " ActiveState Code]
  51. [www.python.org/dev/peps/pep-3107/ PEP-3107]
  52. [peak.telecommunity.com/DevCenter/FrontPage FrontPage — The PEAK Developers' Center]
  53. [peak.telecommunity.com/DevCenter/RulesReadme PEAK-Rules]
  54. [www.python.org/dev/peps/pep-3124/ PEP-3124]
  55. [code.google.com/p/overloading-lib/ overloading-lib], Библиотека динамической перегрузки функций и методов основанной на типах аргументов для языка python
  56. [pychecker.sourceforge.net/ PyChecker: a python source code checking tool]
  57. [www.logilab.org/view?rql=Any%20X%20WHERE%20X%20eid%20857 pylint (analyzes Python source code looking for bugs and signs of poor quality.) (Logilab.org)]
  58. [docs.pylint.org/intro.html Pylint 1.0.0 documentation, Introduction]
  59. [shootout.alioth.debian.org/ Результаты одной из попыток сравнения]
  60. [web.archive.org/web/20130810230937/zephyrfalcon.org/labs/python_pitfalls.html zephyrfalcon.org :: labs :: 10 Python pitfalls]
  61. [shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=python&lang2=gpp&box=1 Python / C++ GNU g++]. Computer Language Benchmarks Game.  ???. Проверено 1 июля 2009. [www.webcitation.org/5w4n30Deb Архивировано из первоисточника 28 января 2011].
  62. [psyco.sf.net/ Psyco] (англ.) — JIT-компилятор для Python, позволяющий увеличить скорость работы программ в 3-10 раз
  63. [code.google.com/p/unladen-swallow/wiki/ProjectPlan unladen-swallow. A faster implementation of Python]. code.google. — «Goals: … Produce a version of Python at least 5x faster than CPython»  Проверено 22 июня 2009. [www.webcitation.org/5w4n3soB7 Архивировано из первоисточника 28 января 2011].
  64. 1 2 [wiki.opensource.nokia.com/projects/PyS60 Python for S60 — OpenSource]
  65. [www.artima.com/weblogs/viewpost.jsp?thread=211200 Python 3000 FAQ]
  66. 1 2 [code.google.com/p/python-safethread/ python-safethread — Project Hosting on Google Code]
  67. [perldoc.perl.org/perlthrtut.html perlthrtut — perldoc.perl.org]
  68. [pypi.python.org/pypi/processing Python Package Index : processing 0.52]
  69. [www.parallelpython.com/ Parallel Python — Home]
  70. datamining.anu.edu.au/~ole/pypar/
  71. [pympi.sourceforge.net/ pyMPI.sourceforge.net: Putting the py in MPI]
  72. [docs.python.org/dev/whatsnew/3.2.html#multi-threading What’s New In Python 3.2 — Python v3.2b2 documentation]
  73. [mail.python.org/pipermail/python-dev/2009-October/093321.html [Python-Dev] Reworking the GIL]
  74. [www.jython.org/ The Jython Project]
  75. [www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython IronPython]
  76. [pythonnet.sourceforge.net/ Python for .NET]
  77. [www.python.org/dev/peps/pep-3146/ PEP 3146 — Merging Unladen Swallow into CPython]
  78. [qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html QINSB is not a Software Blog: Unladen Swallow Retrospective]
  79. [www.tinypy.org/ tinypy :: home]
  80. [micropython.org/ Micro Python]
  81. [www.brython.info/ Сайт проекта Brython].
  82. [qpython.com/ Сайт проекта QPython].
  83. [docs.python.org/dev/3.0/whatsnew/3.0.html What’s New In Python 3.0 — Python v3.0.1 documentation]
  84. [docs.python.org/3.0/index.html Overview — Python v3.0.1 documentation]
  85. [codespeak.net/pypy/dist/pypy/doc/coding-guide.html#restricted-python PyPy[coding-guide]]
  86. [codespeak.net/pypy/dist/pypy/doc/carbonpython.html PyPy carbonpython]
  87. [www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/ Pyrex]
  88. [www.cython.org/ Cython: C-Extensions for Python]
  89. [www.python.org/about/success/usa Python Success Stories]
  90. [sites.google.com/site/pythonforscientists/python-vs-matlab Python vs Matlab] Python for scientists blog
  91. [www.astrobetter.com/wiki/tiki-index.php?page=idl_vs_python IDL vs. Python] AstroBetter Wiki

Литература

На русском языке
  • Коэльё Л. П., Ричерт В. Построение систем машинного обучения на языке Python. — Перевод с английского. — М.: ДМК Пресс, 2015. — с. — ISBN 978-5-97060-330-7.
  • Маккинли У. Python и анализ данных. — Перевод с английского. — М.: ДМК Пресс, 2015. — 482 с. — ISBN 978-5-97060-315-4.
  • Марк Саммерфилд. Python на практике. — Перевод с английского. — М.: ДМК Пресс, 2014. — 338 с. — ISBN 978-5-97060-095-5.
  • Марк Лутц. Программирование на Python / Пер. с англ. — 4-е изд. — СПб.: Символ-Плюс, 2011. — Т. II. — ISBN 978-5-93286-211-7.
  • Марк Лутц. [www.symbol.ru/date/841171.html Программирование на Python] / Пер. с англ. — 4-е изд. — СПб.: Символ-Плюс, 2011. — Т. I. — 992 с. — ISBN 978-5-93286-210-0.
  • Марк Лутц. [www.symbol.ru/date/816603.html Изучаем Python, 4-е издание]. — Перевод с английского. — СПб.: Символ-Плюс, 2010. — 1280 с — ISBN 978-5-93286-159-2
  • Дэвид М. Бизли. [www.symbol.ru/date/784182.html Python. Подробный справочник, 4-е издание]. — Перевод с английского. — СПб.: Символ-Плюс, 2010. — 864 с — ISBN 978-5-93286-157-8
  • Марк Саммерфилд. [www.symbol.ru/date/661501.html Программирование на Python 3. Подробное руководство]. — Перевод с английского. — СПб.: Символ-Плюс, 2009. — 608 с — ISBN 978-5-93286-161-5
  • Ноа Гифт, Джереми М. Джонс. [www.symbol.ru/date/634254.html Python в системном администрировании UNIX и Linux]. — Перевод с английского. — СПб.: Символ-Плюс, 2009. — 512 с — ISBN 978-5-93286-149-3
  • Бизли, Дэвид М. Язык программирования Python. Справочник. — К.: ДиаСофт, 2000. — 336 с. — ISBN 966-7393-54-2, ISBN 0-7357-0901-7
  • Сузи Р. А. Python. Наиболее полное руководство (+CD). — СПб.: БХВ-Петербург, 2002. — 768 с. — ISBN 5-94157-097-X
  • Сузи Р. А. Язык программирования Python: Учебное пособие. — М.: ИНТУИТ, БИНОМ. Лаборатория знаний, 2006. — 328 с. — ISBN 5-9556-0058-2, ISBN 5-94774-442-2
  • Доусон М. Программируем на Python. — СПб.: Питер, 2012. — 432 с. — ISBN 978-5-459-00314-7.
  • С. Шапошникова. [younglinux.info/pdf Основы программирования на Python. Учебник. Вводный курс]. — версия 2. — 2011. — 44 с.
  • И. А. Хахаев. [www.altlinux.org/Books:PythonSchool Практикум по алгоритмизации и программированию на Python. Учебник]. — М.: Альт Линукс, 2010. — 126 с. — (Библиотека ALT Linux). — ISBN 978-5-905167-02-7.
  • А. Н. Чаплыгин. Учимся программировать вместе с Питоном. Учебник. — ревизия 226. — 135 с.
На английском языке
  • David Beazley, Guido Van Rossum. Python: Essential Reference. — New Riders Publishing, 1999.
  • Martin C. Brown. Python: The Complete Reference. McGraw-Hill Professional Publishing, 2001
  • Wesley J. Chun. Core Python Programming. Prentice Hall PTR, 2000
  • Alan Gauld. Learn to Program Using Python: A Tutorial for Hobbyists, Self-Starters, and Those Who Want to Learn the Art of Programming. Addison-Wesley Professional, 2001
  • John E. Grayson. Python and Tkinter Programming. Manning Publications Company, 1999
  • Rashi Gupta. Making use of Python. Wiley, 2002
  • Mark Hammond, Andy Robinson. Python Programming on Win32. O’Reilly, 2000
  • Christopher A. Jones, Fred L. Drake. Python & XML. O’Reilly & Associates, 2001
  • Ivan Van Laningham. Teach Yourself Python in 24 Hours. Sams, 2000
  • Amos Latteier, Michel Pelletier. The Zope Book. New Riders Publishing, 2001
  • Frederik Lundh. Python Standard Library. O’Reilly & Associates, 2001
  • A. Sweigart. [inventwithpython.com/chapters/ Invent Your Own Computer Games with Python]. — 2008—2010. — 436 с. — ISBN 978-0-9821060-1-3.
  • A. Sweigart. [corepython.com/ Core Python Applications Programming]. — 2012. — 888 с. — ISBN 978-0-1326782-0-9.

Ссылки

  • [www.python.org/ Официальный сайт] (англ.)
  • [wiki.python.org/moin/RussianLanguage Каталог ссылок на русскоязычные материалы по Python на официальном вики-сайте.] (англ.)


Отрывок, характеризующий Python

Некоторые мужики сняли шапки, некоторые, не снимая шапок, смотрели на подъехавших. Два старые длинные мужика, с сморщенными лицами и редкими бородами, вышли из кабака и с улыбками, качаясь и распевая какую то нескладную песню, подошли к офицерам.
– Молодцы! – сказал, смеясь, Ростов. – Что, сено есть?
– И одинакие какие… – сказал Ильин.
– Развесе…oo…ооо…лая бесе… бесе… – распевали мужики с счастливыми улыбками.
Один мужик вышел из толпы и подошел к Ростову.
– Вы из каких будете? – спросил он.
– Французы, – отвечал, смеючись, Ильин. – Вот и Наполеон сам, – сказал он, указывая на Лаврушку.
– Стало быть, русские будете? – переспросил мужик.
– А много вашей силы тут? – спросил другой небольшой мужик, подходя к ним.
– Много, много, – отвечал Ростов. – Да вы что ж собрались тут? – прибавил он. – Праздник, что ль?
– Старички собрались, по мирскому делу, – отвечал мужик, отходя от него.
В это время по дороге от барского дома показались две женщины и человек в белой шляпе, шедшие к офицерам.
– В розовом моя, чур не отбивать! – сказал Ильин, заметив решительно подвигавшуюся к нему Дуняшу.
– Наша будет! – подмигнув, сказал Ильину Лаврушка.
– Что, моя красавица, нужно? – сказал Ильин, улыбаясь.
– Княжна приказали узнать, какого вы полка и ваши фамилии?
– Это граф Ростов, эскадронный командир, а я ваш покорный слуга.
– Бе…се…е…ду…шка! – распевал пьяный мужик, счастливо улыбаясь и глядя на Ильина, разговаривающего с девушкой. Вслед за Дуняшей подошел к Ростову Алпатыч, еще издали сняв свою шляпу.
– Осмелюсь обеспокоить, ваше благородие, – сказал он с почтительностью, но с относительным пренебрежением к юности этого офицера и заложив руку за пазуху. – Моя госпожа, дочь скончавшегося сего пятнадцатого числа генерал аншефа князя Николая Андреевича Болконского, находясь в затруднении по случаю невежества этих лиц, – он указал на мужиков, – просит вас пожаловать… не угодно ли будет, – с грустной улыбкой сказал Алпатыч, – отъехать несколько, а то не так удобно при… – Алпатыч указал на двух мужиков, которые сзади так и носились около него, как слепни около лошади.
– А!.. Алпатыч… А? Яков Алпатыч!.. Важно! прости ради Христа. Важно! А?.. – говорили мужики, радостно улыбаясь ему. Ростов посмотрел на пьяных стариков и улыбнулся.
– Или, может, это утешает ваше сиятельство? – сказал Яков Алпатыч с степенным видом, не заложенной за пазуху рукой указывая на стариков.
– Нет, тут утешенья мало, – сказал Ростов и отъехал. – В чем дело? – спросил он.
– Осмелюсь доложить вашему сиятельству, что грубый народ здешний не желает выпустить госпожу из имения и угрожает отпречь лошадей, так что с утра все уложено и ее сиятельство не могут выехать.
– Не может быть! – вскрикнул Ростов.
– Имею честь докладывать вам сущую правду, – повторил Алпатыч.
Ростов слез с лошади и, передав ее вестовому, пошел с Алпатычем к дому, расспрашивая его о подробностях дела. Действительно, вчерашнее предложение княжны мужикам хлеба, ее объяснение с Дроном и с сходкою так испортили дело, что Дрон окончательно сдал ключи, присоединился к мужикам и не являлся по требованию Алпатыча и что поутру, когда княжна велела закладывать, чтобы ехать, мужики вышли большой толпой к амбару и выслали сказать, что они не выпустят княжны из деревни, что есть приказ, чтобы не вывозиться, и они выпрягут лошадей. Алпатыч выходил к ним, усовещивая их, но ему отвечали (больше всех говорил Карп; Дрон не показывался из толпы), что княжну нельзя выпустить, что на то приказ есть; а что пускай княжна остается, и они по старому будут служить ей и во всем повиноваться.
В ту минуту, когда Ростов и Ильин проскакали по дороге, княжна Марья, несмотря на отговариванье Алпатыча, няни и девушек, велела закладывать и хотела ехать; но, увидав проскакавших кавалеристов, их приняли за французов, кучера разбежались, и в доме поднялся плач женщин.
– Батюшка! отец родной! бог тебя послал, – говорили умиленные голоса, в то время как Ростов проходил через переднюю.
Княжна Марья, потерянная и бессильная, сидела в зале, в то время как к ней ввели Ростова. Она не понимала, кто он, и зачем он, и что с нею будет. Увидав его русское лицо и по входу его и первым сказанным словам признав его за человека своего круга, она взглянула на него своим глубоким и лучистым взглядом и начала говорить обрывавшимся и дрожавшим от волнения голосом. Ростову тотчас же представилось что то романическое в этой встрече. «Беззащитная, убитая горем девушка, одна, оставленная на произвол грубых, бунтующих мужиков! И какая то странная судьба натолкнула меня сюда! – думал Ростов, слушяя ее и глядя на нее. – И какая кротость, благородство в ее чертах и в выражении! – думал он, слушая ее робкий рассказ.
Когда она заговорила о том, что все это случилось на другой день после похорон отца, ее голос задрожал. Она отвернулась и потом, как бы боясь, чтобы Ростов не принял ее слова за желание разжалобить его, вопросительно испуганно взглянула на него. У Ростова слезы стояли в глазах. Княжна Марья заметила это и благодарно посмотрела на Ростова тем своим лучистым взглядом, который заставлял забывать некрасивость ее лица.
– Не могу выразить, княжна, как я счастлив тем, что я случайно заехал сюда и буду в состоянии показать вам свою готовность, – сказал Ростов, вставая. – Извольте ехать, и я отвечаю вам своей честью, что ни один человек не посмеет сделать вам неприятность, ежели вы мне только позволите конвоировать вас, – и, почтительно поклонившись, как кланяются дамам царской крови, он направился к двери.
Почтительностью своего тона Ростов как будто показывал, что, несмотря на то, что он за счастье бы счел свое знакомство с нею, он не хотел пользоваться случаем ее несчастия для сближения с нею.
Княжна Марья поняла и оценила этот тон.
– Я очень, очень благодарна вам, – сказала ему княжна по французски, – но надеюсь, что все это было только недоразуменье и что никто не виноват в том. – Княжна вдруг заплакала. – Извините меня, – сказала она.
Ростов, нахмурившись, еще раз низко поклонился и вышел из комнаты.


– Ну что, мила? Нет, брат, розовая моя прелесть, и Дуняшей зовут… – Но, взглянув на лицо Ростова, Ильин замолк. Он видел, что его герой и командир находился совсем в другом строе мыслей.
Ростов злобно оглянулся на Ильина и, не отвечая ему, быстрыми шагами направился к деревне.
– Я им покажу, я им задам, разбойникам! – говорил он про себя.
Алпатыч плывущим шагом, чтобы только не бежать, рысью едва догнал Ростова.
– Какое решение изволили принять? – сказал он, догнав его.
Ростов остановился и, сжав кулаки, вдруг грозно подвинулся на Алпатыча.
– Решенье? Какое решенье? Старый хрыч! – крикнул он на него. – Ты чего смотрел? А? Мужики бунтуют, а ты не умеешь справиться? Ты сам изменник. Знаю я вас, шкуру спущу со всех… – И, как будто боясь растратить понапрасну запас своей горячности, он оставил Алпатыча и быстро пошел вперед. Алпатыч, подавив чувство оскорбления, плывущим шагом поспевал за Ростовым и продолжал сообщать ему свои соображения. Он говорил, что мужики находились в закоснелости, что в настоящую минуту было неблагоразумно противуборствовать им, не имея военной команды, что не лучше ли бы было послать прежде за командой.
– Я им дам воинскую команду… Я их попротивоборствую, – бессмысленно приговаривал Николай, задыхаясь от неразумной животной злобы и потребности излить эту злобу. Не соображая того, что будет делать, бессознательно, быстрым, решительным шагом он подвигался к толпе. И чем ближе он подвигался к ней, тем больше чувствовал Алпатыч, что неблагоразумный поступок его может произвести хорошие результаты. То же чувствовали и мужики толпы, глядя на его быструю и твердую походку и решительное, нахмуренное лицо.
После того как гусары въехали в деревню и Ростов прошел к княжне, в толпе произошло замешательство и раздор. Некоторые мужики стали говорить, что эти приехавшие были русские и как бы они не обиделись тем, что не выпускают барышню. Дрон был того же мнения; но как только он выразил его, так Карп и другие мужики напали на бывшего старосту.
– Ты мир то поедом ел сколько годов? – кричал на него Карп. – Тебе все одно! Ты кубышку выроешь, увезешь, тебе что, разори наши дома али нет?
– Сказано, порядок чтоб был, не езди никто из домов, чтобы ни синь пороха не вывозить, – вот она и вся! – кричал другой.
– Очередь на твоего сына была, а ты небось гладуха своего пожалел, – вдруг быстро заговорил маленький старичок, нападая на Дрона, – а моего Ваньку забрил. Эх, умирать будем!
– То то умирать будем!
– Я от миру не отказчик, – говорил Дрон.
– То то не отказчик, брюхо отрастил!..
Два длинные мужика говорили свое. Как только Ростов, сопутствуемый Ильиным, Лаврушкой и Алпатычем, подошел к толпе, Карп, заложив пальцы за кушак, слегка улыбаясь, вышел вперед. Дрон, напротив, зашел в задние ряды, и толпа сдвинулась плотнее.
– Эй! кто у вас староста тут? – крикнул Ростов, быстрым шагом подойдя к толпе.
– Староста то? На что вам?.. – спросил Карп. Но не успел он договорить, как шапка слетела с него и голова мотнулась набок от сильного удара.
– Шапки долой, изменники! – крикнул полнокровный голос Ростова. – Где староста? – неистовым голосом кричал он.
– Старосту, старосту кличет… Дрон Захарыч, вас, – послышались кое где торопливо покорные голоса, и шапки стали сниматься с голов.
– Нам бунтовать нельзя, мы порядки блюдем, – проговорил Карп, и несколько голосов сзади в то же мгновенье заговорили вдруг:
– Как старички пороптали, много вас начальства…
– Разговаривать?.. Бунт!.. Разбойники! Изменники! – бессмысленно, не своим голосом завопил Ростов, хватая за юрот Карпа. – Вяжи его, вяжи! – кричал он, хотя некому было вязать его, кроме Лаврушки и Алпатыча.
Лаврушка, однако, подбежал к Карпу и схватил его сзади за руки.
– Прикажете наших из под горы кликнуть? – крикнул он.
Алпатыч обратился к мужикам, вызывая двоих по именам, чтобы вязать Карпа. Мужики покорно вышли из толпы и стали распоясываться.
– Староста где? – кричал Ростов.
Дрон, с нахмуренным и бледным лицом, вышел из толпы.
– Ты староста? Вязать, Лаврушка! – кричал Ростов, как будто и это приказание не могло встретить препятствий. И действительно, еще два мужика стали вязать Дрона, который, как бы помогая им, снял с себя кушан и подал им.
– А вы все слушайте меня, – Ростов обратился к мужикам: – Сейчас марш по домам, и чтобы голоса вашего я не слыхал.
– Что ж, мы никакой обиды не делали. Мы только, значит, по глупости. Только вздор наделали… Я же сказывал, что непорядки, – послышались голоса, упрекавшие друг друга.
– Вот я же вам говорил, – сказал Алпатыч, вступая в свои права. – Нехорошо, ребята!
– Глупость наша, Яков Алпатыч, – отвечали голоса, и толпа тотчас же стала расходиться и рассыпаться по деревне.
Связанных двух мужиков повели на барский двор. Два пьяные мужика шли за ними.
– Эх, посмотрю я на тебя! – говорил один из них, обращаясь к Карпу.
– Разве можно так с господами говорить? Ты думал что?
– Дурак, – подтверждал другой, – право, дурак!
Через два часа подводы стояли на дворе богучаровского дома. Мужики оживленно выносили и укладывали на подводы господские вещи, и Дрон, по желанию княжны Марьи выпущенный из рундука, куда его заперли, стоя на дворе, распоряжался мужиками.
– Ты ее так дурно не клади, – говорил один из мужиков, высокий человек с круглым улыбающимся лицом, принимая из рук горничной шкатулку. – Она ведь тоже денег стоит. Что же ты ее так то вот бросишь или пол веревку – а она потрется. Я так не люблю. А чтоб все честно, по закону было. Вот так то под рогожку, да сенцом прикрой, вот и важно. Любо!
– Ишь книг то, книг, – сказал другой мужик, выносивший библиотечные шкафы князя Андрея. – Ты не цепляй! А грузно, ребята, книги здоровые!
– Да, писали, не гуляли! – значительно подмигнув, сказал высокий круглолицый мужик, указывая на толстые лексиконы, лежавшие сверху.

Ростов, не желая навязывать свое знакомство княжне, не пошел к ней, а остался в деревне, ожидая ее выезда. Дождавшись выезда экипажей княжны Марьи из дома, Ростов сел верхом и до пути, занятого нашими войсками, в двенадцати верстах от Богучарова, верхом провожал ее. В Янкове, на постоялом дворе, он простился с нею почтительно, в первый раз позволив себе поцеловать ее руку.
– Как вам не совестно, – краснея, отвечал он княжне Марье на выражение благодарности за ее спасенье (как она называла его поступок), – каждый становой сделал бы то же. Если бы нам только приходилось воевать с мужиками, мы бы не допустили так далеко неприятеля, – говорил он, стыдясь чего то и стараясь переменить разговор. – Я счастлив только, что имел случай познакомиться с вами. Прощайте, княжна, желаю вам счастия и утешения и желаю встретиться с вами при более счастливых условиях. Ежели вы не хотите заставить краснеть меня, пожалуйста, не благодарите.
Но княжна, если не благодарила более словами, благодарила его всем выражением своего сиявшего благодарностью и нежностью лица. Она не могла верить ему, что ей не за что благодарить его. Напротив, для нее несомненно было то, что ежели бы его не было, то она, наверное, должна была бы погибнуть и от бунтовщиков и от французов; что он, для того чтобы спасти ее, подвергал себя самым очевидным и страшным опасностям; и еще несомненнее было то, что он был человек с высокой и благородной душой, который умел понять ее положение и горе. Его добрые и честные глаза с выступившими на них слезами, в то время как она сама, заплакав, говорила с ним о своей потере, не выходили из ее воображения.
Когда она простилась с ним и осталась одна, княжна Марья вдруг почувствовала в глазах слезы, и тут уж не в первый раз ей представился странный вопрос, любит ли она его?
По дороге дальше к Москве, несмотря на то, что положение княжны было не радостно, Дуняша, ехавшая с ней в карете, не раз замечала, что княжна, высунувшись в окно кареты, чему то радостно и грустно улыбалась.
«Ну что же, ежели бы я и полюбила его? – думала княжна Марья.
Как ни стыдно ей было признаться себе, что она первая полюбила человека, который, может быть, никогда не полюбит ее, она утешала себя мыслью, что никто никогда не узнает этого и что она не будет виновата, ежели будет до конца жизни, никому не говоря о том, любить того, которого она любила в первый и в последний раз.
Иногда она вспоминала его взгляды, его участие, его слова, и ей казалось счастье не невозможным. И тогда то Дуняша замечала, что она, улыбаясь, глядела в окно кареты.
«И надо было ему приехать в Богучарово, и в эту самую минуту! – думала княжна Марья. – И надо было его сестре отказать князю Андрею! – И во всем этом княжна Марья видела волю провиденья.
Впечатление, произведенное на Ростова княжной Марьей, было очень приятное. Когда ои вспоминал про нее, ему становилось весело, и когда товарищи, узнав о бывшем с ним приключении в Богучарове, шутили ему, что он, поехав за сеном, подцепил одну из самых богатых невест в России, Ростов сердился. Он сердился именно потому, что мысль о женитьбе на приятной для него, кроткой княжне Марье с огромным состоянием не раз против его воли приходила ему в голову. Для себя лично Николай не мог желать жены лучше княжны Марьи: женитьба на ней сделала бы счастье графини – его матери, и поправила бы дела его отца; и даже – Николай чувствовал это – сделала бы счастье княжны Марьи. Но Соня? И данное слово? И от этого то Ростов сердился, когда ему шутили о княжне Болконской.


Приняв командование над армиями, Кутузов вспомнил о князе Андрее и послал ему приказание прибыть в главную квартиру.
Князь Андрей приехал в Царево Займище в тот самый день и в то самое время дня, когда Кутузов делал первый смотр войскам. Князь Андрей остановился в деревне у дома священника, у которого стоял экипаж главнокомандующего, и сел на лавочке у ворот, ожидая светлейшего, как все называли теперь Кутузова. На поле за деревней слышны были то звуки полковой музыки, то рев огромного количества голосов, кричавших «ура!новому главнокомандующему. Тут же у ворот, шагах в десяти от князя Андрея, пользуясь отсутствием князя и прекрасной погодой, стояли два денщика, курьер и дворецкий. Черноватый, обросший усами и бакенбардами, маленький гусарский подполковник подъехал к воротам и, взглянув на князя Андрея, спросил: здесь ли стоит светлейший и скоро ли он будет?
Князь Андрей сказал, что он не принадлежит к штабу светлейшего и тоже приезжий. Гусарский подполковник обратился к нарядному денщику, и денщик главнокомандующего сказал ему с той особенной презрительностью, с которой говорят денщики главнокомандующих с офицерами:
– Что, светлейший? Должно быть, сейчас будет. Вам что?
Гусарский подполковник усмехнулся в усы на тон денщика, слез с лошади, отдал ее вестовому и подошел к Болконскому, слегка поклонившись ему. Болконский посторонился на лавке. Гусарский подполковник сел подле него.
– Тоже дожидаетесь главнокомандующего? – заговорил гусарский подполковник. – Говог'ят, всем доступен, слава богу. А то с колбасниками беда! Недаг'ом Ег'молов в немцы пг'осился. Тепег'ь авось и г'усским говог'ить можно будет. А то чег'т знает что делали. Все отступали, все отступали. Вы делали поход? – спросил он.
– Имел удовольствие, – отвечал князь Андрей, – не только участвовать в отступлении, но и потерять в этом отступлении все, что имел дорогого, не говоря об именьях и родном доме… отца, который умер с горя. Я смоленский.
– А?.. Вы князь Болконский? Очень г'ад познакомиться: подполковник Денисов, более известный под именем Васьки, – сказал Денисов, пожимая руку князя Андрея и с особенно добрым вниманием вглядываясь в лицо Болконского. – Да, я слышал, – сказал он с сочувствием и, помолчав немного, продолжал: – Вот и скифская война. Это все хог'ошо, только не для тех, кто своими боками отдувается. А вы – князь Андг'ей Болконский? – Он покачал головой. – Очень г'ад, князь, очень г'ад познакомиться, – прибавил он опять с грустной улыбкой, пожимая ему руку.
Князь Андрей знал Денисова по рассказам Наташи о ее первом женихе. Это воспоминанье и сладко и больно перенесло его теперь к тем болезненным ощущениям, о которых он последнее время давно уже не думал, но которые все таки были в его душе. В последнее время столько других и таких серьезных впечатлений, как оставление Смоленска, его приезд в Лысые Горы, недавнее известно о смерти отца, – столько ощущений было испытано им, что эти воспоминания уже давно не приходили ему и, когда пришли, далеко не подействовали на него с прежней силой. И для Денисова тот ряд воспоминаний, которые вызвало имя Болконского, было далекое, поэтическое прошедшее, когда он, после ужина и пения Наташи, сам не зная как, сделал предложение пятнадцатилетней девочке. Он улыбнулся воспоминаниям того времени и своей любви к Наташе и тотчас же перешел к тому, что страстно и исключительно теперь занимало его. Это был план кампании, который он придумал, служа во время отступления на аванпостах. Он представлял этот план Барклаю де Толли и теперь намерен был представить его Кутузову. План основывался на том, что операционная линия французов слишком растянута и что вместо того, или вместе с тем, чтобы действовать с фронта, загораживая дорогу французам, нужно было действовать на их сообщения. Он начал разъяснять свой план князю Андрею.
– Они не могут удержать всей этой линии. Это невозможно, я отвечаю, что пг'ог'ву их; дайте мне пятьсот человек, я г'азог'ву их, это вег'но! Одна система – паг'тизанская.
Денисов встал и, делая жесты, излагал свой план Болконскому. В средине его изложения крики армии, более нескладные, более распространенные и сливающиеся с музыкой и песнями, послышались на месте смотра. На деревне послышался топот и крики.
– Сам едет, – крикнул казак, стоявший у ворот, – едет! Болконский и Денисов подвинулись к воротам, у которых стояла кучка солдат (почетный караул), и увидали подвигавшегося по улице Кутузова, верхом на невысокой гнедой лошадке. Огромная свита генералов ехала за ним. Барклай ехал почти рядом; толпа офицеров бежала за ними и вокруг них и кричала «ура!».
Вперед его во двор проскакали адъютанты. Кутузов, нетерпеливо подталкивая свою лошадь, плывшую иноходью под его тяжестью, и беспрестанно кивая головой, прикладывал руку к бедой кавалергардской (с красным околышем и без козырька) фуражке, которая была на нем. Подъехав к почетному караулу молодцов гренадеров, большей частью кавалеров, отдававших ему честь, он с минуту молча, внимательно посмотрел на них начальническим упорным взглядом и обернулся к толпе генералов и офицеров, стоявших вокруг него. Лицо его вдруг приняло тонкое выражение; он вздернул плечами с жестом недоумения.
– И с такими молодцами всё отступать и отступать! – сказал он. – Ну, до свиданья, генерал, – прибавил он и тронул лошадь в ворота мимо князя Андрея и Денисова.
– Ура! ура! ура! – кричали сзади его.
С тех пор как не видал его князь Андрей, Кутузов еще потолстел, обрюзг и оплыл жиром. Но знакомые ему белый глаз, и рана, и выражение усталости в его лице и фигуре были те же. Он был одет в мундирный сюртук (плеть на тонком ремне висела через плечо) и в белой кавалергардской фуражке. Он, тяжело расплываясь и раскачиваясь, сидел на своей бодрой лошадке.
– Фю… фю… фю… – засвистал он чуть слышно, въезжая на двор. На лице его выражалась радость успокоения человека, намеревающегося отдохнуть после представительства. Он вынул левую ногу из стремени, повалившись всем телом и поморщившись от усилия, с трудом занес ее на седло, облокотился коленкой, крякнул и спустился на руки к казакам и адъютантам, поддерживавшим его.
Он оправился, оглянулся своими сощуренными глазами и, взглянув на князя Андрея, видимо, не узнав его, зашагал своей ныряющей походкой к крыльцу.
– Фю… фю… фю, – просвистал он и опять оглянулся на князя Андрея. Впечатление лица князя Андрея только после нескольких секунд (как это часто бывает у стариков) связалось с воспоминанием о его личности.
– А, здравствуй, князь, здравствуй, голубчик, пойдем… – устало проговорил он, оглядываясь, и тяжело вошел на скрипящее под его тяжестью крыльцо. Он расстегнулся и сел на лавочку, стоявшую на крыльце.
– Ну, что отец?
– Вчера получил известие о его кончине, – коротко сказал князь Андрей.
Кутузов испуганно открытыми глазами посмотрел на князя Андрея, потом снял фуражку и перекрестился: «Царство ему небесное! Да будет воля божия над всеми нами!Он тяжело, всей грудью вздохнул и помолчал. „Я его любил и уважал и сочувствую тебе всей душой“. Он обнял князя Андрея, прижал его к своей жирной груди и долго не отпускал от себя. Когда он отпустил его, князь Андрей увидал, что расплывшие губы Кутузова дрожали и на глазах были слезы. Он вздохнул и взялся обеими руками за лавку, чтобы встать.
– Пойдем, пойдем ко мне, поговорим, – сказал он; но в это время Денисов, так же мало робевший перед начальством, как и перед неприятелем, несмотря на то, что адъютанты у крыльца сердитым шепотом останавливали его, смело, стуча шпорами по ступенькам, вошел на крыльцо. Кутузов, оставив руки упертыми на лавку, недовольно смотрел на Денисова. Денисов, назвав себя, объявил, что имеет сообщить его светлости дело большой важности для блага отечества. Кутузов усталым взглядом стал смотреть на Денисова и досадливым жестом, приняв руки и сложив их на животе, повторил: «Для блага отечества? Ну что такое? Говори». Денисов покраснел, как девушка (так странно было видеть краску на этом усатом, старом и пьяном лице), и смело начал излагать свой план разрезания операционной линии неприятеля между Смоленском и Вязьмой. Денисов жил в этих краях и знал хорошо местность. План его казался несомненно хорошим, в особенности по той силе убеждения, которая была в его словах. Кутузов смотрел себе на ноги и изредка оглядывался на двор соседней избы, как будто он ждал чего то неприятного оттуда. Из избы, на которую он смотрел, действительно во время речи Денисова показался генерал с портфелем под мышкой.
– Что? – в середине изложения Денисова проговорил Кутузов. – Уже готовы?
– Готов, ваша светлость, – сказал генерал. Кутузов покачал головой, как бы говоря: «Как это все успеть одному человеку», и продолжал слушать Денисова.
– Даю честное благородное слово гусского офицег'а, – говорил Денисов, – что я г'азог'ву сообщения Наполеона.
– Тебе Кирилл Андреевич Денисов, обер интендант, как приходится? – перебил его Кутузов.
– Дядя г'одной, ваша светлость.
– О! приятели были, – весело сказал Кутузов. – Хорошо, хорошо, голубчик, оставайся тут при штабе, завтра поговорим. – Кивнув головой Денисову, он отвернулся и протянул руку к бумагам, которые принес ему Коновницын.
– Не угодно ли вашей светлости пожаловать в комнаты, – недовольным голосом сказал дежурный генерал, – необходимо рассмотреть планы и подписать некоторые бумаги. – Вышедший из двери адъютант доложил, что в квартире все было готово. Но Кутузову, видимо, хотелось войти в комнаты уже свободным. Он поморщился…
– Нет, вели подать, голубчик, сюда столик, я тут посмотрю, – сказал он. – Ты не уходи, – прибавил он, обращаясь к князю Андрею. Князь Андрей остался на крыльце, слушая дежурного генерала.
Во время доклада за входной дверью князь Андрей слышал женское шептанье и хрустение женского шелкового платья. Несколько раз, взглянув по тому направлению, он замечал за дверью, в розовом платье и лиловом шелковом платке на голове, полную, румяную и красивую женщину с блюдом, которая, очевидно, ожидала входа влавввквмандующего. Адъютант Кутузова шепотом объяснил князю Андрею, что это была хозяйка дома, попадья, которая намеревалась подать хлеб соль его светлости. Муж ее встретил светлейшего с крестом в церкви, она дома… «Очень хорошенькая», – прибавил адъютант с улыбкой. Кутузов оглянулся на эти слова. Кутузов слушал доклад дежурного генерала (главным предметом которого была критика позиции при Цареве Займище) так же, как он слушал Денисова, так же, как он слушал семь лет тому назад прения Аустерлицкого военного совета. Он, очевидно, слушал только оттого, что у него были уши, которые, несмотря на то, что в одном из них был морской канат, не могли не слышать; но очевидно было, что ничто из того, что мог сказать ему дежурный генерал, не могло не только удивить или заинтересовать его, но что он знал вперед все, что ему скажут, и слушал все это только потому, что надо прослушать, как надо прослушать поющийся молебен. Все, что говорил Денисов, было дельно и умно. То, что говорил дежурный генерал, было еще дельнее и умнее, но очевидно было, что Кутузов презирал и знание и ум и знал что то другое, что должно было решить дело, – что то другое, независимое от ума и знания. Князь Андрей внимательно следил за выражением лица главнокомандующего, и единственное выражение, которое он мог заметить в нем, было выражение скуки, любопытства к тому, что такое означал женский шепот за дверью, и желание соблюсти приличие. Очевидно было, что Кутузов презирал ум, и знание, и даже патриотическое чувство, которое выказывал Денисов, но презирал не умом, не чувством, не знанием (потому что он и не старался выказывать их), а он презирал их чем то другим. Он презирал их своей старостью, своею опытностью жизни. Одно распоряжение, которое от себя в этот доклад сделал Кутузов, откосилось до мародерства русских войск. Дежурный редерал в конце доклада представил светлейшему к подписи бумагу о взысканий с армейских начальников по прошению помещика за скошенный зеленый овес.
Кутузов зачмокал губами и закачал головой, выслушав это дело.
– В печку… в огонь! И раз навсегда тебе говорю, голубчик, – сказал он, – все эти дела в огонь. Пуская косят хлеба и жгут дрова на здоровье. Я этого не приказываю и не позволяю, но и взыскивать не могу. Без этого нельзя. Дрова рубят – щепки летят. – Он взглянул еще раз на бумагу. – О, аккуратность немецкая! – проговорил он, качая головой.


– Ну, теперь все, – сказал Кутузов, подписывая последнюю бумагу, и, тяжело поднявшись и расправляя складки своей белой пухлой шеи, с повеселевшим лицом направился к двери.
Попадья, с бросившеюся кровью в лицо, схватилась за блюдо, которое, несмотря на то, что она так долго приготовлялась, она все таки не успела подать вовремя. И с низким поклоном она поднесла его Кутузову.
Глаза Кутузова прищурились; он улыбнулся, взял рукой ее за подбородок и сказал:
– И красавица какая! Спасибо, голубушка!
Он достал из кармана шаровар несколько золотых и положил ей на блюдо.
– Ну что, как живешь? – сказал Кутузов, направляясь к отведенной для него комнате. Попадья, улыбаясь ямочками на румяном лице, прошла за ним в горницу. Адъютант вышел к князю Андрею на крыльцо и приглашал его завтракать; через полчаса князя Андрея позвали опять к Кутузову. Кутузов лежал на кресле в том же расстегнутом сюртуке. Он держал в руке французскую книгу и при входе князя Андрея, заложив ее ножом, свернул. Это был «Les chevaliers du Cygne», сочинение madame de Genlis [«Рыцари Лебедя», мадам де Жанлис], как увидал князь Андрей по обертке.
– Ну садись, садись тут, поговорим, – сказал Кутузов. – Грустно, очень грустно. Но помни, дружок, что я тебе отец, другой отец… – Князь Андрей рассказал Кутузову все, что он знал о кончине своего отца, и о том, что он видел в Лысых Горах, проезжая через них.
– До чего… до чего довели! – проговорил вдруг Кутузов взволнованным голосом, очевидно, ясно представив себе, из рассказа князя Андрея, положение, в котором находилась Россия. – Дай срок, дай срок, – прибавил он с злобным выражением лица и, очевидно, не желая продолжать этого волновавшего его разговора, сказал: – Я тебя вызвал, чтоб оставить при себе.
– Благодарю вашу светлость, – отвечал князь Андрей, – но я боюсь, что не гожусь больше для штабов, – сказал он с улыбкой, которую Кутузов заметил. Кутузов вопросительно посмотрел на него. – А главное, – прибавил князь Андрей, – я привык к полку, полюбил офицеров, и люди меня, кажется, полюбили. Мне бы жалко было оставить полк. Ежели я отказываюсь от чести быть при вас, то поверьте…
Умное, доброе и вместе с тем тонко насмешливое выражение светилось на пухлом лице Кутузова. Он перебил Болконского:
– Жалею, ты бы мне нужен был; но ты прав, ты прав. Нам не сюда люди нужны. Советчиков всегда много, а людей нет. Не такие бы полки были, если бы все советчики служили там в полках, как ты. Я тебя с Аустерлица помню… Помню, помню, с знаменем помню, – сказал Кутузов, и радостная краска бросилась в лицо князя Андрея при этом воспоминании. Кутузов притянул его за руку, подставляя ему щеку, и опять князь Андрей на глазах старика увидал слезы. Хотя князь Андрей и знал, что Кутузов был слаб на слезы и что он теперь особенно ласкает его и жалеет вследствие желания выказать сочувствие к его потере, но князю Андрею и радостно и лестно было это воспоминание об Аустерлице.
– Иди с богом своей дорогой. Я знаю, твоя дорога – это дорога чести. – Он помолчал. – Я жалел о тебе в Букареште: мне послать надо было. – И, переменив разговор, Кутузов начал говорить о турецкой войне и заключенном мире. – Да, немало упрекали меня, – сказал Кутузов, – и за войну и за мир… а все пришло вовремя. Tout vient a point a celui qui sait attendre. [Все приходит вовремя для того, кто умеет ждать.] A и там советчиков не меньше было, чем здесь… – продолжал он, возвращаясь к советчикам, которые, видимо, занимали его. – Ох, советчики, советчики! – сказал он. Если бы всех слушать, мы бы там, в Турции, и мира не заключили, да и войны бы не кончили. Всё поскорее, а скорое на долгое выходит. Если бы Каменский не умер, он бы пропал. Он с тридцатью тысячами штурмовал крепости. Взять крепость не трудно, трудно кампанию выиграть. А для этого не нужно штурмовать и атаковать, а нужно терпение и время. Каменский на Рущук солдат послал, а я их одних (терпение и время) посылал и взял больше крепостей, чем Каменский, и лошадиное мясо турок есть заставил. – Он покачал головой. – И французы тоже будут! Верь моему слову, – воодушевляясь, проговорил Кутузов, ударяя себя в грудь, – будут у меня лошадиное мясо есть! – И опять глаза его залоснились слезами.
– Однако до лжно же будет принять сражение? – сказал князь Андрей.
– До лжно будет, если все этого захотят, нечего делать… А ведь, голубчик: нет сильнее тех двух воинов, терпение и время; те всё сделают, да советчики n'entendent pas de cette oreille, voila le mal. [этим ухом не слышат, – вот что плохо.] Одни хотят, другие не хотят. Что ж делать? – спросил он, видимо, ожидая ответа. – Да, что ты велишь делать? – повторил он, и глаза его блестели глубоким, умным выражением. – Я тебе скажу, что делать, – проговорил он, так как князь Андрей все таки не отвечал. – Я тебе скажу, что делать и что я делаю. Dans le doute, mon cher, – он помолчал, – abstiens toi, [В сомнении, мой милый, воздерживайся.] – выговорил он с расстановкой.
– Ну, прощай, дружок; помни, что я всей душой несу с тобой твою потерю и что я тебе не светлейший, не князь и не главнокомандующий, а я тебе отец. Ежели что нужно, прямо ко мне. Прощай, голубчик. – Он опять обнял и поцеловал его. И еще князь Андрей не успел выйти в дверь, как Кутузов успокоительно вздохнул и взялся опять за неконченный роман мадам Жанлис «Les chevaliers du Cygne».
Как и отчего это случилось, князь Андрей не мог бы никак объяснить; но после этого свидания с Кутузовым он вернулся к своему полку успокоенный насчет общего хода дела и насчет того, кому оно вверено было. Чем больше он видел отсутствие всего личного в этом старике, в котором оставались как будто одни привычки страстей и вместо ума (группирующего события и делающего выводы) одна способность спокойного созерцания хода событий, тем более он был спокоен за то, что все будет так, как должно быть. «У него не будет ничего своего. Он ничего не придумает, ничего не предпримет, – думал князь Андрей, – но он все выслушает, все запомнит, все поставит на свое место, ничему полезному не помешает и ничего вредного не позволит. Он понимает, что есть что то сильнее и значительнее его воли, – это неизбежный ход событий, и он умеет видеть их, умеет понимать их значение и, ввиду этого значения, умеет отрекаться от участия в этих событиях, от своей личной волн, направленной на другое. А главное, – думал князь Андрей, – почему веришь ему, – это то, что он русский, несмотря на роман Жанлис и французские поговорки; это то, что голос его задрожал, когда он сказал: „До чего довели!“, и что он захлипал, говоря о том, что он „заставит их есть лошадиное мясо“. На этом же чувстве, которое более или менее смутно испытывали все, и основано было то единомыслие и общее одобрение, которое сопутствовало народному, противному придворным соображениям, избранию Кутузова в главнокомандующие.


После отъезда государя из Москвы московская жизнь потекла прежним, обычным порядком, и течение этой жизни было так обычно, что трудно было вспомнить о бывших днях патриотического восторга и увлечения, и трудно было верить, что действительно Россия в опасности и что члены Английского клуба суть вместе с тем и сыны отечества, готовые для него на всякую жертву. Одно, что напоминало о бывшем во время пребывания государя в Москве общем восторженно патриотическом настроении, было требование пожертвований людьми и деньгами, которые, как скоро они были сделаны, облеклись в законную, официальную форму и казались неизбежны.
С приближением неприятеля к Москве взгляд москвичей на свое положение не только не делался серьезнее, но, напротив, еще легкомысленнее, как это всегда бывает с людьми, которые видят приближающуюся большую опасность. При приближении опасности всегда два голоса одинаково сильно говорят в душе человека: один весьма разумно говорит о том, чтобы человек обдумал самое свойство опасности и средства для избавления от нее; другой еще разумнее говорит, что слишком тяжело и мучительно думать об опасности, тогда как предвидеть все и спастись от общего хода дела не во власти человека, и потому лучше отвернуться от тяжелого, до тех пор пока оно не наступило, и думать о приятном. В одиночестве человек большею частью отдается первому голосу, в обществе, напротив, – второму. Так было и теперь с жителями Москвы. Давно так не веселились в Москве, как этот год.
Растопчинские афишки с изображением вверху питейного дома, целовальника и московского мещанина Карпушки Чигирина, который, быв в ратниках и выпив лишний крючок на тычке, услыхал, будто Бонапарт хочет идти на Москву, рассердился, разругал скверными словами всех французов, вышел из питейного дома и заговорил под орлом собравшемуся народу, читались и обсуживались наравне с последним буриме Василия Львовича Пушкина.
В клубе, в угловой комнате, собирались читать эти афиши, и некоторым нравилось, как Карпушка подтрунивал над французами, говоря, что они от капусты раздуются, от каши перелопаются, от щей задохнутся, что они все карлики и что их троих одна баба вилами закинет. Некоторые не одобряли этого тона и говорила, что это пошло и глупо. Рассказывали о том, что французов и даже всех иностранцев Растопчин выслал из Москвы, что между ними шпионы и агенты Наполеона; но рассказывали это преимущественно для того, чтобы при этом случае передать остроумные слова, сказанные Растопчиным при их отправлении. Иностранцев отправляли на барке в Нижний, и Растопчин сказал им: «Rentrez en vous meme, entrez dans la barque et n'en faites pas une barque ne Charon». [войдите сами в себя и в эту лодку и постарайтесь, чтобы эта лодка не сделалась для вас лодкой Харона.] Рассказывали, что уже выслали из Москвы все присутственные места, и тут же прибавляли шутку Шиншина, что за это одно Москва должна быть благодарна Наполеону. Рассказывали, что Мамонову его полк будет стоить восемьсот тысяч, что Безухов еще больше затратил на своих ратников, но что лучше всего в поступке Безухова то, что он сам оденется в мундир и поедет верхом перед полком и ничего не будет брать за места с тех, которые будут смотреть на него.
– Вы никому не делаете милости, – сказала Жюли Друбецкая, собирая и прижимая кучку нащипанной корпии тонкими пальцами, покрытыми кольцами.
Жюли собиралась на другой день уезжать из Москвы и делала прощальный вечер.
– Безухов est ridicule [смешон], но он так добр, так мил. Что за удовольствие быть так caustique [злоязычным]?
– Штраф! – сказал молодой человек в ополченском мундире, которого Жюли называла «mon chevalier» [мой рыцарь] и который с нею вместе ехал в Нижний.
В обществе Жюли, как и во многих обществах Москвы, было положено говорить только по русски, и те, которые ошибались, говоря французские слова, платили штраф в пользу комитета пожертвований.
– Другой штраф за галлицизм, – сказал русский писатель, бывший в гостиной. – «Удовольствие быть не по русски.
– Вы никому не делаете милости, – продолжала Жюли к ополченцу, не обращая внимания на замечание сочинителя. – За caustique виновата, – сказала она, – и плачу, но за удовольствие сказать вам правду я готова еще заплатить; за галлицизмы не отвечаю, – обратилась она к сочинителю: – у меня нет ни денег, ни времени, как у князя Голицына, взять учителя и учиться по русски. А вот и он, – сказала Жюли. – Quand on… [Когда.] Нет, нет, – обратилась она к ополченцу, – не поймаете. Когда говорят про солнце – видят его лучи, – сказала хозяйка, любезно улыбаясь Пьеру. – Мы только говорили о вас, – с свойственной светским женщинам свободой лжи сказала Жюли. – Мы говорили, что ваш полк, верно, будет лучше мамоновского.
– Ах, не говорите мне про мой полк, – отвечал Пьер, целуя руку хозяйке и садясь подле нее. – Он мне так надоел!
– Вы ведь, верно, сами будете командовать им? – сказала Жюли, хитро и насмешливо переглянувшись с ополченцем.
Ополченец в присутствии Пьера был уже не так caustique, и в лице его выразилось недоуменье к тому, что означала улыбка Жюли. Несмотря на свою рассеянность и добродушие, личность Пьера прекращала тотчас же всякие попытки на насмешку в его присутствии.
– Нет, – смеясь, отвечал Пьер, оглядывая свое большое, толстое тело. – В меня слишком легко попасть французам, да и я боюсь, что не влезу на лошадь…
В числе перебираемых лиц для предмета разговора общество Жюли попало на Ростовых.
– Очень, говорят, плохи дела их, – сказала Жюли. – И он так бестолков – сам граф. Разумовские хотели купить его дом и подмосковную, и все это тянется. Он дорожится.
– Нет, кажется, на днях состоится продажа, – сказал кто то. – Хотя теперь и безумно покупать что нибудь в Москве.
– Отчего? – сказала Жюли. – Неужели вы думаете, что есть опасность для Москвы?
– Отчего же вы едете?
– Я? Вот странно. Я еду, потому… ну потому, что все едут, и потом я не Иоанна д'Арк и не амазонка.
– Ну, да, да, дайте мне еще тряпочек.
– Ежели он сумеет повести дела, он может заплатить все долги, – продолжал ополченец про Ростова.
– Добрый старик, но очень pauvre sire [плох]. И зачем они живут тут так долго? Они давно хотели ехать в деревню. Натали, кажется, здорова теперь? – хитро улыбаясь, спросила Жюли у Пьера.
– Они ждут меньшого сына, – сказал Пьер. – Он поступил в казаки Оболенского и поехал в Белую Церковь. Там формируется полк. А теперь они перевели его в мой полк и ждут каждый день. Граф давно хотел ехать, но графиня ни за что не согласна выехать из Москвы, пока не приедет сын.
– Я их третьего дня видела у Архаровых. Натали опять похорошела и повеселела. Она пела один романс. Как все легко проходит у некоторых людей!
– Что проходит? – недовольно спросил Пьер. Жюли улыбнулась.
– Вы знаете, граф, что такие рыцари, как вы, бывают только в романах madame Suza.
– Какой рыцарь? Отчего? – краснея, спросил Пьер.
– Ну, полноте, милый граф, c'est la fable de tout Moscou. Je vous admire, ma parole d'honneur. [это вся Москва знает. Право, я вам удивляюсь.]
– Штраф! Штраф! – сказал ополченец.
– Ну, хорошо. Нельзя говорить, как скучно!
– Qu'est ce qui est la fable de tout Moscou? [Что знает вся Москва?] – вставая, сказал сердито Пьер.
– Полноте, граф. Вы знаете!
– Ничего не знаю, – сказал Пьер.
– Я знаю, что вы дружны были с Натали, и потому… Нет, я всегда дружнее с Верой. Cette chere Vera! [Эта милая Вера!]
– Non, madame, [Нет, сударыня.] – продолжал Пьер недовольным тоном. – Я вовсе не взял на себя роль рыцаря Ростовой, и я уже почти месяц не был у них. Но я не понимаю жестокость…
– Qui s'excuse – s'accuse, [Кто извиняется, тот обвиняет себя.] – улыбаясь и махая корпией, говорила Жюли и, чтобы за ней осталось последнее слово, сейчас же переменила разговор. – Каково, я нынче узнала: бедная Мари Волконская приехала вчера в Москву. Вы слышали, она потеряла отца?
– Неужели! Где она? Я бы очень желал увидать ее, – сказал Пьер.
– Я вчера провела с ней вечер. Она нынче или завтра утром едет в подмосковную с племянником.
– Ну что она, как? – сказал Пьер.
– Ничего, грустна. Но знаете, кто ее спас? Это целый роман. Nicolas Ростов. Ее окружили, хотели убить, ранили ее людей. Он бросился и спас ее…
– Еще роман, – сказал ополченец. – Решительно это общее бегство сделано, чтобы все старые невесты шли замуж. Catiche – одна, княжна Болконская – другая.
– Вы знаете, что я в самом деле думаю, что она un petit peu amoureuse du jeune homme. [немножечко влюблена в молодого человека.]
– Штраф! Штраф! Штраф!
– Но как же это по русски сказать?..


Когда Пьер вернулся домой, ему подали две принесенные в этот день афиши Растопчина.
В первой говорилось о том, что слух, будто графом Растопчиным запрещен выезд из Москвы, – несправедлив и что, напротив, граф Растопчин рад, что из Москвы уезжают барыни и купеческие жены. «Меньше страху, меньше новостей, – говорилось в афише, – но я жизнью отвечаю, что злодей в Москве не будет». Эти слова в первый раз ясно ыоказали Пьеру, что французы будут в Москве. Во второй афише говорилось, что главная квартира наша в Вязьме, что граф Витгснштейн победил французов, но что так как многие жители желают вооружиться, то для них есть приготовленное в арсенале оружие: сабли, пистолеты, ружья, которые жители могут получать по дешевой цене. Тон афиш был уже не такой шутливый, как в прежних чигиринских разговорах. Пьер задумался над этими афишами. Очевидно, та страшная грозовая туча, которую он призывал всеми силами своей души и которая вместе с тем возбуждала в нем невольный ужас, – очевидно, туча эта приближалась.
«Поступить в военную службу и ехать в армию или дожидаться? – в сотый раз задавал себе Пьер этот вопрос. Он взял колоду карт, лежавших у него на столе, и стал делать пасьянс.
– Ежели выйдет этот пасьянс, – говорил он сам себе, смешав колоду, держа ее в руке и глядя вверх, – ежели выйдет, то значит… что значит?.. – Он не успел решить, что значит, как за дверью кабинета послышался голос старшей княжны, спрашивающей, можно ли войти.
– Тогда будет значить, что я должен ехать в армию, – договорил себе Пьер. – Войдите, войдите, – прибавил он, обращаясь к княжие.
(Одна старшая княжна, с длинной талией и окаменелым лидом, продолжала жить в доме Пьера; две меньшие вышли замуж.)
– Простите, mon cousin, что я пришла к вам, – сказала она укоризненно взволнованным голосом. – Ведь надо наконец на что нибудь решиться! Что ж это будет такое? Все выехали из Москвы, и народ бунтует. Что ж мы остаемся?
– Напротив, все, кажется, благополучно, ma cousine, – сказал Пьер с тою привычкой шутливости, которую Пьер, всегда конфузно переносивший свою роль благодетеля перед княжною, усвоил себе в отношении к ней.
– Да, это благополучно… хорошо благополучие! Мне нынче Варвара Ивановна порассказала, как войска наши отличаются. Уж точно можно чести приписать. Да и народ совсем взбунтовался, слушать перестают; девка моя и та грубить стала. Этак скоро и нас бить станут. По улицам ходить нельзя. А главное, нынче завтра французы будут, что ж нам ждать! Я об одном прошу, mon cousin, – сказала княжна, – прикажите свезти меня в Петербург: какая я ни есть, а я под бонапартовской властью жить не могу.
– Да полноте, ma cousine, откуда вы почерпаете ваши сведения? Напротив…
– Я вашему Наполеону не покорюсь. Другие как хотят… Ежели вы не хотите этого сделать…
– Да я сделаю, я сейчас прикажу.
Княжне, видимо, досадно было, что не на кого было сердиться. Она, что то шепча, присела на стул.
– Но вам это неправильно доносят, – сказал Пьер. – В городе все тихо, и опасности никакой нет. Вот я сейчас читал… – Пьер показал княжне афишки. – Граф пишет, что он жизнью отвечает, что неприятель не будет в Москве.
– Ах, этот ваш граф, – с злобой заговорила княжна, – это лицемер, злодей, который сам настроил народ бунтовать. Разве не он писал в этих дурацких афишах, что какой бы там ни был, тащи его за хохол на съезжую (и как глупо)! Кто возьмет, говорит, тому и честь и слава. Вот и долюбезничался. Варвара Ивановна говорила, что чуть не убил народ ее за то, что она по французски заговорила…
– Да ведь это так… Вы всё к сердцу очень принимаете, – сказал Пьер и стал раскладывать пасьянс.
Несмотря на то, что пасьянс сошелся, Пьер не поехал в армию, а остался в опустевшей Москве, все в той же тревоге, нерешимости, в страхе и вместе в радости ожидая чего то ужасного.
На другой день княжна к вечеру уехала, и к Пьеру приехал его главноуправляющий с известием, что требуемых им денег для обмундирования полка нельзя достать, ежели не продать одно имение. Главноуправляющий вообще представлял Пьеру, что все эти затеи полка должны были разорить его. Пьер с трудом скрывал улыбку, слушая слова управляющего.
– Ну, продайте, – говорил он. – Что ж делать, я не могу отказаться теперь!
Чем хуже было положение всяких дел, и в особенности его дел, тем Пьеру было приятнее, тем очевиднее было, что катастрофа, которой он ждал, приближается. Уже никого почти из знакомых Пьера не было в городе. Жюли уехала, княжна Марья уехала. Из близких знакомых одни Ростовы оставались; но к ним Пьер не ездил.
В этот день Пьер, для того чтобы развлечься, поехал в село Воронцово смотреть большой воздушный шар, который строился Леппихом для погибели врага, и пробный шар, который должен был быть пущен завтра. Шар этот был еще не готов; но, как узнал Пьер, он строился по желанию государя. Государь писал графу Растопчину об этом шаре следующее:
«Aussitot que Leppich sera pret, composez lui un equipage pour sa nacelle d'hommes surs et intelligents et depechez un courrier au general Koutousoff pour l'en prevenir. Je l'ai instruit de la chose.
Recommandez, je vous prie, a Leppich d'etre bien attentif sur l'endroit ou il descendra la premiere fois, pour ne pas se tromper et ne pas tomber dans les mains de l'ennemi. Il est indispensable qu'il combine ses mouvements avec le general en chef».
[Только что Леппих будет готов, составьте экипаж для его лодки из верных и умных людей и пошлите курьера к генералу Кутузову, чтобы предупредить его.
Я сообщил ему об этом. Внушите, пожалуйста, Леппиху, чтобы он обратил хорошенько внимание на то место, где он спустится в первый раз, чтобы не ошибиться и не попасть в руки врага. Необходимо, чтоб он соображал свои движения с движениями главнокомандующего.]
Возвращаясь домой из Воронцова и проезжая по Болотной площади, Пьер увидал толпу у Лобного места, остановился и слез с дрожек. Это была экзекуция французского повара, обвиненного в шпионстве. Экзекуция только что кончилась, и палач отвязывал от кобылы жалостно стонавшего толстого человека с рыжими бакенбардами, в синих чулках и зеленом камзоле. Другой преступник, худенький и бледный, стоял тут же. Оба, судя по лицам, были французы. С испуганно болезненным видом, подобным тому, который имел худой француз, Пьер протолкался сквозь толпу.
– Что это? Кто? За что? – спрашивал он. Но вниманье толпы – чиновников, мещан, купцов, мужиков, женщин в салопах и шубках – так было жадно сосредоточено на то, что происходило на Лобном месте, что никто не отвечал ему. Толстый человек поднялся, нахмурившись, пожал плечами и, очевидно, желая выразить твердость, стал, не глядя вокруг себя, надевать камзол; но вдруг губы его задрожали, и он заплакал, сам сердясь на себя, как плачут взрослые сангвинические люди. Толпа громко заговорила, как показалось Пьеру, – для того, чтобы заглушить в самой себе чувство жалости.
– Повар чей то княжеский…
– Что, мусью, видно, русский соус кисел французу пришелся… оскомину набил, – сказал сморщенный приказный, стоявший подле Пьера, в то время как француз заплакал. Приказный оглянулся вокруг себя, видимо, ожидая оценки своей шутки. Некоторые засмеялись, некоторые испуганно продолжали смотреть на палача, который раздевал другого.
Пьер засопел носом, сморщился и, быстро повернувшись, пошел назад к дрожкам, не переставая что то бормотать про себя в то время, как он шел и садился. В продолжение дороги он несколько раз вздрагивал и вскрикивал так громко, что кучер спрашивал его:
– Что прикажете?
– Куда ж ты едешь? – крикнул Пьер на кучера, выезжавшего на Лубянку.
– К главнокомандующему приказали, – отвечал кучер.
– Дурак! скотина! – закричал Пьер, что редко с ним случалось, ругая своего кучера. – Домой я велел; и скорее ступай, болван. Еще нынче надо выехать, – про себя проговорил Пьер.
Пьер при виде наказанного француза и толпы, окружавшей Лобное место, так окончательно решил, что не может долее оставаться в Москве и едет нынче же в армию, что ему казалось, что он или сказал об этом кучеру, или что кучер сам должен был знать это.
Приехав домой, Пьер отдал приказание своему все знающему, все умеющему, известному всей Москве кучеру Евстафьевичу о том, что он в ночь едет в Можайск к войску и чтобы туда были высланы его верховые лошади. Все это не могло быть сделано в тот же день, и потому, по представлению Евстафьевича, Пьер должен был отложить свой отъезд до другого дня, с тем чтобы дать время подставам выехать на дорогу.
24 го числа прояснело после дурной погоды, и в этот день после обеда Пьер выехал из Москвы. Ночью, переменя лошадей в Перхушкове, Пьер узнал, что в этот вечер было большое сражение. Рассказывали, что здесь, в Перхушкове, земля дрожала от выстрелов. На вопросы Пьера о том, кто победил, никто не мог дать ему ответа. (Это было сражение 24 го числа при Шевардине.) На рассвете Пьер подъезжал к Можайску.
Все дома Можайска были заняты постоем войск, и на постоялом дворе, на котором Пьера встретили его берейтор и кучер, в горницах не было места: все было полно офицерами.
В Можайске и за Можайском везде стояли и шли войска. Казаки, пешие, конные солдаты, фуры, ящики, пушки виднелись со всех сторон. Пьер торопился скорее ехать вперед, и чем дальше он отъезжал от Москвы и чем глубже погружался в это море войск, тем больше им овладевала тревога беспокойства и не испытанное еще им новое радостное чувство. Это было чувство, подобное тому, которое он испытывал и в Слободском дворце во время приезда государя, – чувство необходимости предпринять что то и пожертвовать чем то. Он испытывал теперь приятное чувство сознания того, что все то, что составляет счастье людей, удобства жизни, богатство, даже самая жизнь, есть вздор, который приятно откинуть в сравнении с чем то… С чем, Пьер не мог себе дать отчета, да и ее старался уяснить себе, для кого и для чего он находит особенную прелесть пожертвовать всем. Его не занимало то, для чего он хочет жертвовать, но самое жертвование составляло для него новое радостное чувство.


24 го было сражение при Шевардинском редуте, 25 го не было пущено ни одного выстрела ни с той, ни с другой стороны, 26 го произошло Бородинское сражение.
Для чего и как были даны и приняты сражения при Шевардине и при Бородине? Для чего было дано Бородинское сражение? Ни для французов, ни для русских оно не имело ни малейшего смысла. Результатом ближайшим было и должно было быть – для русских то, что мы приблизились к погибели Москвы (чего мы боялись больше всего в мире), а для французов то, что они приблизились к погибели всей армии (чего они тоже боялись больше всего в мире). Результат этот был тогда же совершении очевиден, а между тем Наполеон дал, а Кутузов принял это сражение.
Ежели бы полководцы руководились разумными причинами, казалось, как ясно должно было быть для Наполеона, что, зайдя за две тысячи верст и принимая сражение с вероятной случайностью потери четверти армии, он шел на верную погибель; и столь же ясно бы должно было казаться Кутузову, что, принимая сражение и тоже рискуя потерять четверть армии, он наверное теряет Москву. Для Кутузова это было математически ясно, как ясно то, что ежели в шашках у меня меньше одной шашкой и я буду меняться, я наверное проиграю и потому не должен меняться.
Когда у противника шестнадцать шашек, а у меня четырнадцать, то я только на одну восьмую слабее его; а когда я поменяюсь тринадцатью шашками, то он будет втрое сильнее меня.
До Бородинского сражения наши силы приблизительно относились к французским как пять к шести, а после сражения как один к двум, то есть до сражения сто тысяч; ста двадцати, а после сражения пятьдесят к ста. А вместе с тем умный и опытный Кутузов принял сражение. Наполеон же, гениальный полководец, как его называют, дал сражение, теряя четверть армии и еще более растягивая свою линию. Ежели скажут, что, заняв Москву, он думал, как занятием Вены, кончить кампанию, то против этого есть много доказательств. Сами историки Наполеона рассказывают, что еще от Смоленска он хотел остановиться, знал опасность своего растянутого положения знал, что занятие Москвы не будет концом кампании, потому что от Смоленска он видел, в каком положении оставлялись ему русские города, и не получал ни одного ответа на свои неоднократные заявления о желании вести переговоры.
Давая и принимая Бородинское сражение, Кутузов и Наполеон поступили непроизвольно и бессмысленно. А историки под совершившиеся факты уже потом подвели хитросплетенные доказательства предвидения и гениальности полководцев, которые из всех непроизвольных орудий мировых событий были самыми рабскими и непроизвольными деятелями.
Древние оставили нам образцы героических поэм, в которых герои составляют весь интерес истории, и мы все еще не можем привыкнуть к тому, что для нашего человеческого времени история такого рода не имеет смысла.
На другой вопрос: как даны были Бородинское и предшествующее ему Шевардинское сражения – существует точно так же весьма определенное и всем известное, совершенно ложное представление. Все историки описывают дело следующим образом:
Русская армия будто бы в отступлении своем от Смоленска отыскивала себе наилучшую позицию для генерального сражения, и таковая позиция была найдена будто бы у Бородина.
Русские будто бы укрепили вперед эту позицию, влево от дороги (из Москвы в Смоленск), под прямым почти углом к ней, от Бородина к Утице, на том самом месте, где произошло сражение.
Впереди этой позиции будто бы был выставлен для наблюдения за неприятелем укрепленный передовой пост на Шевардинском кургане. 24 го будто бы Наполеон атаковал передовой пост и взял его; 26 го же атаковал всю русскую армию, стоявшую на позиции на Бородинском поле.
Так говорится в историях, и все это совершенно несправедливо, в чем легко убедится всякий, кто захочет вникнуть в сущность дела.
Русские не отыскивали лучшей позиции; а, напротив, в отступлении своем прошли много позиций, которые были лучше Бородинской. Они не остановились ни на одной из этих позиций: и потому, что Кутузов не хотел принять позицию, избранную не им, и потому, что требованье народного сражения еще недостаточно сильно высказалось, и потому, что не подошел еще Милорадович с ополчением, и еще по другим причинам, которые неисчислимы. Факт тот – что прежние позиции были сильнее и что Бородинская позиция (та, на которой дано сражение) не только не сильна, но вовсе не есть почему нибудь позиция более, чем всякое другое место в Российской империи, на которое, гадая, указать бы булавкой на карте.
Русские не только не укрепляли позицию Бородинского поля влево под прямым углом от дороги (то есть места, на котором произошло сражение), но и никогда до 25 го августа 1812 года не думали о том, чтобы сражение могло произойти на этом месте. Этому служит доказательством, во первых, то, что не только 25 го не было на этом месте укреплений, но что, начатые 25 го числа, они не были кончены и 26 го; во вторых, доказательством служит положение Шевардинского редута: Шевардинский редут, впереди той позиции, на которой принято сражение, не имеет никакого смысла. Для чего был сильнее всех других пунктов укреплен этот редут? И для чего, защищая его 24 го числа до поздней ночи, были истощены все усилия и потеряно шесть тысяч человек? Для наблюдения за неприятелем достаточно было казачьего разъезда. В третьих, доказательством того, что позиция, на которой произошло сражение, не была предвидена и что Шевардинский редут не был передовым пунктом этой позиции, служит то, что Барклай де Толли и Багратион до 25 го числа находились в убеждении, что Шевардинский редут есть левый фланг позиции и что сам Кутузов в донесении своем, писанном сгоряча после сражения, называет Шевардинский редут левым флангом позиции. Уже гораздо после, когда писались на просторе донесения о Бородинском сражении, было (вероятно, для оправдания ошибок главнокомандующего, имеющего быть непогрешимым) выдумано то несправедливое и странное показание, будто Шевардинский редут служил передовым постом (тогда как это был только укрепленный пункт левого фланга) и будто Бородинское сражение было принято нами на укрепленной и наперед избранной позиции, тогда как оно произошло на совершенно неожиданном и почти не укрепленном месте.
Дело же, очевидно, было так: позиция была избрана по реке Колоче, пересекающей большую дорогу не под прямым, а под острым углом, так что левый фланг был в Шевардине, правый около селения Нового и центр в Бородине, при слиянии рек Колочи и Во йны. Позиция эта, под прикрытием реки Колочи, для армии, имеющей целью остановить неприятеля, движущегося по Смоленской дороге к Москве, очевидна для всякого, кто посмотрит на Бородинское поле, забыв о том, как произошло сражение.
Наполеон, выехав 24 го к Валуеву, не увидал (как говорится в историях) позицию русских от Утицы к Бородину (он не мог увидать эту позицию, потому что ее не было) и не увидал передового поста русской армии, а наткнулся в преследовании русского арьергарда на левый фланг позиции русских, на Шевардинский редут, и неожиданно для русских перевел войска через Колочу. И русские, не успев вступить в генеральное сражение, отступили своим левым крылом из позиции, которую они намеревались занять, и заняли новую позицию, которая была не предвидена и не укреплена. Перейдя на левую сторону Колочи, влево от дороги, Наполеон передвинул все будущее сражение справа налево (со стороны русских) и перенес его в поле между Утицей, Семеновским и Бородиным (в это поле, не имеющее в себе ничего более выгодного для позиции, чем всякое другое поле в России), и на этом поле произошло все сражение 26 го числа. В грубой форме план предполагаемого сражения и происшедшего сражения будет следующий:

Ежели бы Наполеон не выехал вечером 24 го числа на Колочу и не велел бы тотчас же вечером атаковать редут, а начал бы атаку на другой день утром, то никто бы не усомнился в том, что Шевардинский редут был левый фланг нашей позиции; и сражение произошло бы так, как мы его ожидали. В таком случае мы, вероятно, еще упорнее бы защищали Шевардинский редут, наш левый фланг; атаковали бы Наполеона в центре или справа, и 24 го произошло бы генеральное сражение на той позиции, которая была укреплена и предвидена. Но так как атака на наш левый фланг произошла вечером, вслед за отступлением нашего арьергарда, то есть непосредственно после сражения при Гридневой, и так как русские военачальники не хотели или не успели начать тогда же 24 го вечером генерального сражения, то первое и главное действие Бородинского сражения было проиграно еще 24 го числа и, очевидно, вело к проигрышу и того, которое было дано 26 го числа.