Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Объекты первого класса Python - полезные примеры новичку

В книге Д.Бизли «Python. Подробный справочник» есть такое суждение:
Тот факт, что все объекты в языке Python являются объектами первого класса, зачастую недооценивается начинающими программистами, тогда как это позволяет писать очень компактные и гибкие программы. Например, предположим, что имеется текстовая строка, такая как “GOOG,100,490.10”, и вам необходимо превратить ее в список полей, попутно выполнив необходимые преобразования типов. Ниже приводится грамотный способ реализации такого преобразования: создается список типов (которые также являются объектами первого класса) и выполняется несколько простых операций по обработке списка:
>>> line = "GOOG,100,490.10" >>> field_types = [str, int, float] >>> raw_fields = line.split(',') >>> fields = [ty(val) for ty,val in zip(field_types,raw_fields)]  >>> fields
[‘GOOG’, 100, 490.10000000000002]
A есть ли еще какие полезные "для новичка" примеры использования этой особенности языка Python?
А то кажется, что это больше похоже на источник головоломных ошибок.


Ответ

Мне кажется в данном контексте можно сделать несколько показательных примеров с функциями, которые можно:
передавать в качестве аргументов возвращать сохранять в переменную (как ссылку на функцию)

Пример:
пусть нам дана двумерная матрица и необходимо найти некоторые характеристики (минимум, максимум и среднее) для каждой строки:
In [15]: import random
In [16]: A = [[random.randint(0, 10) for _ in range(10)] for _ in range(10)]
In [17]: A Out[17]: [[6, 9, 6, 2, 0, 4, 3, 4, 5, 7], [2, 6, 6, 0, 8, 8, 6, 5, 2, 5], [10, 6, 0, 10, 1, 5, 8, 10, 9, 9], [3, 0, 4, 0, 0, 2, 1, 2, 8, 6], [5, 10, 8, 7, 8, 3, 0, 5, 0, 8], [9, 7, 2, 0, 8, 5, 0, 4, 4, 9], [9, 3, 8, 6, 6, 10, 5, 0, 0, 1], [7, 3, 2, 4, 5, 0, 0, 9, 0, 10], [8, 7, 10, 2, 6, 7, 2, 6, 2, 1], [3, 3, 1, 1, 1, 4, 8, 0, 3, 4]]
In [18]: funcs = [min, max, lambda x: sum(x)/len(x)]
In [19]: [[f(lst) for f in funcs] for lst in A] Out[19]: [[0, 9, 4.6], [0, 8, 4.8], [0, 10, 6.8], [0, 8, 2.6], [0, 10, 5.4], [0, 9, 4.8], [0, 10, 4.8], [0, 10, 4.0], [1, 10, 5.1], [0, 8, 2.8]]
теперь для того, чтобы добавить новые характеристики, например сумму значений в каждой строке, достаточно будет добавить имя функции в список funcs - остальной код остается неизменным:
In [20]: funcs.append(sum)
In [21]: [[f(lst) for f in funcs] for lst in A] Out[21]: [[0, 9, 4.6, 46], [0, 8, 4.8, 48], [0, 10, 6.8, 68], [0, 8, 2.6, 26], [0, 10, 5.4, 54], [0, 9, 4.8, 48], [0, 10, 4.8, 48], [0, 10, 4.0, 40], [1, 10, 5.1, 51], [0, 8, 2.8, 28]]

Комментариев нет:

Отправить комментарий