Серверы, хосты и сетевые компоненты — КиберПедия 

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Серверы, хосты и сетевые компоненты

2020-05-07 322
Серверы, хосты и сетевые компоненты 0.00 из 5.00 0 оценок
Заказать работу

Серверы, хосты и сетевые компоненты

Хосты (hosts) являются оконечными узлами в сетевых средах, которые взаимодействуют с прочими узлами. В сегодняшнем мире некий хост может быть конкретным обычным компьютером, либо может быть вашим смартфоном, планшетом или телевизором. С восхождением IoT (Internet of Things, Интернета вещей), наше широкое определение хоста может быть расширено чтобы включать IP камеру, коробки ТВ- наборов, а также всё растущего типа датчиков, которые мы можем применять в сельском хозяйстве, на фабриках, в автомобилях и тому подобном. При таком взрывообразном росте общего числа хостов, подключаемых во всемирный Интернет, все они нуждаются в адресации, маршрутизации и управлении, а спрос на соответствующую сетевую среду никогда не был более значительным.

Большую часть времени когда мы находимся во всемирном Интернете, мы запрашиваем службы. Такая служба может быть некоей веб страницей, отправкой и приёмом электронных писем, передачей файлов и тому подобного. Эти службы предоставляются серверами. Как и подразумевает само название, они предоставляют службы для множества узлов и поэтому обычно имеют более высокие уровни аппаратной спецификации. В некотором смысле, серверы представляют собой особые суперузлы в имеющейся сетевой среде, которые предоставляют дополнительные возможности своим одноранговым партнёрам. Позже в разделе клиент- сервер мы рассмотрим серверы.

Если представить себе серверы и хосты как о городах и посёлках, тогда сетевые компоненты являются нашими дорогами и шоссе для их соединения. На самом деле, при описании сетевых компонентов, которые повсеместно передают всё растущие в размерах биты и байты, на ум приходит термин "информационной супермагистрали". В модели OSI, которой мы коснёмся, такие сетевые компоненты являются маршрутизаторами и коммутаторами, которые располагаются на втором и третьем уровнях данной модели, помимо уровня оптиковолоконного кабеля, коаксиального кабеля, витых медных пар и некоторого оборудования DWDM (уплотнения по длине волны высокой плотности, Dense Walelength Division Multiplexing), которые можно привести в качестве некоторых примеров.

Всё это вместе, хосты, серверы, а также сетевые компоненты создают всемирный Интернет, который мы знаем сегодня.

Появление центров обработки данных

В своём последнем разделе мы рассмотрели различные роли, которые серверы, хосты и сетевые компоненты играют в межсетевом взаимодействии. Из- за того, что такими серверами требуется высокая ёмкость оборудования, они часто все вместе помещаются в неком централизованном расположении с тем, чтобы ими можно было более эффективно управлять. Мы будем называть такие расположения ЦОД (Центрами обработки данных, DC - datacenters).

Облачные центры обработки данных

с появлением облачных вычислений и программного обеспечения или инфраструктуры как некоторой службы (SaaS, IaaS), мы можем сказать, что такие поставщики облачных ЦОД строят облачные ЦОД. Из- за общего числа размещаемых серверов они обычно требуют большого, очень большого объёма энергоснабжения, отвода тепла и сетевых скоростей и нагрузок чем любой корпоративный ЦОД. На самом деле такие облачные ЦОД являются настолько крупными, что они обычно строятся вплотную к источникам энергоснабжения, где они могут получать наинизшую стоимость электричества без существенных потерь на его транспортировку. Они также могут творчески подходить к вопросу отвода тепла в тех местах, где ЦОД может быть построен в обычно прохладном климате и поэтому они могут просто открыть все двери и окна чтобы поддерживать работу сервера при безопасной температуре { Прим. пер.: и выращивать в заполярье кокосы и апельсины }. Любая из поисковых систем может снабдить вас поражающими воображения значениями, когда дело доходит до науки построения и управления такими облачными ЦОД для таких представителей как Amazon, Microsoft, Google и Facebook:

 

Рисунок 1


ЦОД в Юте (источник)

 

Службы, которые должны предоставлять данные серверы в ЦОД обычно не являются эффективными для размещения в каком- либо отдельно взятом сервере. Они распределяются по некоторой флотилии серверов, причём порой по множеству различных стоек для предоставления резервирования и гибкости для владельцев служб. Требования к латентности и резервированию оказывают гигантское воздействие на имеющуюся сетевую среду. Общее число взаимодействий устанавливает эквивалентность взрывному росту сетевого оборудования; это транслируется в то общее число раз, которое данное сетевое оборудование должно быть разведено по стойкам, подготовлено и как им управлять.

 

Рисунок 2


Сеть CLOS (источник)

 

В некотором смысле облачный ЦОД это именно то место, в котором становится необходимой автоматизация сетевой среды. Если мы следуем обычным способом управления сетевыми устройствами через некий терминал или интерфейс командной строки, общее число требуемых часов обслуживания не позволит данной службы быть доступной в разумном объёме времени. Это даже не говоря о том, что повторы людьми имеют склонность к ошибкам, отсутствию эффективности и ужасной растратой способностей инженеров.

Именно в облачном ЦОД автор начал свой путь сетевой автоматизации с помощью Python какое- то число лет тому назад и никогда не оглядывался назад с тех пор.

Модель OSI

Никакая книга по сетям не кажется полной, если она не пройдётся по модели OSI (Open System Interconnection, взаимодействия открытых систем). Данная модель является концептуальной, которая представляет в виде компонентов все функции телекоммуникаций в виде различных уровней. Данная модель определяет семь уровней, причём каждый уровень располагается непосредственно поверх другого, по мере того как они последовательно определяют структуры и характеристики. Например, имеющийся сетевой (network) уровень, такой как IP, может располагаться поверх различных типов канальных (data link) уровней, таких как Ethernet или ретрансляции кадров (frame relay). Эталонная модель OSI является хорошим способом для нормализации различных и отличающихся технологий в некий набор единого языка, на котором люди способны договариваться. Это значительно снижает сферу для участников, работающих на определённых индивидуальных уровнях и позволяет им углубляться в свои специфические задачи не беспокоясь о совместимости:

 

Рисунок 3


Модель OSI (источник - в оригинале)

 

Модель ISO первоначально была разработана в конце 1970х и позже была опубликована совместно ISO (International Organization for Standardization) и теперь называемым Telecommunication Standardization Sector из ITU-T (Telecommunication StandardizationSector of the International Telecommunication Union). Она повсеместно применяется и обычно упоминается при введении новой темы в области телекоммуникаций.

Примерно в тот же самый период времени, когда была разработана модель OSI, приобрёл очертания всемирный Интернет. Обозначение, под которым обычно используется данная модель, обозначается как модель TCP/IP, поскольку TCP (Transmission Control Protocol) и IP (Internet Protocol), так как первоначально именно они составляли комплект данного протокола. Они несколько похожи на саму модель OSI в отношении того как они подразделяют сквозную передачу данных на уровни абстракции. Что их различает, так это то, что данная модель объединяет уровни с 5 по 7 в модели OSI в общий уровень Application (Приложений), в то время как уровни Physical и Data link (физический и канальный) соединены в общий канальный (Link) уровень { Прим. пер.: оставляя на месте слегка переименованные сетевой (Transport) и транспортный (Transport), всего - 4 уровня }:

 


Комплект протокола интернет (источник

 

Обе модели и OSI, и TCP/IP полезны при снабжении некоторого стандарта для представления повсеместного взаимодействия данных. Однако, по большей части мы будем ссылаться именно на модель TCP/IP, во многом по той причине, что именно на ней был построен всемирный Интернет. Мы будем определять модель OSI когда это необходимо, например, когда мы обсуждаем в последующих главах всю структуру веб.

Модели клиент- сервер

Эталонные модели демонстрируют некий стандартный способ для взаимодействия данных между двумя узлами. Конечно, сегодня мы знаем, что не все узлы создаются эквивалентными. Даже в свои дни DARPA-net имелись узлы рабочих станций, а также имелись узлы для целей обслуживания содержимого другим узлам. Такие модули обычно имеют спецификации более высокого уровня и более пристально обслуживаются их инженерами. Так как эти узлы предоставляют ресурсы и службы прочим, они обычно называются серверами. Такие серверы обычно пребывают в состоянии покоя ожидая инициирующих запросов от клиентов для выдачи своих ресурсов. Такая модель распределённых ресурсов, которые "запрашиваются" клиентами обычно имеет название модели Клиент - Сервер.

Почему это важно? Если вы на минутку задумаетесь о ней, вся важность сетевой среды основывается в действительности на данной модели Клиент- Сервер. Без неё на самом деле не было бы большой потребности в межсетевом взаимодействии. Именно оно требуется для обмена битами и байтами между клиентом и сервером и именно оно освещает своим светом всю важность сетевой инженерии. Конечно, мы все в курсе того как самая большая из всех сеть, всемирный Интернет, преобразовала все наши жизни и продолжает делать это вновь и вновь.

Вы спросите как каждый узел определяет своё время, скорость, источник и получателя всякий раз, когда им потребуется взаимодействовать друг с другом? Это вплотную подводит нас к понятию сетевых протоколов.

TCP

TCP (Transmission Control Protocol, протокол управления передачей) является одним из самых основных протоколов, применяемых в нашем современном интернете. Если вы открыли некую веб страницу или отправили какое- то электронное письмо, вы прошли по сети при помощи протокола TCP. Данный протокол располагается на 4 уровне модели OSI и он отвечает за доставку всех сегментов данных между двумя узлами надёжным образом с проверкой на наличие ошибок. Сам TCP состоит из заголовка в 160 бит, содержащего помимо прочего порт источника и получателя, последовательный номер, номер подтверждения, управляющие флаги и контрольную сумму:

 

Рисунок 5


Заголовок TCP (источник

 

UDP

UDP также является ключевым участником имеющегося комплекта протокола Интернет. Как и TCP, он находится на 4 уровне модели OSI, который отвечает за доставку сегментов данных между прикладным уровнем и уровнем IP. В отличие от TCP его заголовок состоит всего лишь из 64 бит, который содержит только порт источника и получателя, длину и контрольную сумму. Такой легковесный заголовок делает его идеальным для приложений, предпочитающих более быструю доставку без установления определённого сеанса между двумя хостами или необходимости гарантированной доставки данных. Возможно это сложно представить в наши дни быстрых соединений интернет, однако такой дополнительный заголовок составлял значительную разницу в скорости передачи в ранние дни X.21 и соединений ретрансляции кадров (frame relay). Несмотря на важность сбережения скорости самой по себе, отсутствие установления различных состояний подобных TCP также сберегает вычислительные ресурсы на имеющихся двух оконечных точках.

 

Рисунок 6


Заголовок UDP (источник

 

Теперь вы можете задаться вопросом зачем вообще пользоваться UDP в наши дни; принимая во внимание отсутствие надёжной передачи, разве мы не желаем чтобы все наши соединения были надёжными и свободными от ошибок? Если вы задумаетесь о некотором мультимедийном приложении видео потока или вызове Skype { Прим. пер.: или сеансе удалённого рабочего места RDP Windows/ VMware/ XenServer/ FusionAccess/ VNC }, такие приложения получат преимущества от более лёгкого заголовка в случае, когда приложению всего лишь нужно доставить текужую дейтаграмму так быстро, как это только возможно. Вы также можете рассмотреть процесс просмотра DNS. Когда набранный вами в браузере адрес переводится в понятный компьютеру адрес, этот пользователь получает выгоду от более лёгкого процесса так как это случится даже "до" доставки самого первого бита информации вам с вашего любимого вебсайта.

Опять же, данный раздел не восстанавливает справедливость по теме UDP и читателю предлагается изучить данную тему в различных источниках если он/ она заинтересован в получении дополнительных знаний в отношении UDP.

IP

Как сказали бы сетевые инженеры, они сами ";живут" на уровне IP, который является 3 уровнем согласно модели OSI. IP имеет задание адресации и маршрутизации между оконечными узлами, помимо всего прочего. Именно адресация IP, вероятно, является наиболее важным заданием. Само адресное пространство подразделяется на две части; сетевую порцию и порцию хоста. Именно маска подсети указывает какая порция адреса относится к сетевой части, а какая к самому хосту. И IPv4, и, позднее, IPv6 отображают имеющийся адрес в нотации с точками, например, 192.168.0.1. Маска подсети может либо представляться в нотации с точками (255.255.255.0), либо с применением переднего слеша для отображения числа бит, которые должны рассматриваться как биты сети (/24).

 

Рисунок 7


Заголовок IPv4 (источник

 

Заголовок IPv6, последующее за IPv4 поколение заголовка IP, имеет некую фиксированную порцию и различные расширяющие заголовки.

 

Рисунок 8


Заголовок IPv6 (источник

 

Поле Next Header в разделе фиксированного заголовка может указывать некий последующий расширительный заголовок, который несёт дополнительную информацию. Такие расширительные заголовки могут содержать информацию о маршрутизации и фрагментации. Как бы сильно разработчики протокола не желали перейти с IPv4 на IPv6, интернет сегодня всё ещё достаточно много адресации выполняет при помощи IPv4.

NAT IP и безопасность

NAT (Network Address Translation, трансляция сетевого адреса) обычно используется для трансляции диапазона частных IPv4 адресов в общедоступные, допускающие маршрутизацию адреса IPv4. Но также это может означать и некую трансляцию между IPv4 в IPv6, например, в пограничных областях, когда IPv6 используется внутри самой сетевой среды, которые подлежат трансляции в IPv4 в том случае, когда эти пакета покидают данную сетевую среду. Порой NAT6to6 используется также по причинам безопасности.

Безопасность - это непрерывный процесс, который объединяет все аспекты сетевого взаимодействия, включая автоматизацию и Python. Данная книга имеет целью применение Python чтобы помочь вам в управлении сетевой средой; безопасности будет посвящена часть той главы которая применяет SSHv2 поверх telnet. Мы также рассмотрим, как мы можем применять Python и другие цепочки инструментов для получения визуализации сети.

Понятия маршрутизации IP

По моему личному мнению, маршрутизация IP состоит в том, чтобы иметь все необходимые промежуточные устройства между двумя оконечными пунктами обмена всеми пакетами между ними на основе имеющегося IP заголовка. Для каждого взаимодействия в интернете данный пакет будет перемещаться по различным промежуточным устройствам. Как уже упоминалось, такие промежуточные устройства состоят из маршрутизаторов, коммутаторов, оптического оборудования и различного прочего снаряжения, которые не рассматриваются за пределами сетевого и транспортного уровня. При аналогии с поездкой по дорогам вы можете отправиться в путешествие по Соединённым Штатам из города Сан Диего в Калифорнии в город Сиэтл в Вашингтоне. Адрес IP источника будет аналогом Сан Диего, а адресом IP назначения может быть указан Сеэтл. По своему пути вы можете останавливаться во множестве разнообразных промежуточных пунктах, таких Лос Анжелес, Сан Франциско и Портленд. Их все можно рассматривать как маршрутизаторы и коммутаторы между источником и пунктом назначения.

Почему это было важно? В некотором смысле данная книга посвящена управлению и оптимизации таких промежуточных устройств. В эпоху мега ЦОД, которые занимают размеры нескольких футбольных полей, необходимость эффективного, гибкого и экономически обоснованного подхода к управлению сетевой средой становится существенным моментом конкурентного преимущества для компаний. В последующих главах мы погрузимся в то, как мы можем применять программирование Python для эффективного управления своей сетевой средой.

Обзор языка Python

Если коротко, данная книга посвящена облегчению нашей жизни при помощи Python. Но что такое Python и почему именно он является избранным языком для многих инженеров DevOps? Словами фонда Python Executive Summary (https://www.python.org/doc/essays/blurb/):

Python является языком программирования с интерпретатором и объектно- ориентацией, а также обладающим высоким уровнем и при этом с динамической семантикой. Его встроенная структура данных высокого уровня в комбинации с динамической типизацией и динамическим связыванием делают его очень привлекательным для Быстрой разработки приложений, а также для применения в качестве языка сценариев или склеивающего языка для соединения имеющихся компонентов в одно целое. Python прост, обладает лёгким в освоении синтаксисе придающем особую значимость читабельности и, тем самым, снижает стоимость сопровождения.

Если вы в какой- то степени новичок в программировании, тогда слова объектно- ориентированная, динамическая семантика не означают для вас чего- то существенного. Однако я думаю, что все мы согласимся что Быстрая разработка приложений, простота и лёгкость обучения синтаксису звучат как хорошие понятия. Python как язык интерпретатора означает, что не требуется никакой процесс компиляции, поэтому значительно возрастает скорость процесса написания, проверки и изменения ваших программ. Для простых сценариев, в случае падения вашего сценария несколько операторов печати это обычно всё что вам нужно чтобы выяснить что идёт не так. Применение интерпретатора также означает, что Python просто переносится на различные типы операционных систем и программы Python, написанные в Windows могут применяться в Linux и Mac.

Объектно- ориентированная природа поощряет повторное применение кода посредством его разбиения на простые многоразовые формы такие как модули и пакеты. Фактически все файлы Python являются модулями, которые могут повторно применяться или импортироваться в другую программу Python. Это делает простым совместное использование программ между инженерами и поощряет повторное применение кода. У Python также имеются некий батарейки с мантрами, что означает, что нет нужды загружать дополнительный код для общих задач. Чтобы достичь этого и при том не раздувать черезчур сам код, при установке самого интерпретатора Python устанавливается некий набор стандартных библиотек. Для распространённых задач, таких как регулярные выражения, математические функции, а также декодирование JSON, всё что вам нужно, это оператор import и ваш интерпретатор перемести эти функции в вашу программу. Именно это я бы хотел рассмотреть как одно из убийственных свойств Python.

Наконец, тот факт, что код Python может стартовать с относительно небольшого сценария в несколько строк кода и превращаться в полноценную производственную систему, это очень удобно для сетевых инженеров. Как многие из нас знают, сама сетевая среда обычно органично развивается без некоего генерального плана. Язык, который может расти вместе с вашей сетью в размере неоценим. Вы можете быть удивлены, увидев язык, который многими считался языком сценариев и который при этом применялся для полноценных производственных систем (организации, применяющие Python, https://wiki.python.org/moin/OrganizationsUsingPython).

Если вы когда либо работали в среде, в которой вы должны переключаться по роду деятельности между платформами различных производителей, такими как Cisco IOS и Juniper Junos, вы знаете какая головная боль состоит в переключении между синтаксисом и применением когда вы пытаетесь достичь одной и той же цели. При помощи гибкости Python достаточной для больших и малых программ, больше нет такого переключения контекста, потому что это всего лишь Python.

На протяжении остатка данной главы мы предпримем тур по верхам нашего языка Python чтобы слегка освежить навыки. Если вы уже знакомы с основами, чувствуйте себя в праве перескочить к следующей главе.

Версии Python

на момент написания данной книги в начале 2017, Python Python пребывает в процессе перехода с Python версии 2 на Python версии 3. К сожалению Python 3 не совместим в обратную сторону с Python 2. Когда я произношу переход, имейте в виду, что Python 3 был выпущен в далёком 2008, более 9 лет назад с активной разработкой и наиболее поздней версией 3.6. Самый последний выпуск Python 2.x, 2.7 был выпущен шесть лет тому назад, в 2010. К счастью, на одной и той же машине могут сосуществовать обе версии. Что касается лично меня, я применяю Python 2 в качестве своего интерпретатора по умолчанию, когда я набираю Python в приглашении командной строки и я использую Python 3 когда мне необходимо применять Python 3. Дополнительная информация приводится в нашем следующем разделе об исполнении интерпретатора Python, однако вот пример исполнения Python 2 и Python 3 на машине Ubuntu Linux:

echou @pythonicNeteng:~$ python

More information.

>> > exit()

echou @pythonicNeteng:~$ python3

More information.

>> > exit()

  

С завершающим расширенную поддержку выпуском 2.7, оставляющим только обновления безопасности, большинство инфраструктур Python теперь поддерживают Python 3. Python3 также имеет множество полезных свойств, например, асинхронный ввод/ вывод, который может получать преимущества при нашей потребности в оптимизации кода. Данная книга будет применять Python 3 для своих примеров кода.

Если некоторые особые библиотеки не поддерживают Python 3, например, Ansible (они активно работают над переносом на Python 3), это будет указываться с тем чтобы вы могли вместо него применять Python 2.

Операционная система

Как уже упоминалось, Python является кросс платформенным. Программы Python могут исполняться в Windows, Mac, и Linux. { Прим. пер.: а также FreeBSD и массе прочих ОС } На практике необходимо придерживаться некоторых предосторожностей когда вам необходимо гарантировать кроссплатформенную совместимость, например, принять меры предосторожности о хитростях с обратными слешами в именах файлов Windows { Прим. пер.: подробнее см. Исправление имён файлов Unix/Linux/POSIX }. Поскольку данная книга предназначена для DevOps, системных и сетевых инженеров, Linux является предпочитаемой платформой для целевой аудитории, особенно для промышленных применений. Весь код данной книги был проверен на машине с Linux Ubuntu 16.06 LTS. Я также приложил все свои усилия чтобы убедиться, что данный код работает также на платформе Windows и Mac.

Если вас интересуют подробности применяемой ОС, они таковы:

echou @pythonicNeteng:~$ uname -a

GNU / Linux

echou @pythonicNeteng:~$

  

Исполнение программ Python

Программы Python исполняются неким интерпретатором, что означает, что данный код подаётся через такой интерпретатор для его исполнения лежащей в основе операционной системой и отображения результатов. Существует ряд различных реализаций данного интерпретатора в имеющемся сообществе разработчиков Python, такие как IronPython и Jython. В данной книге мы будем иметь дело с наиболее распространённой на сегодняшний день версией интерпретатора Python, СPython.

Одним из способов, которым вы можете применять Python состоит в получении преимуществ от имеющегося интерактивного приглашения. Это полезно когда вы желаете быстро проверить некую порцию кода или концепцию Python без написания программы целиком. Это обычно выполняется простым набором с клавиатуры Python:

More information.

>> > print("hello world")

Hello world

>> >

  

Такой интерактивный режим является одним из самых полезных свойств Python. В такой интерактивной оболочке вы можете набирать любой разрешённый оператор или последовательность операторов и немедленно получать результат обратно. Обычно я использую это для исследования некоторого свойства или библиотеки, с которыми я не знаком. А вы говорите моментальное удовольствие!

Наиболее распространённым способом исполнения программ, однако, является их сохранение в вашем файле Python и последующем исполнении их в интерпретаторе. Это убережёт вас от набора одних и тех же операторов снова и снова, так как вы это делаете в интерактивной оболочке. Файлы Python являются всего лишь обычными текстовыми файлами, которые обычно сохраняются с расширением.py. В мире *nix вы также можете добавить поверх строку shebang #!) для определения того интерпретатора, который вы используете для выполнения данного файла. Символ # может применяться для определения комментариев, которые не будут исполняться вашим интерпретатором. Приводимый ниже файл helloworld.py имеет такие операторы:

 

# This is a comment

print("hello world")

     

Он может быть исполнен следующим образом:

echou @pythonicNeteng:~/Master_Python_Networking/

Chapter1$ python helloworld.py

Hello world

echou @pythonicNeteng:~/Master_Python_Networking/

Chapter1$

  

Встроенные типы Python

Python имеет некоторые стандартные типы, встроенные в сам интерпретатор:

  • None: Это объект Null
  • Численный: int, long, float, complex и bool (это подкласс int со значениями True или False)
  • Последовательности: str (строка), list (список), tuple (кортеж) и range (диапазон)
  • Соответствие: dict
  • Множества: set и frozenset

Тип None

Тип None обозначает некий объект без значения. именно это возвращается функцией, которая в явном виде ничего не возвращает. Тип None также применяется в качестве аргумента функции для определения ошибки в случае, когда вызывающий её не передал некоторого реального значения.

Числа

Численные объекты Python в основном являются собственно числами. За исключением Булева, все числовые типы int, long, float и complex имеют знак, что означает, что они могут быть положительными и отрицательными. Булевский тип (логический) является подклассом значений целого, который может иметь только два значения: 1 для True и 0 для False. Остальные числовые типы различаются только тем насколько точно они могут представлять данное число; например, int это целые числа с ограниченным диапазоном, а long - с неограниченным. float - это числа, применяющие представление с двойной точностью (64- бита) на данной машине. { Прим. пер.: представление может различаться для разных процессоров, что может стать источником очень трудно обнаруживаемых ошибок при переносе кодов с платформы на платформу. Помните об этом! }

Последовательности

Последовательности являются упорядоченными наборами объектов с неким индексом из неотрицательных целых. В этом и нескольких последующих разделах мы будем применять свой интерактивный интерпретатор для иллюстрации различных типов. Не стесняйтесь набирать то же самое на своём собственном компьютере.

Порой это может оказаться сюрпризом для людей, что string на самом деле некий тип последовательности. Однако если вы взглянете пристальней, строки это последовательности помещённых вместе символов. Строки заключаются в одиночные, двойные или тройные кавычки. В последующем примере отметим ту строку, которая слишком длинна и тройные кавычки позволяют нам расширить такую строку на несколько строчек:

>>> a = "networking is fun"

>>> b = 'DevOps is fun too'

>>> c = """what about coding?

... super fun!"""

>>>

  

Другими двумя широко применяемыми типами последовательностей являются списки и кортежи. Списки являются последовательностями произвольных объектов. Списки можно создавать при помощи заключения своих объектов в квадратные скобки. В точности как и строки, списки индексируются неотрицательными целыми, начинающимися с нуля. Значения списков выбираются путём ссылки по значению индекса:

>> > vendors = [ "Cisco", "Arista", "Juniper" ]

>> > vendors[ 0 ]

'Cisco'

>> > vendors[ 1 ]

'Arista'

>> > vendors[ 2 ]

'Juniper'

  

Кортежи похожи на списки и создаются заключением всех значений в круглые скобки. Как и списки, значения в данном кортеже выбираются путём ссылки на его индексный номер. В отличии от списков, все значения не могут изменяться после их создания:

>> > datacenters = ("SJC1", "LAX1", "SFO1")

>> > datacenters[ 0 ]

'SJC1'

>> > datacenters[ 1 ]

'LAX1'

>> > datacenters[ 2 ]

'SFO1'

  

Некоторые операции являются общими для всех типов последовательностей, например, возвращение некоторого элемента по значению его индекса, а также расслоение:

>> > a

'networking is fun'

>> > a[ 1 ]

'e'

>> > vendors

[ 'Cisco', 'Arista', 'Juniper' ]

>> > vendors[ 1 ]

'Arista'

>> > datacenters

('SJC1', 'LAX1', 'SFO1')

>> > datacenters[ 1 ]

'LAX1'

>> >

>>> a[ 0:2 ]

'ne'

>> > vendors[ 0:2 ]

[ 'Cisco', 'Arista' ]

>> > datacenters[ 0:2 ]

('SJC1', 'LAX1')

>> >

  

Имеются также общие функции, которые могут применяться к типам последовательностей, такие как проверка общего числа элементов, а также минимальное и максимальное значения:

>> > len(a)

17

>> > len(vendors)

3

>> > len(datacenters)

3

>> >

>>> b = [ 1, 2, 3, 4, 5 ]

>> > min(b)

1

>> > max(b)

5

  

Неудивительно, что существуют различные методы, которые применяются только к строкам. Стоит отметить, что эти методы не изменяют имеющиеся строковые данные и всегда возвращают новую строку. Если вы хотите использовать новое значение для строки, вам необходимо перехватить возвращаемое значение и присвоить его другой переменной:

>> > a

'networking is fun'

>> > a.capitalize()

'Networking is fun'

>> > a.upper()

'NETWORKING IS FUN'

>> > a

'networking is fun'

>> > b = a.upper()

>> > b

'NETWORKING IS FUN'

>> > a.split()

[ 'networking', 'is', 'fun' ]

>> > a

'networking is fun'

>> > b = a.split()

>> > b

[ 'networking', 'is', 'fun' ]

>> >

  

Вот некоторые общеупотребимые методы для какого- то списка. Такой список является очень полезной структурой с точки зрения ввода нескольких элементов и выполнения итераций с их помощью. Например, мы можем создать некий список коммутаторов ствола ЦОД и применить один и тот же список доступа к ним всем итеративно пройдясь по ним, последовательно один за другим. Так как некий список значений может изменяться после создания (в отличии от кортежей), мы также можем расширять и выделять имеющийся список по мере продвижения в данной программе.

>> > routers = [ 'r1', 'r2', 'r3', 'r4', 'r5' ]

>> > routers.append('r6')

>> > routers

[ 'r1', 'r2', 'r3', 'r4', 'r5', 'r6' ]

>> > routers.insert(2, 'r100')

>> > routers

[ 'r1', 'r2', 'r100', 'r3', 'r4', 'r5', 'r6' ]

>> > routers.pop(1)

'r2'

>> > routers

[ 'r1', 'r100', 'r3', 'r4', 'r5', 'r6' ]

  

Соответствия

Python предоставляет один тип соответствия, называемый словарём. Я себе представляю словарь как базу данных для бедных, так как он содержит объекты, которые могут индексироваться ключами. Его часто называют ассоциативным массивом или таблицей хэшей в прочих языках программирования. Если вы уже применяли какие- либо подобные словарям объекты в других языках, вы будете знать, что это мощный тип, так как вы можете ссылаться на свой объект посредством читабельного ключа. Этот ключ более интуитивно понятен для тех несчастных людей, которые пытаются сопровождать ваш код, вероятно, через несколько месяцев после того как вы написали этот код в 2 часа утром. Данный объект также может быть другим типом данных, таким как список. Вы можете создать некий словарь с помощью фигурных скобок:

>> > datacenter1 = { 'spines': [ 'r1', 'r2', 'r3', 'r4' ]}

>> > datacenter1[ 'leafs' ] = [ 'l1', 'l2', 'l3', 'l4' ]

>> > datacenter1

{ 'leafs': [ 'l1', 'l2', 'l3', 'l4' ], 'spines': [ 'r1',

'r2', 'r3', 'r4' ]}

>> > datacenter1[ 'spines' ]

[ 'r1', 'r2', 'r3', 'r4' ]

>> > datacenter1[ 'leafs' ]

[ 'l1', 'l2', 'l3', 'l4' ]

  

Множества

Множество применяется для того чтобы содержать неупорядоченные коллекции объектов. В оличии от списков и кортежей наборы не имеют порядка и не могут индекисроваться числами. Однако имеется одно свойство, которое делает множества выделяющимися и полезными: все элементы в некотором наборе никогда не дублируются. Представим себе, что у вас имеется некий список IP, который вам необходимо поместить в некий список доступа. Единственная проблема в данном списке IP состоит в том, что он полон дублирований. Теперь подумайте о том как вы можете применить цикл для сортировки с целью выявления уникальных элементов, в то время как имеющийся встроенный тип множества позволил бы вам избежать все повторяющиеся элементы всего лишь одной строкой кода. Если быть честным, я не применяю множества очень часто, однако когда мне это требуется, я всегда очень благодарен их наличию. Когда создаётся множество множеств, их можно сравнивать друг с другом при помощи объединения, пересечения и различия:

>> > a = "hello"

>> > set(a)

{ 'h', 'l', 'o', 'e' }

>> > b = set([ 1, 1, 2, 2, 3, 3, 4, 4 ])

>> > b

{ 1, 2, 3, 4 }

>> > b.add(5)

>> > b

{ 1, 2, 3, 4, 5 }

>> > b.update([ 'a', 'a', 'b', 'b' ])

>> > b

{ 1, 2, 3, 4, 5, 'b', 'a' }

>> > a = set([ 1, 2, 3, 4, 5 ])

>> > b = set([ 4, 5, 6, 7, 8 ])

>> > a.intersection(b)

{ 4, 5 }

>> > a.union(b)

{ 1, 2, 3, 4, 5, 6, 7, 8 }

>> > 1 *

{ 1, 2, 3 }

>> >

  

Операторы Python

Python имеет некоторые численные операторы, которые вы ожидаете получить; отметим, что усекающее деление (//, также называемое floor division - нижним делением) усекает получаемый результат до некоторого целого и десятичной точки и возвращает целое значение. { Прим. пер.: всегда вниз, 7//3=2 и -7//2=-3 } Оператор взятия по модулю % возвращает остаток от деления:

>>> 1 + 2

3

>>> 2 - 1

1

>>> 1 * 5

5

>>> 5 / 1

5.0

>>> 5 // 2

2

>>> 5 % 2

1

  

Также имеются операции сравнения:

>> > a = 1

>> > b = 2

>>


Поделиться с друзьями:

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.277 с.