Использование генератора для формирования списка 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование генератора для формирования списка



Например, создание списка кубов целых чилел от 1 до 10 можно осуществить следующим образом:

>>> a_list=[x**3 for x in range (1, 11)]
>>> a_list
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000].

Выражение x**3 for x in range(1,11) является генераторным выражением. Оно имеет тип генератора:

>>> type (x**3 for x in range (1, 11))
<class 'generator'>

и состоит из выражения x**3, за которым следует оператор for для итерабельного типа. В таком виде генераторное выражение может использоваться только в качестве единичного аргумента в функциях. В остальных случаях необходимо указывать его в скобках, например при анализе, является ли тип generator итерабельным:

>>> import collections
>>> isinstance ((x**3 for x in range (1, 11)), collections.Iterable)
True.

В приведенном примере сформированные кубы целых чисел сохранены в памяти в виде списка. Для длинных последовательностей это не всегда удобно. Рассмотрим вариант генерации кубов чисел без сохранения их в памяти:

>>> gen=(x**3 for x in range (1, 11))
>>> for x in gen:
print x, end= ' ')
1, 8, 27, 64, 125, 216, 343, 512, 729, 1000.

Поскольку значения генератора gen не сохранены в памяти повторное его использование ничего не дает:

>>> for x in gen:
print x, end= ' ')

Оглавление

Использование генератора для формирования множества

Создадим с помощью генератора множество букв, из которых состоит предложение "Карл украл у Клары кораллы", представив их в верхнем регистре:

>>> a_set={x for x in 'Карл украл у Клары кораллы'.upper()}
>>> a_set
{'О', 'Л', 'К', 'А', ' ', 'Ы', 'Р', 'У'}.

Оглавление

Использование генератора для формирования словаря

В качестве последнего примера использования генераторов рассмотрим создание словаря, ключами которого являются числа, заданные в списке, а значениями – квадратные корни этих чисел:

>>> {x:x**(1/2) for x in [2, 5, 25] }
{25: 5.0, 2: 1.4142135623730951, 5: 2.23606797749979}.

Формировать элементы последовательностей также можно с использованием встроенной функции map() (см. подраздел 1.5.2 лаб. раб. №6).

Оглавление

Копирование объектов

В подразделе 1.4 при описании метода copy() был использован термин поверхностная копия. Поскольку существует еще и глубокая копия, дадим разъяснение этим терминам.
Операторы присваивания в языке Python не копируют объекты, они только сооздают ссылки на объект. Для контейнеров, которые являются изменяемыми или содержат изменяемые элементы, возникает иногда необходимость их копирования – чтобы можно было изменить копию, не изменяя исходные значения.
Модуль copy содержит два метода:

· один для создания поверхностной копии – copy.copy(x);

· другой для создания глубокой копии – copy.deepcopy(x).

Различие между между поверхностным (англ. shallow) и глубоким (англ. deep) копированием имеет смысл только для составных объектов (объектов, которые содержат другие объекты, например, списки, словари или экземпляры классов):

· поверхностное копирование создает новый составной объект, в который включаются ссылки на объекты, содержащиеся в исходном объекте;

· глубокое копирование создает новый составной объект, в который рекурсивно включаются копии объектов, составляющих исходный объект.

В качестве примера создадим и сравним поверзностную и глубокую копию словаря:

>>> import copy
>>> a_dict={1:5,2:{3:25}}
>>> a_dict
{1: 5, 2: {3: 25}}
>>> b_dict=copy.copy(a_dict)
>>> b_dict
{1: 5, 2: {3: 25}}
>>> b_dict[2][3]=77
>>> a_dict
{1: 5, 2: {3: 77}}.

Видно, что при использовании поверхностного копирования словаря (функции copy()) изменения в полученной копии привели к изменению оригинала. При использовании глубокого копирования (функции deepcopy()) этого не произойдет:

>>> a_dict={1:5,2:{3:25}}
>>> c_dict=copy.deepcopy(a_dict)
>>> c_dict[2][3]=77
>>> a_dict
{1: 5, 2: {3: 25}}.

Для создания "поверхностной" копии помимо метода copy() модуля copy() можно также использовать:

· методы copy() изменяемых объектов: списков, множеств и словарей (см. подразделы 2.3 лаб. раб. №3, 1.4 и 2.2);

· срезы последовательностей (см. подраздел 1.4.2 лаб. раб. №3);

· конструкторы, аргументы которых содержат тот же тип, что и создаваемый объект (см. описания конструкторов всех рассмотренных типов).

Оглавление

Индивидуальные задания

Разработать программу на языке Python, которая выполняет следующее:

· 1 Создает множество a_set, содержащее не менее 7 элементов любых разрешенных типов, с помощью (см. колонку "Множество"/"Создание" табл. №1):

§ 1 – литерала;

§ 2 – конструктора;

§ 3 – генератора.

· 2 Создает итерабельный объект it_ob, содержащий не менее трех элементов, имеющихся в объекте a_set, и проверить, все ли элементы it_ob хэшируемы. Если нет – заменить нехэшируемые элементы хэшируемыми.

· 3 Преобразует объект it_ob в множество b_set и выполняет над множествами a_set и b_set операции (см. колонку "Множество"/"Операции" табл. №1):

§ 1 – union();

§ 2 – intersection();

§ 3 – difference();

§ 4 – symmetric_difference().

· 4 Создает словарь a_dict с помощью (см. колонку "Словарь"/"Создание" табл. №1):

§ 1 – литерала;

§ 2 – конструктора с именованными аргументами;

§ 3 – конструктора с аргументом, имеющем тип словаря;

§ 4 – конструктора с аргументом итерабельного типа;

§ 5 – генератора.

· 5 Выполняет следующие методы словаря a_dict (см. колонку "Словарь"/"Методы" табл. №1):

§ 1 – clear();

§ 2 – get(key[, default]);

§ 3 – items();

§ 4 – keys();

§ 5 – pop(key[, default);

§ 6 – popitem();

§ 7 – setdefault(key[, default);

§ 8 – update([dict2]);

§ 9 – values().

Таблица 1 – Перечень индивидуальных заданий

Номер
п/п

Множество

Словарь

 
Создание Методы Операции Создание Методы  
1 3 1,3 4 1 2,5,8  
2 2 1,4 3 2 2,6,9  
3 1 1,5 2 3 3,5,1  
4 3 2,3 1 4 3,6,8  
5 2 2,4 4 5 4,5,9  
6 1 2,5 3 1 4,6,1  
7 3 1,3 2 2 7,9,5  
8 2 1,4 1 3 2,5,8  
9 1 1,5 4 4 2,6,9  
10 3 2,3 3 5 3,5,1  
11 2 2,4 2 1 3,6,8  
12 1 2,5 1 2 4,5,9  
13 3 1,3 4 3 4,6,1  
14 2 1,4 3 4 7,9,5  
15 1 1,5 2 5 2,5,8  
16 3 2,3 1 1 2,6,9  
17 2 2,4 4 2 3,5,1  
18 1 2,5 3 3 3,6,8  
19 3 1,3 2 4 4,5,9  
20 2 1,4 1 5 4,6,1  

 



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 152; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.219.217 (0.011 с.)