Николай обнови решението на 29.04.2013 16:55 (преди над 11 години)
+REPOSITORY = 'https://github.com/nkmprog/python-retrospective'
+
+# Двадесет неща, които научих
+#
+# 1. Python поддържа концепцията за итериране върху колекции. За да бъде един
+# обект итеруем той трябва да поддържа iterator protocol. Протоколът се със-
+# тои от 2 метода iterator.__iter__ и iterator.__next__. За да се поддържа
+# итеруемост обаче е възможно просто да имплементираме __iter__ като генера-
+# тор. Това може да стане чрез yield или generator expressions.
+# Един обект, бидейки итеруем предоставя възможността за използването на
+# удобния синтаксис for item in sequence.
+#
+# 2. Генераторите са лесен и мощен начин за създаването на итератори, т.е
+# те са вид итератори. Съществена разлика между двете е, че генераторите
+# могат да бъдат итерирани само 1 път, това е така, тъй като генерират
+# стойностите си lazy. Имплементирани са чрес yield. Всичко, което можем
+# да направим с генератори можем да направим и чрез итератори.
+#
+# 3. Използването на yield в декларацията на функция е достатъчно, за да се
+# създаде генератор вместо нормална функция. Yield запазва локалния state
+# на генератора и връща стойност. Последващото извикване на __next__ върху
+# генератора продължава изпълнението на функцията със запазеният state.
+# Това позволява lazy генериране на стойности.
+#
+# 4. Ако се опитаме да достъпим до стойност чрез несъществуващ ключ ще получим
+# KeyError. defaultdict вместо това ще създаде двойка ключ-стойност, като
+# стойността ще бъде от типа подаден като аргумент в конструктура.
+#
+# 5. Стратегията за оценяване на аргументите на функция в Python се нарича
+# Call by Sharing. Подавайки аргументи на функция, ние всъщност подаваме
+# имена, които са референции към обекти. Ако обектът е mutable то те могат
+# да бъдат променени in place. Това се различава от модела на Call by Value.
+# Ако обектите са immutable, то те не могат да бъдат променени във функцията
+# тъй като те въобще не могат да бъдат променени.
+#
+# 6. Python използва reference counting в своята garbage collection стратегия.
+# Всеки обект съдържа брояч, в който се пази броят на референций към обекта.
+# Ако броячът се нулира, то последната референция сочеща обекта е била
+# премахната, следователно паметта заделена за обекта може да бъде освободе-
+# на.
+#
+# 7. Ако в по-стара версия от Python 3.2 се опитаме да изтрием променлива
+# (използвайки del), дефинирана в затварящ scope(enclosing scope) ще получим
+# SyntaxError. В по-новите версии, от Python 3.2 (вкл.) нататък това
+# ограничение е премахнато(т.е интерпретатора не се грижи за това) и вече е
+# отговорност на програмиста това да не се опитва, следователно и се връша
+# runtime error(NameError).
+# Източник: http://stackoverflow.com/questions/12338713/python-
+# nested-scopes-with-dynamic-features
+#
+# 8. Декоратор e име на design pattern. Декораторите динамично променят
+# функционалността на на функция, метод или клас без да се използва
+# някаква йерархична структура или да се променя source кода.
+# Декораторите в Python не са точна имплементация на DecoratorPattern. Те не
+# внасят нова функционалност в езика, a улесняват синтаксиса с цел по-лесна
+# и гъвкава промяна на функции и методи.
+#
+# 9. __future__ e псевдо-модул, който се използва за да позволи нови "фийчъри"
+# на езика да се използват, коiто не са съвместими с интерпретаторa.
+# Тъй като future statement е директива към интерпретатора, променяйки
+# начина, по-който самата програма се parse-ва е нужно той да в началото на
+# програмата, от там и синтаксиса: from __future__ import something.
+#
+# 10. Резултатът от with израза се нарича Context Manager.
+# Това е обект, който имплементира методите __enter__ и __exit__,
+# който се изпълняват съответно преди и след with блока.
+#
+# 11. Test Driven Development е процес на разработване на код, който се
+# изразя в повтарянето на един и същ къс цикъл от следните стъпки:
+# 1. Писане на тестове. 2. Написване на код, който да минава въпросните
+# тестове. 3. Рефакторинг на написания код към желания стандарт.
+#
+# 12. Една от ползите не TDD е, че кодът(програмата) върви заедно с
+# тестовете си, който служат като един вид документация.
+#
+# 13. В Python истински multithreading няма как да се постигне заради
+# Global Interpreter Lock.
+#
+# 14. Конкуренцията за общи ресурси между различни нишки трябва да се управлява
+# чрез aquire и release, за да не се получи ситуация, в която две или
+# повече нишки изпозват един и същ ресурс едновременно.
+#
+# 15. Изключенията имат йерархична структура. Ако едно изключение може да се
+# хване от повече от 1 блок, то се обработва от първия блок.
+# Следователно реда на блоковете има значение при обработката на изклю-
+# чения, т.е. е добре да изграждаме блоковете си от по-специфичен към
+# по-общ.
+#
+# 16. Всяка инстанция на клас съдържа в себе си dict, който имплементира
+# пространството и с имена. Този речник е първото място където
+# референциите към атрибути се търсят.