38
Почему каждому языку нужен свой _

Александр Щепановский «Почему каждому языку нужен свой _»

  • Upload
    devday

  • View
    124

  • Download
    2

Embed Size (px)

DESCRIPTION

Такие библиотеки как funcy и underscore часто связывают с функциональным программированием, но настоящий их фокус - это практичность. Задача их - упростить манипулирование данными, коллекциями, функциями и даже потоком управления, а также абстрагировать часто встречащиеся полезные поведения. В своём докладе я приведу жизненные примеры использования всего этого, а также расскажу об идеях заложенных в и продвигаемых funcy.

Citation preview

Page 1: Александр Щепановский «Почему каждому языку нужен свой _»

Почему каждому языку нужен свой _

Page 2: Александр Щепановский «Почему каждому языку нужен свой _»

Что такое _?

Underscore – библиотека для JavaScript, которая делает жизнь лучше, предоставляя кучу полезных утилит.

Page 3: Александр Щепановский «Почему каждому языку нужен свой _»

Что такое funcy?

funcy – библиотека для Python, ...

Page 4: Александр Щепановский «Почему каждому языку нужен свой _»

Запутанный кусок кода

images = []

for url in urls:

for attempt in range(TRIES):

try:

images.append(download_image(url))

break

except HttpError:

if attempt + 1 == TRIES:

raise

Page 5: Александр Щепановский «Почему каждому языку нужен свой _»

Распутанный кусок кода

http_retry = retry(TRIES, HttpError)

harder_download = http_retry(download_image)

images = map(harder_download, urls)

Page 6: Александр Щепановский «Почему каждому языку нужен свой _»

Словарь с грязными данными

d = {}

for k, v in request.items():

try:

d[k] = int(v)

except (TypeError, ValueError):

d[k] = None

Page 7: Александр Щепановский «Почему каждому языку нужен свой _»

Словарь с грязными данными

walk_values(silent(int), request)

Page 8: Александр Щепановский «Почему каждому языку нужен свой _»

Отслеживание предыдущего элемента

prev = None

is_ascending = True

for x in seq:

if prev and x >= seq:

is_ascending = False

break

prev = x

Page 9: Александр Щепановский «Почему каждому языку нужен свой _»

Отслеживание предыдущего элемента

is_ascending = all(l < r for l, r

in pairwise(seq))

Page 10: Александр Щепановский «Почему каждому языку нужен свой _»

Больше кода

● Дольше писать● Дольше читать● Дольше отлаживать● Больше ошибок

Page 11: Александр Щепановский «Почему каждому языку нужен свой _»

Зачем нужен _

● ...● …● …● ...

Page 12: Александр Щепановский «Почему каждому языку нужен свой _»

Запутанный кусок кода

images = []

for url in urls:

for attempt in range(TRIES):

try:

images.append(download_image(url))

break

except HttpError:

if attempt + 1 == TRIES:

raise

Page 13: Александр Щепановский «Почему каждому языку нужен свой _»

Что здесь происходит?

● Загрузка картинок (полезный экшн)● Повторные попытки загрузки● Итерация по адресам и сбор результатов

Page 14: Александр Щепановский «Почему каждому языку нужен свой _»

Запутанные аспекты

images = []

for url in urls:

for attempt in range(TRIES):

try:

images.append(download_image(url))

break

except HttpError:

if attempt + 1 == TRIES:

raise

Page 15: Александр Щепановский «Почему каждому языку нужен свой _»

Выделим повторные попытки

def retry(...):

...

http_retry = retry(TRIES, HttpError)

harder_download = http_retry(download_image)

images = []

for url in urls:

images.append(harder_download(url))

Page 16: Александр Щепановский «Почему каждому языку нужен свой _»

Свернём итерацию

def retry(...):

...

http_retry = retry(TRIES, HttpError)

harder_download = http_retry(download_image)

images = map(harder_download, urls)

Page 17: Александр Щепановский «Почему каждому языку нужен свой _»

Вынесем полезные шаблоны

● retry – в библиотеку● map – стандартная функция

(но если нет, то тоже в библиотеку)

Page 18: Александр Щепановский «Почему каждому языку нужен свой _»

Зачем нужен _

● содержит общие шаблоны● …● …● ...

Page 19: Александр Щепановский «Почему каждому языку нужен свой _»

Словарь с грязными данными

# вариант с циклом

d = {}

for k, v in request.items():

try:

d[k] = int(v)

except (TypeError, ValueError):

d[k] = None

# вариант с функцией

walk_values(silent(int), request)

Page 20: Александр Щепановский «Почему каждому языку нужен свой _»

Упрощённый вариант

# вариант с функцией

walk_values(int, request)

# вариант с генератором списков

{k: int(v) for k, v in request.items()}

Page 21: Александр Щепановский «Почему каждому языку нужен свой _»

Составляющие компоненты

# 3 составляющих

walk_values(int, data)

# около 8 составляющих

{k: int(v) for k, v in data.items()}

Page 22: Александр Щепановский «Почему каждому языку нужен свой _»

Высокий и низкий уровень

walk_values(int, data)

# красным выделены низкоуровневые детали

{k: int(v) for k, v in data.items()}

Page 23: Александр Щепановский «Почему каждому языку нужен свой _»

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● …● ...

Page 24: Александр Щепановский «Почему каждому языку нужен свой _»

Естественный язык

# строю словарь из пар

# ключ-"значение, приведённое к целому числу"

# для каждой пары ключ-значение данного словаря

{k: int(v) for k, v in request.items()}

# привожу значения словаря к целым числам

walk_values(int, request)

Page 25: Александр Щепановский «Почему каждому языку нужен свой _»

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● подстёгивает мышление на более абстрактном уровне● ...

Page 26: Александр Щепановский «Почему каждому языку нужен свой _»

Отслеживание предыдущего элемента

is_ascending = all(l < r for l, r

in pairwise(seq))

Page 27: Александр Щепановский «Почему каждому языку нужен свой _»

Порождение новых понятий

is_ascending = all(l < r for l, r

in pairwise(seq))

последовательность возрастает, если для всех её соседних пар левый сосед меньше правого.

Page 28: Александр Щепановский «Почему каждому языку нужен свой _»

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● подстёгивает мышление на более абстрактном уровне● предоставляет набор высокоуровневых понятий

Page 34: Александр Щепановский «Почему каждому языку нужен свой _»

Ещё библиотеки

Java – FunctionalJava, lambdaj

Page 35: Александр Щепановский «Почему каждому языку нужен свой _»

Ещё библиотеки

Java – FunctionalJava, lambdaj

C# - LINQ

Page 36: Александр Щепановский «Почему каждому языку нужен свой _»

Ещё библиотеки

Java – FunctionalJava, lambdaj

C# - LINQ

Objective-C – Underscore.m

Page 37: Александр Щепановский «Почему каждому языку нужен свой _»

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● подстёгивает мышление на более абстрактном уровне● предоставляет набор высокоуровневых понятий

Page 38: Александр Щепановский «Почему каждому языку нужен свой _»

Спасибо

hackflow.comgithub.com/Suor@hackflow