Решение на Ретроспекция от Николай Манолов

Обратно към всички решения

Към профила на Николай Манолов

Резултати

  • 0 точки от тестове
  • 4 бонус точки
  • 4 точки общо
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)

Код

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, който имплементира
# пространството и с имена. Този речник е първото място където
# референциите към атрибути се търсят.

История (1 версия и 0 коментара)

Николай обнови решението на 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, който имплементира
+# пространството и с имена. Този речник е първото място където
+# референциите към атрибути се търсят.