В книге Д.Бизли «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]]
Комментариев нет:
Отправить комментарий