Различия между версиями 4 и 5
Версия 4 от 2015-06-08 20:46:32
Размер: 9796
Редактор: FrBrGeorge
Комментарий:
Версия 5 от 2015-06-08 22:06:38
Размер: 11154
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 67: Строка 67:
На первый взгляд словари выглядят как массивы, у которых вместо индекса можно писать любой константный питоновсткий объект. На самом деле это — хеш-таблицы, использующие целочисленное значение функции `hash(объект)` для связывания объекта. Множество внутренних структур самого Питона (например, пространства имён), реализованы с помощью словарей. На первый взгляд словари выглядят как массивы, у которых вместо индекса можно писать любой константный питоновсткий объект. На самом деле это — хеш-таблицы, использующие целочисленное значение функции `hash(объект)` для связывания объекта. Словари не упорядочены.

Множество внутренних структур самого Питона (например, пространства имён), реализованы с помощью словарей.
Строка 69: Строка 71:
Цикл `for переменная in последовательность` в Питоне — не просто цикл по последовательности, и тем более — не просто цикл со счётчиком. Роль `последовательности` может играть любой итерируемый объект (т. е. имеющий метод `.__iter__()`). Помимо списков итерируемыми являются, например, словарь и файл:
{{{#!python
>>> d={1:"QQ", 222:"abc", (1,"TTT"): 2}
>>> for k in d:
... print(k)
...
1
222
(1, 'TTT')
}}}

В примере с файлом обратите внимание на удвоение переводов строк: итерация пио файлу эквивалентна последовательному вызову метода `.readline()` (прочесть строку), который возвращает очередную строку целиком, вместе с концевым символом переводя строк, а функция `print()` при печати добавляет ещё один.
{{{#!python
>>> for line in open("file.txt"):
... print(line)
...
First line

Second line

Third line

}}}
Строка 70: Строка 95:

Особенности ЯП 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

Значащие отступы

Вместо операторных скобок используется одинаковый отступ всех операторов в блоке (это называется «блок с отступом»).

   1 for i in range(10):
   2     n = 3*i**2 + 2*i + 7
   3     print (i,n)
   4 print "Done"

Достоинство: практически любую программу можно прочесть. Недостаток: надо избегать использования символов табуляции.

Связывание

Значение любого питоновского выражения — это объект. Объект можно связать с помощью имени или в качестве элемента составного объекта. Основная операция связывания — это «=». В примере создаётся два объекта: один с одной связью (именем), другой — с четырьмя (три имени и участие в списке).

   1 >>> a=b=[1,"QQ",2]
   2 >>> c=b
   3 >>> e=[234,678,b]
   4 >>> d=[1,"QQ",2]
   5 >>> id(a), id(b), id(c), id(d), id(e[2])
   6 (139945032097664, 139945032097664, 139945032097664, 139945032132440, 139945032097664)

Удалить объект в Питоне нельзя. Операция del удаляет одну связь. Если эта связь — последняя, объект становится недоступен.

   1 >>> del a
   2 >>> a
   3 Traceback (most recent call last):
   4   File "<stdin>", line 1, in <module>
   5 NameError: name 'a' is not defined
   6 >>> c
   7 [1, 'QQ', 2]

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

   1 >>> c[1]="ZZZZZ"
   2 >>> e[2]
   3 [1, 'ZZZZZ', 2]
   4 >>> b
   5 [1, 'ZZZZZ', 2]

«Списки»

Тип данных «list» в питоне — это динамический массив связей. Тип объекта может быть любым, но поскольку любая связь имеет одинаковое внутреннее представление, сложность индексации в объекте типа list — O(1). Динамическая реогранизация массива при его значительном увеличении/уменьшении происходит прозрачно для программиста.

Словари

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

Множество внутренних структур самого Питона (например, пространства имён), реализованы с помощью словарей.

Цикл с итерируемым объектом

Цикл for переменная in последовательность в Питоне — не просто цикл по последовательности, и тем более — не просто цикл со счётчиком. Роль последовательности может играть любой итерируемый объект (т. е. имеющий метод .__iter__()). Помимо списков итерируемыми являются, например, словарь и файл:

   1 >>> d={1:"QQ", 222:"abc", (1,"TTT"): 2}
   2 >>> for k in d:
   3 ...   print(k)
   4 ... 
   5 1
   6 222
   7 (1, 'TTT')

В примере с файлом обратите внимание на удвоение переводов строк: итерация пио файлу эквивалентна последовательному вызову метода .readline() (прочесть строку), который возвращает очередную строку целиком, вместе с концевым символом переводя строк, а функция print() при печати добавляет ещё один.

   1 >>> for line in open("file.txt"):
   2 ...   print(line)
   3 ... 
   4 First line
   5 
   6 Second line
   7 
   8 Third line

Неявная динамическая типизация (duck typing)

Универсалные логические выражения

  • Нулевой объект класса
  • Частичное вычисление AND и OR

Наличие современных программных конструкций

  • Исключения как средство управления вычислениями
  • Повторно-входимые функции
  • Декораторы
  • Контексты

Динамическая объектная модель

Выражения как суперпозиция методов

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

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

Паскаль и Си

  • У имён объектов нет типов, потому что они — не переменные, а просто именованные связи. Считается плохим тоном программирования использовать одно и то же имя для объектов разного типа.
  • Действительное отличие подхода «имя == связь» от подхода «имя == переменная» начинается
  • (Паскаль) Нет разделения на функции и процедуры, функция без return возвращает None, возвращаемое значение любой функции можно не использовать.

  • (Паскаль) Как и в Си, в Питоне «==» — это сравнение, а «=» — присваивание

  • (Си) В питоне, как в Си, есть операции изменения объекта (например, «+=» — прибавление). Разумеется, изменяться может только неконстантный объект (например, список), для константного объекта (число, строка) результат такой операции — новый объект, результат вычисления выражения. В приведённом примере в результате прибавления списочный объект остаётся тем же, а целочисленный меняется на другой.

       1 >>> a=[1,2,"QQ"]
       2 >>> id(a)
       3 140178647658648
       4 >>> a+=["NN",1.234]
       5 >>> a
       6 [1, 2, 'QQ', 'NN', 1.234]
       7 >>> id(a)
       8 140178647658648
       9 >>> b=3
      10 >>> id(b)
      11 6398248
      12 >>> b+=7
      13 >>> b
      14 10
      15 >>> id(b)
      16 6398080
    
  • Передача параметров в функции происходит строго по соиспользованию. Это значит, что фактическими параметрами функции являются объекты (возможно, только что вычисленные), для них создаются имена в локальном пространстве имён функции, а при выходе из функции эти имена уничтожаются. Копирования данных не происходит. В Си передача данных строго по значению (передача данных по ссылке имитируется передачей указателя на объект). В паскале передача данных либо по значению, либо по ссылке (указывается явно).
  • Частичное вычисление AND и OR (см. выше) как в Си, но значение — не булевское

  • Структуры (записи) как отдельные конструкции в Питоне не выделены. Логически — это просто объекты, у которых нет методов.
  • Структуры (записи) как последовательности байтов, в которые упакованы объекты разного типа, в синтаксис не встроены, поддерживаются модулем strcut

  • Массивы как последовательности байтов, представляющие собой последовательности данных одного типа, встречаются и используются в Питоне редко. Есть встроенные типы bytearray/bytes, выделенный модуль array. Самые мощные массивы реализованы в стороннем пакете NumPy.

  • В Питоне больше, чем с Си и Паскале, конструкций языка и встроенных типов, некоторые из них нужны не сразу

Python/Features (последним исправлял пользователь FrBrGeorge 2016-11-02 22:28:07)