С. В. Вабищевич инженерпрограммист компании ооо ск хайникс мемори солюшнс Восточная Европа
Скачать 1.28 Mb.
|
if a < 0: # first way >>> b = –a >>> elif a > 0: >>> b = a 14 >>> else: >>> b = 0 >>> >>> b = a if a >= 0 else -a # second way >>> >>> b = abs(a) # third way Особенности условного оператора следующие: – конструкция elif равносильна else if; – тернарный условный оператор перед if содержит значение, ко- торое будет возвращено, если условие истинно, а после else – если условие ложно. Конструкция switch языка C в Python заменяется на if- elif-…- -else. Напоминание. Наличие else в условиях с большим количеством веток elif крайне рекомендуется. Так, если значения, которые про- веряются в одной из веток elif, изменятся, будет явно выполнен код, который находится в ветке else. Это должна быть либо инструкция pass, либо выражение, которым бросается исключение. Замечание. Инструкция pass является аналогом пустого тела некоторого блока – функции, условного выражения, цикла, класса. ЦИКЛ WHILE Оператор цикла while рассмотрим на следующем примере. Пусть необходимо с консоли считать пользовательский ввод, интер- претировать его как целое, проверить, что число больше 20, и произ- вести при этом не более 5 попыток. Если количество попыток боль- ше, сообщить об этом пользователю. >>> attempt_count = 0 >>> max_attempt_count = 5 >>> while attempt_count < max_attempt_count: >>> # convert from str to int >>>x = int(input(‘enter an integer: ’)) >>> if x > 20: >>> break >>>attempt_count += 1 >>> else: # if cycle hasn’t been broken >>>print(‘expected integer has not been received’ >>> ‘ after%d attempts’% max_attempt_count) 15 Следует обратить внимание на функцию ввода с консоли input, а также преобразование строки к числу вызовом int. Инструкция else применима в связке не только с if, но и с ин- струкциями for, while (циклы) и try (блок исключения). Важно! Код в блоке else при инструкциях for и while выполнит- ся в том случае, если цикл был прерван, когда условие стало ложным или итерирование прошло по всем элементам, но не был преждев- ременно прерван инструкцией break. В языке Python есть две управляющие инструкции – break и continue, которые позволяют прервать итерирование или перей- ти к следующей итерации. А ниже приведен пример бесконечного цикла. >>> while True: # infinite loop >>> pass ЦИКЛ FOR Для итерирования по коллекциям и, вообще говоря, по любым объектам, по которым допустимо итерирование, исполь- зуется цикл for. Следует отметить, что в нем не нужно поддерживать индекс операции (счетчик). >>> for i in range(1, 5, 2): >>> print(i, i + 1, end=‘ ’) 1 2 3 4 Здесь функция range генерирует последовательность чисел от од- ного (start) до пяти (end, не включительно) с шагом два (step). Пара- метр end у функции print служит для задания символа окончания вывода. Здесь вместо переноса строки используется пробел. Напоминание. Крайне нежелательно изменять итерируемый объект (здесь – range) в теле цикла! Если попытаться удалять эле- менты из списка, по которому идет итерирование, могут не удалить- ся все нужные объекты из- за изменения итератора, а также прои- зойти исключение. Замечание. В Python 3.x range возвращает генератор – объект, который не хранит всю последовательность. В Python 2.x для это- го следует использовать функцию xrange, а функция range вернет список. 16 БАЗОВЫЙ СИНТАКСИС ФУНКЦИЙ Для определения функции в языке Python используется инструкция def. Ни тип аргументов, ни тип возвращаемого значе- ния не указывается. >>> def print_hello(): >>> print(‘hello’) >>> >>> print_hello() hello >>> def get_greetings(name=‘Bob’): >>> return ‘Hello, ’ + name >>> print(get_greetings(‘Alex’)) Hello, Alex Обратите внимание на возможность опустить инструкцию return в функции. Пустая функция или функция с оператором return без аргумента возвращает специальный объект None. >>> def empty(): >>> return Можно вернуть из функции также сразу несколько (кортеж) зна- чений: >>> def multiple(): >>> return 1, 2 Узнать тип объекта, в том числе того, который вернула функция, можно, вызвав функцию type: >>> type(‘hello’) Важно! Поскольку Python динамически типизированный, воз- вращать из функции значения разных типов при разных значениях входных аргументов не рекомендуется. Единственным исключени- ем является значение None. ВСТРОЕННЫЕ ФУНКЦИИ Посмотреть доступные переменные, а также глобальные функции можно, вызвав функцию dir: 17 – просмотр встроенных объектов (функций, исключений и т. п.): >>> dir() – просмотр атрибутов и методов некоторого объекта: >>> dir(object) Глобально доступны основные функции работы с числами и стро- ками. Вот некоторые из них: – bin, oct, hex – преобразуют число в строку в заданной систе- ме счисления; – ord, chr – преобразуют Unicode- символ (UCS 2) в числовой код и обратно; – bool, int, str – стандартные типы, могут использоваться для преобразования типов; – abs, sum, round, min, max, pow, divmod – общие математиче- ские функции: >>> max(1, 3, 4, 2) # max([1, 3, 4, 2]) 4 Помимо доступных глобально в стандартной библиотеке Python есть прочие математические модули: math, cmath, decimal, fractions, random (и statistics с версии Python 3.4). 2.4. СПИСКИ Список представляет собой изменяемую последователь- ность объектов. Из нее можно удалять элементы, добавлять новые, изменять элементы по индексу. Создать список можно следующим образом: >>> x = list() >>> y = [] Замечание. Второй вариант работает чуть быстрее из- за особен- ностей реализации интерпретатора. Добавить элементы можно с помощью следующих методов и операторов: >>> x.append(v) >>> x.insert(idx, v) 18 >>> x += >>> x.extend(iterable) Метод append добавляет элемент в конец списка, insert – по про- извольному индексу (список копируется, чтобы расшириться), ме- тод extend и оператор += добавляют элементы в конец списка из iterable – произвольного итерируемого объекта, например друго- го списка или кортежа. К элементам списков можно обращаться по индексу >>> x[idx] Можно устанавливать новое значение элементу списка >>> x[idx] = v Допускаются также отрицательные индексы. На примере списка из одного элемента обращения ниже эквивалентны. >>> x = [100] >>> x[0] == x[len(x) – 1] == x[–1] True Обращение по отрицательному индексу приводит к обращению, в котором этот индекс увеличен на длину коллекции (см. пример). Указание индекса «–1» полезно для взятия последнего элемента. Некорректные индексы порождают исключение IndexError. Удаление элементов производится с помощью методов pop (по индексу), remove (по значению), а также инструкции del. >>> x.pop(idx) >>> x.remove(v) >>> del x[idx] Список можно отсортировать или развернуть, не создавая при этом новый объект: >>> x.sort() >>> x.reverse() Вопрос: какая сортировка используется? Ответ представлен в конце главы. Проверить присутствие элемента в коллекции можно с помощью следующих методов: – index (возвращает индекс элемента или бросает исключение ValueError); 19 – count (подсчитать количество элементов с таким значением); – инструкций in и not in (проверяют наличие элемента и возвра- щают булево значение) >>> x.index(v) >>> x.count(v) >>> v in x Допустимо неявное преобразование списка к bool. Оно реали- зовано таким образом, что список интерпретируется как False, если его длина равна нулю, и True иначе. >>> bool([]) # False Списки можно сравнивать. Сравнение происходит лексикогра- фически. >>> [1, 2, 3] > [1, 2, 1] True Вопрос: какой будет результат сравнения списков [1, 2] и [2]? Вопрос: что будет, если сравнить список со строкой? Списки можно умножать: >>> [1] * 5 == [1, 1, 1, 1, 1] True Получить отсортированную копию списка можно, вызвав функ- цию sorted(x). Она является встроенной глобальной функцией (built- in) и поддерживает аргумент key для сортировки сложных типов. Развернуть список можно, вызвав встроенную (built- in) функцию reversed(x). Она возвращает итератор, который позволит обойти элементы в обратном порядке. 2.5. КОРТЕЖИ Кортеж – это неизменяемая последовательность объек- тов. Отличие от списка в том, что кортеж не допускает присваива- ния по индексу, добавления, вставки и удаления элементов, а также сортировку и обращение порядка. Методы у кортежа такие же, как у списка, за исключением всех методов, изменяющих порядок или структуру объекта. 20 Создать кортеж можно следующими способами: >>> x = (1, 2, 3) # or just x = 1, 2, 3 >>> y = tuple([5, 6, 7]) К кортежу применим оператор +=, однако при выполнении соз- дается новый кортеж, содержащий все элементы. x += 1, 2 # (1, 2, 3, 1, 2) Замечание. Кортеж создается при указании элементов через за- пятую, а потому скобки можно опустить. Однако это неверно для не- которых синтаксических конструкций, где запятая играет иную роль (например, инструкция assert или raise (в Python 2.x)). Кортеж из одного элемента и пустой кортеж создаются следую- щим образом: >>> empty_tuple = () >>> empty_tuple = tuple() >>> one_item_tuple = (1,) 2.6. СЛОВАРИ И МНОЖЕСТВА ОПРЕДЕЛЕНИЕ И СОЗДАНИЕ СЛОВАРЕЙ Словарь отражает связь «ключ- значение». Словари в Python реализованы как hash- таблица (ассоциативный массив пар). Вопрос: какая хеш- функция используется? Создание пустого словаря возможно двумя способами: >>> empty_dict = {} >>> empty_dict = dict() Создание словаря, содержащего элементы, возможно из пар ключ- значение либо с помощью специального синтаксиса: >>> x = dict([(0, 6), (1, 7), (2, 8)]) >>> y = {2: 8, 1: 7, 0: 6} ОСОБЕННОСТИ ХЕШИРОВАНИЯ Следует обратить внимание: не все объекты могут быть ключом словаря. Поскольку словари являются хеш- таблицами, ключи 21 должны быть хешируемыми. Для получения значения хеша по клю- чу можно вызвать встроенную функцию hash. >>> hash([1, 2, 3]) # raise TypeError! Из встроенных типов невозможно хешировать изменяемые типы – list, set и dict. Хеши некоторых ключей могут совпадать. >>> hash(1) == hash(True) True При попытке создать словарь, в котором присутствует несколь- ко ключей, имеющих одинаковый хеш, в словаре останется только один такой элемент. Ключ элемента при этом будет тот, который был объявлен первым: >>> x = {1: ‘a’, True: ‘b’, 1.0: ‘c’} >>> assert x == {1: ‘c’} МЕТОДЫ РАБОТЫ СО СЛОВАРЯМИ Словари допускают получение значения по ключу. Метод get-словаря позволяет задать значение по умолчанию, которое бу- дет возвращено, если такого ключа нет. >>> x[key] >>> x.get(key, default) Для присваивания элемента используют обращение по индек- су, метод setdefault (позволяет указать значение по умолчанию, которое будет выставлено, только если такого ключа нет в сло- варе) и метод update (обновляет словарь значениями из друго- го словаря): >>> x[key] = value >>> x.setdefault(key, default) >>> x.update(other_dict) Для удаления элемента по ключу используют метод pop или ин- струкцию del. Для очистки словаря используется метод clear. Обра- тите внимание, что метод pop содержит аргумент default, что позво- ляет избежать проверки на наличие ключа в словаре и просто указать значение по умолчанию. 22 >>> x.pop(key, default) >>> del x[key] >>> x.clear() Проверка принадлежности ключа словарю выполняется с помо- щью инструкций in и not in: >>> key in x Для итерирования по словарям в Python 2.x есть следующие ме- тоды: – keys(), values(), items() – возвращают списки ключей, значений и пар ключ- значение; – iterkeys(), itervalues(), iteritems() – возвращают, соответствен- но, итераторы; – viewkeys(), viewvalues(), viewitems() – возвращают view- объекты. В Python 3.x методы keys(), values() и items() возвращают view- объекты. Такие объекты отражают изменения в исходной коллекции. Отличие view- объектов от итераторов в том, что если создать пе- ременную итератор, модифицировать словарь и попытаться вос- пользоваться сохраненным итератором, произойдет исключение. Для view- объектов такие действия будут корректны, однако моди- фицировать словарь во время итерирования по нему по- прежнему не рекомендуется. Замечание. Словари не гарантируют порядок обхода. В Python 3.5 словари были улучшены, но гарантия одинакового обхода при многократных вызовах все равно не дается. Словари также можно сравнивать на равенство. 2.7. МНОЖЕСТВА ОПРЕДЕЛЕНИЕ И СОЗДАНИЕ МНОЖЕСТВ Множества ( set) являются набором некоторых элементов, в котором порядок неважен. Все элементы должны быть хешируе- мы, как и в словарях. Для множества есть его неизменяемый аналог – frozenset. Не- которую аналогию можно провести с аналогом tuple для типа list. >>> x = set() >>> x_frozen = frozenset() 23 Неизменяемые множества ( frozenset) в отличие от обычных можно хешировать: >>> hash(frozenset()) # все хорошо >>> hash(set()) # raise TypeError! Создание множеств возможно с помощью специального синтак- сиса, а также с помощью вызова функции set. >>>x = set([1, 2, 3]) >>> x = {1, 2, 3} МЕТОДЫ РАБОТЫ С МНОЖЕСТВАМИ Для добавления элемента используется метод add: >>> x.add(key) Для удаления элемента используются методы remove (броса- ет исключение, если элемент отсутствует), discard (перед удалени- ем проверяет наличие элемента), clear (удаляет все элементы мно- жества): >>> x.remove(key) >>> x.discard(key) >>> x.clear() Проверка принадлежности, как и в других коллекциях, происхо- дит с помощью инструкций in и not in: >>> key in x Над множествами допустимы логические операции: – пересечение: >>> x & y >>> x.intersection(y) >>> x &= y >>> x.insersection_update(y) – объединение: >>> x | y >>> x.union(y) >>> x |= y >>> x.update(y) 24 – разность: >>> x – y >>> x.difference(y) >>> x -= y >>> x.difference_update(y) Также доступны проверка вхождения одного множества в другое (методы issubset, issuperset) и симметрическая разность множеств ( ^, symmetric_difference). 2.8. ФАЙЛЫ Для открытия файлов используется стандартная функция open. Она возвращает объект- обертку над C-указателем на файло- вый дескриптор. >>> f = open(“path_to_file”) # file object >>> # some actions >>> f.close() Замечание. В Python 3.x для корректной работы с Unicode и раз- деления бинарных данных и текстовых была переработана иерархия классов- оберток над файловыми дескрипторами, систематизирован весь протокол работы с файлами и потоками. Подробнее можно по- читать на странице документации модуля io 1 . Полезным в этом мо- дуле может быть файловый буффер StringIO (в Python 2 этот класс расположен отдельно). Если произойдет исключение в коде до метода close, файл не бу- дет закрыт. Можно обработать это исключение, но лучше использо- вать менеджер контекстов (context manager): >>> with open(“path_to_file”) as f: >>> # some actions Рассмотрим подробнее функцию open. Она принимает следую- щие параметры: – path_to_file – путь к файлу, который нужно открыть; – mode – способ обращения с файлом: «r» (чтение), «w» (запись), «a» (запись в конец), «b» (открыть в бинарном режиме), «t» (открыть в текстовом режиме) и их комбинации; 1 https ://docs.python.org/3/library/io.html 25 – buffering – размер буфера при чтении или записи; – encoding – кодировка файла (только в Python 3.x). Поскольку файлы, по сути, являются последовательностью байтов, их интерпретация зависит от кодировки. А потому важно указывать параметр «encoding» со значением «utf-8» в случае работы с Unicode. В Python 2.x для открытия файла в специфичной кодировке или для кодирования и декодирования строк следует использовать функ- ции модуля |