Найти - Пользователи
Полная версия: Вопрос из книги Text processing in Python
Начало » Python для экспертов » Вопрос из книги Text processing in Python
1
Tmr
Вопрос к тем, кто книгу читал и тем, кому тема интересна.
В первой главе определяется маленькая библиотека полезных функций высшего порядка combinatorial.py
с таким содержимым:
from operator import mul, add, truth
apply_each = lambda fns, args=: map(apply, fns, *len(fns))
bools = lambda lst: map(truth, lst)
bool_each = lambda fns, args=: bools(apply_each(fns, args))
conjoin = lambda fns, args=: reduce(mul, bool_each(fns, args))
all = lambda fns: lambda arg, fns=fns: conjoin(fns, (arg,))
both = lambda f,g: all((f,g))
all3 = lambda f,g,h: all((f,g,h))
and_ = lambda f,g: lambda x, f=f, g=g: f(x) and g(x)
or_ = lambda f,g: lambda x, f=f, g=g: f(x) or g(x)
disjoin = lambda fns, args=: reduce(add, bool_each(fns, args))
some = lambda fns: lambda arg, fns=fns: disjoin(fns, (arg,))
either = lambda f,g: some((f,g))
anyof3 = lambda f,g,h: some((f,g,h))
compose = lambda f,g: lambda x, f=f, g=g: f(g(x))
compose3 = lambda f,g,h: lambda x, f=f, g=g, h=h: f(g(h(x)))
shortcut_all = lambda fns: reduce(and_, fns)
shortcut_some = lambda fns: reduce(or_, fns)
not_ = lambda f: lambda x, f=f: not f(x)
ident = lambda x: x
Используется она в основном для комбинирования функций фильтрации и простых преобразований строк текста. Например:
short_regvals = filter(both(shortline, isRegVal), lines)
shortline = lambda line: len(line) < 25
В книге есть вопрос:
The function ident() would appear to be pointless, since it simply returns whatever value is passed to it. In truth, ident() is an almost indispensable function for a combinatorial collection. Explain the significance of ident().

Hint: Suppose you have a list of lines of text, where some of the lines may be empty strings. What filter can you apply to find all the lines that start with a #?
Перевод вкратце: в каких случаях функция ident() из combinatorial.py(определена последней) необходима/незаменима, в чем её значение?
Что-то мне ни один случай её применения в голову не приходит… Есть идеи?
Александр Кошелев
Возможно, когда цепочка преобразований определяется динамически(на основе ввода пользователя, полученных данных и т.д.), то чтобы не вставлять проверки на наличие функции, можно просто использовать ident, которая ничего не делает.
Tmr
Это самое очевидное применение, хотя его важность (тем более “почти необходимость”) в этом контексте довольно сомнительна. Меня заинтриговала подсказка в тексте:
Hint: Suppose you have a list of lines of text, where some of the lines may be empty strings. What filter can you apply to find all the lines that start with a #?
Я сделал так:
selected = filter(lambda x: x.startswith(“#”), open(“c:\\sandbox\\file.txt”).readlines())
#или
selected =

Работает хорошо.
А как можно это сделать с полезным использованием ident в голову не приходит…
offtopic: как включить подсветку python синтаксиса?
подсветку уже нашел.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB