2010-01-19 3 views
9

Я видел некоторые изящные фрагменты python, использующие понимание списков и уменьшение карты. Можете ли вы поделиться некоторыми из этих кодов или веб-сайта.Фрагменты функционального программирования Python

Спасибо.

+10

Хороший вопрос, но ** сообщество wiki **! –

ответ

2

Вот быстрая сортировка:

def qsort (list): 
    if (len(list) > 1): 
     list = qsort(filter (lambda x: x <= list[0], list[1:])) + [list[0]] + qsort(filter (lambda x: x > list[0], list[1:])) 
    return list 

Это одно решение для программирования головоломки найти недостающее число среди целых чисел от 1 до 100:

from random import randint 
nos = range(1,101) 
to_remove = randint(1,100) 
nos.remove(to_remove) 
print "Removed %d from list" % to_remove 

found = 5050 - reduce (lambda x,y: x+y, nos) 
print "You removed %d " % found 
7

Python не lisp. Пожалуйста, не пытайтесь сделать так. Это уменьшает только одну из самых сильных сторон Python, которая является ее читабельностью и понятностью позже.

Если вам нравится функциональное программирование, изучите Haskell, ML, или F#. Вы будете поражены тем, что предлагают эти языки (с самого начала начинаются чистые функции).

+0

Я согласен с ML - часто упускается из виду – zebrabox

3

Будьте осторожны при программировании python в функциональном стиле. Единственная причина, по которой это делается, - это читаемость. Если алгоритм более элегантно выражен функционально, чем императивно, и он не вызывает проблем с производительностью (обычно это не так), то идите прямо вперед.

Однако python не оптимизирует рекурсию хвоста и имеет фиксированный предел рекурсии 1000, поэтому вы вообще не можете выполнять рекурсию O (n), только O (log (n)).

Кроме того, reduce() удаляется в python 3 по уважительной причине (http://www.artima.com/weblogs/viewpost.jsp?thread=98196). Большинство нетривиальных применений сокращения более читабельны как нормальный цикл вместо сокращения, а sum() уже встроен.

+0

'reduce' все еще находится в' functools'. – max