Í͈͚͈̖̩ͨ̄ͬ̑ͤ͛̍͝ ̓̈́̎̔̾̅ͣ̚͏̥͖̳̮̜̯͜Ḥ̵̝͎̀̑̽̈̓͋ͩ́̚̕ȧ̢̢̯͈͙̓̌͑ͮ̃ṽ̢͖̺̞̪̱̫̗̰̎ͨ̌̌̒̿͑̋͜e̬̼̣̔ͭ͆̒̊̆ͧ ̯̰̥̮̖͓̪͓̊͠͞N̸͚̳̝̟̩̻̺̙̮ͣ̊̂̾ͮͩ̀͒o̙̻̽̂͡ ̳͙͕̱̌̔̏̓ͬͨ͝͠M̴̨͖͇̼̞̟̺̪̟̪ͪ̈́̐o̥̼̙̰̯̯̘̟̪͂͜u̴̱͓͙̮̘͈̙͕ͬ͌̒̃̐́͗ͬ͠t̴̯̩͈̙̰̑̈́h̴̄ͮ҉̝,̡̼̰̠̤͙̃ͪ̊̈ͥ̂̊́͡ͅ ͉̩̩͙̖̠̻̹̅̃̅́͐̀̚̚͟a̾͗ͩ̍ͣ́̽̚͏̹̳́n̸ͦ̃̎ͧ͌̚ͅd̞̭̙ͥͭ̔̂̐͐̇̚͘͢ ̜̝̦͇̼̬͋ͤ̇ͤ͛͛̆ͤ̕͠I̮̪̠̥͌̄͝ ͥ͑̈́҉͔̳̣̀͞M̈̃ͦ̃͋̈͂̿͏͖̖́͡ͅu̡̟̯̦ͪ̐͑̆ͦ͒̀ͅͅs̭͚̙̺̲̳̻̎ͬͩ͗ͬͥͩͪ̾͢t̹̯̤̮̬̠͚ͨ͒͐͗͑ ̐̾̈ͯ̎̅̽̒͏̫͕S̱͎̯̪̣̥͍̲ͥ̑ͨͣ͐̄̏̏̀ͅc̦̰ͬ̀̕r̞̹͗̒̀ͬ̔̋͌̂͠e͕̙̲̱̲ͪ̇̌̕a̴̹͖̩̻͌̑̿͌̌ͭ̚m̥̦͓͇̲̝̥̆ͯͥ̈́̈́͝
в котором я сталкиваюсь с непроизносимым ужасом потустороннего мира.
Проявлением наибольшего милосердия в нашем мире является, на мой взгляд, неспособность человеческого разума связать воедино все, что этот мир в себя включает. Мы живем на тихом островке невежества посреди темного моря бесконечности, и нам вовсе не следует плавать на далекие расстояния.
Говард Филлипс Лавкрафт «Зов Ктулху»
Внимательно посмотрите на таблицу ниже:
Чтобы защитить наш мозг от разрушительного воздействия этого творения Древних, повторим некоторые строки из Дзена Питона:
Вы уже ощутили благотворное воздействие этих благословенных скрижалей на вашу душу, не правда ли?
Вооружившись скальпелем логики и 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)
Out[75]:
Если вы запустите код выше, то список будет распечатан только раз. Почему? Цимес заключается в том, что map в python версии выше 3.0.0 ленивый и не вычисляет значения до тех пор, пока они не понадобятся. Для того, чтобы напечатать список в "функциональном" стиле из таблицы, нужно заставить итератор, который возвращается из map, пробежать каждое значение из списка. Например так:
In [76]:
list(map(print, grocery_list))
Out[76]:
Остаётся только один вопрос:
In [77]:
for grocery in grocery_list: print(grocery)
Я не против использования 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))
Оба примера не должны существовать в нашей вселенной.
Каждый раз, когда вы пишете такой код, в мире умирает один хороший человек. Оглянитесь вокруг - это всё ваша вина!
в котороя я терплю сокрушительное поражение и завариваю себе чай
По-настоящему насладиться спокойной и неувядающей красотой можно только в счастливых снах, однако наш мир лишил себя такой возможности, в угаре идолопоклонства уратив драгоценный дар детской чистоты и невинности.
Говард Филлипс Лавкрафт «Серебряный Ключ»
Здесь я попытался поставить себя на место автора таблицы. Заклинаю, если вам дорог рассудок и душа ваших близких, не пытайтесь писать или туториалы. К̛а̵ж͡да͢я ͘т̶ака͞я͡ ќа͝ртин̶ка наполн͟яет͝ ̡гл̶а̷з͟а ж͡ид̢ко̕й҉ болью, которая просачивается в каждую клеточку нашего существования. Чтение подобных вещей помещает моё сознание в п͝҉р̵̧͜о͢с̴̀т̧р̨̨͝а̡̢н͏̀с̢̕͞т̴͝в̨̕о ̡с͠т͏рад̷а̷̸н͡и̢͘͝й̵ ALL IS LOŚ̏T ALL IS LOST n*͑̾̅ͫg͛͆l̍ͫ ̟e̠̅s ͎a̧͈r̽̾e not rè̑aͨl̃ͤ ZA̡͠LGΌ ISͮ̂҉̯͈ TO͇ͅƝ̴ȳ TH̘Ë́̉ ͠P̯͍O̚N̐Y̡ Hͨ͊E̾͛ ͧ̾Cͭ̏Oͮ͏M͊̒ȆͩSͯ Я̘̦̜̰̯̲́͡ ͠҉̛̭͈̮̠̻̦Н͏͏̟̞͚̦͎͈̻͓͔̥̭́̕А͏̷̼̟̦̭̬͈̗̰͕̞͚̫̹͎͝͠Й̴͉̦̞̱̼̤̩͚͖̲̲̮̺̼̰̀͠Д̡̼̮͈̩͠͠У̶̤̫̗̤͙͈͇͓̗͈̤̭̟͍͘ͅ ̧̜̰͔͙̳͘Т̛̛̝̖͖̻̣͎̠̙͇̻̪͈͈͢͠Е̥̤̗͈̱͕̻͕̟̘̦̫̖͔̮̩̟̗̩͢Б̢̨̪̜̪̭̙͖̝͇͓͟͢͡ ̶̢̳̪͔̤̲͉̤͖͉͓̕͟͝Я̶̢̤̳̠͓̭̼̯̩͖̙͔͙͟ ̨̀͏̮̹͙̫̱̬̘̪͉͔̰͖Н̢̡̢̩̪͈̩̹̩͜͡А̻̞̟͙͕̻̙̯̺̪̟͘Й̸̳͎̫͉̦̗̜̮̲̲̼͕͈̰͘͠Д̶̢̩̹̮̝͙̳̝͎̣͍̯́͞͠ͅУ̛͇͙͔͉́͘ ̸͚͓͙͕̺͉̲̫̖͎͔̯͇̪͜ͅО̧͟҉̢̻̲̱̥Т̷͉͙͈̫͓͇̞̬̬̭͟͢͠͞К̶̸̘̱̞̙͔̞̤͇̣͕͙̜̱̤О̷̯͎̠̫͍̝̳̕П̴̧̛͎͈̗͎̼̠͇̣̝̼͙̭͘͢А̡̫̯̘̬͈Й̸̨̛͙͓̼̣͇͖̺̘͉͖͚̬̺̠̣̠́͢ͅТ̢҉̣̭̖̀͠͞Ѐ̷̛̛̰̟̻͚̪̠͚̥̙͓̺̻͓̕ ̴̙͔̹̳̮͙͓̹̟̮͖͚̭͜М̷̧̛̫̖̣͖̯͍̪͎͘͢Е̢̛͍͖̩͇͎͇̲͜Н̷͇̝͓̱̝̱̳͙̙͓̯̟̼̙̮͟͜Я̸̟̱̜̞̬̱̙ У͘ мен͡я̨ по͝ш͡ла͠ ͝кро͜вь͝ ̸но̶со̨м, ме̨н̶я посе̡щ͟а͞л̀и̴ в͝и͏д̷ен҉и͟я ͏ис͠по̡л҉и̶н̀ск͟и̴х, пож́и͟рающ̧и̧х͞ ͘са͝м͠о̧е с͏еб̛я̡ ч͢ер͠вей,̡ ̢полз͠а̨ю͠щих̡ ̀по̴ ͠т̸к̶ан͜и͝ в̨с̴е͢лен̴н̢ой, но тут с полки упал томик Страуструпа, подул ветерок, в воздухе пахнуло цветами, в комнате посветлело, и я очнулся. Кажется, автор попытался показать моральное превосходство лямбда-функций перед обычными. Осознав это, я сдался. Мои чувства были оглушены, нервы порваны. В полной прострации я решил долбануть чашечку чая.
в котором я восстанавливаю свои нервы и даю мудрое наставление
Вся наша жизнь - это лишь цепь возникающих в сознании образов, а поскольку нет никакой существенной разницы между отражениями объективной реальности и образами, порожденными фантазией, то нет и причин отдавать кому-то из них предпочтение.
Говард Филлипс Лавкрафт «Иные боги»
Функциональное программирование - это прекрасно. Что может быть лучше, чем подставить паруса бодрящему ветру чистых функций? Отсуствие побочных эффектов делает вашу кожу мягкой, а волосы шелковистыми. Как приятно коротать зимние вечера, каррируя функции высшего порядка в то время, как снаружи бесится императивная вьюга изменяемого, хаотичного состояния.
Однако помни, юный подаван, всё хорошо в меру. Все время от времени увлекаются однострочниками, и нет ничего постыдного в том, чтобы навернуть один комбинатор поверх другого. Но если ты - автор шедевра, послужившего причиной для написания этого документа - то знай: Я҉҉ Н́А͡ЙДУ͢ Т͠͏ЕБ̴̕Я̨͏҉ ̀͟О͏͜ ̷̛Д̴҉А̢̀, Я́́ ̴̛͢Н͠͏А͏̛̀Й̷̧̕͜Д̴̕͘͞У̧̧̛,̶͜͡ ̷̡͡͠͠ ̛́͟͟͞Ѝ̷͏̀ ̧Т̶̧̀͝͡Е̶̴͢Б̷̷̡͟Е̵͢ ͘Э̴̴̸̡̛Т̵̀̕О͏̧̀ ̢̕Н̧́Е҉̛ ̢́͢͞͡П̛́О̵͘͝͠Н̶̴̡҉̴Р͝А̷̴͡҉͜В̴̶̀Ѝ̶̧̛͝Т̸̵̡́͞С̴̨̀͢Я͢