Разделы сайта
Выбор редакции:
- Окрестности кальпе испания
- Как правильно заряжать ноутбук, чтобы продлить срок службы батареи Как заряжать аккумулятор ноутбука первый раз
- Skyrim - гайд по улучшению графики (UPD) Основные графические настройки Скайрим
- Как усыновить ребёнка в Скайриме – Дети для усыновления Скачать мод на скайрим улучшенные дети
- Разблокировать Bootloader HTC
- На время полета отключить мобильный телефон
- Телефон службы поддержки киевстар или как позвонить оператору Дополнительная информация по обращению в справочную службу
- Левитирующая колонка красная Будущее, в котором возможны такие технические новинки, уже наступило
- Что такое майнинг криптовалюты простым языком
- Детализация звонков МТС: все способы получения распечатки звонков
Реклама
Углубленный уровень. Списки в Python |
В Python просто генераторы и генераторы списков - разные вещи. Здесь есть проблема перевода с английского. То, что мы привыкли называть генератором списка, в английском варианте звучит как "list comprehension " и к генераторам никакого отношения не имеет. Слово "comprehension" (понимание, осмысление) оказывается как бы не в тему при переводе на русский. Получается что-то вроде "понимание списка". Поэтому мы говорим "генератор списка", понимая под словом "генератор" не объект, а синтаксическую конструкцию, которая генерирует, то есть создает, список. С другой стороны, объекты-генераторы - это особые объекты-функции, которые между вызовами сохраняют свое состояние. В цикле for они ведут себя подобно итерируемым объектам, к которым относятся списки, словари, строки и др. Однако генераторы поддерживают метод __next__(), а значит являются разновидностью итераторов. Быстрым способом создания относительно простых объектов-генераторов являются генераторные выражения - generator expressions . Синтаксис этих выражений похож на синтаксис генераторов списков. Однако они возвращают разные типы объектов. Первый - объект-генератор. Второй - список. Сначала рассмотрим генераторы списков, чтобы привыкнуть к синтаксической конструкции. Генераторы списковВ Python генераторы списков позволяют создавать и быстро заполнять списки. Синтаксическая конструкция генератора списка предполагает наличие итерируемого объекта или итератора, на базе которого будет создаваться новый список, а также выражение, которое будет что-то делать с извлеченными из последовательности элементами перед тем как добавить их в формируемый список. >>> a = [ 1 , 2 , 3 ] >>> b = [ i+10 for i in a] >>> a [ 1 , 2 , 3 ] >>> b [ 11 , 12 , 13 ] В примере выше генератором списка является выражение . Здесь a - итерируемый объект. В данном случае это другой список. Из него извлекается каждый элемент в цикле for. Перед for описывается действие, которое выполняется над элементом перед его добавлением в новый список. Обратите внимание, что генератор создает новый список, а не изменяет существующий. Если надо изменить текущую переменную, ей надо присвоить новое значение: >>> a = [ 1 , 2 , 3 ] >>> a = [ i+10 for i in a] >>> a [ 11 , 12 , 13 ] Генераторы списков относятся к разряду "синтаксического сахара" языка программирования Python. Другими словами, без них можно обойтись: >>> for index, value in enumerate (a) : ... a [ index] = value + 10 ... >>> a [ 11 , 12 , 13 ] Если в программе может быть несколько ссылок на список, генераторами надо пользоваться осторожно: >>> ls0 = [ 1 , 2 , 3 ] >>> ls1 = ls0 >>> ls1.append (4 ) >>> ls0 [ 1 , 2 , 3 , 4 ] >>> ls1 = [ i+1 for i in ls1] >>> ls1 [ 2 , 3 , 4 , 5 ] >>> ls0 [ 1 , 2 , 3 , 4 ] Здесь мы предполагаем, что изменение списка через одну переменную, будут видны через другую. Однако если изменить список генератором, то переменные будут указывать на разные списки. Перебираемым в цикле for объектом может быть быть не только список. В примере ниже в список помещаются строки файла. >>> lines = [ line.strip () for line in open ("text.txt" ) ] >>> lines [ "one" , "two" , "three" ] В генератор списка можно добавить условие: >>> from random import randint >>> nums = [ randint(10 , 20 ) for i in range (10 ) ] >>> nums [ 18 , 17 , 11 , 11 , 15 , 18 , 11 , 20 , 10 , 19 ] >>> nums = [ i for i in nums if i%2 == 0 ] >>> nums [ 18 , 18 , 20 , 10 ] Генераторы списков могут содержать вложенные циклы: >>> a = "12" >>> b = "3" >>> c = "456" >>> comb = [ i+j+k for i in a for j in b for k in c] >>> comb [ "134" , "135" , "136" , "234" , "235" , "236" ] Генераторы словарей и множествЕсли в выражении генератора списка заменить квадратные скобки на фигурные, то можно получить не список, а словарь: >>> a = { i:i**2 for i in range (11 , 15 ) } >>> a { 11 : 121 , 12 : 144 , 13 : 169 , 14 : 196 } При этом синтаксис выражения до for должен быть соответствующий словарю, то есть включать ключ и через двоеточие значение. Если этого нет, будет сгенерировано множество: >>> a = { i for i in range (11 , 15 ) } >>> a set ([ 11 , 12 , 13 , 14 ] ) >>> b = { 1 , 2 , 3 } >>> b set ([ 1 , 2 , 3 ] ) ГенераторыВыражения, создающие объекты-генераторы, похожи на выражения, генерирующие списки, словари и множества за одним исключением. Чтобы создать генераторный объект, надо использовать круглые скобки: >>> a = (i for i in range (2 , 8 ) ) >>> a < generator object < genexpr> at 0x7efc88787910 > >>> for i in a: ... print (i) ... 2 3 4 5 6 7 Второй раз перебрать генератор в цикле for не получится, так как объект-генератор уже сгенерировал все значения по заложенной в него "формуле". Поэтому генераторы обычно используются, когда надо единожды пройтись по итерируемому объекту. Кроме того, генераторы экономят память, так как в ней хранятся не все значения, скажем, большого списка, а только предыдущий элемент, предел и формула, по которой вычисляется следующий элемент. Выражение, создающее генератор, это сокращенная запись следующего: >>> def func(start, finish) : ... while start < finish: ... yield start * 0.33 ... start += 1 ... >>> a = func(1 , 4 ) >>> a < generator object func at 0x7efc88787a50 > >>> for i in a: ... print (i) ... 0.33 0.66 0.99 Если нет необходимости использовать функцию многократно, проще использовать выражение: >>> b = (i*0.33 for i in range (1 , 4 ) ) >>> b < generator object < genexpr> at 0x7efc88787960 > >>> for i in b: ... print (i) ... 0.33 0.66 0.99 | |Генераторы списков (list comprehensions) позволяют быстро создать список на основе существующих списков. При помощи генератора можно построить список на основе любого итерируемого типа данных (к примеру, из строк или кортежей). В результате цикл создаст такой же список: ["8", "h", "o", "s", "t"] Условные выражения в генераторах списковГенераторы списков могут использовать условные выражения, чтобы изменить существующие списки или другие последовательные типы данных, и в результате получить новый список. Давайте рассмотрим генератор с выражением if: fish_tuple = ("blowfish", "clownfish", "catfish", "octopus") Список использует кортеж fish_tuple в качестве основы для нового списка fish_list. Ключевые слова for и in используются так же, как в предыдущем размере. Кроме того, генератор содержит выражение if, благодаря чему он исключает из списка строку ‘octopus’. Запросите содержимое списка fish_list и убедитесь, что он содержит все элементы fish_tuple, кроме ‘octopus’. ["blowfish", "clownfish", "catfish"] Как видите, с помощью условного выражения можно исключить из нового списка определённый элемент. Теперь рассмотрим другой пример, в котором используются математические операции, цифры и метод range().
Читайте также: Новый список number_list будет содержать квадратичные значения каждого чётного элемента в диапазоне от 0-9. В результате получится такой список: Давайте разберём этот пример пошагово. Если вместо x ** 2 for x использовать просто x for x, список будет выглядеть так: number_list = После этого в генератор было добавлено условное выражение: number_list = Выражение if исключило из списка все нечётные числа. Теперь осталось добавить оператор, который возведёт все элементы в квадрат: number_list = Теперь каждый элемент списка будет возведён в квадрат. Также в генераторах можно использовать вложенные выражения if: number_list = Сегодня я расскажу о таком типе данных, как списки , операциях над ними и методах, о генераторах списков и о применении списков. Что такое списки?Списки в Python - упорядоченные изменяемые коллекции объектов произвольных типов (почти как массив, но типы могут отличаться). Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами. Например, можно обработать любой итерируемый объект (например, ) встроенной функцией list : >>> list ("список" ) ["с", "п", "и", "с", "о", "к"]Список можно создать и при помощи литерала: >>> s = # Пустой список >>> l = [ "s" , "p" , [ "isok" ], 2 ] >>> s >>> l ["s", "p", ["isok"], 2]Как видно из примера, список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего. И еще один способ создать список - это генераторы списков . Генератор списков - способ построить новый список, применяя выражение к каждому элементу последовательности. Генераторы списков очень похожи на цикл . >>> c = [ c * 3 for c in "list" ] >>> c ["lll", "iii", "sss", "ttt"]Возможна и более сложная конструкция генератора списков: >>> c = [ c * 3 for c in "list" if c != "i" ] >>> c ["lll", "sss", "ttt"] >>> c = [ c + d for c in "list" if c != "i" for d in "spam" if d != "a" ] >>> c ["ls", "lp", "lm", "ss", "sp", "sm", "ts", "tp", "tm"]Но в сложных случаях лучше пользоваться обычным циклом for для генерации списков. Функции и методы списковСоздать создали, теперь нужно со списком что-то делать. Для списков доступны основные , а также методы списков. Таблица "методы списков"
Нужно отметить, что методы списков, в отличие от , изменяют сам список, а потому результат выполнения не нужно записывать в эту переменную. >>> l = [ 1 , 2 , 3 , 5 , 7 ] >>> l . sort () >>> l >>> l = l . sort () >>> print (l ) NoneИ, напоследок, примеры работы со списками: >>> a = [ 66.25 , 333 , 333 , 1 , 1234.5 ] >>> print (a . count (333 ), a . count (66.25 ), a . count ("x" )) 2 1 0 >>> a . insert (2 , - 1 ) >>> a . append (333 ) >>> a >>> a . index (333 ) 1 >>> a . remove (333 ) >>> a >>> a . reverse () >>> a >>> a . sort () >>> a [-1, 1, 66.25, 333, 333, 1234.5]Изредка, для увеличения производительности, списки заменяют гораздо менее гибкими У языка программирования Pyrhon есть особая синтаксическая конструкция, с помощью которой можно на основании определенных правил создавать заполненные списки. Формируемые списки могут получаться различными, содержание конструкции может быть разным, поэтому они получили название генераторы списков. Они удобны, потому что записи получаются не такими длинными, нежели при традиционном методе создания списков. К примеру, нужен список из натуральных чисел до конкретного числа. Традиционный метод будет иметь такой вид: >>> a = >>> for i in range(1,15): ... a.append(i) ... >>>Список занял три строчки кода. А генератору нужна только одна: >>> a = >>> aКонструкция – это генератор списка. Всю конструкции нужно поместить в квадратные списки, что отражает создание списка. Внутри скобок есть три части:
Разберем на примере>>> a = >>> b = >>> bВ этой ситуации мы берем каждый элемент перечня и возводим в квадрат. Отсюда:
Тут берем ключ в словаре, а в генерируемый список попадает произведение ключа на имеющееся у него значение. >>> a = {1:10, 2:20, 3:30} >>> b = [] for i in a] >>> b [, , ] >>> c = >>> cВ данном случае список b содержит вложенные списки. Опустив в генераторе квадратные скобы по выражению ] была бы получена ошибка. Если вам нужен одноуровневый перечень с ключами из словарных значений, нужно взять каждый вложенный перечень и уже оттуда брать каждый компонент. Делается это вложенной конструкцией for. Традиционный синтаксис формирования перечня имеет такой вид: >>> c = >>> for i in b: ... for j in i: ... c.append(j) ... >>> cГенераторы списков могут дополняться конструкцией if. К примеру, нужно извлечь все числа из строки: >>> a = "lsj94ksd231 9" >>> b =Либо наполнить список цифрами, кратными 31 или 30: >>> a = >>> aПеречни так создаваться намного проще и быстрее. Но, они не годятся для замены достаточно сложных конструкций. К примеру, если в условии проверки будет ветка else. Закончились деньги, а до зарплаты еще пара недель? Можно одолжить, но что делать если не у кого? Не идти же в банк за кредитом. В этом случае вам помогут микрозаймы . Простой зайдите на сайт, оформите заявку (это очень просто и быстро) и через несколько минут вы получите деньги! Очень удобно и быстро, и главное не нужно ни у кого просить! В каждом языке программирования есть одна такая особенность, сложно устроенная, но специально упрощённая штука. Если вы раньше писали на другом языке, можете и не обратить на это внимания, поскольку ваш старый язык не так сильно упрощал эту штуку (потому что он был занят тем, что сильно упрощал какую-нибудь другую штуку). В этой главе вы изучите генераторы списков, словарей и множеств - три взаимосвязанные концепции, сконцентрированные вокруг одной очень мощной технологии. Но сначала я хочу немного отклониться от нашего повествования, чтобы рассказать вам о двух модулях, которые помогут вам передвигаться по вашей локальной файловой системе. Работа с файлами и каталогамиPython 3 поставляется с модулем os , что означает «операционная система». содержит множество функций для получения информации о локальных каталогах, файлах, процессах и переменных окружения (а в некоторых случаях, и для манипулирования ими). Python предлагает очень хороший унифицированный программный интерфейс для всех поддерживаемых операционных систем , так что ваши программы можно запускать на любом компьютере с минимальным количеством платформо-зависимого кода. Текущий рабочий каталогКогда ваше знакомство с Python только начинается, вы много времени проводите в интерактивной оболочке Python . На протяжении всей этой книги вы будете видеть примеры, выглядящие следующим образом:
Всегда есть текущий рабочий каталог. Если вы ничего не знаете о текущем рабочем каталоге, то, возможно, шаг 1 окажется неудачным и будет порождено исключение типа ImportError . Почему? Потому что Python будет искать указанный модуль в пути поиска оператора import , но не найдёт его, потому что каталог examples не содержится в путях поиска. Чтобы исправить это, вы можете сделать одно из двух:
Текущий рабочий каталог является неявным параметром, который Python постоянно хранит в памяти. Текущий рабочий каталог есть всегда, когда вы работаете в интерактивной оболочке Python, запускаете свой сценарии из командной строки или CGI -сценарий где-то на веб-сервере . Модуль os содержит две функции для работы с текущим рабочим каталогом.
Работа с именами файлов и каталоговРаз зашла речь о каталогах, я хочу обратить ваше внимание на модуль os .path . Он содержит функции для работы с именами файлов и каталогов.
Модуль os .path также содержит функции для разбиения файловых путей, имён папок и файлов на их составные части.
Получение содержимого каталогаМодуль glob понимает символы-джокеры, использующиеся в командных оболочках. Модуль glob - это ещё один инструмент из стандартной библиотеки Python. Это простой способ программно получить содержимое папки, а также он умеет использовать символы-джокеры , с которыми вы наверняка знакомы, если работали в командной строке.
Получение сведений о файлеЛюбая современная операционная система хранит сведения о каждом файле (метаданные): дата создания, дата последней модификации, размер файла и т. д. Python предоставляет единый программный интерфейс для доступа к этим метаданным. Вам не надо открывать файл; всё, что требуется - имя файла.
Получение абсолютных путейВ предыдущем разделе функция glob .glob () возвращала список относительных путей. В первом примере пути имели вид "examples\feed.xml" , а во втором относительные пути были даже короче, например, "romantest1.py" . Пока вы остаётесь в текущем рабочем каталоге, по этим относительным путям можно будет открывать файлы или получать их метаданные. Но если вы захотите получить абсолютный путь - то есть тот, который включает все имена каталогов до корневого или до буквы диска, вам понадобится функция os .path .realpath () . >>>
import
os
c:\Users\pilgrim\diveintopython3\examples\feed.xml Генераторы списковВ генераторах списков можно использовать любые выражения Python. С помощью генераторов списков можно легко отобразить один список в другой, применив некоторую функцию к каждому элементу.
В генераторах списков можно использовать любые выражения Python, включая функции модуля os , применяемые для работы с файлами и каталогами.
При генерировании списков можно также фильтровать элементы, чтобы отбросить некоторые значения.
Все рассмотренные примеры генераторов списков использовали простые выражения: умножение числа на константу, вызов одной функции или просто возврат элемента списка без изменений (после фильтрации). Но при генерации списков можно использовать выражения любой сложности.
Генераторы словарейГенератор словаря похож на генератор списка, но вместо списка он создает словарь.
Также, как и в генераторах списков, вы можете включать в генераторы словарей условие if , чтобы отфильтровать входную последовательность с помощью выражения-условия, вычисляющегося для каждого элемента.
|
Читайте: |
---|
Новое
- Как правильно заряжать ноутбук, чтобы продлить срок службы батареи Как заряжать аккумулятор ноутбука первый раз
- Skyrim - гайд по улучшению графики (UPD) Основные графические настройки Скайрим
- Как усыновить ребёнка в Скайриме – Дети для усыновления Скачать мод на скайрим улучшенные дети
- Разблокировать Bootloader HTC
- На время полета отключить мобильный телефон
- Телефон службы поддержки киевстар или как позвонить оператору Дополнительная информация по обращению в справочную службу
- Левитирующая колонка красная Будущее, в котором возможны такие технические новинки, уже наступило
- Что такое майнинг криптовалюты простым языком
- Детализация звонков МТС: все способы получения распечатки звонков
- Интеграция виртуальной АТС Zadarma и Zoho CRM