Язык Python. Уроки Python. Python Lessons Oleg Kishinskii мар. 30
Скачать 406.31 Kb.
|
СловариСловари Python — нечто совершенно иное; они вообще не являются последовательностями и взамен известны как отображения. Отображения также представляют собой коллекции других объектов, но они хранят объекты по ключам, а не по относительным позициям. В действительности отображения не поддерживают какой-либо надежный порядок слева направо; они просто отображают ключи на связанные значения. Словари — единственный тип отображения в наборе основных объектов Python являются изменяемыми,’ как и списки, их можно модифицировать на месте и они способны увели- чиваться и уменьшаться по требованию. Наконец, подобно спискам словари — это гибкий инструмент для представления коллекций, но их мнемонические ключи лучше подходят, когда элементы коллекции именованы или помечены, скажем, как поля в записи базы данных. Словари - это изменяемый упорядоченный тип данных: данные в словаре - это пары ключ: значение доступ к значениям осуществляется по ключу, а не по номеру, как в списках данные в словаре упорядочены по порядку добавления элементов так как словари изменяемы, то элементы словаря можно менять, добавлять, удалять ключ должен быть объектом неизменяемого типа: число, строка, кортеж значение может быть данными любого типа для удобства словарь можно записать так: london = { 'id': 1, 'name':'London', 'it_vlan':320, 'user_vlan':1010, (continues on next page) 'mngmt_vlan':99, 'to_name': None, 'to_id': None, 'port':'G1/0/11' } (продолжение с предыдущей страницы) Для того, чтобы получить значение из словаря, надо обратиться по ключу, таким же образом, как это было в списках, только вместо номера будет использоваться ключ: D = {'food': 'Spam', 'quantity': 4, 'color': 'pink'} При написании в виде литералов словари указываются в фигурных скобках и состо ят из ряда пар “ключ: значение”. Словари удобны всегда, когда нам необходимо ассо циировать набор значений с ключами — например, для описания свойств чего-нибудь. Рассмотрим следующий словарь их трех элементов (с ключами ’ food ’, ’ quantity ’ и ’ color ’, возможно представляющих детали позиции гипотетического меню): Мы можем индексировать этот словарь по ключу, чтобы извлекать и изменять зна чения, связанные с ключами. Операция индексации словаря имеет такой же синтак сис, как для последовательностей, но элементом в квадратных скобках будет ключ, а не относительная позиция: D = {} D['name'] = 'Bob' D['job'] = 'dev' D['age'] =40 print (D) #{'*:age40,'job':'dev','name':'Bob'} print(D['name']) #Bob Хотя форма литерала в фигурных скобках встречается, пожалуй, чаще приходится видеть словари, построенные другими способами (все данные программы редко из вестны до ее запуска). Скажем, следующий код начинает с пустого словаря и заполняет его по одному ключу за раз. В отличие от присваивания элементу в списке, находящемуся вне установленных границ, которое запрещено, при- сваивание новому ключу словаря приводит к созданию этого ключа: В словаре в качестве значения можно использовать словарь: london_co = { 'r1': { 'hostname': 'london_r1', 'location': '21 New Globe Walk', 'vendor': 'Cisco', 'model': '4451', 'ios': '15.4', 'ip': '10.255.0.1' (continues on next page) }, 'r2': { 'hostname': 'london_r2', 'location': '21 New Globe Walk', 'vendor': 'Cisco', 'model': '4451', 'ios': '15.4', 'ip': '10.255.0.2' }, 'sw1': { 'hostname': 'london_sw1', 'location': '21 New Globe Walk', 'vendor': 'Cisco', 'model': '3850', 'ios': '3.6.XE', 'ip': '10.255.0.101' } (продолжение с предыдущей страницы) } london_co['r1']['ios'] #'15.4' london_co['r1']['model'] #'4451' london_co['sw1']['ip'] #'10.255.0.101' Получить значения из вложенного словаря можно так: Методы для работы со словарямиclear()позволяет очистить словарь: copy()london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'} london2 = london.copy() id(london) #25524512 id(london2) #25563296london['vendor'] = 'Juniper' london2['vendor'] #'Cisco' создает полную копию словаря Примечание: Если указать, что один словарь равен другому, то london2 будет ссылкой на словарь. И при изменениях словаря london меняется и словарь london2, так как это ссылки на один и тот же объект. get()запрашивает ключ, и если его нет, вместо ошибки возвращает None. london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'} print(london.get('ios')) #None (continues on next page) #Методget()позволяеттакжеуказыватьдругоезначениевместоNone print(london.get('ios', 'Ooops')) #Ooops (продолжение с предыдущей страницы) setdefault()london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'} ios = london.setdefault('ios') print(ios) #None london #{'name':'London1','location':'LondonStr','vendor':'Cisco','ios':None} london.setdefault('name') #'London1' #Второйаргументпозволяетуказать,какоезначениедолжносоответствоватьключу model = london.setdefault('model', 'Cisco3580') print(model) #Cisco3580 london {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco', 'ios': None, 'model': 'Cisco3580'} #Методsetdefaultзаменяеттакуюконструкцию: if key in london: value = london[key] else: london[key] = 'somevalue' value = london[key] ищет ключ, и если его нет, вместо ошибки создает ключ со значением None, если ключ есть, setdefault возвращает значение, которое ему соответствует: keys(), values(), items()Все три метода возвращают специальные объекты view, которые отображают ключи, значения и пары ключ-значение словаря соответственно. london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'} keys = london.keys() print(keys) #dict_keys(['name','location','vendor']) #Сейчаспеременнойkeysсоответствуетviewdict_keys,вкоторомтриключа:name,locationиvendor.#Но,еслимыдобавимвсловарьещеоднупаруключ-значение,объектkeysтожепоменяется:london['ip'] = '10.1.1.1' keys #dict_keys(['name','location','vendor','ip']) #Еслинужнополучитьобычныйсписокключей,которыйнебудетменятьсясизменениямисловаря,␣ ˓→достаточноконвертироватьviewвсписок: list_keys = list(london.keys()) list_keys #['name','location','vendor','ip'] Очень важная особенность view заключается в том, что они меняются вместе с изменением словаря. И фактически они лишь дают способ посмотреть на соответствующие объекты, но не создают их копию. del()london = {'name': 'London1', 'location': 'London Str', 'vendor': 'Cisco'} del london['name'] london #{'location':'LondonStr','vendor':'Cisco'} Удаляет ключ и значение update()r1 = {'name': 'London1', 'location': 'London Str'} r1.update({'vendor': 'Cisco', 'ios':'15.2'}) r1 #{'name':'London1','location':'LondonStr','vendor':'Cisco','ios':'15.2'} #Аналогичнымобразомможнообновитьзначения:r1.update({'name': 'london-r1', 'ios':'15.4'}) r1 ''' {'name':'london-r1', 'location':'LondonStr', 'vendor':'Cisco', 'ios':'15.4'} ''' Позволяет добавлять в словарь содержимое другого словаря: КортежиT = (1, 2, 3, 4) #Кортежиз4элементов len(Т) #Длина4 Т + (5, б) #Конкатенация(1,2,3,4,5,6) Т[О] #Индексация,нарезаниеит.д. Объект кортежа примерно похож на список, который нельзя изменять — кортежи являются последо- вательностями подобно спискам, но они неизменяемые подобно строка ми. Функционально они исполь- зуются для представления фиксированных коллекций элементов: скажем, компонентов специфической даты в календаре. Синтаксически они записываются в круглых, а не квадратных скобках и поддержи- вают произвольные типы, произвольное вложение и обычные операции над последовательностями: Примечание: Главное отличие кортежей заключается в том, что после создания их нельзя из менять, т.е. они являются неизменяемыми последовательностями (одноэлементные кортежи вроде приведенно- го ниже требуют хвостовой запятой): tuple2 = („password“,) Итак, зачем нам тип, который похож на список, но поддерживает меньше операций? Откровенно го- воря, на практике кортежи применяются в целом не так часто, как списки, но весь смысл в их неиз- меняемости. Если вы передаете коллекцию объектов внутри своей программы в виде списка, тогда он может быть модифицирован где угодно; если вы используете кортеж, то изменить его не удастся. То есть кортежи обеспечивают своего рода ограничение целостности, что удобно в программах, крупнее тех, которые мы будем писать здесь. Позже в книге мы еще обсудим кортежи, включая расширение, которое построено поверх них и называется именованными кортежами. МножествоМножество - это изменяемый неупорядоченный тип данных. В множестве всегда содержатся только уникальные элементы. Множество в Python - это последовательность элементов, которые разделены между собой запятой и заключены в фигурные скобки. cities = ['Санкт-Петербург', 'Хабаровск', 'Казань', 'Санкт-Петербург', 'Казань'] un_cities = set(cities) for city in un_cities: print("Один мой друг живёт в городе " + city) ''' ОдинмойдругживётвгородеХабаровск ОдинмойдругживётвгородеСанкт-ПетербургОдинмойдругживётвгородеКазань ''' С помощью множества можно легко убрать повторяющиеся элементы: Множества полезны тем, что с ними можно делать различные операции и находить объединение мно- жеств, пересечение и так далее. vlans1 = {10,20,30,50,100} vlans2 = {100,101,102,102,200} vlans1.union(vlans2) #{10,20,30,50,100,101,102,200} vlans1 | vlans2 #{10,20,30,50,100,101,102,200} #Пересечениемножествможнополучитьспомощьюметодаintersection()илиоператора& vlans1 = {10,20,30,50,100} vlans2 = {100,101,102,102,200} vlans1.intersection(vlans2) #{100} vlans1 & vlans2 #{100} Предупреждение: Нельзя создать пустое множество с помощью литерала (так как в таком случае это будет не множество, а словарь): set1 = {} type(set1) #dict Но пустое множество можно создать таким образом set2 = set() type(set2) #set Объединение множеств можно получить с помощью метода union() или оператора |: Методы для работы с множествамиadd()set1 = {10,20,30,40} set1.add(50) set1 #{10,20,30,40,50} добавляет элемент во множество: discard()позволяет удалять элементы, не выдавая ошибку, если элемента в множестве нет set1 #{10,20,30,40,50} set1.discard(55) set1 #{10,20,30,40,50} set1.discard(50) set1 #{10,20,30,40} clear()set1 = {10,20,30,40} set1.clear() set1 #set() очищает множество Булевы значенияБулевы значения в Python это две константы True и False. В Python истинными и ложными значениями считаются не только True и False. истинное значение: любое ненулевое число любая непустая строка любой непустой объект ложное значение: 0 None пустая строка пустой объект Остальные истинные и ложные значения, как правило, логически следуют из условия. Для проверки булевого значения объекта, можно воспользоваться bool: Преобразование типовВ Python есть несколько полезных встроенных функций, которые позволяют преобразовать данные из одного типа в другой. int()преобразует строку в int: bin()bin(10) #'0b1010' bin(255) #'0b11111111' Преобразовать десятичное число в двоичный формат можно с помощью bin(): hex()hex(10) #'0xa' hex(255) #'0xff' Аналогичная функция есть и для преобразования в шестнадцатеричный формат: list()list("string") #['s','t','r','i','n','g'] list({1,2,3}) #[1,2,3] list((1,2,3,4)) #[1,2,3,4 Функция list() преобразует аргумент в список: set()set([1,2,3,3,4,4,4,4]) #{1,2,3,4} set((1,2,3,3,4,4,4,4)) #{1,2,3,4} set("string string") #{'','g','i','n','r','s','t'} Функция set() преобразует аргумент в множество: tuple()tuple([1,2,3,4]) #(1,2,3,4) tuple({1,2,3,4}) #(1,2,3,4) tuple("string") #('s','t','r','i','n','g') Функция tuple() преобразует аргумент в кортеж: str()str(10) #'10' Функция str() преобразует аргумент в строку: Проверка типовisdigit()"a".isdigit() #False"a10".isdigit() #False"10".isdigit() #True Проверяет, сосоит ли строка из одних только цифр isalpha()"a".isalpha() #True"a100".isalpha() #False"a-- ".isalpha() #False"a ".isalpha() #False Проверяет, состоит ли строка из одних букв: isalnum()"a".isalnum() #True "a10".isalnum() #True позволяет проверить, состоит ли строка из букв или цифр: type()Иногда, в зависимости от результата, библиотека или функция может выводить разные типы объектов. Например, если объект один, возвращается строка, если несколько, то возвращается кортеж. Нам же надо построить ход программы по-разному, в зависимости от того, была ли возвращена строка или кортеж. type("string") #str type("string") is str #True #Аналогичноскортежем(идругимитипамиданных): type((1,2,3)) #tupletype((1,2,3)) is tuple #Truetype((1,2,3)) is list #False В этом может помочь функция type(): ФайлыОбъекты файлов являются главным интерфейсом к внешним файлам на компью тере. Они могут применяться для чтения и записи текстовых заметок, аудиоклипов, документов Excel, сохраненных сообщений электронной почты и всего того, что вы в итоге сохранили на своем компьютере. Файлы относятся к основным типам, но они кое в чем своеобразны — специфический литеральный синтаксис для их создания от сутствует, Взамен, чтобы создать объект файла, необходимо вызвать встроенную фун кцию open, передав ей в виде строк имя внешнего файла и необязательный режим обработки. f = open('data.txt' , 'w') #Создатьновыйфайлврежимезаписи('w') f.write('Hello\n') #Записатьвнего строкисимволов f.write ('world\n') #Возвратитьколичествозаписанныхэлементов f.close() #Закрытьдлясбрасываниябуфероввыводанадиск Например, для создания выходного текстового файла понадобится передать его имя и строку режима обработки ’ w ’, чтобы записывать данные: Код создает файл в текущем каталоге и записывает в него текст (имя файла мо жет содержать полный путь к каталогу, если нужно получить доступ к файлу где-то в другом месте на компьютере). Чтобы прочитать то, что было записано, необходимо повторно открыть файл в режиме обработки ’ г ’ для чтения текстового ввода (он вы бирается по умолчанию, если в вызове строка режима не указана). Затем следует про читать содержимое файла в строку и отобразить ее. В сценарии содержимое файла всегда будет строкой независимо от типа находящихся в нем данных: Python LessonsПримечание: Обратите внимание, что для того что бы прочесь все строки из файла, нам нужно обернуть функцию чтения в цикл for line in open(’data.txt’): print(line) так же не забывайте закрывать файл после операции чтения или записи f.close Примечание: Ранее в примере с подсчетом слов мы использовали друую констукцию with open(filename, encoding=»utf8») as file: #эта строка открывает файл text = file.read() #читаем содержимое файла и записываем все в переменную text text = text.replace(«n», » «) #преобразуем наш текст в одну длинную строку заменив символ перевода строки на пробел text = text.replace(«,», «»).replace(«.», «»).replace(«?», «»).replace(«!», «») #а так же уберем все запетые, пробелы, и прочие знаки пунктуации text = text.lower() #перведем все слова в строчные, тоесть если было «Начало изучения Языка Программирования», то будет «начало изучения языка программирования» words = text.split() #создадим список слов («списки»,»выгледят»,»вот»,»так») words.sort() Такой подход позволяет не закрывать файл в ручную. |