Python: коллекции, часть 4/4: все о выражениях-генераторах, генераторах списков, множеств и словарей
Содержание:
How enumerate() Works Behind The Scenes
You might be wondering how the function works behind the scenes. Part of it’s magic lies in the fact that is implemented as a Python iterator. This means that element indexes are generated lazily (one by one, just-in-time), which keeps memory use low and keeps this construct so fast.
Let’s play with some more code to demonstrate what I mean:
>>> names = 'Bob', 'Alice', 'Guido' >>> enumerate(names) <enumerate object at 0x1057f4120>
In the above code snippet I set up the same enumeration you’ve already seen in the previous examples. But instead of immediately looping over the result of the call I’m just displaying the returned object on the Python console.
As you can see, it’s an “enumerate object.” This is the actual iterator. And like I said, it generates its output elements lazily and one by one when they’re requested.
In order to retrieve those “on demand” elements so we can inspect them, I’m going to call the built-in function on the iterator:
>>> list(enumerate(names))
For each element in the input list () the iterator returned by produces a tuple of the form . In your typical for-in loop you’ll use this to your advantage by leveraging Python’s data structure unpacking feature:
5. Генерация стандартных коллекций
5.1 Создание коллекций из выражения-генератора
ПримечаниеВнимание
- Передачей готового выражения-генератора присвоенного переменной в функцию создания коллекции.
- Написание выражения-генератора сразу внутри скобок вызываемой функции создания коллекции.
5.2 Специальный синтаксис генераторов коллекций
Обратите внимание
Генератор списка (list comprehension)
Не пишите круглые скобки в квадратных!
Генератор множества (set comprehension)
Генератор словаря (dictionary comprehension)
переворачивание словаря
Словарь из списка:
Важно! Такой синтаксис создания словаря работает только в фигурных скобках, выражение-генератор так создать нельзя, для этого используется немного другой синтаксис (благодарю longclaps за подсказку в комментариях):
Функция map
Функция map() предоставляет возможность применить указанную функцию к каждому элементу объекта. В результате получим список из модифицированных элементов исходного объекта.
Решим задачу возведения в квадрат всех элементов списка с использованием цикла for.
>>> numbers = >>> sq_nums = [] >>> for num in numbers: sq_nums.append(num**2) >>> sq_nums
Эту задачу можно также решить с использованием List Comprehensions.
>>> sq_nums = >>> sq_nums
Точно такой же результат получим, если воспользуемся функций map().
>>> sq_nums = list(map(lambda x: x**2, numbers)) >>> sq_nums
На первый взгляд такой подход может показаться сложнее предыдущего, но вся его мощь заключается в первом аргументе – функции, которая используется для модификации значений элементов объекта. Это может быть как lambda-функция, как в нашем примере, так функция, созданная с использованием ключевого слова def.
Результат работы функции map() можно использовать в цикле for.
>>> msg = "simple" >>> for sym in map(lambda x: x+'-', msg): print(sym, end='') s-i-m-p-l-e-
Используйте map(), если вам необходимо обработать элементы объекта, используя определенную функцию .
Creating enumerations
Enumerations are created as classes and you should put them inside folder.
You can pass an array of symbols, so that the respective value for each symbol will be the
stringified version of the symbol itself:
class RelationshipStatus < EnumerateIt::Base associate_values( :single, :married, :divorced ) end
This will create some nice stuff:
-
Each enumeration’s value will turn into a constant:
RelationshipStatus::SINGLE #=> 'single' RelationshipStatus::MARRIED #=> 'married'
-
You can retrieve a list with all the enumeration codes:
RelationshipStatus.list #=>
-
You can retrieve a JSON with all the enumeration codes:
RelationshipStatus.to_json #=> "[{\"value\":\"divorced\",\"label\":\"Divorced\"},{\"value\":\"married\", ...
-
You can get an array of options, ready to use with the , , etc. family of
Rails helpers.RelationshipStatus.to_a #=> , , ]
-
You can retrieve a list with values for a group of enumeration constants.
RelationshipStatus.values_for %w(MARRIED SINGLE) #=>
-
You can retrieve the value for a specific enumeration constant:
RelationshipStatus.value_for('MARRIED') #=> 'married'
-
You can retrieve the symbol used to declare a specific enumeration value:
RelationshipStatus.key_for(RelationshipStatus::MARRIED) #=> :married
-
You can iterate over the list of the enumeration’s values:
RelationshipStatus.each_value { |value| ... }
-
You can iterate over the list of the enumeration’s translations:
RelationshipStatus.each_translation { |translation| ... }
-
You can also retrieve all the translations of the enumeration:
RelationshipStatus.translations
-
You can ask for the enumeration’s length:
RelationshipStatus.length #=> 3
Sorting enumerations
When calling methods like , and , the returned values will be sorted by
default in the same order passed to call.
However, if you want to overwrite the default sort mode, you can use the class method:
class RelationshipStatus < EnumerateIt::Base associate_values :single, :married sort_by :translation end
The method accepts one of the following values:
Value | Behavior |
---|---|
The default behavior, will return values in order that was passed to call | |
Will sort the returned values based on the name of each enumeration option | |
will sort the returned values based on their translations | |
See section for more details |
Другие встроенные функции
abs(x) — Возвращает абсолютную величину (модуль числа).
all(последовательность) — Возвращает True, если все элементы истинные (или, если последовательность пуста).
any(последовательность) — Возвращает True, если хотя бы один элемент — истина. Для пустой последовательности возвращает False.
ascii(object) — Как repr(), возвращает строку, содержащую представление объекта, но заменяет не-ASCII символы на экранированные последовательности.
bin(x) — Преобразование целого числа в двоичную строку.
callable(x) — Возвращает True для объекта, поддерживающего вызов (как функции).
chr(x) — Возвращает односимвольную строку, код символа которой равен x.
classmethod(x) — Представляет указанную функцию методом класса.
compile(source, filename, mode, flags=0, dont_inherit=False) — Компиляция в программный код, который впоследствии может выполниться функцией eval или exec. Строка не должна содержать символов возврата каретки или нулевые байты.
delattr(object, name) — Удаляет атрибут с именем ‘name’.
dir() — Список имен объекта, а если объект не указан, список имен в текущей локальной области видимости.
divmod(a, b) — Возвращает частное и остаток от деления a на b.
enumerate(iterable, start=0) — Возвращает итератор, при каждом проходе предоставляющем кортеж из номера и соответствующего члена последовательности.
eval(expression, globals=None, locals=None) — Выполняет строку программного кода.
exec(object]) — Выполняет программный код на Python.
filter(function, iterable) — Возвращает итератор из тех элементов, для которых function возвращает истину.
format(value) — Форматирование (обычно форматирование строки).
getattr(object, name ,) — извлекает атрибут объекта или default.
globals() — Словарь глобальных имен.
hasattr(object, name) — Имеет ли объект атрибут с именем ‘name’.
hash(x) — Возвращает хеш указанного объекта.
help() — Вызов встроенной справочной системы.
hex(х) — Преобразование целого числа в шестнадцатеричную строку.
id(object) — Возвращает «адрес» объекта. Это целое число, которое гарантированно будет уникальным и постоянным для данного объекта в течение срока его существования.
input() — Возвращает введенную пользователем строку. Prompt — подсказка пользователю.
isinstance(object, ClassInfo) — Истина, если объект является экземпляром ClassInfo или его подклассом. Если объект не является объектом данного типа, функция всегда возвращает ложь.
issubclass(класс, ClassInfo) — Истина, если класс является подклассом ClassInfo. Класс считается подклассом себя.
iter(x) — Возвращает объект итератора.
len(x) — Возвращает число элементов в указанном объекте.
locals() — Словарь локальных имен.
map(function, iterator) — Итератор, получившийся после применения к каждому элементу последовательности функции function.
max(iter, * ) — Максимальный элемент последовательности.
min(iter, * ) — Минимальный элемент последовательности.
next(x) — Возвращает следующий элемент итератора.
oct(х) — Преобразование целого числа в восьмеричную строку.
open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True) — Открывает файл и возвращает соответствующий поток.
ord(с) — Код символа.
pow(x, y) — ( x ** y ) % r.
reversed(object) — Итератор из развернутого объекта.
repr(obj) — Представление объекта.
print(, *, sep=» «, end=’\n’, file=sys.stdout) — Печать.
property(fget=None, fset=None, fdel=None, doc=None)
round(X ) — Округление до N знаков после запятой.
setattr(объект, имя, значение) — Устанавливает атрибут объекта.
sorted(iterable) — Отсортированный список.
staticmethod(function) — Статический метод для функции.
sum(iter, start=0) — Сумма членов последовательности.
super(]) — Доступ к родительскому классу.
type(object) — Возвращает тип объекта.
type(name, bases, dict) — Возвращает новый экземпляр класса name.
vars() — Словарь из атрибутов объекта. По умолчанию — словарь локальных имен.
zip(*iters) — Итератор, возвращающий кортежи, состоящие из соответствующих элементов аргументов-последовательностей.