Главная страница

С. В. Вабищевич инженерпрограммист компании ооо ск хайникс мемори солюшнс Восточная Европа


Скачать 1.28 Mb.
НазваниеС. В. Вабищевич инженерпрограммист компании ооо ск хайникс мемори солюшнс Восточная Европа
Дата22.11.2021
Размер1.28 Mb.
Формат файлаpdf
Имя файлаKositsin.pdf
ТипУчебно-методическое пособие
#278468
страница2 из 9
1   2   3   4   5   6   7   8   9
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’)
‘str’>
Важно! Поскольку 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,
randomstatistics с версии 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 для открытия файла в специфичной кодировке или для кодирования и декодирования строк следует использовать функ- ции модуля
1   2   3   4   5   6   7   8   9


написать администратору сайта