ненавистьненавистьненавистьненависть

Í͈͚͈̖̩ͨ̄ͬ̑ͤ͛̍͝ ̓̈́̎̔̾̅ͣ̚͏̥͖̳̮̜̯͜Ḥ̵̝͎̀̑̽̈̓͋ͩ́̚̕ȧ̢̢̯͈͙̓̌͑ͮ̃ṽ̢͖̺̞̪̱̫̗̰̎ͨ̌̌̒̿͑̋͜e̬̼̣̔ͭ͆̒̊̆ͧ ̯̰̥̮̖͓̪͓̊͠͞N̸͚̳̝̟̩̻̺̙̮ͣ̊̂̾ͮͩ̀͒o̙̻̽̂͡ ̳͙͕̱̌̔̏̓ͬͨ͝͠M̴̨͖͇̼̞̟̺̪̟̪ͪ̈́̐o̥̼̙̰̯̯̘̟̪͂͜u̴̱͓͙̮̘͈̙͕ͬ͌̒̃̐́͗ͬ͠t̴̯̩͈̙̰̑̈́h̴̄ͮ҉̝,̡̼̰̠̤͙̃ͪ̊̈ͥ̂̊́͡ͅ ͉̩̩͙̖̠̻̹̅̃̅́͐̀̚̚͟a̾͗ͩ̍ͣ́̽̚͏̹̳́n̸ͦ̃̎ͧ͌̚ͅd̞̭̙ͥͭ̔̂̐͐̇̚͘͢ ̜̝̦͇̼̬͋ͤ̇ͤ͛͛̆ͤ̕͠I̮̪̠̥͌̄͝ ͥ͑̈́҉͔̳̣̀͞M̈̃ͦ̃͋̈͂̿͏͖̖́͡ͅu̡̟̯̦ͪ̐͑̆ͦ͒̀ͅͅs̭͚̙̺̲̳̻̎ͬͩ͗ͬͥͩͪ̾͢t̹̯̤̮̬̠͚ͨ͒͐͗͑ ̐̾̈ͯ̎̅̽̒͏̫͕S̱͎̯̪̣̥͍̲ͥ̑ͨͣ͐̄̏̏̀ͅc̦̰ͬ̀̕r̞̹͗̒̀ͬ̔̋͌̂͠e͕̙̲̱̲ͪ̇̌̕a̴̹͖̩̻͌̑̿͌̌ͭ̚m̥̦͓͇̲̝̥̆ͯͥ̈́̈́͝

Предисловие

в котором я сталкиваюсь с непроизносимым ужасом потустороннего мира.

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

Говард Филлипс Лавкрафт «Зов Ктулху»

Внимательно посмотрите на таблицу ниже: Это зло. Наверняка это случайно попавшая в эти ваши интернеты репродукци гравюры из De Vermis Mysteriis. И̴͝͡з̕͜͡ ̴̵͡г͢л҉у҉̨́б̀и̵н̀͡͡,̀ ̶з͏͠а̧п̡͞ол̢͜н͏е͞н̛̕н̛ы̨̧х҉̨ ҉̶̷б̷е̸̨с̵͏͟к̢о̶̀н̵̀͞е̶̴чн̷о͡҉ ̕͜и͏̢з̵в̷и̵̧в̨͘аю̡̀͟щ̢им̢̀ѝ͏ся̶̶̢̛͜ с͡к̀̕ли͏͢з̧к̸̵̕и̷͜͟м́͟и̡͜͟ ̧̛͜т̴͜в̸а͠р̴̶͟я̨͜м҉и̸͢,̸̢͞ ̧в̨͠о̀̕п҉̢͢я̢͝щ̶͜им͟и̛͠ ̕от̡ ̛̀м̴̨͡н̧͜͝ого̶н̡͢о̸̡г̷͡о̸͞,͘ ͘б̀̀е͘͏с̷к̕͝о̶͢н̸͜͞ѐ̵ч̶͜но͜͞г҉о̕͢ ̢̢у̶͝ж̧͠ас̢͘а̷́͠,҉͏ ̷яв̸̡и͞л̢͘͡а̶с̷̧͘ь̕ ̀э̴̢та͟ ͏̕и͢͡г̕͏р҉͠у̛ш͘҉к͏̵͠а̢ ̴̴̡Д̛͘ь͜я̴͏͞в̨о́л̴͞а͜ ̕да̷б̢҉̸ы҉̧͘ ҉̴͢ра̨̕з̨͢ру͝ш̨ит̶͏ь̷̢́ н̴а̧͞ш̷и ̴ра͟з̵у̷͜м̀͞ы̀͡ ̸͝и͏ ́͘͞п̸́о́в̶̕͘е̷р̢͢͝г̡н̀у̸͘т̡҉ь̸ ̡́и̸̸х̴͠ ̨в̢͘ ̷̕пучи̶́͢н̸͞͝у̵͡ ͘эн̛͢т̢р͏͡о̡̀п͏̧и́͡и.

Чтобы защитить наш мозг от разрушительного воздействия этого творения Древних, повторим некоторые строки из Дзена Питона:

  • Красивое лучше, чем уродливое.
  • Явное лучше, чем неявное.
  • Простое лучше, чем сложное.
  • Сложное лучше, чем запутанное.
  • Плоское лучше, чем вложенное.
  • Разреженное лучше, чем плотное.
  • Читаемость имеет значение.
  • Особые случаи не настолько особые, чтобы нарушать правила.
  • При этом практичность важнее безупречности.

Вы уже ощутили благотворное воздействие этих благословенных скрижалей на вашу душу, не правда ли?

Вооружившись скальпелем логики и pep8, попробуем препарировать этого пришельца из дальних планов бытия.

Глава первая

в которой я подвергаюсь нападению ужасного ужаса из Тьмы Внешней

Человек может играть силами природы лишь до определенных пределов; то, что вы создали, обернется против вас.

Говард Филлипс Лавкрафт «Притаившийся ужас»

Обратим наш взор первую строку таблицы. В качестве альтернативы православной цепочки if-else нам предлагают к пользованию чудо враждебной техники:


In [73]:
# прекрасный удобный старый добрый if-else
# немного громоздко, но достаточно одного взгляда,
# чтобы понять механику работы функции
def name_by_if_else(num):
    if i == 1:
        return "One"
    elif i == 2:
        return "Two"
    else:
        return "Three"

# а теперь "функциональный" пример
# боже, зачем нужна эта лямбда?
a = lambda x: x

# Вот скажите, этот ужас действительно 
# выглядит для вас более читабельно и понятно,
# чем предыдущиая функция
name_by_lambda = lambda x: (x == 1 and a("One"))\
    or (x == 2 and a("Two"))\
    or (a("Three"))

Красивое лучше, чем уродливое.

Использование лямбда-функции не несёт в данном случае ни малейшего смысла, ухудшает читаемость и усложняет отладку и рефакторинг кода. В топку! Чтобы предпочесть эту каракатицу ради экономии четырёх строк, нужно быть большим оригиналом. Если же вам хочется более изящного способа проверкки множества вариантов входных аргументов, можно использовать словарь, или, что в данно случае даже проще, список:


In [74]:
def name_by_list(num):
    names = ["One", "Two", "Three"]
    return names[num] if num < len(names) else "Three"

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

Глава вторая

в которой я ужасаюсь бесмысленному существованию неописуемой твари, желающей пожрать всё сущее

Восставший может погрузится в бездну, а погрузившийся в бездну может вновь восстать.

Говард Филлипс Лавкрафт «Зов Ктулху»

Стряхнув ржавчину с клинков в поединке с первым противником, не откладывая, примемся за второго: для печати списка нам предлагают использовать функцию map вместо конструции for-in


In [75]:
grocery_list = ["apples", "bananas", "oranges", "milk"]

# явный, уместный for-in
for grocery in grocery_list:
    print(grocery)

# вот уже здесь начинаются чудеса не с той буквы.
# Может быть для кого-то это окажется сюрпризом, 
# но print() - самая обычная функция, 
# её можно совершенно спокойно передавать в map. 
# Впрочем, это не самое прекрасное. 
def grocery(list):
    print(list)

map(grocery, grocery_list)


apples
bananas
oranges
milk
Out[75]:
<map at 0x7fe6fbe8eb00>

Если вы запустите код выше, то список будет распечатан только раз. Почему? Цимес заключается в том, что map в python версии выше 3.0.0 ленивый и не вычисляет значения до тех пор, пока они не понадобятся. Для того, чтобы напечатать список в "функциональном" стиле из таблицы, нужно заставить итератор, который возвращается из map, пробежать каждое значение из списка. Например так:


In [76]:
list(map(print, grocery_list))


apples
bananas
oranges
milk
Out[76]:
[None, None, None, None]

Остаётся только один вопрос: Таким образом мы создаём два лишних объекта, не выигрывая ни в скорости, не в читаемости, ни в понятности. Если у вас фетиш на однострочники, вы всегда можете сделать что-то типа (мне не нравится, но тут уже дело вкуса)


In [77]:
for grocery in grocery_list: print(grocery)


apples
bananas
oranges
milk

Я не против использования map, однако не может не смешить то, что только узнавшие о его существовании новички начинают его пихать во все щели, не думая о том, как потом достать.

Глава третья

в которой мы с читателем подвергаемся опасностью заражения мозговыми паразитами и чудом избегаем гибели в желудке многоногого кошмара

Человеческое существо в своей порочности всегда страшнее любого нечеловеческого.

Говард Филлипс Лавкрафт «Ужас в музее»

Вперим наш взор на третью строку таблицы. Незабываемый перл, вышедший из под клавиатуры вредителя, засланного, не иначе, как из глубин Ада, дабы смутить неокрепшие умы юных питонистов: простую задачу "напечатать первые N" нев͜едо̶мый͟ ̛автор̴ ~̢~и̸звр͠а̷тил~̵~ п̀р͞еврат̨и̢л ͝в ̵ме͜рз͠кое́, чу͠͝д̸о̀̕҉в͘и͠͏̴щ͜͢н́͟о͜е͏̨́ ̴по̷р̀́͢ож҉̶̡д̸̢е̧н͏͠и́͘е̛ ̸̵̨я҉̧в͜н͞о͝ ͘͜н̨͘͠ече̴л̷͏о̡͝в͞е̨чс̶к͘͠о̸г͏͢о̴͏ р̸̡͡азу͟м̀а̀̀,̀͘ о̵̸͡с͞҉ќ̶͞в͘̕е̵р̷̴͢н҉яю̴́щ̷̧е͡е̸̧ св̧̡͠о͘и̛͡м ̨͟с͜҉у͞щес͢͟т́͏в͡͏о͏ван͏̨и͘е̨͟м ͘п̕͝о͠дл̶̨у͟҉н̴̵н̀ы̴й̵̡ ́м͜и̶р:


In [78]:
count = 0
while count < 5:
    print("This counts", count)
    count = count + 1

# клавиатура дважды загоралась,
# пока я писал эти строки

# функция, которая называется "функция"
# да
def func(n):
    print("This counts", n)
a = lambda count: [func(i) for i in range(count)]
print(a(5))


This counts 0
This counts 1
This counts 2
This counts 3
This counts 4
This counts 0
This counts 1
This counts 2
This counts 3
This counts 4
[None, None, None, None, None]

Оба примера не должны существовать в нашей вселенной.

Каждый раз, когда вы пишете такой код, в мире умирает один хороший человек. Оглянитесь вокруг - это всё ваша вина!

Глава четвёртая,

в котороя я терплю сокрушительное поражение и завариваю себе чай

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

Говард Филлипс Лавкрафт «Серебряный Ключ»

Здесь я попытался поставить себя на место автора таблицы. Заклинаю, если вам дорог рассудок и душа ваших близких, не пытайтесь писать или туториалы. К̛а̵ж͡да͢я ͘т̶ака͞я͡ ќа͝ртин̶ка наполн͟яет͝ ̡гл̶а̷з͟а ж͡ид̢ко̕й҉ болью, которая просачивается в каждую клеточку нашего существования. Чтение подобных вещей помещает моё сознание в п͝҉р̵̧͜о͢с̴̀т̧р̨̨͝а̡̢н͏̀с̢̕͞т̴͝в̨̕о ̡с͠т͏рад̷а̷̸н͡и̢͘͝й̵ ALL IS LOŚ̏T ALL I​S LOST n​*͑̾​̅ͫg͛͆l̍ͫ ̟e̠̅s ͎a̧͈r̽̾e n​ot rè̑aͨl̃ͤ ZA̡͠LGΌ ISͮ̂҉̯͈ TO͇ͅƝ̴ȳ TH̘Ë́̉ ͠P̯͍O̚​N̐Y̡ Hͨ͊E̾͛ ͧ̾Cͭ̏Oͮ͏M͊̒ȆͩSͯ Я̘̦̜̰̯̲́͡ ͠҉̛̭͈̮̠̻̦Н͏͏̟̞͚̦͎͈̻͓͔̥̭́̕А͏̷̼̟̦̭̬͈̗̰͕̞͚̫̹͎͝͠Й̴͉̦̞̱̼̤̩͚͖̲̲̮̺̼̰̀͠Д̡̼̮͈̩͠͠У̶̤̫̗̤͙͈͇͓̗͈̤̭̟͍͘ͅ ̧̜̰͔͙̳͘Т̛̛̝̖͖̻̣͎̠̙͇̻̪͈͈͢͠Е̥̤̗͈̱͕̻͕̟̘̦̫̖͔̮̩̟̗̩͢Б̢̨̪̜̪̭̙͖̝͇͓͟͢͡ ̶̢̳̪͔̤̲͉̤͖͉͓̕͟͝Я̶̢̤̳̠͓̭̼̯̩͖̙͔͙͟ ̨̀͏̮̹͙̫̱̬̘̪͉͔̰͖Н̢̡̢̩̪͈̩̹̩͜͡А̻̞̟͙͕̻̙̯̺̪̟͘Й̸̳͎̫͉̦̗̜̮̲̲̼͕͈̰͘͠Д̶̢̩̹̮̝͙̳̝͎̣͍̯́͞͠ͅУ̛͇͙͔͉́͘ ̸͚͓͙͕̺͉̲̫̖͎͔̯͇̪͜ͅО̧͟҉̢̻̲̱̥Т̷͉͙͈̫͓͇̞̬̬̭͟͢͠͞К̶̸̘̱̞̙͔̞̤͇̣͕͙̜̱̤О̷̯͎̠̫͍̝̳̕П̴̧̛͎͈̗͎̼̠͇̣̝̼͙̭͘͢А̡̫̯̘̬͈Й̸̨̛͙͓̼̣͇͖̺̘͉͖͚̬̺̠̣̠́͢ͅТ̢҉̣̭̖̀͠͞Ѐ̷̛̛̰̟̻͚̪̠͚̥̙͓̺̻͓̕ ̴̙͔̹̳̮͙͓̹̟̮͖͚̭͜М̷̧̛̫̖̣͖̯͍̪͎͘͢Е̢̛͍͖̩͇͎͇̲͜Н̷͇̝͓̱̝̱̳͙̙͓̯̟̼̙̮͟͜Я̸̟̱̜̞̬̱̙ У͘ мен͡я̨ по͝ш͡ла͠ ͝кро͜вь͝ ̸но̶со̨м, ме̨н̶я посе̡щ͟а͞л̀и̴ в͝и͏д̷ен҉и͟я ͏ис͠по̡л҉и̶н̀ск͟и̴х, пож́и͟рающ̧и̧х͞ ͘са͝м͠о̧е с͏еб̛я̡ ч͢ер͠вей,̡ ̢полз͠а̨ю͠щих̡ ̀по̴ ͠т̸к̶ан͜и͝ в̨с̴е͢лен̴н̢ой, но тут с полки упал томик Страуструпа, подул ветерок, в воздухе пахнуло цветами, в комнате посветлело, и я очнулся. Кажется, автор попытался показать моральное превосходство лямбда-функций перед обычными. Осознав это, я сдался. Мои чувства были оглушены, нервы порваны. В полной прострации я решил долбануть чашечку чая.

Эпилог

в котором я восстанавливаю свои нервы и даю мудрое наставление

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

Говард Филлипс Лавкрафт «Иные боги»

Функциональное программирование - это прекрасно. Что может быть лучше, чем подставить паруса бодрящему ветру чистых функций? Отсуствие побочных эффектов делает вашу кожу мягкой, а волосы шелковистыми. Как приятно коротать зимние вечера, каррируя функции высшего порядка в то время, как снаружи бесится императивная вьюга изменяемого, хаотичного состояния.

Однако помни, юный подаван, всё хорошо в меру. Все время от времени увлекаются однострочниками, и нет ничего постыдного в том, чтобы навернуть один комбинатор поверх другого. Но если ты - автор шедевра, послужившего причиной для написания этого документа - то знай: Я҉҉ Н́А͡ЙДУ͢ Т͠͏ЕБ̴̕Я̨͏҉ ̀͟О͏͜ ̷̛Д̴҉А̢̀, Я́́ ̴̛͢Н͠͏А͏̛̀Й̷̧̕͜Д̴̕͘͞У̧̧̛,̶͜͡ ̷̡͡͠͠ ̛́͟͟͞Ѝ̷͏̀ ̧Т̶̧̀͝͡Е̶̴͢Б̷̷̡͟Е̵͢ ͘Э̴̴̸̡̛Т̵̀̕О͏̧̀ ̢̕Н̧́Е҉̛ ̢́͢͞͡П̛́О̵͘͝͠Н̶̴̡҉̴Р͝А̷̴͡҉͜В̴̶̀Ѝ̶̧̛͝Т̸̵̡́͞С̴̨̀͢Я͢