Информационные технологииStfw.Ru 🔍

Неформальное введение в Python

🕛 11.07.2009, 13:11
В следующих примерах ввод и вывод различаются наличием или отсутствием приглашения ('>>> ' или '... '): для воспроизведения примера Вам следует после появления приглашения набрать весь следующий за приглашением текст. Строки в примере, не начинающиеся с приглашения, выдаются самим интерпретатором. Обратите внимание, что наличие в строке только вторичного приглашения в примерах означает, что Вы должны ввести пустую строку - таким образом в интерактивном режиме обозначается конец многострочных команд.

Многие примеры в книге, даже если они вводятся в интерактивном режиме, снабжены комментариями. Комментарии в языке Python начинаются с символа '#' и продолжаются до конца строки. Комментарий может начинаться в начале строки или после кода, но не внутри строковых выражений. Символ '#' в строковом выражении является всего лишь символом '#'.

Несколько примеров:

# это первый комментарий
SPAM = 1 # а это второй # ... и, наконец, третий!
STRING = "# Это не комментарий."
Использование интерпретатора Python в качестве калькулятора

Давайте испробуем несколько простых команд Python. Запустите интерпретатор и дождитесь появления первичного приглашения '>>> ' (это не должно занять много времени.)
3.1.1. Числа

Интерпретатор работает как простой калькулятор: Вы можете набрать выражение, и он выведет результат. Синтаксис выражений прост: операторы +, -, * и / работают, как и в большинстве других языков (например, в Pascal и C). Для группирования можно использовать скобки. Например:

>>> 2+2
4
>>> # Это комментарий
... 2+2
4
>>> 2+2 # Комментарий в той же строке, что и код
4
>>> (50-5*6)/4
5
>>> # При целочисленном делении результат округляется в
... # меньшую сторону:
... 7/3
2
>>> 7/-3
-3

Подобно С, знак равенства ('=') используется для присваивания значения переменной. Присвоенное значение при этом не выводится:

>>> width = 20
>>> height = 5*9
>>> width * height
900

Значение можно присвоить одновременно нескольким переменным:

>>> x = y = z = 0 # Переменным x, y и z присваивается 0
>>> x
0
>>> y
0
>>> z
0

Имеется полная поддержка чисел с плавающей точкой. Операторы со смешанными типами операндов преобразуют целый операнд в число с плавающей точкой:

>>> 4 * 2.5 / 3.3
3.0303030303030303
>>> 7.0 / 2
3.5

Также поддерживаются и комплексные числа. Мнимая часть записывается с суффиксом 'j' или 'J'. Комплексные числа записываются как '(real+imagj)' или могут быть созданы функцией 'complex(real, imag)'.

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)

Комплексные числа представляются двумя числами с плавающей точкой - действительной и мнимой частью. Чтобы извлечь эти части из комплексного числа z, используйте z.real and z.imag.

>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5

Функции преобразования к целому числу и числу с плавающей точкой (int(), long() и float()) не работают для комплексных чисел - такое преобразование неоднозначно. Используйте abs(z) для получения абсолютного значения и z.real для получения вещественной части.

>>> a=1.5+0.5j
>>> float(a)
Traceback (innermost last):
File "<stdin>", line 1, in ?
TypeError: can't convert complex to float; use e.g.
abs(z)
>>> a.real
1.5
>>> abs(a)
1.5811388300841898

В интерактивном режиме последнее выведенное значение сохраняется в переменной _. Это позволяет использовать Python в качестве настольного калькулятора, например:

>>> tax = 17.5 / 100
>>> price = 3.50
>>> price * tax
0.61249999999999993
>>> price + _
4.1124999999999998
>>> print round(_, 2)
4.11

Пользователь должен обращаться с ней как с переменной, доступной только для чтения. Не присваивайте ей значение явно - Вы создадите независимую локальную переменную с таким же именем, сделав встроенную переменную недоступной.
3.1.2. Строки

Кроме чисел, Python также может работать со строками (string), которые могут быть записаны различными путями. В настоящее время Python считает печатными 7-битное подмножество символов. Представление же остальных символов выводится с использованием управляющих последовательностей, что делает работу в интерактивном режиме, например, с русским языком неудобной. По этой причине текст в некоторых примерах данной книги оставлен без перевода. Они могут быть заключены в одинарные или двойные кавычки:
>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'

Длинные строковые выражения могут быть разбиты различными способами на несколько строк. Символ новой строки может быть "спрятан" с помощью обратной косой черты ('\'), например:

hello = "Это длинное строковое выражение, содержащее\n\
несколько строк текста, как Вы бы это сделали в C.\n\ Обратите внимание, что пробелы в\ начале строки\nимеют значение.\n"
print hello

Результат будет следующим:

Это длинное строковое выражение, содержащее
несколько строк текста, как Вы бы это сделали в C. Обратите внимание, что пробелы в начале строки
имеют значение.

По-другому, текст может быть заключен в утроенные кавычки: """ или '''. Концы строк не нужно "прятать" при использовании утроенных кавычек, но они будут включены в текст.

print """
Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to
"""

выведет следующее:

Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to

Интерпретатор выводит результат строковых операций в том же виде, в котором они могли бы быть набраны: в кавычках, обходя кавычки и другие специальные символы с помощью управляющих последовательностей, начинающихся с обратной косой черты ('\'). Текст заключается в двойные кавычки, если он не содержит двойные кавычки, во всех остальных случаях, он выводится в одинарных кавычках. Инструкция print, описанная ниже, может быть использована для вывода текста без кавычек и специальных последовательностей.

Существует также "необрабатываемый" режим ввода строк, задаваемый с помощью буквы 'r' или 'R' перед кавычками: в этом случае символ обратной косой черты также может быть использован для маскировки символов одинарной и двойной кавычек, если им предшествует нечетное число символов обратной косой черты, однако сам символ обратной косой черты остается частью строки. Даже в таком режиме строка не может заканчиваться нечетным количеством символов обратной косой черты. Необрабатываемый режим наиболее полезен в тех случаях, когда необходимо вводить значительное количество символов обратной косой черты, например, в регулярных выражениях.

Строки можно объединить (склеить) с помощью оператора + и размножить оператором *:

>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
'<HelpAHelpAHelpAHelpAHelpA>'

Две строки, записанные друг за другом, автоматически объединяются. Первая строка в приведенном примере может быть также записана как 'word = 'Help' 'A''. Такой метод работает только для строк записанных непосредственно, но не для произвольных строковых выражений.

>>> 'str' 'ing' # Правильно
'string'
>>> 'str'.strip() + 'ing' # Правильно
'string'
>>> 'str'.strip() 'ing' # Ошибка File "<stdin>", line 1 'str'.strip() 'ing' ^
SyntaxError: invalid syntax

Строка - последовательность символов с произвольным доступом, Вы можете получить любой символ строки по его индексу. Подобно C, первый символ имеет индекс 0. Нет отдельного типа для символа, символ - это просто строка единичной длины. Подобно Icon, подстрока может быть определена с помощью среза - двух индексов, разделенных двоеточием.

>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'

Строки в языке Python невозможно изменить. Попытка изменить символ в определенной позиции или подстроку вызовет ошибку:

>>> word[0] = 'x'
Traceback (innermost last): File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> word[:-1] = 'Splat'
Traceback (innermost last): File "<stdin>", line 1, in ?
TypeError: object doesn't support slice assignment

Индексы среза имеют полезные значения по умолчанию: опущенный первый индекс считается равным 0, опущенный второй индекс дает такой же результат, как если бы он был равен длине строки.

>>> word[:2] # Первые два символа
'He'
>>> word[2:] # Вся строка, кроме первых двух символов
'lpA'

Полезный инвариант операции среза: s[:i] + s[i:] равно s.

>>> word[:2] + word[2:]
'HelpA'
>>> word[:3] + word[3:]
'HelpA'

Срезы с вырожденными индексами обрабатываются изящно: слишком большой индекс обрабатывается, как если бы он был равен длине строки; если верхняя граница меньше нижней, то возвращается пустая строка.

>>> word[1:100]
'elpA'
>>> word[10:]
''
>>> word[2:1]
''

Индексы могут иметь отрицательные значения, для отсчета с конца:

>>> word[-1] # Последний символ
'A'
>>> word[-2] # Преджпоследний символ
'p'
>>> word[-2:] # Последние два символа
'pA'
>>> word[:-2] # Кроме последних двух символов
'Hel'

Однако -0 обозначает то же самое, что и 0, то есть не будет отсчитываться с конца.

>>> word[-0] # (так как -0 равен 0)
'H'

Отрицательные индексы в срезах выходящие за пределы обрабатываются, как если бы они были равны нулю, но не пытайтесь использовать это для простых индексов (с одним элементом):

>>> word[-100:]
'HelpA'
>>> word[-10] # Ошибка
Traceback (innermost last): File "<stdin>", line 1
IndexError: string index out of range

Лучший способ запомнить, как определяются индексы в срезе - считать их указывающими между символами, с номером 0 на левой границе первого символа. А правая граница последнего символа имеет индекс равный длине строки, например:
H e l p A 0 1 2 3 4 5
-5 -4 -3 -2 -1

Первая строка чисел показывает позиции в строке, на которые указывают индексы от 0 до 5, вторая - соответствующие отрицательные индексы. Срез от i до j включает в себя все символы между краями, помеченными i и j, соответственно.

Для неотрицательных индексов длина подстроки равняется разности индексов, если они оба не выходят за пределы диапазона, например, длина подстроки word[1:3] равна 2.

Встроенная функция len() возвращает длину строки:

>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
Строки Unicode

Начиная с версии 1.6, в языке Python доступен новый тип данных для хранения текста - строка Unicode. Его можно использовать для работы с текстом, содержащим одновременно буквы и символы нескольких языков, доступных в Unicode (см. http://www.unicode.org). Строки Unicode полностью интегрируется с обычными строками, автоматически производя, где это необходимо, преобразование.

Unicode имеет значительное преимущество - предоставляет возможность использовать все символы, используемые в современных и древних текстах. Ранее мы могли использовать только 256 символов из определенной кодовой страницы, что приводило к большим затруднениям, особенно при интернационализации (internationalization, обычно записывается как i18n - i + 18 символов + n) программного обеспечения. Unicode решает эту проблему, определяя одну кодовую страницу для всех символов.

Создаются строки Unicode настолько же просто, как и обычные строки:

>>> u'Hello World !'
u'Hello World !'

Маленькая буква 'u' перед кавычками указывает, что предполагается создание строки Unicode. Если Вы хотите включить в строку специальные символы, используйте управляющие последовательности:

>>> u'Hello\u0020World !'
u'Hello World !'

Управляющая последовательность \u0020 указывает, что необходимо вставить Unicode символ с порядковым номером в шестнадцатеричной системе исчисления 0x0020 (пробел).

Благодаря тому, что первые 256 символов Unicode те же, что и в стандартной кодировке Latin-1, ввод текста на большинстве языков, используемых в западных странах, сильно упрощается.

Как и для обычных строк, для строк Unicode существует "необрабатываемый" режим, задаваемый с помощью буквы 'r' или 'R' перед кавычками. Управляющими считаются только последовательности, которые применяются для обозначения символов Unicode, и только если используется нечетное количество символов обратной косой черты перед буквой 'u':

>>> ur'Hello\u0020World !'
u'Hello World !'
>>> ur'Hello\\u0020World !'
u'Hello\\\\u0020World !'

Кроме описанного выше метода, Python предоставляет возможность создать строку Unicode на основе строки в известной кодировке. Встроенная функция unicode() может работать с Latin-1, ASCII, UTF-8, UTF-16, с русскими кодировками ISO-8859-5, KOI8-R, CP1251, CP866 и Mac-cyrillic, и многими другими. Python по умолчанию использует кодировку ASCII (ASCII является общей частью для подавляющего большинства кодировок. Вы можете изменить кодировку по умолчанию с помощью функции sys.set_string_encoding(). Однако лучше все же указывать ее явно.), например, при выводе на экран инструкцией print и записи в файл. Если у Вас есть данные в определенной кодировке, для получения строки Unicode используйте встроенную функцию unicode(), указав кодировку в качестве второго аргумента:

>>> s = unicode("Привет", "KOI8-R")
>>> s
u'\u041F\u0440\u0438\u0432\u0435\u0442'

Если строка Unicode содержит символы с кодом больше 127, преобразование в ASCII не возможно:

>>> str(s)
Traceback (most recent call last): File "<stdin>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in
range(128)

Метод encode() позволяет преобразовывать строки Unicode в обычные строки, содержащие текст в указанной кодировке:

>>> s.encode("KOI8-R")
'\360\322\311\327\305\324'
>>> s.encode("UTF-8")
'\320\237\321\200\320\270\320\262\320\265\321\202'

Списки

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

>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]

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

>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boe!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam',
'eggs', 100, 'Boe!']

В отличие от строк, которые неизменяемы (immutable), существует возможность изменения отдельных элементов списка:

>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]

Присваивание срезу также возможно, и это может привести к изменению размера списка:

>>> # Заменить несколько элементов:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # удалить:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Вставить:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Вставить копию самого себя в начало:
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy',
1234]

Встроенная функция len() также применима и к спискам:

>>> len(a)
8

Списки могут быть вложенными (списки, содержащие другие списки), например:

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']

Как Вы уже, наверное, догадались, метод append() добавляет элемент в конец списка. Заметьте, что p[1] и q на самом деле ссылаются на один и тот же объект!

Python   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉