12323
Комментарий:
|
15914
|
Удаления помечены так. | Добавления помечены так. |
Строка 64: | Строка 64: |
'''Групповое связывание'''. Связывание может быть групповым, когда слева и справа от «=» стоят последовательности (причём «слева» может быть не одно): {{{#!python >>> a=x,y=3,5 >>> a (3, 5) >>> x 3 >>> y 5 }}} Более того, эти последовательности автоматически распаковываются: {{{#!python >>> c=["QQ",3,[12,34],(1,5,6)] >>> (s,t),n,(x,y),l=c >>> s 'Q' >>> t 'Q' >>> x 12 >>> y 34 >>> l (1, 5, 6) }}} === «Математические» сравнения === Конструкции вида «'''a < b < c'''» в Питоне могут быть произвольной длины и обозначают многоместные сравнения в «математическом стиле» (в большинстве языков указанный пример читался бы как сравнение результата '''a<b''' с '''c'''. |
|
Строка 99: | Строка 129: |
=== Универсалные логические выражения === * /!\ Нулевой объект класса * /!\ Частичное вычисление `AND` и `OR` |
=== Универсальные логические выражения === В Питоне любой объект может быть параметром операторов `if` и `while`, а также булевских операций `and`, `or` и `not`. Обычно одно значение объекта любого класса может считаться «ложью» (такой объект называется нулевым), остальные — «истиной». Нулевыми являются численные нули, пустые последовательности и словари и т. п., а также все объекты, имеющие метод `.__bool__()`, у которых он возвращает `False`. '''Частичное вычисление'''. Операция `not объект` возвращает `True` или `False`, в зависимости от того, является ли объект нулевым, или нет. Операции `оббъект1 and объкет2` и `объект1 or объект2` возвращают `объект1` или `объект2` по следующим правилам: || A '''or''' B|| B нулевой || B ненулевой || || А нулевой || B || B || || А ненулевой || A || A || То есть «если A ненулевой, результат A, иначе B» || A '''and''' B|| B нулевой || B ненулевой || || А нулевой || A || A || || А ненулевой || B || B || То есть «если A нулевой, результат A, иначе B» В обои случаях есть ситуация, при которой '''B''' не вычисляется. === Циклические конструкторы === /!\ |
Строка 115: | Строка 162: |
* (Паскаль) Питон различает большие и маленькие буквы. | |
Строка 119: | Строка 167: |
* (Си) Хотя в Питоне есть конструкция вида «'''a=b=c'''», операция «'''='''» не является, как в Си, арифметической, и её нельзя использовать в выражениях. * (Паскаль) Операции `and`, `or` и `not` имеют более низкий приоритет, чем арифметические и операции сравнения, поэтому выражение вида `a>0 and b+c<0` не требует скобок. Побитовые операции в Питоне обозначаются так же, как в Си: «'''&'''», «'''|'''» и «'''~'''». |
|
Строка 138: | Строка 188: |
* /!\ тернарные операции | |
Строка 143: | Строка 194: |
* В Питоне больше, чем с Си и Паскале, конструкций языка и встроенных типов, некоторые из них нужны не сразу | * В Питоне больше, чем с Си и Паскале, конструкций языка и встроенных типов, некоторые из них нужны не сразу (например, `assert` или `with`) |
Особенности ЯП Python3
Базовые особенности
Python2 и Python3
Имеется два похожих языка программирования с разным синтаксисом — Pythoh2 и Python3. Python2 — более новый язык, из которого выброшено то, что показалось неудачным в Python2
Интерпретатор
Python — интерпретируемый язык, поэтому очень много ошибок возникает в процессе выполнения, а не в момент лексического/синтаксического анализа. Например, наличие или отсутствие имени в пространстве видимости проверяется в момент использования этого имени:
1 Python 2.7.8 (default, Nov 20 2014, 14:29:22)
2 [GCC 4.9.2 20141101 (ALT Linux 4.9.2-alt1)] on linux2
3 Type "help", "copyright", "credits" or "license" for more information.
4 >>> a*2
5 Traceback (most recent call last):
6 File "<stdin>", line 1, in <module>
7 NameError: name 'a' is not defined
8 >>> a=2
9 >>> a*2
10 4
Значащие отступы
Вместо операторных скобок используется одинаковый отступ всех операторов в блоке (это называется «блок с отступом»).
Достоинство: практически любую программу можно прочесть. Недостаток: надо избегать использования символов табуляции.
Связывание
Значение любого питоновского выражения — это объект. Объект можно связать с помощью имени или в качестве элемента составного объекта. Основная операция связывания — это «=». В примере создаётся два объекта: один с одной связью (именем), другой — с четырьмя (три имени и участие в списке).
Удалить объект в Питоне нельзя. Операция del удаляет одну связь. Если эта связь — последняя, объект становится недоступен. В удобный для Питона момент придёт сборщик мусора gc и зачистит занимаемую объектом память.
Все связи равноправны. Если объект модифицируем, его можно изменить, обращаясь к любой.
Групповое связывание. Связывание может быть групповым, когда слева и справа от «=» стоят последовательности (причём «слева» может быть не одно):
Более того, эти последовательности автоматически распаковываются:
«Математические» сравнения
Конструкции вида «a < b < c» в Питоне могут быть произвольной длины и обозначают многоместные сравнения в «математическом стиле» (в большинстве языков указанный пример читался бы как сравнение результата a<b с c.
«Списки»
Тип данных «list» в питоне — это динамический массив связей. Тип объекта может быть любым, но поскольку любая связь имеет одинаковое внутреннее представление, сложность индексации в объекте типа list — O(1). Динамическая реогранизация массива при его значительном увеличении/уменьшении происходит прозрачно для программиста.
Словари
На первый взгляд словари выглядят как массивы, у которых вместо индекса можно писать любой константный питоновсткий объект. На самом деле это — хеш-таблицы, использующие целочисленное значение функции hash(объект) для связывания объекта. Словари не упорядочены.
Множество внутренних структур самого Питона (например, пространства имён), реализованы с помощью словарей.
Цикл с итерируемым объектом
Цикл for переменная in последовательность в Питоне — не просто цикл по последовательности, и тем более — не просто цикл со счётчиком. Роль последовательности может играть любой итерируемый объект (т. е. имеющий метод .__iter__()). Помимо списков итерируемыми являются, например, словарь и файл:
В примере с файлом обратите внимание на удвоение переводов строк: итерация по файлу эквивалентна последовательному вызову метода .readline() (прочесть строку), который возвращает очередную строку целиком, вместе с концевым символом перевода строк, а функция print() при печати добавляет ещё один.
Выражения как суперпозиция методов
Все выражения с объектами можно воспринимать как «синтаксический сахар», удобную форму записи вызова соответствующий методов (они называются «специальными»). Например, a+b превращается в a.__add__(b), причём если при вычислении возникает исключение, то попытка продолжается с помощью b.__radd__(a).
Неявная динамическая типизация (duck typing)
Тип объекта в Питоне всегда строго определён — это класс, экземпляром которого объект является (этот класс возвращает, например, type(объект)). Но в пространстве имён нет никаких привязок к типам
Универсальные логические выражения
В Питоне любой объект может быть параметром операторов if и while, а также булевских операций and, or и not. Обычно одно значение объекта любого класса может считаться «ложью» (такой объект называется нулевым), остальные — «истиной».
Нулевыми являются численные нули, пустые последовательности и словари и т. п., а также все объекты, имеющие метод .__bool__(), у которых он возвращает False.
Частичное вычисление. Операция not объект возвращает True или False, в зависимости от того, является ли объект нулевым, или нет. Операции оббъект1 and объкет2 и объект1 or объект2 возвращают объект1 или объект2 по следующим правилам:
A or B |
B нулевой |
B ненулевой |
А нулевой |
B |
B |
А ненулевой |
A |
A |
То есть «если A ненулевой, результат A, иначе B»
A and B |
B нулевой |
B ненулевой |
А нулевой |
A |
A |
А ненулевой |
B |
B |
То есть «если A нулевой, результат A, иначе B»
В обои случаях есть ситуация, при которой B не вычисляется.
Циклические конструкторы
Наличие современных программных конструкций
Исключения как средство управления вычислениями
Повторно-входимые функции
Декораторы
Контексты
Динамическая объектная модель
…
Строки документации
…
Сравнение с другими языками
Паскаль и Си
- (Паскаль) Питон различает большие и маленькие буквы.
- У имён объектов нет типов, потому что они — не переменные, а просто именованные связи. Считается плохим тоном программирования использовать одно и то же имя для объектов разного типа.
- Действительное отличие подхода «имя == связь» от подхода «имя == переменная» заметно только на изменяемых объектах, для константных же (чисел, строк) именованные связи ведут себя совершенно так же, как переменные без типа.
(Паскаль) Нет разделения на функции и процедуры, функция без return возвращает None, возвращаемое значение любой функции можно не использовать.
(Паскаль) Как и в Си, в Питоне «==» — это сравнение, а «=» — присваивание
(Си) Хотя в Питоне есть конструкция вида «a=b=c», операция «=» не является, как в Си, арифметической, и её нельзя использовать в выражениях.
(Паскаль) Операции and, or и not имеют более низкий приоритет, чем арифметические и операции сравнения, поэтому выражение вида a>0 and b+c<0 не требует скобок. Побитовые операции в Питоне обозначаются так же, как в Си: «&», «|» и «~».
(Си) В питоне, как в Си, есть операции изменения объекта (например, «+=» — прибавление). Разумеется, изменяться может только неконстантный объект (например, список), для константного объекта (число, строка) результат такой операции — новый объект, результат вычисления выражения. В приведённом примере в результате прибавления списочный объект остаётся тем же, а целочисленный меняется на другой.
тернарные операции
- Передача параметров в функции происходит строго по соиспользованию. Это значит, что фактическими параметрами функции являются объекты (возможно, только что вычисленные), для них создаются имена в локальном пространстве имён функции, а при выходе из функции эти имена уничтожаются. Копирования данных не происходит. В Си передача данных строго по значению (передача данных по ссылке имитируется передачей указателя на объект). В паскале передача данных либо по значению, либо по ссылке (указывается явно).
Частичное вычисление AND и OR (см. выше) как в Си, но значение — не булевское
- Структуры (записи) как отдельные конструкции в Питоне не выделены. Логически — это просто объекты, у которых нет методов.
Структуры (записи) как последовательности байтов, в которые упакованы объекты разного типа, в синтаксис не встроены, поддерживаются модулем strcut
Массивы как последовательности байтов, представляющие собой последовательности данных одного типа, встречаются и используются в Питоне редко. Есть встроенные типы bytearray/bytes, выделенный модуль array. Самые мощные массивы реализованы в стороннем пакете NumPy.
В Питоне больше, чем с Си и Паскале, конструкций языка и встроенных типов, некоторые из них нужны не сразу (например, assert или with)