Книга на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16
Скачать 0.72 Mb.
|
Как это работает: Переменная zoo обозначает кортеж элементов. Как мы видим, функция len позволяет получить длину кортежа. Это также указывает на то, что кортеж является последовательностью Теперь мы перемещаем этих животных в новый зоопарк, поскольку старый зоопарк закрывается. Поэтому кортеж new_zoo содержит тех животных, ко- торые уже там, наряду с привезёнными из старого зоопарка. Возвращаясь к реальности, обратите внимание на то, что кортеж внутри кортежа не теряет своей индивидуальности. 12.3. Кортеж 88 A Byte of Python (Russian), Версия 2.02 Доступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки – точно так же, как мы это делали для спис- ков. Это называется оператором индексирования. Доступ к третьему элементу в new_zoo мы получаем, указывая new_zoo[2] , а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2] . Это достаточно просто, как только вы поймёте принцип. Скобки Хотя скобки и не являются обязательными, я предпочитаю всегда указывать их, чтобы было очевидно, что это кортеж, особенно в двусмысленных случаях. Например, print(1, 2,3) и print( (1,2,3) ) делают разные вещи: первое выражение выводит три числа, тогда как второе – кортеж, содержащий эти три числа. Кортеж, содержащий 0 или 1 элемент Пустой кортеж создаётся при помощи пустой пары скобок – « myempty = () ». Однако, с кортежем из одного элемента не всё так просто. Его нужно указывать при помощи за- пятой после первого (и единственного) элемента, чтобы Python мог отличить кортеж от скобок, окружающих объект в выражении. Таким образом, чтобы получить кортеж, со- держащий элемент 2 , вам потребуется указать « singleton = (2,) ». Замечание для программистов на Perl Список внутри списка не теряет своей индивидуальности, т.е. списки не развёртываются, как в Perl. Это же относится к кортежу внутри кортежа, или кортежу внутри списка, или списку внутри кортежа и т.д. В Python все они рассматриваются как объекты, хранящиеся внутри другого объекта – только и всего. 12.4 Словарь Словарь – это некий аналог адресной книги, в которой можно найти адрес или контакт- ную информацию о человеке, зная лишь его имя; т.е. некоторые ключи (имена) связаны со значениями (информацией). Заметьте, что ключ должен быть уникальным – вы ведь не сможете получить корректную информацию, если у вас записаны два человека с пол- ностью одинаковыми именами. Обратите также внимание на то, что в словарях в качестве ключей могут использоваться только неизменяемые объекты (как строки), а в качестве значений можно использовать как неизменяемые, так и изменяемые объекты. Точнее говоря, в качестве ключей должны использоваться только простые объекты. 12.4. Словарь 89 A Byte of Python (Russian), Версия 2.02 Пары ключ-значение указываются в словаре следующим образом: « d = {key1 : value1, key2 : value2 } ». Обратите внимание, что ключ и значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки. Помните, что пары ключ-значение никоим образом не упорядочены в словаре. Если вам необходим некоторый порядок, вам придётся отдельно отсортировать словарь перед об- ращением к нему. Словари являются экземплярами/объектами класса dict Пример: (сохраните как using_dict.py ) # 'ab' - сокращение от 'a'ddress'b'ook ab = { 'Swaroop' : 'swaroop@swaroopch.com' , 'Larry' : 'larry@wall.org' , 'Matsumoto' : 'matz@ruby-lang.org' , 'Spammer' : 'spammer@hotmail.com' } ( "Адрес Swaroop'а:" , ab[ 'Swaroop' ]) # Удаление пары ключ-значение del ab[ 'Spammer' ] ( ' \nВ адресной книге {0} контакта \n' format( len (ab))) for name, address in ab items(): ( 'Контакт {0} с адресом {1} ' format(name, address)) # Добавление пары ключ-значение ab[ 'Guido' ] = 'guido@python.org' if 'Guido' in ab: ( " \nАдрес Guido:" , ab[ 'Guido' ]) Вывод: $ python3 using_dict.py Адрес Swaroop'а: swaroop@swaroopch.com В адресной книге 3 контакта Контакт Swaroop с адресом swaroop@swaroopch.com Контакт Matsumoto с адресом matz@ruby-lang.org Контакт Larry с адресом larry@wall.org (продолжение на следующей странице) 12.4. Словарь 90 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) Адрес Guido: guido@python.org Как это работает: Мы создаём словарь ab 2 при помощи обозначений, описанных ранее. Затем мы обращаемся к парам ключ-значение, указывая ключ в операторе индек- сирования, которым мы пользовались для списков и кортежей. Как видите, синтаксис прост. Удалять пары ключ-значение можно при помощи нашего старого доброго оператора del . Мы просто указываем имя словаря и оператор индексирования для удаляемого ключа, после чего передаём это оператору del . Для этой опе- рации нет необходимости знать, какое значение соответствует данному клю- чу. Далее мы обращаемся ко всем парам ключ-значение нашего словаря, исполь- зуя метод items , который возвращает список кортежей, каждый из которых содержит пару элементов: ключ и значение. Мы получаем эту пару и при- сваиваем её значение переменным name и address соответственно в цикле for..in , а затем выводим эти значения на экран в блоке for. Новые пары ключ-значение добавляются простым обращением к нужному ключу при помощи оператора индексирования и присваиванием ему неко- торого значения, как мы сделали для Guido в примере выше. Проверить, существует ли пара ключ-значение, можно при помощи оператора in Чтобы просмотреть список всех методов класса dict смотрите help(dict) Ключевые Аргументы и Словари К слову, если вы использовали ключевые аргументы в ваших функциях, вы уже исполь- зовали словари! Только подумайте: вы указали пару ключ-значение среди параметров функции при её определении, а когда обращаетесь к переменным внутри функции, то это, фактически, обращение по ключу к словарю (который в терминах разработчиков ком- пиляторов называется таблицей имён). 2 address book – англ. «адресная книга» (прим. перев.) 12.4. Словарь 91 A Byte of Python (Russian), Версия 2.02 12.5 Последовательности Списки, кортежи и строки являются примерами последовательностей. Но что такое по- следовательности и что в них такого особенного? Основные возможности – это проверка принадлежности (т.е. выражения « in » и « not in ») и оператор индексирования, позволяющий получить напрямую некоторый эле- мент последовательности. Все три типа последовательностей, упоминавшиеся выше (списки, кортежи и строки), также предоставляют операцию получения вырезки, которая позволяет получить вырез- ку последовательности, т.е. её фрагмент. Пример: (сохраните как seq.py ) shoplist = [ 'яблоки' , 'манго' , 'морковь' , 'бананы' ] name = 'swaroop' # Операция индексирования ( 'Элемент 0 -' , shoplist[ 0 ]) ( 'Элемент 1 -' , shoplist[ 1 ]) ( 'Элемент 2 -' , shoplist[ 2 ]) ( 'Элемент 3 -' , shoplist[ 3 ]) ( 'Элемент -1 -' , shoplist[ - 1 ]) ( 'Элемент -2 -' , shoplist[ - 2 ]) ( 'Символ 0 -' , name[ 0 ]) # Вырезка из списка ( 'Элементы с 1 по 3:' , shoplist[ 1 : 3 ]) ( 'Элементы с 2 до конца:' , shoplist[ 2 :]) ( 'Элементы с 1 по -1:' , shoplist[ 1 : - 1 ]) ( 'Элементы от начала до конца:' , shoplist[:]) # Вырезка из строки ( 'Символы с 1 по 3:' , name[ 1 : 3 ]) ( 'Символы с 2 до конца:' , name[ 2 :]) ( 'Символы с 1 до -1:' , name[ 1 : - 1 ]) ( 'Символы от начала до конца:' , name[:]) Вывод: $ python3 seq.py Элемент 0 - яблоки Элемент 1 - манго Элемент 2 - морковь Элемент 3 - бананы Элемент -1 - бананы (продолжение на следующей странице) 12.5. Последовательности 92 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) Элемент -2 - морковь Символ 0 - s Элементы с 1 по 3: ['манго', 'морковь'] Элементы с 2 до конца: ['морковь', 'бананы'] Элементы с 1 по -1: ['манго', 'морковь'] Элементы от начала до конца: ['яблоки', 'манго', 'морковь', 'бананы'] Символы с 1 по 3: wa Символы с 2 до конца: aroop Символы с 1 до -1: waroo Символы от начала до конца: swaroop Как это работает: Прежде всего, мы видим, как использовать индексы для получения отдельных элементов последовательности. Это ещё называют приписыванием индекса. Ко- гда мы указываем число в квадратных скобках после последовательности, как показано выше, Python извлекает элемент, соответствующий указанной пози- ции в последовательности. Помните, что Python начинает отсчёт с 0. Поэтому shoplist[0] извлекает первый элемент, а shoplist[3] – четвёртый элемент последовательности shoplist Индекс также может быть отрицательным числом. В этом случае позиция от- считывается от конца последовательности. Поэтому shoplist[-1] указывает на последний элемент последовательности shoplist , а shoplist[-2] – на предпоследний. Операция вырезки производится при помощи указания имени последова- тельности, за которым может следовать пара чисел, разделённых двоеточием и заключённых в квадратные скобки. Заметьте, как это похоже на операцию индексирования, которой мы пользовались до сих пор. Помните, что числа в скобках необязательны, тогда как двоеточие – обязательно. Первое число (перед двоеточием) в операции вырезки указывает позицию, с которой вырезка должна начинаться, а второе число (после двоеточия) указы- вает, где вырезка должна закончиться. Если первое число не указано, Python начнёт вырезку с начала последовательности. Если пропущено второе число, Python закончит вырезку у конца последовательности. Обратите внимание, что полученная вырезка будет начинаться с указанной начальной позиции, а заканчиваться прямо перед указанной конечной позицией, т.е. начальная позиция будет включена в вырезку, а конечная – нет. Таким образом, shoplist[1:3] возвращает вырезку из последовательности, начинающуюся с позиции 1, включает позицию 2, но останавливается на позиции 3, и поэтому возвращает вырезку из двух элементов. Аналогично, shoplist[:] возвращает копию всей последовательности. Вырезка может осуществляться и с отрицательными значениями. Отрица- 12.5. Последовательности 93 A Byte of Python (Russian), Версия 2.02 тельные числа обозначают позицию с конца последовательности. Например, shoplist[:-1] вернёт вырезку из последовательности, исключающую по- следний элемент, но содержащую все остальные. Кроме того, можно также указать третий аргумент для вырезки, который будет обозначать шаг вырезки (по умолчанию шаг вырезки равен 1): >>> shoplist = [ 'яблоки' , 'манго' , 'морковь' , 'бананы' ] >>> shoplist[:: 1 ] ['яблоки', 'манго', 'морковь', 'бананы'] >>> shoplist[:: 2 ] ['яблоки', 'морковь'] >>> shoplist[:: 3 ] ['яблоки', 'бананы'] >>> shoplist[:: - 1 ] ['бананы', 'морковь', 'манго', 'яблоки'] Обратите внимание на то, что когда шаг равен 2, мы получаем элементы, на- ходящиеся на позициях 0, 2, … Когда шаг равен 3, мы получаем элементы с позиций 0, 3, … и т.д. Попробуйте разные комбинации параметров вырезки, используя интерактивную оболоч- ку интерпретатора Python, т.е. его командную строку, чтобы сразу видеть результат. По- следовательности замечательны тем, что они дают возможность обращаться к кортежам, спискам и строкам одним и тем же способом! 12.6 Множество Множества – это неупорядоченные наборы простых объектов. Они необходимы тогда, ко- гда присутствие объекта в наборе важнее порядка или того, сколько раз данный объект там встречается. Используя множества, можно осуществлять проверку принадлежности, определять, яв- ляется ли данное множество подмножеством другого множества, находить пересечения множеств и так далее. >>> bri = set ([ 'Бразилия' , 'Россия' , 'Индия' ]) >>> 'Индия' in bri True >>> 'США' in bri False >>> bric = bri copy() >>> bric add( 'Китай' ) >>> bric issuperset(bri) True (продолжение на следующей странице) 12.6. Множество 94 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) >>> bri remove( 'Россия' ) >>> bri & bric # OR bri.intersection(bric) {'Бразилия', 'Индия'} Как это работает: Этот пример достаточно нагляден, так как использует основы теории мно- жеств из школьного курса математики. 12.7 Ссылки Когда мы создаём объект и присваиваем его переменной, переменная только ссылается на объект, а не представляет собой этот объект! То есть имя переменной указывает на ту часть памяти компьютера, где хранится объект. Это называется привязкой имени к объекту. Обычно вам не следует об этом беспокоиться, однако есть некоторый неочевидный эф- фект, о котором нужно помнить: Пример: (сохраните как reference.py ) ( 'Простое присваивание' ) shoplist = [ 'яблоки' , 'манго' , 'морковь' , 'бананы' ] mylist = shoplist # mylist - лишь ещё одно имя, указывающее на тот же объект! del shoplist[ 0 ] # Я сделал первую покупку, поэтому удаляю её из списка ( 'shoplist:' , shoplist) ( 'mylist:' , mylist) # Обратите внимание, что и shoplist, и mylist выводят один и тот же список # без пункта "яблоко", подтверждая тем самым, что они указывают на один # объект. ( 'Копирование при помощи полной вырезки' ) mylist = shoplist[:] # создаём копию путём полной вырезки del mylist[ 0 ] # удаляем первый элемент ( 'shoplist:' , shoplist) ( 'mylist:' , mylist) # Обратите внимание, что теперь списки разные Вывод:_12.7._Ссылки'>Вывод: 12.7. Ссылки 95 A Byte of Python (Russian), Версия 2.02 $ python3 reference.py Простое присваивание shoplist: ['манго', 'морковь', 'бананы'] mylist: ['манго', 'морковь', 'бананы'] Копирование при помощи полной вырезки shoplist: ['манго', 'морковь', 'бананы'] mylist: ['морковь', 'бананы'] Как это работает: Большая часть объяснения содержится в комментариях. Помните, что если вам нужно сделать копию списка или подобной последо- вательности, или другого сложного объекта (не такого простого объекта, как целое число), вам следует воспользоваться операцией вырезки. Если вы про- сто присвоите имя переменной другому имени, оба они будут ссылаться на один и тот же объект, а это может привести к проблемам, если вы не осторож- ны. 12.8 Ещё о строках Мы уже детально обсуждали строки ранее. Что же ещё можно о них узнать? Что ж, вы знали, например, что строки также являются объектами и имеют методы, при помощи которых можно делать практически всё: от проверки части строки до удаления краевых пробелов? Все строки, используемые вами в программах, являются объектами класса str . Некоторые полезные методы этого класса продемонстрированы на примере ниже. Чтобы посмотреть весь список методов, выполните help(str) Пример: (сохраните как str_methods.py ) name = 'Swaroop' # Это объект строки if name startswith( 'Swa' ): ( 'Да, строка начинается на "Swa"' ) if 'a' in name: ( 'Да, она содержит строку "a"' ) if name find( 'war' ) != - 1 : ( 'Да, она содержит строку "war"' ) delimiter = '_*_' (продолжение на следующей странице) 12.8. Ещё о строках 96 A Byte of Python (Russian), Версия 2.02 (продолжение с предыдущей страницы) mylist = [ 'Бразилия' , 'Россия' , 'Индия' , 'Китай' ] (delimiter join(mylist)) Вывод: $ python3 str_methods.py Да, строка начинается на "Swa" Да, она содержит строку "a" Да, она содержит строку "war" Бразилия_*_Россия_*_Индия_*_Китай Как это работает: Здесь мы видим сразу несколько методов строк в действии. Метод startswith служит для того, чтобы определять, начинается ли строка с некоторой заданной подстроки. Опе- ратор in используется для проверки, является ли некоторая строка частью данной строки. Метод find используется для определения позиции данной подстроки в строке; find воз- вращает -1, если подстрока не обнаружена. В классе str также имеется отличный метод для объединения ( join ) 3 элементов последовательности с указанной строкой в качестве разделителя между элементами, возвращающий большую строку, сгенерированную та- ким образом. 12.9 Резюме Мы детально рассмотрели различные встроенные структуры данных Python. Эти струк- туры данных будут крайне важны для написания программ существенного размера. Теперь, когда мы накопили достаточно базовых знаний о Python, далее посмотрим, как проектировать и писать настоящую программу на Python. 3 join – англ. «объединять» (прим.перев.) |