Самоучитель PythonВыпуск 2Дмитрий Мусинмая 07, 2017
Скачать 0.74 Mb.
|
Методы словарей dict.clear() - очищает словарь. dict.copy() - возвращает копию словаря. classmethod dict.fromkeys(seq[, value]) - создает словарь с ключами из seq и значением value (по умолчанию None). dict.get(key[, default]) - возвращает значение ключа, но если его нет, не бросает исключе- ние, а возвращает default (по умолчанию None). dict.items() - возвращает пары (ключ, значение). dict.keys() - возвращает ключи в словаре. dict.pop(key[, default]) - удаляет ключ и возвращает значение. Если ключа нет, возвращает default (по умолчанию бросает исключение). 17.1. Методы словарей 58 Самоучитель Python, Выпуск 0.2 dict.popitem() - удаляет и возвращает пару (ключ, значение). Если словарь пуст, бросает исключение KeyError. Помните, что словари неупорядочены. dict.setdefault(key[, default]) - возвращает значение ключа, но если его нет, не бросает ис- ключение, а создает ключ с значением default (по умолчанию None). dict.update([other]) - обновляет словарь, добавляя пары (ключ, значение) из other. Суще- ствующие ключи перезаписываются. Возвращает None (не новый словарь!). dict.values() - возвращает значения в словаре. 17.1. Методы словарей 59 Глава 18 Множества (set и frozenset) Доброго времени суток! Сегодня я расскажу о работе с множествами в python, операциях над ними и покажу примеры их применения. Что такое множество? Множество в python - “контейнер”, содержащий не повторяющиеся элементы в случай- ном порядке. Создаём множества: >>> a = set () >>> a set() >>> a = set ( 'hello' ) >>> a {'h', 'o', 'l', 'e'} >>> a = { 'a' , 'b' , 'c' , 'd' } >>> a {'b', 'c', 'a', 'd'} >>> a = {i ** 2 for i in range ( 10 )} # генератор множеств >>> a {0, 1, 4, 81, 64, 9, 16, 49, 25, 36} >>> a = {} # А так нельзя! >>> type (a) Как видно из примера, множества имеет тот же литерал, что и словарь , но пустое множе- ство с помощью литерала создать нельзя. 60 Самоучитель Python, Выпуск 0.2 Множества удобно использовать для удаления повторяющихся элементов: >>> words = [ 'hello' , 'daddy' , 'hello' , 'mum' ] >>> set (words) {'hello', 'daddy', 'mum'} С множествами можно выполнять множество операций: находить объединение, пересе- чение... • len(s) - число элементов в множестве (размер множества). • x in s - принадлежит ли x множеству s. • set.isdisjoint(other) - истина, если set и other не имеют общих элементов. • set == other - все элементы set принадлежат other, все элементы other принадлежат set. • set.issubset(other) или set <= other - все элементы set принадлежат other. • set.issuperset(other) или set >= other - аналогично. • set.union(other, ...) или set | other | ... - объединение нескольких множеств. • set.intersection(other, ...) или set & other & ... - пересечение. • set.difference(other, ...) или set - other - ... - множество из всех элементов set, не при- надлежащие ни одному из other. • set.symmetric_difference(other); set ^ other - множество из элементов, встречающих- ся в одном множестве, но не встречающиеся в обоих. • set.copy() - копия множества. И операции, непосредственно изменяющие множество: • set.update(other, ...); set |= other | ... - объединение. • set.intersection_update(other, ...); set &= other & ... - пересечение. • set.difference_update(other, ...); set -= other | ... - вычитание. • set.symmetric_difference_update(other); set ^= other - множество из элементов, встре- чающихся в одном множестве, но не встречающиеся в обоих. • set.add(elem) - добавляет элемент в множество. • set.remove(elem) - удаляет элемент из множества. KeyError, если такого элемента не существует. • set.discard(elem) - удаляет элемент, если он находится в множестве. • set.pop() - удаляет первый элемент из множества. Так как множества не упорядоче- ны, нельзя точно сказать, какой элемент будет первым. • set.clear() - очистка множества. 18.1. Что такое множество? 61 Самоучитель Python, Выпуск 0.2 frozenset Единственное отличие set от frozenset заключается в том, что set - изменяемый тип дан- ных, а frozenset - нет. Примерно похожая ситуация с списками и кортежами >>> a = set ( 'qwerty' ) >>> b = frozenset ( 'qwerty' ) >>> a == b True >>> True True >>> type (a - b) >>> type (a | b) >>> a add( 1 ) >>> b add( 1 ) Traceback (most recent call last): File " , line 1 , in AttributeError : 'frozenset' object has no attribute 'add' 18.2. frozenset 62 Глава 19 Функции и их аргументы В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def, return и lambda, обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов. Именные функции, инструкция def Функция в python - объект, принимающий аргументы и возвращающий значение. Обыч- но функция определяется с помощью инструкции def. Определим простейшую функцию: def add (x, y): return x + y Инструкция return говорит, что нужно вернуть значение. В нашем случае функция воз- вращает сумму x и y. Теперь мы ее можем вызвать: >>> add( 1 , 10 ) 11 >>> add( 'abc' , 'def' ) 'abcdef' Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции!): >>> def newfunc (n): def myfunc (x): 63 Самоучитель Python, Выпуск 0.2 return x + n return myfunc >>> new = newfunc( 100 ) # new - это функция >>> new( 200 ) 300 Функция может и не заканчиваться инструкцией return, при этом функция вернет зна- чение None : >>> def func (): pass >>> (func()) None Аргументы функции Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными. >>> def func (a, b, c = 2 ): # c - необязательный аргумент return a + b + c >>> func( 1 , 2 ) # a = 1, b = 2, c = 2 (по умолчанию) 5 >>> func( 1 , 2 , 3 ) # a = 1, b = 2, c = 3 6 >>> func(a = 1 , b = 3 ) # a = 1, b = 3, c = 2 6 >>> func(a = 3 , c = 6 ) # a = 3, c = 6, b не определен Traceback (most recent call last): File "", line 1, in func(a=3, c=6) TypeError : func() takes at least 2 arguments (2 given) Функция также может принимать переменное количество позиционных аргументов, то- гда перед именем ставится *: >>> def func ( * args): return args >>> func( 1 , 2 , 3 , 'abc' ) (1, 2, 3, 'abc') >>> func() () >>> func( 1 ) 19.2. Аргументы функции 64 Самоучитель Python, Выпуск 0.2 (1,) Как видно из примера, args - это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем. Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **: >>> def func ( ** kwargs): return kwargs >>> func(a = 1 , b = 2 , c = 3 ) {'a': 1, 'c': 3, 'b': 2} >>> func() {} >>> func(a = 'python' ) {'a': 'python'} В переменной kwargs у нас хранится словарь , с которым мы, опять-таки, можем делать все, что нам заблагорассудится. Анонимные функции, инструкция lambda Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda. Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func(): >>> func = lambda x, y: x + y >>> func( 1 , 2 ) 3 >>> func( 'a' , 'b' ) 'ab' >>> ( lambda x, y: x + y)( 1 , 2 ) 3 >>> ( lambda x, y: x + y)( 'a' , 'b' ) 'ab' lambda функции, в отличие от обычной, не требуется инструкция return, а в остальном, ведет себя точно так же: >>> func = lambda * args: args >>> func( 1 , 2 , 3 , 4 ) (1, 2, 3, 4) 19.3. Анонимные функции, инструкция lambda 65 Глава 20 Исключения в python. Конструкция try - except для обработки исключений Исключения (exceptions) - ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках. Самый простейший пример исключения - деление на ноль: >>> 100 / 0 Traceback (most recent call last): File "", line 1, in 100 / 0 ZeroDivisionError : division by zero В данном случае интерпретатор сообщил нам об исключении ZeroDivisionError, то есть делении на ноль. Также возможны и другие исключения: >>> 2 + '1' Traceback (most recent call last): File "", line 1, in 2 + '1' TypeError : unsupported operand type(s) for +: 'int' and 'str' >>> int ( 'qwerty' ) Traceback (most recent call last): File "", line 1, in int('qwerty') ValueError : invalid literal for int() with base 10: 'qwerty' В этих двух примерах генерируются исключения TypeError и ValueError соответственно. Подсказки дают нам полную информацию о том, где порождено исключение, и с чем оно связано. 66 Самоучитель Python, Выпуск 0.2 Рассмотрим иерархию встроенных в python исключений, хотя иногда вам могут встре- титься и другие, так как программисты могут создавать собственные исключения. Дан- ный список актуален для python 3.3 , в более ранних версиях есть незначительные изме- нения. • BaseException - базовое исключение, от которого берут начало все остальные. – SystemExit - исключение, порождаемое функцией sys.exit при выходе из про- граммы. – KeyboardInterrupt - порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C). – GeneratorExit - порождается при вызове метода close объекта generator. – Exception - а вот тут уже заканчиваются полностью системные исключения (ко- торые лучше не трогать) и начинаются обыкновенные, с которыми можно рабо- тать. * StopIteration - порождается встроенной функцией next, если в итераторе больше нет элементов. * ArithmeticError - арифметическая ошибка. · FloatingPointError - порождается при неудачном выполнении операции с плавающей запятой. На практике встречается нечасто. · OverflowError - возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но мо- жет возникать в некоторых других случаях. · ZeroDivisionError - деление на ноль. * AssertionError - выражение в функции assert ложно. * AttributeError - объект не имеет данного атрибута (значения или метода). * BufferError - операция, связанная с буфером, не может быть выполнена. * EOFError - функция наткнулась на конец файла и не смогла прочитать то, что хотела. * ImportError - не удалось импортирование модуля или его атрибута. * LookupError - некорректный индекс или ключ. · IndexError - индекс не входит в диапазон элементов. · KeyError - несуществующий ключ (в словаре , множестве или другом объекте). * MemoryError - недостаточно памяти. * NameError - не найдено переменной с таким именем. · UnboundLocalError - сделана ссылка на локальную переменную в функции, но переменная не определена ранее. 67 Самоучитель Python, Выпуск 0.2 * OSError - ошибка, связанная с системой. · BlockingIOError · ChildProcessError - неудача при операции с дочерним процессом. · ConnectionError - базовый класс для исключений, связанных с подклю- чениями. · BrokenPipeError · ConnectionAbortedError · ConnectionRefusedError · ConnectionResetError · FileExistsError - попытка создания файла или директории, которая уже существует. · FileNotFoundError - файл или директория не существует. · InterruptedError - системный вызов прерван входящим сигналом. · IsADirectoryError - ожидался файл, но это директория. · NotADirectoryError - ожидалась директория, но это файл. · PermissionError - не хватает прав доступа. · ProcessLookupError - указанного процесса не существует. · TimeoutError - закончилось время ожидания. * ReferenceError - попытка доступа к атрибуту со слабой ссылкой. * RuntimeError - возникает, когда исключение не попадает ни под одну из дру- гих категорий. * NotImplementedError - возникает, когда абстрактные методы класса требу- ют переопределения в дочерних классах. * SyntaxError - синтаксическая ошибка. · IndentationError - неправильные отступы. · TabError - смешивание в отступах табуляции и пробелов. * SystemError - внутренняя ошибка. * TypeError - операция применена к объекту несоответствующего типа. * ValueError - функция получает аргумент правильного типа, но некорректно- го значения. * UnicodeError - ошибка, связанная с кодированием / раскодированием unicode в строках · UnicodeEncodeError - исключение, связанное с кодированием unicode. · UnicodeDecodeError - исключение, связанное с декодированием unicode. 68 Самоучитель Python, Выпуск 0.2 · UnicodeTranslateError - исключение, связанное с переводом unicode. * Warning - предупреждение. Теперь, зная, когда и при каких обстоятельствах могут возникнуть исключения, мы мо- жем их обрабатывать. Для обработки исключений используется конструкция try - except. Первый пример применения этой конструкции: >>> try : k = 1 / 0 except ZeroDivisionError : k = 0 >>> (k) 0 В блоке try мы выполняем инструкцию, которая может породить исключение, а в бло- ке except мы перехватываем их. При этом перехватываются как само исключение, так и его потомки. Например, перехватывая ArithmeticError, мы также перехватываем FloatingPointError, OverflowError и ZeroDivisionError. >>> try : k = 1 / 0 except ArithmeticError : k = 0 >>> (k) 0 Также возможна инструкция except без аргументов, которая перехватывает вообще всё (и прерывание с клавиатуры, и системный выход и т. д.). Поэтому в такой форме инструк- ция except практически не используется, а используется except Exception. Однако чаще всего перехватывают исключения по одному, для упрощения отладки (вдруг вы ещё дру- гую ошибку сделаете, а except её перехватит). Ещё две инструкции, относящиеся к нашей проблеме, это finally и else. Finally выполняет блок инструкций в любом случае, было ли исключение, или нет (применима, когда нуж- но непременно что-то сделать, к примеру, закрыть файл). Инструкция else выполняется в том случае, если исключения не было. >>> f = open ( '1.txt' ) >>> ints = [] >>> try : for line in f: ints append( int (line)) except ValueError : ( 'Это не число. Выходим.' ) except Exception : ( 'Это что ещё такое?' ) else : ( 'Всё хорошо.' ) finally : 69 Самоучитель Python, Выпуск 0.2 f close() ( 'Я закрыл файл.' ) # Именно в таком порядке: try, группа except, затем else, и только потом ˓→ finally. Это не число. Выходим. Я закрыл файл. 70 Глава 21 Байты (bytes и bytearray) Байтовые строки в Python - что это такое и с чем это едят? Байтовые строки очень похожи на обычные строки , но с некоторыми отличиями. Попробуем выяснить, с какими. Что такое байты? Байт - минимальная единица хранения и обработки цифровой инфор- мации. Последовательность байт представляет собой какую-либо информацию (текст, картинку, мелодию...). Создаём байтовую строку: >>> b'bytes' b'bytes' >>> 'Байты' encode( 'utf-8' ) b'\xd0\x91\xd0\xb0\xd0\xb9\xd1\x82\xd1\x8b' >>> bytes ( 'bytes' , encoding = 'utf-8' ) b'bytes' >>> bytes ([ 50 , 100 , 76 , 72 , 41 ]) b'2dLH)' Если первые три способа нам уже известны ( тут , тут и тут ), то последний нужно пояснить. Функция bytes принимает список чисел от 0 до 255 и возвращает байты, получающиеся применением функции chr. >>> chr ( 50 ) '2' >>> chr ( 100 ) 'd' >>> chr ( 76 ) 'L' Что делать с байтами? Хотя байтовые строки поддерживают практически все строковые методы, с ними мало что нужно делать. Обычно их надо записать в файл / прочесть из 71 |